From 1e5f67fc23c9b3f9cceb6760cd7233f81177da78 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 28 Oct 2014 11:29:21 +0900 Subject: [PATCH 001/451] Correct swapped explanation of dithering methods atkinson and fs --- converters/img2sixel.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 396b91e5..d7c12a10 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -65,9 +65,9 @@ auto -> choose diffusion type automatically (default) .br none -> do not diffusion .br -fs -> Bill Atkinson's method +fs -> Floyd-Steinberg method .br -atkinson -> Floyd-Steinberg method +atkinson -> Bill Atkinson's method .br jajuni -> Jarvis, Judice & Ninke .br From a4ce2688e06619e9e5cf07bb465f3ff28bd57c90 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 28 Oct 2014 15:23:56 +0900 Subject: [PATCH 002/451] Add contributers --- converters/img2sixel.1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index d7c12a10..7146ac19 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -341,6 +341,16 @@ MagickCore's resize.c. Araki Ken (@arakiken), Iwamoto Kouichi (@ttdoda) Kazuhiro YOSHIKAWA (@yoshikaw) +Araki Ken (@arakiken) +Markus Elfring (@elfring) +isaki (@isaki68k) +NOKUBI Takatsug (@knok) +Yasuhiro MATSUMOTO (@mattn) +Izumi Tsutsui (@tsutsui) +Iwamoto Kouichi (@ttdoda) +haru (@uobikiemukot) +Bruce Mitchener (@waywardmonkeys) +Kazuhiro YOSHIKAWA (@yoshikaw) .fi From 4ad225ee1602f2031d5cac766d366e1313b9635d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 3 Nov 2014 06:28:26 +0900 Subject: [PATCH 003/451] Delete duplicated contributers --- converters/img2sixel.1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 7146ac19..fa1f098b 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -338,9 +338,6 @@ MagickCore's resize.c. .SH CONTRIBUTORS .nf -Araki Ken (@arakiken), -Iwamoto Kouichi (@ttdoda) -Kazuhiro YOSHIKAWA (@yoshikaw) Araki Ken (@arakiken) Markus Elfring (@elfring) isaki (@isaki68k) From 0c7c4bb6b32bb6f43f70bda3525fa289b5bc685e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 4 Dec 2014 01:12:35 +0900 Subject: [PATCH 004/451] Add test for SSL access with libcurl --- converters/Makefile.am | 16 ++++++++++++++-- converters/Makefile.in | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 8d55c98a..dfa6a12f 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -13,7 +13,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel @@ -140,8 +140,20 @@ if HAVE_PNG $(WINE) ./img2sixel ../images/snake.png endif if HAVE_CURL - !$(WINE) ./img2sixel file:///test + ! $(WINE) ./img2sixel file:///test + ! $(WINE) ./img2sixel https:///test $(WINE) ./img2sixel file:///$$(pwd)/../images/snake.jpg + if which openssl && which python; then \ + openssl genrsa | openssl rsa > server.key; \ + openssl req -new -key server.key -subj "/CN=localhost" | openssl x509 -req -signkey server.key > server.crt; \ + echo "import BaseHTTPServer as bs, SimpleHTTPServer as ss, ssl" > server.py; \ + echo "httpd = bs.HTTPServer(('localhost', 4443), ss.SimpleHTTPRequestHandler)" >> server.py; \ + echo "httpd.socket = ssl.wrap_socket(httpd.socket, certfile='server.crt', keyfile='server.key', server_side=True)" >> server.py; \ + echo "for x in range(1,2): httpd.handle_request()" >> server.py; \ + python server.py& \ + sleep 1; \ + ./img2sixel 'https://localhost:4443/snake.sixel'; \ + fi endif if WANT_SIXEL2PNG ! $(WINE) ./sixel2png -i unknown.sixel diff --git a/converters/Makefile.in b/converters/Makefile.in index 202459ee..76c90ebb 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -424,7 +424,7 @@ dist_man_MANS = $(am__append_3) $(am__append_8) dist_bashcompletion_DATA = $(am__append_4) dist_zshcompletion_DATA = $(am__append_5) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c scale.c malloc_stub.c loader.c frompnm.c \ @WANT_IMG2SIXEL_TRUE@ scale.h malloc_stub.h loader.h frompnm.h @@ -1153,8 +1153,20 @@ test: all @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/seq2gif.gif -S -datkinson @HAVE_JPEG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake-progressive.jpg @HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.png -@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ !$(WINE) ./img2sixel file:///test +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ! $(WINE) ./img2sixel file:///test +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ! $(WINE) ./img2sixel https:///test @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel file:///$$(pwd)/../images/snake.jpg +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ if which openssl && which python; then \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ openssl genrsa | openssl rsa > server.key; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ openssl req -new -key server.key -subj "/CN=localhost" | openssl x509 -req -signkey server.key > server.crt; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "import BaseHTTPServer as bs, SimpleHTTPServer as ss, ssl" > server.py; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "httpd = bs.HTTPServer(('localhost', 4443), ss.SimpleHTTPRequestHandler)" >> server.py; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "httpd.socket = ssl.wrap_socket(httpd.socket, certfile='server.crt', keyfile='server.key', server_side=True)" >> server.py; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "for x in range(1,2): httpd.handle_request()" >> server.py; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ python server.py& \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ sleep 1; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ./img2sixel 'https://localhost:4443/snake.sixel'; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ fi @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ ! $(WINE) ./sixel2png -i unknown.sixel @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ ! $(WINE) ./sixel2png -% < snake.sixel @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png -H From 1d2975d2532d5709abc8f3814710fa56b9736555 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 4 Dec 2014 02:17:16 +0900 Subject: [PATCH 005/451] Introduce -k, --insecure option for libcurl integration --- README.md | 3 +++ converters/Makefile.am | 11 ++++++--- converters/Makefile.in | 10 +++++--- converters/img2sixel.1 | 7 ++++-- converters/img2sixel.c | 28 ++++++++++++++++++---- converters/loader.c | 26 +++++++++++++------- converters/loader.h | 2 +- converters/shell-completion/bash/img2sixel | 1 + converters/shell-completion/zsh/_img2sixel | 1 + 9 files changed, 66 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 51bcf826..a5ed6af8 100644 --- a/README.md +++ b/README.md @@ -303,6 +303,9 @@ Options: -e, --monochrome output monochrome sixel image this option assumes the terminal background color is black +-k, --insecure allow to connect to SSL sites without + certs(enabled only when configured + with --with-libcurl) -i, --invert assume the terminal background color is white, make sense only when -e option is given diff --git a/converters/Makefile.am b/converters/Makefile.am index dfa6a12f..cf93d0ca 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -13,7 +13,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py server.key server.crt if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel @@ -149,11 +149,16 @@ if HAVE_CURL echo "import BaseHTTPServer as bs, SimpleHTTPServer as ss, ssl" > server.py; \ echo "httpd = bs.HTTPServer(('localhost', 4443), ss.SimpleHTTPRequestHandler)" >> server.py; \ echo "httpd.socket = ssl.wrap_socket(httpd.socket, certfile='server.crt', keyfile='server.key', server_side=True)" >> server.py; \ - echo "for x in range(1,2): httpd.handle_request()" >> server.py; \ + echo "httpd.handle_request()" >> server.py; \ + echo "httpd.handle_request()" >> server.py; \ python server.py& \ sleep 1; \ - ./img2sixel 'https://localhost:4443/snake.sixel'; \ + ! ./img2sixel 'https://localhost:4443/snake.sixel'; \ + sleep 1; \ + ./img2sixel -k 'https://localhost:4443/snake.sixel'; \ fi +else + ! $(WINE) ./img2sixel -k < ../images/snake.jpg endif if WANT_SIXEL2PNG ! $(WINE) ./sixel2png -i unknown.sixel diff --git a/converters/Makefile.in b/converters/Makefile.in index 76c90ebb..f1da4e0d 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -424,7 +424,7 @@ dist_man_MANS = $(am__append_3) $(am__append_8) dist_bashcompletion_DATA = $(am__append_4) dist_zshcompletion_DATA = $(am__append_5) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py server.key server.crt @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c scale.c malloc_stub.c loader.c frompnm.c \ @WANT_IMG2SIXEL_TRUE@ scale.h malloc_stub.h loader.h frompnm.h @@ -1162,11 +1162,15 @@ test: all @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "import BaseHTTPServer as bs, SimpleHTTPServer as ss, ssl" > server.py; \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "httpd = bs.HTTPServer(('localhost', 4443), ss.SimpleHTTPRequestHandler)" >> server.py; \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "httpd.socket = ssl.wrap_socket(httpd.socket, certfile='server.crt', keyfile='server.key', server_side=True)" >> server.py; \ -@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "for x in range(1,2): httpd.handle_request()" >> server.py; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "httpd.handle_request()" >> server.py; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ echo "httpd.handle_request()" >> server.py; \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ python server.py& \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ sleep 1; \ -@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ./img2sixel 'https://localhost:4443/snake.sixel'; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ! ./img2sixel 'https://localhost:4443/snake.sixel'; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ sleep 1; \ +@HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ./img2sixel -k 'https://localhost:4443/snake.sixel'; \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ fi +@HAVE_CURL_FALSE@@WANT_IMG2SIXEL_TRUE@ ! $(WINE) ./img2sixel -k < ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ ! $(WINE) ./sixel2png -i unknown.sixel @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ ! $(WINE) ./sixel2png -% < snake.sixel @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png -H diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 4ff6e13b..b38df617 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -40,8 +40,11 @@ transform image colors to match this set of colorsspecify map. .TP 5 .B \-e, \-\-monochrome output monochrome sixel image. -this option assumes the terminal -background color is black. +this option assumes the terminal background color is black. +.TP 5 +.B \-k, \-\-insecure +allow to connect to SSL sites without certs +(enabled only when configured with --with-libcurl) .TP 5 .B \-i, \-\-invert assume the terminal background color is white. diff --git a/converters/img2sixel.c b/converters/img2sixel.c index dcacc95f..19cd6b9c 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -141,7 +141,7 @@ prepare_builtin_palette(int builtin_palette) static sixel_dither_t * -prepare_specified_palette(char const *mapfile, int reqcolors) +prepare_specified_palette(char const *mapfile, int reqcolors, int finsecure) { unsigned char *mappixels; sixel_dither_t *dither = NULL; @@ -160,7 +160,7 @@ prepare_specified_palette(char const *mapfile, int reqcolors) ret = load_image_file(mapfile, &map_sx, &map_sy, &palette, &ncolors, &pixelformat, &frame_count, &loop_count, - &delays, /* fstatic */ 1, + &delays, /* fstatic */ 1, finsecure, /* reqcolors */ 256, &mappixels); if (ret != 0 || mappixels == NULL || map_sx * map_sy == 0) { @@ -228,6 +228,7 @@ typedef struct Settings { enum loopMode loop_mode; enum paletteType palette_type; int f8bit; + int finsecure; int finvert; int fuse_macro; int fignore_delay; @@ -277,7 +278,8 @@ prepare_palette(sixel_dither_t *former_dither, return former_dither; } dither = prepare_specified_palette(psettings->mapfile, - psettings->reqcolors); + psettings->reqcolors, + psettings->finsecure); } else if (psettings->builtin_palette) { if (former_dither) { return former_dither; @@ -803,6 +805,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) ppalette, &ncolors, &pixelformat, &frame_count, &loop_count, &delays, psettings->fstatic, + psettings->finsecure, psettings->reqcolors, &pixels); @@ -1023,6 +1026,9 @@ void show_help(void) "-e, --monochrome output monochrome sixel image\n" " this option assumes the terminal\n" " background color is black\n" + "-k, --insecure allow to connect to SSL sites without\n" + " certs(enabled only when configured\n" + " with --with-libcurl)\n" "-i, --invert assume the terminal background color\n" " is white, make sense only when -e\n" " option is given\n" @@ -1186,7 +1192,7 @@ main(int argc, char *argv[]) int number; char unit[32]; int parsed; - char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:C:DVH"; + char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:kil:t:ugvSn:PE:C:DVH"; settings_t settings = { -1, /* reqcolors */ @@ -1202,6 +1208,7 @@ main(int argc, char *argv[]) LOOP_AUTO, /* loop_mode */ PALETTETYPE_AUTO, /* palette_type */ 0, /* f8bit */ + 0, /* finsecure */ 0, /* finvert */ 0, /* fuse_macro */ 0, /* fignore_delay */ @@ -1243,6 +1250,7 @@ main(int argc, char *argv[]) {"resampling", required_argument, &long_opt, 'r'}, {"quality", required_argument, &long_opt, 'q'}, {"palette-type", required_argument, &long_opt, 't'}, + {"insecure", no_argument, &long_opt, 'k'}, {"invert", no_argument, &long_opt, 'i'}, {"loop-control", required_argument, &long_opt, 'l'}, {"use-macro", no_argument, &long_opt, 'u'}, @@ -1491,6 +1499,9 @@ main(int argc, char *argv[]) goto argerr; } break; + case 'k': + settings.finsecure = 1; + break; case 'i': settings.finvert = 1; break; @@ -1605,6 +1616,13 @@ main(int argc, char *argv[]) " with arguments [filename ...].\n"); goto argerr; } +#if !HAVE_LIBCURL + if (settings.insecure) { + fprintf(stderr, "option -k, --insecure is enabled " + "only when configured with --with-libcurl.\n"); + goto argerr; + } +#endif /* HAVE_LIBCURL */ if (settings.show_version) { show_version(); exit_code = EXIT_SUCCESS; @@ -1643,7 +1661,7 @@ main(int argc, char *argv[]) argerr: exit_code = EXIT_FAILURE; - fprintf(stderr, "usage: img2sixel [-78eIiugvSPDVH] [-p colors] [-m file] [-d diffusiontype]\n" + fprintf(stderr, "usage: img2sixel [-78eIkiugvSPDVH] [-p colors] [-m file] [-d diffusiontype]\n" " [-f findtype] [-s selecttype] [-c geometory] [-w width]\n" " [-h height] [-r resamplingtype] [-q quality] [-l loopmode]\n" " [-t palettetype] [-n macronumber] [-C score] [-b palette]\n" diff --git a/converters/loader.c b/converters/loader.c index 2d641a21..1dddf09a 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -208,16 +208,17 @@ get_chunk_from_file(char const *filename, chunk_t *pchunk) # ifdef HAVE_LIBCURL static int -get_chunk_from_url(char const *url, chunk_t *pchunk) +get_chunk_from_url(char const *url, chunk_t *pchunk, int finsecure) { CURL *curl; CURLcode code; + int ret = (-1); chunk_init(pchunk, 1024); curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - if (strncmp(url, "https://", 8) == 0) { + if (strncmp(url, "https://", 8) == 0 && finsecure) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); } @@ -227,11 +228,18 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) if (code != CURLE_OK) { fprintf(stderr, "curl_easy_perform('%s') failed.\n" "code: %d.\n", url, code); - curl_easy_cleanup(curl); - return (-1); + if (code == CURLE_SSL_CACERT) { + fprintf(stderr, "if you'd like to turn off libcurl's verification " + "of the certificate, use the -k (or --insecure) " + " option.\n"); + } + goto end; } + ret = 0; + +end: curl_easy_cleanup(curl); - return 0; + return ret; } # endif /* HAVE_LIBCURL */ @@ -477,11 +485,11 @@ load_sixel(unsigned char *buffer, int size, static int -get_chunk(char const *filename, chunk_t *pchunk) +get_chunk(char const *filename, chunk_t *pchunk, int finsecure) { if (filename != NULL && strstr(filename, "://")) { # ifdef HAVE_LIBCURL - return get_chunk_from_url(filename, pchunk); + return get_chunk_from_url(filename, pchunk, finsecure); # else fprintf(stderr, "To specify URI schemes, you have to " "configure this program with --with-libcurl " @@ -987,7 +995,7 @@ load_image_file(char const *filename, int *psx, int *psy, unsigned char **ppalette, int *pncolors, int *ppixelformat, int *pframe_count, int *ploop_count, int **ppdelay, - int fstatic, int reqcolors, + int fstatic, int finsecure, int reqcolors, unsigned char **ppixels) { int comp; @@ -1001,7 +1009,7 @@ load_image_file(char const *filename, int *psx, int *psy, *ppalette = NULL; } - ret = get_chunk(filename, &chunk); + ret = get_chunk(filename, &chunk, finsecure); if (ret != 0) { return (-1); } diff --git a/converters/loader.h b/converters/loader.h index d1a1ebe9..8ddcddb2 100644 --- a/converters/loader.h +++ b/converters/loader.h @@ -31,7 +31,7 @@ load_image_file(char const *filename, int *psx, int *psy, unsigned char **ppalette, int *pncolors, int *ppixelformat, int *pframe_count, int *ploop_count, int **ppdelay, - int fstatic, int reqcolors, + int fstatic, int finsecure, int reqcolors, unsigned char **ppixels); #ifdef __cplusplus diff --git a/converters/shell-completion/bash/img2sixel b/converters/shell-completion/bash/img2sixel index 9095f49b..5e4f4c6c 100644 --- a/converters/shell-completion/bash/img2sixel +++ b/converters/shell-completion/bash/img2sixel @@ -114,6 +114,7 @@ _img2sixel() -p --colors \ -m --mapfile \ -e --monochrome \ + -k --insecure \ -i --invert \ -I --high-color \ -u --use-macro \ diff --git a/converters/shell-completion/zsh/_img2sixel b/converters/shell-completion/zsh/_img2sixel index e124bae4..7f71c026 100644 --- a/converters/shell-completion/zsh/_img2sixel +++ b/converters/shell-completion/zsh/_img2sixel @@ -104,6 +104,7 @@ _arguments -S -s -A "-*" -S \ {-p,--colors=}'[specify number of colors to reduce the image to]' \ {-m,--mapfile=}'[transform image colors to match specified set of colors]':files:_files \ {-e,--monochrome}'[output monochrome sixel image]' \ + {-k,--insecure}'[allow to connect to SSL sites without certs]' \ {-i,--invert}'[assume the terminal background color is white]' \ {-I,--high-color}'[output 15bpp sixel image]' \ {-u,--use-macro}'[use DECDMAC and DECINVM for GIF animation]' \ From 065eea7ad4329e0837980cfed271ed058d1905f4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 4 Dec 2014 12:19:30 +0900 Subject: [PATCH 006/451] Fix a stupid typo --- converters/img2sixel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 19cd6b9c..9629f24f 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1617,7 +1617,7 @@ main(int argc, char *argv[]) goto argerr; } #if !HAVE_LIBCURL - if (settings.insecure) { + if (settings.finsecure) { fprintf(stderr, "option -k, --insecure is enabled " "only when configured with --with-libcurl.\n"); goto argerr; From 8854c3d19d4e010f7a51989bf7cf4314f83bf6d9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 5 Dec 2014 20:25:01 +0900 Subject: [PATCH 007/451] Suppress a clang warning: -Wunused-parameter --- converters/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/converters/loader.c b/converters/loader.c index 1dddf09a..cb6bee96 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -491,6 +491,7 @@ get_chunk(char const *filename, chunk_t *pchunk, int finsecure) # ifdef HAVE_LIBCURL return get_chunk_from_url(filename, pchunk, finsecure); # else + (void) finsecure; /* unused */ fprintf(stderr, "To specify URI schemes, you have to " "configure this program with --with-libcurl " "option at compile time.\n"); From 616658f0737f66ed379411560805cae5502ca54a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Dec 2014 17:24:58 +0900 Subject: [PATCH 008/451] Add --enable-tests configure option --- config.h.in | 3 +++ configure | 27 +++++++++++++++++++++++++++ configure.ac | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/config.h.in b/config.h.in index 51d74294..b1372280 100644 --- a/config.h.in +++ b/config.h.in @@ -174,6 +174,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UNISTD_H +/* enable tests */ +#undef HAVE_TESTS + /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H diff --git a/configure b/configure index 7d5e4f56..8a6a5a30 100755 --- a/configure +++ b/configure @@ -658,6 +658,8 @@ AM_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG +COND_TESTS_FALSE +COND_TESTS_TRUE COND_GCOV_FALSE COND_GCOV_TRUE COND_DEBUG_FALSE @@ -809,6 +811,7 @@ with_bashcompletiondir with_zshcompletiondir enable_debug enable_gcov +enable_tests ' ac_precious_vars='build_alias host_alias @@ -1463,6 +1466,7 @@ Optional Features: --disable-sixel2png whether to build sixel2png (default: yes) --enable-debug Use debug macro and specific CFLAGS --enable-gcov Use gcov + --enable-tests Build tests Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -11848,6 +11852,24 @@ else fi +# Check whether --enable-tests was given. +if test "${enable_tests+set}" = set; then : + enableval=$enable_tests; +$as_echo "#define HAVE_TESTS 1" >>confdefs.h + +else + enable_tests=no +fi + + if test x$enable_tests != xno; then + COND_TESTS_TRUE= + COND_TESTS_FALSE='#' +else + COND_TESTS_TRUE='#' + COND_TESTS_FALSE= +fi + + # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -14498,6 +14520,10 @@ if test -z "${COND_GCOV_TRUE}" && test -z "${COND_GCOV_FALSE}"; then as_fn_error $? "conditional \"COND_GCOV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${COND_TESTS_TRUE}" && test -z "${COND_TESTS_FALSE}"; then + as_fn_error $? "conditional \"COND_TESTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -16766,5 +16792,6 @@ echo " Zsh completion dir : $zshcompletiondir" #echo " WIC integration : $have_wic" echo " gcov integration : $enable_gcov" echo " debugging : $enable_debug" +echo " tests : $enable_tests" echo "" echo "" diff --git a/configure.ac b/configure.ac index 216fcf60..f19b1534 100644 --- a/configure.ac +++ b/configure.ac @@ -118,6 +118,13 @@ AC_ARG_ENABLE([gcov], [enable_gcov=no]) AM_CONDITIONAL([COND_GCOV], [test x$enable_gcov != xno]) +AC_ARG_ENABLE([tests], + [AS_HELP_STRING([--enable-tests], + [Build tests])], + [AC_DEFINE(HAVE_TESTS, [1], [enable tests])], + [enable_tests=no]) +AM_CONDITIONAL([COND_TESTS], [test x$enable_tests != xno]) + # Checks for programs. AC_PROG_CC AC_PROG_INSTALL @@ -432,5 +439,6 @@ echo " Zsh completion dir : $zshcompletiondir" #echo " WIC integration : $have_wic" echo " gcov integration : $enable_gcov" echo " debugging : $enable_debug" +echo " tests : $enable_tests" echo "" echo "" From dfe5703aa47699ca9134627e87cfc054c38181f6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Dec 2014 19:29:37 +0900 Subject: [PATCH 009/451] Add basic tests of dither.c --- .travis.yml | 2 +- Makefile.am | 5 ++- Makefile.in | 5 ++- converters/Makefile.am | 16 ++++++++- converters/Makefile.in | 47 +++++++++++++++++++++++--- src/dither.c | 75 ++++++++++++++++++++++++++++++++++++++++++ src/dither.h | 5 +++ 7 files changed, 146 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index cafa4ad8..14b6c6a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ env: - XCC=clang HOST= PREFIX=/usr DEBUG=--enable-debug WINE= GDKPIXBUF="--with-gdk-pixbuf2" GD="--with-gd" JPEG=--without-jpeg PNG=--without-png - XCC=clang HOST= PREFIX=/usr DEBUG=--enable-debug WINE= GDKPIXBUF="--with-gdk-pixbuf2" GD="--with-gd" LIBCURL="--with-libcurl" JPEG=--without-jpeg PNG=--without-png - XCC=gcc HOST= PREFIX=/usr DEBUG=--enable-debug WINE= GDKPIXBUF="--with-gdk-pixbuf2" GD="--with-gd" JPEG="--with-jpeg" PNG="--with-png" LIBCURL="--with-libcurl" - - XCC=clang HOST= PREFIX=/usr DEBUG=--enable-debug WINE= JPEG="--with-jpeg" PNG="--with-png" LIBCURL="--with-libcurl" GCOV="--enable-gcov" STATIC="--disable-shared" + - XCC=clang HOST= PREFIX=/usr DEBUG="--enable-tests --enable-debug" WINE= JPEG="--with-jpeg" PNG="--with-png" LIBCURL="--with-libcurl" GCOV="--enable-gcov" STATIC="--disable-shared" before_install: - "sudo apt-get -qq update --force-yes > /dev/null" diff --git a/Makefile.am b/Makefile.am index 713603b2..25aa1d98 100644 --- a/Makefile.am +++ b/Makefile.am @@ -7,11 +7,14 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} pkgconfigdir = @pkgconfigdir@ pkgconfig_DATA = libsixel.pc -CLEANFILES = valgrind.log test.log +CLEANFILES = valgrind.log test.log unittest.log all-am: cp package.json.in package.json +unittest: all + cd converters && $(MAKE) unittest 2>&1 |tee unittest.log + test: all cd converters && $(MAKE) test 2>&1 |tee test.log diff --git a/Makefile.in b/Makefile.in index f7b32716..46e6cd44 100644 --- a/Makefile.in +++ b/Makefile.in @@ -367,7 +367,7 @@ SUBDIRS = include src converters DIST_SUBDIRS = $(SUBDIRS) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} pkgconfig_DATA = libsixel.pc -CLEANFILES = valgrind.log test.log +CLEANFILES = valgrind.log test.log unittest.log all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -882,6 +882,9 @@ uninstall-am: uninstall-pkgconfigDATA all-am: cp package.json.in package.json +unittest: all + cd converters && $(MAKE) unittest 2>&1 |tee unittest.log + test: all cd converters && $(MAKE) test 2>&1 |tee test.log diff --git a/converters/Makefile.am b/converters/Makefile.am index ea566b69..437cf184 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -42,7 +42,21 @@ sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) dist_man_MANS += sixel2png.1 endif -test: all +if COND_TESTS +bin_PROGRAMS += tests +tests_SOURCES = tests.c +tests_CPPFLAGS = -I$(top_builddir)/include/ -I$(top_builddir)/src/ $(AM_CPPFLAGS) +tests_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +tests_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +dist_man_MANS += sixel2png.1 +endif + +unittest: all +if COND_TESTS + ./tests +endif + +test: all unittest if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -d invalid_option) test ! $$($(WINE) ./img2sixel -r invalid_option) diff --git a/converters/Makefile.in b/converters/Makefile.in index 848a2054..55e7d41f 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -79,13 +79,15 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) +bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) @WANT_IMG2SIXEL_TRUE@am__append_1 = img2sixel @WANT_IMG2SIXEL_TRUE@am__append_2 = img2sixel.1 @WANT_IMG2SIXEL_TRUE@am__append_3 = shell-completion/bash/img2sixel @WANT_IMG2SIXEL_TRUE@am__append_4 = shell-completion/zsh/_img2sixel @WANT_SIXEL2PNG_TRUE@am__append_5 = sixel2png @WANT_SIXEL2PNG_TRUE@am__append_6 = sixel2png.1 +@COND_TESTS_TRUE@am__append_7 = tests +@COND_TESTS_TRUE@am__append_8 = sixel2png.1 subdir = converters SUBDIRS = DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ @@ -106,6 +108,7 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @WANT_IMG2SIXEL_TRUE@am__EXEEXT_1 = img2sixel$(EXEEXT) @WANT_SIXEL2PNG_TRUE@am__EXEEXT_2 = sixel2png$(EXEEXT) +@COND_TESTS_TRUE@am__EXEEXT_3 = tests$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(bashcompletiondir)" \ "$(DESTDIR)$(zshcompletiondir)" @@ -147,6 +150,14 @@ sixel2png_OBJECTS = $(am_sixel2png_OBJECTS) sixel2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sixel2png_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__tests_SOURCES_DIST = tests.c +@COND_TESTS_TRUE@am_tests_OBJECTS = tests-tests.$(OBJEXT) +tests_OBJECTS = $(am_tests_OBJECTS) +@COND_TESTS_TRUE@tests_DEPENDENCIES = $(top_builddir)/src/libsixel.la \ +@COND_TESTS_TRUE@ $(am__DEPENDENCIES_1) +tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(tests_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -181,9 +192,9 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(img2sixel_SOURCES) $(sixel2png_SOURCES) +SOURCES = $(img2sixel_SOURCES) $(sixel2png_SOURCES) $(tests_SOURCES) DIST_SOURCES = $(am__img2sixel_SOURCES_DIST) \ - $(am__sixel2png_SOURCES_DIST) + $(am__sixel2png_SOURCES_DIST) $(am__tests_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ @@ -420,7 +431,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ DIST_SUBDIRS = $(SUBDIRS) -dist_man_MANS = $(am__append_2) $(am__append_6) +dist_man_MANS = $(am__append_2) $(am__append_6) $(am__append_8) dist_bashcompletion_DATA = $(am__append_3) dist_zshcompletion_DATA = $(am__append_4) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage @@ -445,6 +456,10 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe @WANT_SIXEL2PNG_TRUE@ $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) @WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +@COND_TESTS_TRUE@tests_SOURCES = tests.c +@COND_TESTS_TRUE@tests_CPPFLAGS = -I$(top_builddir)/include/ -I$(top_builddir)/src/ $(AM_CPPFLAGS) +@COND_TESTS_TRUE@tests_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +@COND_TESTS_TRUE@tests_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) all: all-recursive .SUFFIXES: @@ -537,6 +552,10 @@ sixel2png$(EXEEXT): $(sixel2png_OBJECTS) $(sixel2png_DEPENDENCIES) $(EXTRA_sixel @rm -f sixel2png$(EXEEXT) $(AM_V_CCLD)$(sixel2png_LINK) $(sixel2png_OBJECTS) $(sixel2png_LDADD) $(LIBS) +tests$(EXEEXT): $(tests_OBJECTS) $(tests_DEPENDENCIES) $(EXTRA_tests_DEPENDENCIES) + @rm -f tests$(EXEEXT) + $(AM_V_CCLD)$(tests_LINK) $(tests_OBJECTS) $(tests_LDADD) $(LIBS) + mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -551,6 +570,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-malloc_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-sixel2png.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-stb_image_write.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tests-tests.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -685,6 +705,20 @@ sixel2png-malloc_stub.obj: malloc_stub.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-malloc_stub.obj `if test -f 'malloc_stub.c'; then $(CYGPATH_W) 'malloc_stub.c'; else $(CYGPATH_W) '$(srcdir)/malloc_stub.c'; fi` +tests-tests.o: tests.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_CPPFLAGS) $(CPPFLAGS) $(tests_CFLAGS) $(CFLAGS) -MT tests-tests.o -MD -MP -MF $(DEPDIR)/tests-tests.Tpo -c -o tests-tests.o `test -f 'tests.c' || echo '$(srcdir)/'`tests.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tests-tests.Tpo $(DEPDIR)/tests-tests.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests.c' object='tests-tests.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_CPPFLAGS) $(CPPFLAGS) $(tests_CFLAGS) $(CFLAGS) -c -o tests-tests.o `test -f 'tests.c' || echo '$(srcdir)/'`tests.c + +tests-tests.obj: tests.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_CPPFLAGS) $(CPPFLAGS) $(tests_CFLAGS) $(CFLAGS) -MT tests-tests.obj -MD -MP -MF $(DEPDIR)/tests-tests.Tpo -c -o tests-tests.obj `if test -f 'tests.c'; then $(CYGPATH_W) 'tests.c'; else $(CYGPATH_W) '$(srcdir)/tests.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tests-tests.Tpo $(DEPDIR)/tests-tests.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests.c' object='tests-tests.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_CPPFLAGS) $(CPPFLAGS) $(tests_CFLAGS) $(CFLAGS) -c -o tests-tests.obj `if test -f 'tests.c'; then $(CYGPATH_W) 'tests.c'; else $(CYGPATH_W) '$(srcdir)/tests.c'; fi` + mostlyclean-libtool: -rm -f *.lo @@ -1064,7 +1098,10 @@ uninstall-man: uninstall-man1 uninstall-dist_zshcompletionDATA uninstall-man uninstall-man1 -test: all +unittest: all +@COND_TESTS_TRUE@ ./tests + +test: all unittest @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -d invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -r invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -s invalid_option) diff --git a/src/dither.c b/src/dither.c index 317fc980..ba0a1a97 100644 --- a/src/dither.c +++ b/src/dither.c @@ -664,6 +664,81 @@ sixel_dither_apply_palette(sixel_dither_t *dither, return dest; } + +#if HAVE_TESTS +static int +test1(void) +{ + sixel_dither_t *dither = NULL; + int nret = EXIT_FAILURE; + + dither = sixel_dither_create(0); + if (dither == NULL) { + perror(NULL); + goto error; + } + nret = EXIT_SUCCESS; + +error: + sixel_dither_unref(dither); + return nret; +} + +static int +test2(void) +{ + sixel_dither_t *dither = NULL; + int colors; + int nret = EXIT_FAILURE; + + dither = sixel_dither_create(INT_MAX); + if (dither == NULL) { + perror(NULL); + goto error; + } + sixel_dither_set_body_only(dither, 1); + colors = sixel_dither_get_num_of_histogram_colors(dither); + if (colors != -1) { + perror(NULL); + goto error; + } + nret = EXIT_SUCCESS; + +error: + sixel_dither_unref(dither); + return nret; +} + +int +sixel_dither_tests_main(int argc, char *argv[]) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + test2, + }; + + (void) argv; + (void) argc; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + perror(NULL); + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/dither.h b/src/dither.h index a7fae9a1..4cac8b20 100644 --- a/src/dither.h +++ b/src/dither.h @@ -57,6 +57,11 @@ int sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, int width, int height, int const pixelformat); +#if HAVE_TESTS +int +sixel_dither_tests_main(int argc, char *argv[]); +#endif + #ifdef __cplusplus } #endif From 68570358dc0ad02ebb91bcf8d912c5fc76363f4a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Dec 2014 19:50:45 +0900 Subject: [PATCH 010/451] Add missing tests.c --- converters/tests.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 converters/tests.c diff --git a/converters/tests.c b/converters/tests.c new file mode 100644 index 00000000..d4372a4e --- /dev/null +++ b/converters/tests.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2014 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#if defined(HAVE_INTTYPES_H) +# include +#endif + +#include "dither.h" +#include "quant.h" +#include "sixel.h" + +#if HAVE_TESTS + +int +main(int argc, char *argv[]) +{ + int nret = EXIT_FAILURE; + nret = sixel_dither_tests_main(argc, argv); + if (nret != EXIT_SUCCESS) { + goto error; + } + puts("done."); +error: + return nret; +} + +#endif + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 835578a395af5e221b1a89c1f11d069c313bca20 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 15:43:27 +0900 Subject: [PATCH 011/451] Cleanup scale.c --- converters/img2sixel.c | 18 +-- converters/scale.c | 264 +++++++++++++++++++++++------------------ converters/scale.h | 15 ++- 3 files changed, 169 insertions(+), 128 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 772c2dbe..10ded5c2 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -328,6 +328,7 @@ do_resize(unsigned char **ppixels, int size; int n; unsigned char *scaled_frame = NULL; + int nret; if (psettings->percentwidth > 0) { psettings->pixelwidth = *psx * psettings->percentwidth / 100; @@ -357,15 +358,16 @@ do_resize(unsigned char **ppixels, } for (n = 0; n < frame_count; ++n) { - scaled_frame = LSS_scale(frames[n], *psx, *psy, 3, - psettings->pixelwidth, - psettings->pixelheight, - psettings->method_for_resampling); - if (scaled_frame == NULL) { - return (-1); + scaled_frame = p + size * n; + nret = sixel_helper_scale_image( + frames[n], *psx, *psy, 3, + psettings->pixelwidth, + psettings->pixelheight, + psettings->method_for_resampling, + scaled_frame); + if (nret != 0) { + return nret; } - memcpy(p + size * n, scaled_frame, size); - free(scaled_frame); } for (n = 0; n < frame_count; ++n) { frames[n] = p + size * n; diff --git a/converters/scale.c b/converters/scale.c index 7fc27f8b..fe499382 100644 --- a/converters/scale.c +++ b/converters/scale.c @@ -169,6 +169,7 @@ hamming(const double d) return 0.54 + 0.46 * cos(d * M_PI); } + static unsigned char normalize(double x, double total) { @@ -185,152 +186,185 @@ normalize(double x, double total) } -unsigned char * -LSS_scale(unsigned char const *pixels, - int srcx, int srcy, int depth, - int destx, int desty, - enum methodForResampling const methodForResampling) +static void +scale_without_resampling( + unsigned char const *pixels, + int const srcw, + int const srch, + int const dstw, + int const dsth, + int const depth, + unsigned char *result) +{ + int w; + int h; + int x; + int y; + int i; + int index; + + for (h = 0; h < dsth; h++) { + for (w = 0; w < dstw; w++) { + x = w * srcw / dstw; + y = h * srch / dsth; + for (i = 0; i < depth; i++) { + index = (y * srcw + x) * depth + i; + result[(h * dstw + w) * depth + i] = pixels[index]; + } + } + } +} + + +typedef double (*resample_fn_t)(double const d); + +static void +scale_with_resampling( + unsigned char const *pixels, + int const srcw, + int const srch, + int const dstw, + int const dsth, + int const depth, + resample_fn_t const f_resample, + double n, + unsigned char *result) { - unsigned char *result; - double *offsets; - int i, index; - double n; - int h, w; - int y, x; + int w; + int h; + int x; + int y; + int i; + int index; int x_first, x_last, y_first, y_last; double center_x, center_y; double diff_x, diff_y; double weight; double total; - double (*f_resample)(double const d); + double offsets[8]; + + for (h = 0; h < dsth; h++) { + for (w = 0; w < dstw; w++) { + total = 0.0; + for (i = 0; i < depth; i++) { + offsets[i] = 0; + } + + /* retrieve range of affected pixels */ + if (dstw >= srcw) { + center_x = (w + 0.5) * srcw / dstw; + x_first = MAX(center_x - n, 0); + x_last = MIN(center_x + n, srcw - 1); + } else { + center_x = w + 0.5; + x_first = MAX(floor((center_x - n) * srcw / dstw), 0); + x_last = MIN(floor((center_x + n) * srcw / dstw), srcw - 1); + } + if (dsth >= srch) { + center_y = (h + 0.5) * srch / dsth; + y_first = MAX(center_y - n, 0); + y_last = MIN(center_y + n, srch - 1); + } else { + center_y = h + 0.5; + y_first = MAX(floor((center_y - n) * srch / dsth), 0); + y_last = MIN(floor((center_y + n) * srch / dsth), srch - 1); + } + + /* accumerate weights of affected pixels */ + for (y = y_first; y <= y_last; y++) { + for (x = x_first; x <= x_last; x++) { + if (dstw >= srcw) { + diff_x = (x + 0.5) - center_x; + } else { + diff_x = (x + 0.5) * dstw / srcw - center_x; + } + if (dsth >= srch) { + diff_y = (y + 0.5) - center_y; + } else { + diff_y = (y + 0.5) * dsth / srch - center_y; + } + weight = f_resample(fabs(diff_x)) * f_resample(fabs(diff_y)); + for (i = 0; i < depth; i++) { + index = (y * srcw + x) * depth + i; + offsets[i] += pixels[index] * weight; + } + total += weight; + } + } + + /* normalize */ + if (total > 0.0) { + for (i = 0; i < depth; i++) { + index = (h * dstw + w) * depth + i; + result[index] = normalize(offsets[i], total); + } + } + } + } +} - result = malloc(destx * desty * depth); - offsets = malloc(sizeof(*offsets) * depth); + +int +sixel_helper_scale_image( + unsigned char const /* in */ *pixels, /* source image data */ + int const /* in */ srcw, /* source image width */ + int const /* in */ srch, /* source image height */ + int const /* in */ depth, /* source image depth */ + int const /* in */ dstw, /* destination image width */ + int const /* in */ dsth, /* destination image height */ + int const /* in */ method_for_resampling, /* one of methodForResampling */ + unsigned char /* out */ *result) +{ + if (depth > 4) { + return (-1); + } /* choose re-sampling strategy */ - switch (methodForResampling) { -#if 0 + switch (method_for_resampling) { case RES_NEAREST: - f_resample = nearest_neighbor; - n = 1.0; + scale_without_resampling(pixels, srcw, srch, dstw, dsth, depth, + result); break; -#endif case RES_GAUSSIAN: - f_resample = gaussian; - n = 1.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + gaussian, 1.0, result); break; case RES_HANNING: - f_resample = hanning; - n = 1.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + hanning, 1.0, result); break; case RES_HAMMING: - f_resample = hamming; - n = 1.0; - break; - case RES_BILINEAR: - f_resample = bilinear; - n = 1.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + hamming, 1.0, result); break; case RES_WELSH: - f_resample = welsh; - n = 1.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + welsh, 1.0, result); break; case RES_BICUBIC: - f_resample = bicubic; - n = 2.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + bicubic, 2.0, result); break; case RES_LANCZOS2: - f_resample = lanczos2; - n = 3.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + lanczos2, 3.0, result); break; case RES_LANCZOS3: - f_resample = lanczos3; - n = 3.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + lanczos3, 3.0, result); break; case RES_LANCZOS4: - f_resample = lanczos4; - n = 4.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + lanczos4, 4.0, result); break; + case RES_BILINEAR: default: - f_resample = bilinear; - n = 1.0; + scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, + bilinear, 1.0, result); break; } - - if (methodForResampling == RES_NEAREST) { - for (h = 0; h < desty; h++) { - for (w = 0; w < destx; w++) { - x = w * srcx / destx; - y = h * srcy / desty; - for (i = 0; i < depth; i++) { - index = (y * srcx + x) * depth + i; - result[(h * destx + w) * depth + i] = pixels[index]; - } - } - } - } else { - for (h = 0; h < desty; h++) { - for (w = 0; w < destx; w++) { - total = 0.0; - for (i = 0; i < depth; i++) { - offsets[i] = 0; - } - - /* retrieve range of affected pixels */ - if (destx >= srcx) { - center_x = (w + 0.5) * srcx / destx; - x_first = MAX(center_x - n, 0); - x_last = MIN(center_x + n, srcx - 1); - } else { - center_x = w + 0.5; - x_first = MAX(floor((center_x - n) * srcx / destx), 0); - x_last = MIN(floor((center_x + n) * srcx / destx), srcx - 1); - } - if (desty >= srcy) { - center_y = (h + 0.5) * srcy / desty; - y_first = MAX(center_y - n, 0); - y_last = MIN(center_y + n, srcy - 1); - } else { - center_y = h + 0.5; - y_first = MAX(floor((center_y - n) * srcy / desty), 0); - y_last = MIN(floor((center_y + n) * srcy / desty), srcy - 1); - } - - /* accumerate weights of affected pixels */ - for (y = y_first; y <= y_last; y++) { - for (x = x_first; x <= x_last; x++) { - if (destx >= srcx) { - diff_x = (x + 0.5) - center_x; - } else { - diff_x = (x + 0.5) * destx / srcx - center_x; - } - if (desty >= srcy) { - diff_y = (y + 0.5) - center_y; - } else { - diff_y = (y + 0.5) * desty / srcy - center_y; - } - weight = f_resample(fabs(diff_x)) * f_resample(fabs(diff_y)); - for (i = 0; i < depth; i++) { - index = (y * srcx + x) * depth + i; - offsets[i] += pixels[index] * weight; - } - total += weight; - } - } - - /* normalize */ - if (total > 0.0) { - for (i = 0; i < depth; i++) { - index = (h * destx + w) * depth + i; - result[index] = normalize(offsets[i], total); - } - } - } - } - } - free(offsets); - return result; + return 0; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/converters/scale.h b/converters/scale.h index dc792b94..8eb1a7d7 100644 --- a/converters/scale.h +++ b/converters/scale.h @@ -45,11 +45,16 @@ extern "C" { /* image scaling api */ -unsigned char * -LSS_scale(unsigned char const *pixels, - int srcx, int srcy, int depth, - int destx, int desty, - enum methodForResampling const methodForResampling); +int +sixel_helper_scale_image( + unsigned char const /* in */ *pixels, /* source image data */ + int const /* in */ srcw, /* source image width */ + int const /* in */ srch, /* source image height */ + int const /* in */ depth, /* source image depth */ + int const /* in */ dstw, /* destination image width */ + int const /* in */ dsth, /* destination image height */ + int const /* in */ method_for_resampling, /* one of methodForResampling */ + unsigned char /* out */ *result); #ifdef __cplusplus } From a3c656893c97c460985395e968e83375e9917244 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 16:44:58 +0900 Subject: [PATCH 012/451] Add new API sixel_helper_compute_depth and sixel_helper_normalize_pixelformat --- converters/img2sixel.c | 40 +-------- converters/scale.c | 94 +++++++++++++--------- converters/scale.h | 40 +++++++-- include/sixel.h.in | 26 ++++++ src/Makefile.am | 2 +- src/Makefile.in | 13 ++- src/dither.c | 134 ++---------------------------- src/pixelformat.c | 179 +++++++++++++++++++++++++++++++++++++++++ src/quant.c | 23 +----- src/tosixel.c | 9 ++- 10 files changed, 321 insertions(+), 239 deletions(-) create mode 100644 src/pixelformat.c diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 10ded5c2..e82548ef 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -360,11 +360,11 @@ do_resize(unsigned char **ppixels, for (n = 0; n < frame_count; ++n) { scaled_frame = p + size * n; nret = sixel_helper_scale_image( + scaled_frame, frames[n], *psx, *psy, 3, psettings->pixelwidth, psettings->pixelheight, - psettings->method_for_resampling, - scaled_frame); + psettings->method_for_resampling); if (nret != 0) { return nret; } @@ -492,40 +492,6 @@ wait_stdin(void) #endif /* HAVE_SYS_SELECT_H */ -static int -compute_depth_from_pixelformat(int pixelformat) -{ - int depth = (-1); /* unknown */ - - switch (pixelformat) { - case PIXELFORMAT_ARGB8888: - case PIXELFORMAT_RGBA8888: - depth = 4; - break; - case PIXELFORMAT_RGB888: - case PIXELFORMAT_BGR888: - depth = 3; - break; - case PIXELFORMAT_RGB555: - case PIXELFORMAT_RGB565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_AG88: - case PIXELFORMAT_GA88: - depth = 2; - break; - case PIXELFORMAT_G8: - case PIXELFORMAT_PAL8: - depth = 1; - break; - default: - break; - } - - return depth; -} - - static int output_sixel_without_macro( unsigned char **frames, @@ -817,7 +783,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) goto end; } - depth = compute_depth_from_pixelformat(pixelformat); + depth = sixel_helper_compute_depth(pixelformat); if (depth == (-1)) { nret = (-1); goto end; diff --git a/converters/scale.c b/converters/scale.c index fe499382..8740dd31 100644 --- a/converters/scale.c +++ b/converters/scale.c @@ -188,13 +188,13 @@ normalize(double x, double total) static void scale_without_resampling( - unsigned char const *pixels, + unsigned char *dst, + unsigned char const *src, int const srcw, int const srch, int const dstw, int const dsth, - int const depth, - unsigned char *result) + int const depth) { int w; int h; @@ -209,7 +209,7 @@ scale_without_resampling( y = h * srch / dsth; for (i = 0; i < depth; i++) { index = (y * srcw + x) * depth + i; - result[(h * dstw + w) * depth + i] = pixels[index]; + dst[(h * dstw + w) * depth + i] = src[index]; } } } @@ -220,15 +220,15 @@ typedef double (*resample_fn_t)(double const d); static void scale_with_resampling( - unsigned char const *pixels, + unsigned char *dst, + unsigned char const *src, int const srcw, int const srch, int const dstw, int const dsth, int const depth, resample_fn_t const f_resample, - double n, - unsigned char *result) + double n) { int w; int h; @@ -286,7 +286,7 @@ scale_with_resampling( weight = f_resample(fabs(diff_x)) * f_resample(fabs(diff_y)); for (i = 0; i < depth; i++) { index = (y * srcw + x) * depth + i; - offsets[i] += pixels[index] * weight; + offsets[i] += src[index] * weight; } total += weight; } @@ -296,7 +296,7 @@ scale_with_resampling( if (total > 0.0) { for (i = 0; i < depth; i++) { index = (h * dstw + w) * depth + i; - result[index] = normalize(offsets[i], total); + dst[index] = normalize(offsets[i], total); } } } @@ -306,64 +306,80 @@ scale_with_resampling( int sixel_helper_scale_image( - unsigned char const /* in */ *pixels, /* source image data */ - int const /* in */ srcw, /* source image width */ - int const /* in */ srch, /* source image height */ - int const /* in */ depth, /* source image depth */ - int const /* in */ dstw, /* destination image width */ - int const /* in */ dsth, /* destination image height */ - int const /* in */ method_for_resampling, /* one of methodForResampling */ - unsigned char /* out */ *result) + unsigned char /* out */ *dst, + unsigned char const /* in */ *src, /* source image data */ + int const /* in */ srcw, /* source image width */ + int const /* in */ srch, /* source image height */ + int const /* in */ pixelformat, /* one of enum pixelFormat */ + int const /* in */ dstw, /* destination image width */ + int const /* in */ dsth, /* destination image height */ + int const /* in */ method_for_resampling) /* one of methodForResampling */ { - if (depth > 4) { - return (-1); + int const depth = sixel_helper_compute_depth(pixelformat); + unsigned char *new_src = NULL; + int nret; + + if (depth != 3) { + new_src = malloc(srcw * srch * 3); + if (new_src == NULL) { + return (-1); + } + + nret = sixel_helper_normalize_pixelformat(new_src, src, + srcw, srch, pixelformat); + if (nret != 0) { + free(new_src); + return (-1); + } + + src = new_src; } /* choose re-sampling strategy */ switch (method_for_resampling) { case RES_NEAREST: - scale_without_resampling(pixels, srcw, srch, dstw, dsth, depth, - result); + scale_without_resampling(dst, src, srcw, srch, dstw, dsth, depth); break; case RES_GAUSSIAN: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - gaussian, 1.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + gaussian, 1.0); break; case RES_HANNING: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - hanning, 1.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + hanning, 1.0); break; case RES_HAMMING: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - hamming, 1.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + hamming, 1.0); break; case RES_WELSH: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - welsh, 1.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + welsh, 1.0); break; case RES_BICUBIC: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - bicubic, 2.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + bicubic, 2.0); break; case RES_LANCZOS2: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - lanczos2, 3.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + lanczos2, 3.0); break; case RES_LANCZOS3: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - lanczos3, 3.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + lanczos3, 3.0); break; case RES_LANCZOS4: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - lanczos4, 4.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + lanczos4, 4.0); break; case RES_BILINEAR: default: - scale_with_resampling(pixels, srcw, srch, dstw, dsth, depth, - bilinear, 1.0, result); + scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, + bilinear, 1.0); break; } + free(new_src); return 0; } diff --git a/converters/scale.h b/converters/scale.h index 8eb1a7d7..f84fe176 100644 --- a/converters/scale.h +++ b/converters/scale.h @@ -47,14 +47,38 @@ extern "C" { int sixel_helper_scale_image( - unsigned char const /* in */ *pixels, /* source image data */ - int const /* in */ srcw, /* source image width */ - int const /* in */ srch, /* source image height */ - int const /* in */ depth, /* source image depth */ - int const /* in */ dstw, /* destination image width */ - int const /* in */ dsth, /* destination image height */ - int const /* in */ method_for_resampling, /* one of methodForResampling */ - unsigned char /* out */ *result); + unsigned char /* out */ *dst, + unsigned char const /* in */ *src, /* source image data */ + int const /* in */ srcw, /* source image width */ + int const /* in */ srch, /* source image height */ + int const /* in */ pixelformat, /* source image depth */ + int const /* in */ dstw, /* destination image width */ + int const /* in */ dsth, /* destination image height */ + int const /* in */ method_for_resampling); /* one of methodForResampling */ + +#ifdef __cplusplus +} +#endif + +/* helper API */ + +#ifdef __cplusplus +extern "C" { +#endif + +int +sixel_helper_compute_depth( + int /* in */ pixelformat /* one of enum pixelFormat */ +); + +int +sixel_helper_normalize_pixelformat( + unsigned char /* out */ *dst, /* destination image */ + unsigned char const /* in */ *src, /* source image */ + int /* in */ width, /* source image width */ + int /* in */ height, /* source image height */ + int const /* in */ pixelformat /* source image pixelformat */ +); #ifdef __cplusplus } diff --git a/include/sixel.h.in b/include/sixel.h.in index f51421ad..5cd6eba9 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -351,6 +351,32 @@ sixel_decode( } #endif +/* helper API */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* compute pixel depth from pixelformat */ +int +sixel_helper_compute_depth( + int /* in */ pixelformat /* one of enum pixelFormat */ +); + +/* convert pixelFormat into PIXELFORMAT_RGB888 */ +int +sixel_helper_normalize_pixelformat( + unsigned char /* out */ *dst, /* destination image */ + unsigned char const /* in */ *src, /* source image */ + int /* in */ width, /* source image width */ + int /* in */ height, /* source image height */ + int const /* in */ pixelformat /* source image pixelformat */ +); + +#ifdef __cplusplus +} +#endif + #endif /* LIBSIXEL_SIXEL_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/Makefile.am b/src/Makefile.am index 84e6e332..1902a883 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,7 +6,7 @@ endif CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) diff --git a/src/Makefile.in b/src/Makefile.in index eb72a948..bd749740 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -125,7 +125,8 @@ LTLIBRARIES = $(lib_LTLIBRARIES) libsixel_la_LIBADD = am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ - libsixel_la-quant.lo libsixel_la-dither.lo + libsixel_la-quant.lo libsixel_la-dither.lo \ + libsixel_la-pixelformat.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -337,7 +338,7 @@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) @@ -424,6 +425,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-output.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-pixelformat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-quant.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-tosixel.Plo@am__quote@ @@ -483,6 +485,13 @@ libsixel_la-dither.lo: dither.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-dither.lo `test -f 'dither.c' || echo '$(srcdir)/'`dither.c +libsixel_la-pixelformat.lo: pixelformat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-pixelformat.lo -MD -MP -MF $(DEPDIR)/libsixel_la-pixelformat.Tpo -c -o libsixel_la-pixelformat.lo `test -f 'pixelformat.c' || echo '$(srcdir)/'`pixelformat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-pixelformat.Tpo $(DEPDIR)/libsixel_la-pixelformat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixelformat.c' object='libsixel_la-pixelformat.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-pixelformat.lo `test -f 'pixelformat.c' || echo '$(srcdir)/'`pixelformat.c + mostlyclean-libtool: -rm -f *.lo diff --git a/src/dither.c b/src/dither.c index 317fc980..40c9c54a 100644 --- a/src/dither.c +++ b/src/dither.c @@ -285,128 +285,6 @@ sixel_dither_get(int builtin_dither) } -static void -get_rgb(unsigned char *data, int const pixelformat, int depth, - unsigned char *r, unsigned char *g, unsigned char *b) -{ - unsigned int pixels = 0, low, high; - int count = 0; - - while (count < depth) { - pixels = *(data + count) | (pixels << 8); - count++; - } - - /* TODO: we should swap bytes (only necessary on LSByte first hardware?) */ - if (depth == 2) { - low = pixels & 0xff; - high = (pixels >> 8) & 0xff; - pixels = (low << 8) | high; - } - - switch (pixelformat) { - case PIXELFORMAT_RGB555: - *r = ((pixels >> 10) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x1f) << 3; - *b = ((pixels >> 0) & 0x1f) << 3; - break; - case PIXELFORMAT_RGB565: - *r = ((pixels >> 11) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x3f) << 2; - *b = ((pixels >> 0) & 0x1f) << 3; - break; - case PIXELFORMAT_RGB888: - *r = (pixels >> 0) & 0xff; - *g = (pixels >> 8) & 0xff; - *b = (pixels >> 16) & 0xff; - break; - case PIXELFORMAT_BGR555: - *r = ((pixels >> 0) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x1f) << 3; - *b = ((pixels >> 10) & 0x1f) << 3; - break; - case PIXELFORMAT_BGR565: - *r = ((pixels >> 0) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x3f) << 2; - *b = ((pixels >> 11) & 0x1f) << 3; - break; - case PIXELFORMAT_BGR888: - *r = (pixels >> 16) & 0xff; - *g = (pixels >> 8) & 0xff; - *b = (pixels >> 0) & 0xff; - break; - case PIXELFORMAT_RGBA8888: - *r = (pixels >> 24) & 0xff; - *g = (pixels >> 16) & 0xff; - *b = (pixels >> 8) & 0xff; - break; - case PIXELFORMAT_ARGB8888: - *r = (pixels >> 16) & 0xff; - *g = (pixels >> 8) & 0xff; - *b = (pixels >> 0) & 0xff; - break; - case PIXELFORMAT_GA88: - *r = *g = *b = (pixels >> 8) & 0xff; - break; - case PIXELFORMAT_G8: - case PIXELFORMAT_AG88: - *r = *g = *b = pixels & 0xff; - break; - default: - *r = *g = *b = 0; - break; - } -} - - -int -sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, - int width, int height, - int const pixelformat) -{ - int x, y, dst_offset, src_offset, depth; - unsigned char r, g, b; - - switch (pixelformat) { - case PIXELFORMAT_G8: - depth = 1; - break; - case PIXELFORMAT_RGB565: - case PIXELFORMAT_RGB555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: - depth = 2; - break; - case PIXELFORMAT_RGB888: - case PIXELFORMAT_BGR888: - depth = 3; - break; - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: - depth = 4; - break; - default: - return (-1); - } - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - src_offset = depth * (y * width + x); - dst_offset = 3 * (y * width + x); - get_rgb(src + src_offset, pixelformat, depth, &r, &g, &b); - - *(dst + dst_offset + 0) = r; - *(dst + dst_offset + 1) = g; - *(dst + dst_offset + 2) = b; - } - } - - return 0; -} - - static void sixel_dither_set_method_for_largest(sixel_dither_t *dither, int method_for_largest) { @@ -459,8 +337,8 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, } if (pixelformat != PIXELFORMAT_RGB888) { - nret = sixel_normalize_pixelformat(normalized_pixels, data, - width, height, pixelformat); + nret = sixel_helper_normalize_pixelformat(normalized_pixels, data, + width, height, pixelformat); if (nret != 0) { goto end; } @@ -632,10 +510,10 @@ sixel_dither_apply_palette(sixel_dither_t *dither, if (normalized_pixels == NULL) { goto end; } - sixel_normalize_pixelformat(normalized_pixels, - pixels, - width, height, - dither->pixelformat); + sixel_helper_normalize_pixelformat(normalized_pixels, + pixels, + width, height, + dither->pixelformat); input_pixels = normalized_pixels; } else { input_pixels = pixels; diff --git a/src/pixelformat.c b/src/pixelformat.c new file mode 100644 index 00000000..4945f839 --- /dev/null +++ b/src/pixelformat.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2014 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "config.h" + +#include "sixel.h" + + +static void +get_rgb(unsigned char const *data, + int const pixelformat, + int depth, + unsigned char *r, + unsigned char *g, + unsigned char *b) +{ + unsigned int pixels = 0; + unsigned int low; + unsigned int high; + int count = 0; + + while (count < depth) { + pixels = *(data + count) | (pixels << 8); + count++; + } + + /* TODO: we should swap bytes (only necessary on LSByte first hardware?) */ + if (depth == 2) { + low = pixels & 0xff; + high = (pixels >> 8) & 0xff; + pixels = (low << 8) | high; + } + + switch (pixelformat) { + case PIXELFORMAT_RGB555: + *r = ((pixels >> 10) & 0x1f) << 3; + *g = ((pixels >> 5) & 0x1f) << 3; + *b = ((pixels >> 0) & 0x1f) << 3; + break; + case PIXELFORMAT_RGB565: + *r = ((pixels >> 11) & 0x1f) << 3; + *g = ((pixels >> 5) & 0x3f) << 2; + *b = ((pixels >> 0) & 0x1f) << 3; + break; + case PIXELFORMAT_RGB888: + *r = (pixels >> 0) & 0xff; + *g = (pixels >> 8) & 0xff; + *b = (pixels >> 16) & 0xff; + break; + case PIXELFORMAT_BGR555: + *r = ((pixels >> 0) & 0x1f) << 3; + *g = ((pixels >> 5) & 0x1f) << 3; + *b = ((pixels >> 10) & 0x1f) << 3; + break; + case PIXELFORMAT_BGR565: + *r = ((pixels >> 0) & 0x1f) << 3; + *g = ((pixels >> 5) & 0x3f) << 2; + *b = ((pixels >> 11) & 0x1f) << 3; + break; + case PIXELFORMAT_BGR888: + *r = (pixels >> 16) & 0xff; + *g = (pixels >> 8) & 0xff; + *b = (pixels >> 0) & 0xff; + break; + case PIXELFORMAT_RGBA8888: + *r = (pixels >> 24) & 0xff; + *g = (pixels >> 16) & 0xff; + *b = (pixels >> 8) & 0xff; + break; + case PIXELFORMAT_ARGB8888: + *r = (pixels >> 16) & 0xff; + *g = (pixels >> 8) & 0xff; + *b = (pixels >> 0) & 0xff; + break; + case PIXELFORMAT_GA88: + *r = *g = *b = (pixels >> 8) & 0xff; + break; + case PIXELFORMAT_G8: + case PIXELFORMAT_AG88: + *r = *g = *b = pixels & 0xff; + break; + default: + *r = *g = *b = 0; + break; + } +} + + +int +sixel_helper_compute_depth(int pixelformat) +{ + int depth = (-1); /* unknown */ + + switch (pixelformat) { + case PIXELFORMAT_ARGB8888: + case PIXELFORMAT_RGBA8888: + depth = 4; + break; + case PIXELFORMAT_RGB888: + case PIXELFORMAT_BGR888: + depth = 3; + break; + case PIXELFORMAT_RGB555: + case PIXELFORMAT_RGB565: + case PIXELFORMAT_BGR555: + case PIXELFORMAT_BGR565: + case PIXELFORMAT_AG88: + case PIXELFORMAT_GA88: + depth = 2; + break; + case PIXELFORMAT_G8: + case PIXELFORMAT_PAL8: + depth = 1; + break; + default: + break; + } + + return depth; +} + + +int +sixel_helper_normalize_pixelformat( + unsigned char /* out */ *dst, /* destination image */ + unsigned char const /* in */ *src, /* source image */ + int /* in */ width, /* source image width */ + int /* in */ height, /* source image height */ + int const /* in */ pixelformat) /* source image pixelformat */ +{ + int x; + int y; + int dst_offset; + int src_offset; + int depth; + unsigned char r; + unsigned char g; + unsigned char b; + + depth = sixel_helper_compute_depth(pixelformat); + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + src_offset = depth * (y * width + x); + dst_offset = 3 * (y * width + x); + get_rgb(src + src_offset, pixelformat, depth, &r, &g, &b); + + *(dst + dst_offset + 0) = r; + *(dst + dst_offset + 1) = g; + *(dst + dst_offset + 2) = b; + } + } + + return 0; +} + + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/quant.c b/src/quant.c index fa8c7a60..0ce0d864 100644 --- a/src/quant.c +++ b/src/quant.c @@ -599,27 +599,6 @@ mediancut(tupletable2 const colorfreqtable, } -static int -compute_depth_from_pixelformat(int pixelformat) -{ - int depth = (-1); /* unknown */ - - switch (pixelformat) { - case PIXELFORMAT_RGB888: - depth = 3; - break; - case PIXELFORMAT_RGB555: - case PIXELFORMAT_RGB565: - depth = 2; - break; - default: - break; - } - - return depth; -} - - static int computeHash(unsigned char const *data, int const depth) { @@ -1117,7 +1096,7 @@ sixel_quant_make_palette(unsigned char const *data, int ret; unsigned char *palette; tupletable2 colormap; - int depth = compute_depth_from_pixelformat(pixelformat); + int depth = sixel_helper_compute_depth(pixelformat); if (depth == -1) { return NULL; diff --git a/src/tosixel.c b/src/tosixel.c index 93e362ce..289a5fe6 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -1016,8 +1016,13 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, if (normalized_pixels == NULL) { goto error; } - sixel_normalize_pixelformat(normalized_pixels, pixels, width, height, - dither->pixelformat); + nret = sixel_helper_normalize_pixelformat(normalized_pixels, + pixels, + width, height, + dither->pixelformat); + if (nret != 0) { + goto error; + } pixels = normalized_pixels; } paletted_pixels = (unsigned char *)malloc(whole_size); From 24a9bab659ef704f03ad46694b222f2dfd36c3e6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 17:21:33 +0900 Subject: [PATCH 013/451] Cleanup loader.c --- converters/img2sixel.c | 39 +++++++++++++++++++++++++++------------ converters/loader.c | 19 +++++++++++++------ converters/loader.h | 19 +++++++++++++------ src/pixelformat.c | 2 -- 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e82548ef..9dfbc1e7 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -157,12 +157,20 @@ prepare_specified_palette(char const *mapfile, int reqcolors) delays = NULL; - ret = load_image_file(mapfile, &map_sx, &map_sy, - &palette, &ncolors, &pixelformat, - &frame_count, &loop_count, - &delays, /* fstatic */ 1, - /* reqcolors */ 256, - &mappixels); + ret = sixel_helper_load_image_file( + &mappixels, + &palette, + &map_sx, + &map_sy, + &ncolors, + &pixelformat, + &frame_count, + &loop_count, + &delays, + mapfile, + 1, /* fstatic */ + 256 /* reqcolors */ + ); if (ret != 0 || mappixels == NULL || map_sx * map_sy == 0) { goto end; } @@ -772,12 +780,19 @@ convert_to_sixel(char const *filename, settings_t *psettings) frames = NULL; frame = NULL; delays = NULL; - nret = load_image_file(filename, &sx, &sy, - ppalette, &ncolors, &pixelformat, - &frame_count, &loop_count, - &delays, psettings->fstatic, - psettings->reqcolors, - &pixels); + nret = sixel_helper_load_image_file( + &pixels, + ppalette, + &sx, + &sy, + &ncolors, + &pixelformat, + &frame_count, + &loop_count, + &delays, + filename, + psettings->fstatic, + psettings->reqcolors); if (nret != 0 || pixels == NULL || sx * sy == 0) { goto end; diff --git a/converters/loader.c b/converters/loader.c index e7ccd740..6e8d3074 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -982,12 +982,19 @@ arrange_pixelformat(unsigned char *pixels, int width, int height) int -load_image_file(char const *filename, int *psx, int *psy, - unsigned char **ppalette, int *pncolors, - int *ppixelformat, - int *pframe_count, int *ploop_count, int **ppdelay, - int fstatic, int reqcolors, - unsigned char **ppixels) +sixel_helper_load_image_file( + unsigned char /* out */ **ppixels, /* loaded pixel data */ + unsigned char /* out */ **ppalette, /* loaded palette data */ + int /* out */ *psx, /* image width */ + int /* out */ *psy, /* image height */ + int /* out */ *pncolors, /* palette colors */ + int /* out */ *ppixelformat, /* one of enum pixelFormat */ + int /* out */ *pframe_count, /* frame count */ + int /* out */ *ploop_count, /* loop count */ + int /* out */ **ppdelay, /* delay for each frames */ + char const /* in */ *filename, /* source file name */ + int /* in */ fstatic, /* whether to extract static image */ + int /* in */ reqcolors) /* requested number of colors */ { int comp; int stride = (-1); diff --git a/converters/loader.h b/converters/loader.h index d1a1ebe9..25350ea0 100644 --- a/converters/loader.h +++ b/converters/loader.h @@ -27,12 +27,19 @@ extern "C" { #endif int -load_image_file(char const *filename, int *psx, int *psy, - unsigned char **ppalette, int *pncolors, - int *ppixelformat, - int *pframe_count, int *ploop_count, int **ppdelay, - int fstatic, int reqcolors, - unsigned char **ppixels); +sixel_helper_load_image_file( + unsigned char **ppixels, + unsigned char **ppalette, + int *psx, + int *psy, + int *pncolors, + int *ppixelformat, + int *pframe_count, + int *ploop_count, + int **ppdelay, + char const *filename, + int fstatic, + int reqcolors); #ifdef __cplusplus } diff --git a/src/pixelformat.c b/src/pixelformat.c index 4945f839..6e711bc3 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -17,7 +17,6 @@ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * */ #include "config.h" @@ -173,7 +172,6 @@ sixel_helper_normalize_pixelformat( return 0; } - /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ From 2d26afee937dc6c37dd19afdceea97c4dd95c1de Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 17:51:41 +0900 Subject: [PATCH 014/451] Add new API sixel_helper_scale_image --- converters/Makefile.am | 4 +- converters/Makefile.in | 24 ++-------- converters/img2sixel.c | 2 - converters/scale.h | 92 ------------------------------------- include/sixel.h.in | 27 +++++++++++ src/Makefile.am | 2 +- src/Makefile.in | 12 ++++- {converters => src}/scale.c | 3 +- 8 files changed, 45 insertions(+), 121 deletions(-) delete mode 100644 converters/scale.h rename {converters => src}/scale.c (99%) diff --git a/converters/Makefile.am b/converters/Makefile.am index ea566b69..de12bbc3 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -17,8 +17,8 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel -img2sixel_SOURCES = img2sixel.c scale.c malloc_stub.c loader.c frompnm.c \ - scale.h malloc_stub.h loader.h frompnm.h +img2sixel_SOURCES = img2sixel.c malloc_stub.c loader.c frompnm.c \ + malloc_stub.h loader.h frompnm.h img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ diff --git a/converters/Makefile.in b/converters/Makefile.in index 848a2054..2727fc51 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -110,11 +110,10 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(bashcompletiondir)" \ "$(DESTDIR)$(zshcompletiondir)" PROGRAMS = $(bin_PROGRAMS) -am__img2sixel_SOURCES_DIST = img2sixel.c scale.c malloc_stub.c \ - loader.c frompnm.c scale.h malloc_stub.h loader.h frompnm.h +am__img2sixel_SOURCES_DIST = img2sixel.c malloc_stub.c loader.c \ + frompnm.c malloc_stub.h loader.h frompnm.h @WANT_IMG2SIXEL_TRUE@am_img2sixel_OBJECTS = \ @WANT_IMG2SIXEL_TRUE@ img2sixel-img2sixel.$(OBJEXT) \ -@WANT_IMG2SIXEL_TRUE@ img2sixel-scale.$(OBJEXT) \ @WANT_IMG2SIXEL_TRUE@ img2sixel-malloc_stub.$(OBJEXT) \ @WANT_IMG2SIXEL_TRUE@ img2sixel-loader.$(OBJEXT) \ @WANT_IMG2SIXEL_TRUE@ img2sixel-frompnm.$(OBJEXT) @@ -425,8 +424,8 @@ dist_bashcompletion_DATA = $(am__append_3) dist_zshcompletion_DATA = $(am__append_4) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe -@WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c scale.c malloc_stub.c loader.c frompnm.c \ -@WANT_IMG2SIXEL_TRUE@ scale.h malloc_stub.h loader.h frompnm.h +@WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c loader.c frompnm.c \ +@WANT_IMG2SIXEL_TRUE@ malloc_stub.h loader.h frompnm.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ @@ -547,7 +546,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-img2sixel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-malloc_stub.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-scale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-malloc_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-sixel2png.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-stb_image_write.Po@am__quote@ @@ -587,20 +585,6 @@ img2sixel-img2sixel.obj: img2sixel.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-img2sixel.obj `if test -f 'img2sixel.c'; then $(CYGPATH_W) 'img2sixel.c'; else $(CYGPATH_W) '$(srcdir)/img2sixel.c'; fi` -img2sixel-scale.o: scale.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-scale.o -MD -MP -MF $(DEPDIR)/img2sixel-scale.Tpo -c -o img2sixel-scale.o `test -f 'scale.c' || echo '$(srcdir)/'`scale.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-scale.Tpo $(DEPDIR)/img2sixel-scale.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale.c' object='img2sixel-scale.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-scale.o `test -f 'scale.c' || echo '$(srcdir)/'`scale.c - -img2sixel-scale.obj: scale.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-scale.obj -MD -MP -MF $(DEPDIR)/img2sixel-scale.Tpo -c -o img2sixel-scale.obj `if test -f 'scale.c'; then $(CYGPATH_W) 'scale.c'; else $(CYGPATH_W) '$(srcdir)/scale.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-scale.Tpo $(DEPDIR)/img2sixel-scale.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale.c' object='img2sixel-scale.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-scale.obj `if test -f 'scale.c'; then $(CYGPATH_W) 'scale.c'; else $(CYGPATH_W) '$(srcdir)/scale.c'; fi` - img2sixel-malloc_stub.o: malloc_stub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-malloc_stub.o -MD -MP -MF $(DEPDIR)/img2sixel-malloc_stub.Tpo -c -o img2sixel-malloc_stub.o `test -f 'malloc_stub.c' || echo '$(srcdir)/'`malloc_stub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-malloc_stub.Tpo $(DEPDIR)/img2sixel-malloc_stub.Po diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 9dfbc1e7..d0656311 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -66,10 +66,8 @@ #endif #include -#include "scale.h" #include "loader.h" - /* loop modes */ enum loopMode { LOOP_AUTO, /* honer the setting of GIF header */ diff --git a/converters/scale.h b/converters/scale.h deleted file mode 100644 index f84fe176..00000000 --- a/converters/scale.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014 Hayaki Saito - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIBSIXEL_SCALE_H -#define LIBSIXEL_SCALE_H - -/* method for re-sampling */ -enum methodForResampling { - RES_NEAREST, /* Use nearest neighbor method */ - RES_GAUSSIAN, /* Use guaussian filter */ - RES_HANNING, /* Use hanning filter */ - RES_HAMMING, /* Use hamming filter */ - RES_BILINEAR, /* Use bilinear filter */ - RES_WELSH, /* Use welsh filter */ - RES_BICUBIC, /* Use bicubic filter */ - RES_LANCZOS2, /* Use lanczos-2 filter */ - RES_LANCZOS3, /* Use lanczos-3 filter */ - RES_LANCZOS4, /* Use lanczos-4 filter */ -}; - - -#ifdef __cplusplus -extern "C" { -#endif - -/* exported functions */ - -/* image scaling api */ - -int -sixel_helper_scale_image( - unsigned char /* out */ *dst, - unsigned char const /* in */ *src, /* source image data */ - int const /* in */ srcw, /* source image width */ - int const /* in */ srch, /* source image height */ - int const /* in */ pixelformat, /* source image depth */ - int const /* in */ dstw, /* destination image width */ - int const /* in */ dsth, /* destination image height */ - int const /* in */ method_for_resampling); /* one of methodForResampling */ - -#ifdef __cplusplus -} -#endif - -/* helper API */ - -#ifdef __cplusplus -extern "C" { -#endif - -int -sixel_helper_compute_depth( - int /* in */ pixelformat /* one of enum pixelFormat */ -); - -int -sixel_helper_normalize_pixelformat( - unsigned char /* out */ *dst, /* destination image */ - unsigned char const /* in */ *src, /* source image */ - int /* in */ width, /* source image width */ - int /* in */ height, /* source image height */ - int const /* in */ pixelformat /* source image pixelformat */ -); - -#ifdef __cplusplus -} -#endif - - -#endif /* LIBSIXEL_SCALE_H */ - -/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ -/* vim: set expandtab ts=4 : */ -/* EOF */ diff --git a/include/sixel.h.in b/include/sixel.h.in index 5cd6eba9..02fedd1a 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -143,6 +143,20 @@ enum encodePolicy { ENCODEPOLICY_SIZE = 2, /* encode to as small sixel sequence as possible */ }; +/* method for re-sampling */ +enum methodForResampling { + RES_NEAREST = 0, /* Use nearest neighbor method */ + RES_GAUSSIAN = 1, /* Use guaussian filter */ + RES_HANNING = 2, /* Use hanning filter */ + RES_HAMMING = 3, /* Use hamming filter */ + RES_BILINEAR = 4, /* Use bilinear filter */ + RES_WELSH = 5, /* Use welsh filter */ + RES_BICUBIC = 6, /* Use bicubic filter */ + RES_LANCZOS2 = 7, /* Use lanczos-2 filter */ + RES_LANCZOS3 = 8, /* Use lanczos-3 filter */ + RES_LANCZOS4 = 9, /* Use lanczos-4 filter */ +}; + #ifndef LIBSIXEL_DITHER_H /* handle type of dither context object */ @@ -373,6 +387,19 @@ sixel_helper_normalize_pixelformat( int const /* in */ pixelformat /* source image pixelformat */ ); +/* scale image to specified size */ +int +sixel_helper_scale_image( + unsigned char /* out */ *dst, + unsigned char const /* in */ *src, /* source image data */ + int const /* in */ srcw, /* source image width */ + int const /* in */ srch, /* source image height */ + int const /* in */ pixelformat, /* one of enum pixelFormat */ + int const /* in */ dstw, /* destination image width */ + int const /* in */ dsth, /* destination image height */ + int const /* in */ method_for_resampling /* one of methodForResampling */ +); + #ifdef __cplusplus } #endif diff --git a/src/Makefile.am b/src/Makefile.am index 1902a883..9cb49c97 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,7 +6,7 @@ endif CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) diff --git a/src/Makefile.in b/src/Makefile.in index bd749740..a8d96bb8 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -126,7 +126,7 @@ libsixel_la_LIBADD = am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ - libsixel_la-pixelformat.lo + libsixel_la-pixelformat.lo libsixel_la-scale.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -338,7 +338,7 @@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) @@ -427,6 +427,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-output.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-pixelformat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-quant.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-tosixel.Plo@am__quote@ .c.o: @@ -492,6 +493,13 @@ libsixel_la-pixelformat.lo: pixelformat.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-pixelformat.lo `test -f 'pixelformat.c' || echo '$(srcdir)/'`pixelformat.c +libsixel_la-scale.lo: scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-scale.lo -MD -MP -MF $(DEPDIR)/libsixel_la-scale.Tpo -c -o libsixel_la-scale.lo `test -f 'scale.c' || echo '$(srcdir)/'`scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-scale.Tpo $(DEPDIR)/libsixel_la-scale.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale.c' object='libsixel_la-scale.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-scale.lo `test -f 'scale.c' || echo '$(srcdir)/'`scale.c + mostlyclean-libtool: -rm -f *.lo diff --git a/converters/scale.c b/src/scale.c similarity index 99% rename from converters/scale.c rename to src/scale.c index 8740dd31..067149cd 100644 --- a/converters/scale.c +++ b/src/scale.c @@ -20,7 +20,6 @@ */ #include "config.h" -#include "malloc_stub.h" #define _USE_MATH_DEFINES /* for MSVC */ #include @@ -30,7 +29,7 @@ #include -#include "scale.h" +#include #if !defined(MAX) # define MAX(l, r) ((l) > (r) ? (l) : (r)) From 98b7aee472511276c8ed705c8933579da1e6cf38 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 18:32:39 +0900 Subject: [PATCH 015/451] Add new API: sixel_helper_load_image_file --- configure | 3 +- configure.ac | 1 + converters/Makefile.am | 16 ++++---- converters/Makefile.in | 55 +++++-------------------- converters/img2sixel.c | 2 +- converters/loader.h | 52 ------------------------ converters/stb_image.c | 39 ------------------ include/Makefile.am | 2 +- include/Makefile.in | 9 +++-- src/Makefile.am | 21 +++++++++- src/Makefile.in | 71 ++++++++++++++++++++++++++++----- {converters => src}/frompnm.c | 0 {converters => src}/frompnm.h | 0 {converters => src}/loader.c | 2 - {converters => src}/stb_image.h | 0 15 files changed, 110 insertions(+), 163 deletions(-) delete mode 100644 converters/loader.h delete mode 100644 converters/stb_image.c rename {converters => src}/frompnm.c (100%) rename {converters => src}/frompnm.h (100%) rename {converters => src}/loader.c (99%) rename {converters => src}/stb_image.h (100%) diff --git a/configure b/configure index ae69eed3..1b5beb95 100755 --- a/configure +++ b/configure @@ -14346,7 +14346,7 @@ else fi -ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h src/Makefile include/Makefile converters/Makefile" +ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h include/sixel-imageio.h src/Makefile include/Makefile converters/Makefile" cat >confcache <<\_ACEOF @@ -15394,6 +15394,7 @@ do "libsixel.pc") CONFIG_FILES="$CONFIG_FILES libsixel.pc" ;; "package.json.in") CONFIG_FILES="$CONFIG_FILES package.json.in" ;; "include/sixel.h") CONFIG_FILES="$CONFIG_FILES include/sixel.h" ;; + "include/sixel-imageio.h") CONFIG_FILES="$CONFIG_FILES include/sixel-imageio.h" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "converters/Makefile") CONFIG_FILES="$CONFIG_FILES converters/Makefile" ;; diff --git a/configure.ac b/configure.ac index e201a442..365fe3e5 100644 --- a/configure.ac +++ b/configure.ac @@ -414,6 +414,7 @@ AC_CONFIG_FILES([Makefile libsixel.pc package.json.in include/sixel.h + include/sixel-imageio.h src/Makefile include/Makefile converters/Makefile]) diff --git a/converters/Makefile.am b/converters/Makefile.am index de12bbc3..3312ee88 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -17,15 +17,15 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel -img2sixel_SOURCES = img2sixel.c malloc_stub.c loader.c frompnm.c \ - malloc_stub.h loader.h frompnm.h +img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ - $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) -img2sixel_LDADD = $(top_builddir)/src/libsixel.la -lm \ - $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) +img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ + $(top_builddir)/src/libsixel-imageio.la -lm \ + $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) dist_man_MANS += img2sixel.1 dist_bashcompletion_DATA += shell-completion/bash/img2sixel dist_zshcompletion_DATA += shell-completion/zsh/_img2sixel @@ -37,7 +37,7 @@ sixel2png_SOURCES = sixel2png.c stb_image_write.c malloc_stub.c \ stb_image_write.h malloc_stub.h sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ - $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) + $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) dist_man_MANS += sixel2png.1 endif diff --git a/converters/Makefile.in b/converters/Makefile.in index 2727fc51..ea042f69 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -110,17 +110,15 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(bashcompletiondir)" \ "$(DESTDIR)$(zshcompletiondir)" PROGRAMS = $(bin_PROGRAMS) -am__img2sixel_SOURCES_DIST = img2sixel.c malloc_stub.c loader.c \ - frompnm.c malloc_stub.h loader.h frompnm.h +am__img2sixel_SOURCES_DIST = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@am_img2sixel_OBJECTS = \ @WANT_IMG2SIXEL_TRUE@ img2sixel-img2sixel.$(OBJEXT) \ -@WANT_IMG2SIXEL_TRUE@ img2sixel-malloc_stub.$(OBJEXT) \ -@WANT_IMG2SIXEL_TRUE@ img2sixel-loader.$(OBJEXT) \ -@WANT_IMG2SIXEL_TRUE@ img2sixel-frompnm.$(OBJEXT) +@WANT_IMG2SIXEL_TRUE@ img2sixel-malloc_stub.$(OBJEXT) img2sixel_OBJECTS = $(am_img2sixel_OBJECTS) am__DEPENDENCIES_1 = @WANT_IMG2SIXEL_TRUE@img2sixel_DEPENDENCIES = \ @WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel.la \ +@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la \ @WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ @WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ @WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ @@ -424,24 +422,23 @@ dist_bashcompletion_DATA = $(am__append_3) dist_zshcompletion_DATA = $(am__append_4) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe -@WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c loader.c frompnm.c \ -@WANT_IMG2SIXEL_TRUE@ malloc_stub.h loader.h frompnm.h - +@WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ -@WANT_IMG2SIXEL_TRUE@ $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ -@WANT_IMG2SIXEL_TRUE@ $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) +@WANT_IMG2SIXEL_TRUE@ $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ +@WANT_IMG2SIXEL_TRUE@ $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) -@WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la -lm \ -@WANT_IMG2SIXEL_TRUE@ $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ -@WANT_IMG2SIXEL_TRUE@ $(LIBJPEG_LIBS) $(LIBPNG_LIBS) +@WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ +@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la -lm \ +@WANT_IMG2SIXEL_TRUE@ $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ +@WANT_IMG2SIXEL_TRUE@ $(LIBJPEG_LIBS) $(LIBPNG_LIBS) @WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c stb_image_write.c malloc_stub.c \ @WANT_SIXEL2PNG_TRUE@ stb_image_write.h malloc_stub.h @WANT_SIXEL2PNG_TRUE@sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ -@WANT_SIXEL2PNG_TRUE@ $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) +@WANT_SIXEL2PNG_TRUE@ $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) @WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) all: all-recursive @@ -542,9 +539,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-frompnm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-img2sixel.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-malloc_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-malloc_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-sixel2png.Po@am__quote@ @@ -599,34 +594,6 @@ img2sixel-malloc_stub.obj: malloc_stub.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-malloc_stub.obj `if test -f 'malloc_stub.c'; then $(CYGPATH_W) 'malloc_stub.c'; else $(CYGPATH_W) '$(srcdir)/malloc_stub.c'; fi` -img2sixel-loader.o: loader.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-loader.o -MD -MP -MF $(DEPDIR)/img2sixel-loader.Tpo -c -o img2sixel-loader.o `test -f 'loader.c' || echo '$(srcdir)/'`loader.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-loader.Tpo $(DEPDIR)/img2sixel-loader.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='loader.c' object='img2sixel-loader.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-loader.o `test -f 'loader.c' || echo '$(srcdir)/'`loader.c - -img2sixel-loader.obj: loader.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-loader.obj -MD -MP -MF $(DEPDIR)/img2sixel-loader.Tpo -c -o img2sixel-loader.obj `if test -f 'loader.c'; then $(CYGPATH_W) 'loader.c'; else $(CYGPATH_W) '$(srcdir)/loader.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-loader.Tpo $(DEPDIR)/img2sixel-loader.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='loader.c' object='img2sixel-loader.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-loader.obj `if test -f 'loader.c'; then $(CYGPATH_W) 'loader.c'; else $(CYGPATH_W) '$(srcdir)/loader.c'; fi` - -img2sixel-frompnm.o: frompnm.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-frompnm.o -MD -MP -MF $(DEPDIR)/img2sixel-frompnm.Tpo -c -o img2sixel-frompnm.o `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-frompnm.Tpo $(DEPDIR)/img2sixel-frompnm.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frompnm.c' object='img2sixel-frompnm.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-frompnm.o `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c - -img2sixel-frompnm.obj: frompnm.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -MT img2sixel-frompnm.obj -MD -MP -MF $(DEPDIR)/img2sixel-frompnm.Tpo -c -o img2sixel-frompnm.obj `if test -f 'frompnm.c'; then $(CYGPATH_W) 'frompnm.c'; else $(CYGPATH_W) '$(srcdir)/frompnm.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2sixel-frompnm.Tpo $(DEPDIR)/img2sixel-frompnm.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frompnm.c' object='img2sixel-frompnm.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2sixel_CPPFLAGS) $(CPPFLAGS) $(img2sixel_CFLAGS) $(CFLAGS) -c -o img2sixel-frompnm.obj `if test -f 'frompnm.c'; then $(CYGPATH_W) 'frompnm.c'; else $(CYGPATH_W) '$(srcdir)/frompnm.c'; fi` - sixel2png-sixel2png.o: sixel2png.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-sixel2png.o -MD -MP -MF $(DEPDIR)/sixel2png-sixel2png.Tpo -c -o sixel2png-sixel2png.o `test -f 'sixel2png.c' || echo '$(srcdir)/'`sixel2png.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-sixel2png.Tpo $(DEPDIR)/sixel2png-sixel2png.Po diff --git a/converters/img2sixel.c b/converters/img2sixel.c index d0656311..72f72806 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -66,7 +66,7 @@ #endif #include -#include "loader.h" +#include /* loop modes */ enum loopMode { diff --git a/converters/loader.h b/converters/loader.h deleted file mode 100644 index 25350ea0..00000000 --- a/converters/loader.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2014 Hayaki Saito - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIBSIXEL_LOADER_H -#define LIBSIXEL_LOADER_H - -#ifdef __cplusplus -extern "C" { -#endif - -int -sixel_helper_load_image_file( - unsigned char **ppixels, - unsigned char **ppalette, - int *psx, - int *psy, - int *pncolors, - int *ppixelformat, - int *pframe_count, - int *ploop_count, - int **ppdelay, - char const *filename, - int fstatic, - int reqcolors); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBSIXEL_LOADER_H */ - -/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ -/* vim: set expandtab ts=4 : */ -/* EOF */ diff --git a/converters/stb_image.c b/converters/stb_image.c deleted file mode 100644 index 49b84be7..00000000 --- a/converters/stb_image.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2014 Hayaki Saito - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "config.h" - -#if !defined(HAVE_MEMCPY) -# define memcpy(d, s, n) (bcopy ((s), (d), (n))) -#endif - -#if !defined(HAVE_MEMMOVE) -# define memmove(d, s, n) (bcopy ((s), (d), (n))) -#endif - -#define STBI_NO_STDIO 1 -#define STB_IMAGE_IMPLEMENTATION 1 - -#include "stb_image.h" - -/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ -/* vim: set expandtab ts=4 : */ -/* EOF */ diff --git a/include/Makefile.am b/include/Makefile.am index 0043c256..fe97ffb8 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1 +1 @@ -include_HEADERS = sixel.h +include_HEADERS = sixel.h sixel-imageio.h diff --git a/include/Makefile.in b/include/Makefile.in index 42c4d437..693a0e2d 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -80,7 +80,8 @@ build_triplet = @build@ host_triplet = @host@ subdir = include DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/sixel.h.in $(include_HEADERS) + $(srcdir)/sixel.h.in $(srcdir)/sixel-imageio.h.in \ + $(include_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -91,7 +92,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = sixel.h +CONFIG_CLEAN_FILES = sixel.h sixel-imageio.h CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) @@ -297,7 +298,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ -include_HEADERS = sixel.h +include_HEADERS = sixel.h sixel-imageio.h all: all-am .SUFFIXES: @@ -333,6 +334,8 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): sixel.h: $(top_builddir)/config.status $(srcdir)/sixel.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +sixel-imageio.h: $(top_builddir)/config.status $(srcdir)/sixel-imageio.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo diff --git a/src/Makefile.am b/src/Makefile.am index 9cb49c97..d6f0b6fd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,8 +6,25 @@ endif CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c \ + quant.c dither.c pixelformat.c \ + scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ + $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + +lib_LTLIBRARIES += libsixel-imageio.la +libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h +libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ +libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ + $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) +libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + dist_man_MANS = sixel.5 diff --git a/src/Makefile.in b/src/Makefile.in index a8d96bb8..83917c54 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -122,16 +122,29 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man5dir)" LTLIBRARIES = $(lib_LTLIBRARIES) -libsixel_la_LIBADD = +am__DEPENDENCIES_1 = +libsixel_imageio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libsixel_imageio_la_OBJECTS = libsixel_imageio_la-loader.lo \ + libsixel_imageio_la-frompnm.lo +libsixel_imageio_la_OBJECTS = $(am_libsixel_imageio_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libsixel_imageio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libsixel_imageio_la_CFLAGS) $(CFLAGS) \ + $(libsixel_imageio_la_LDFLAGS) $(LDFLAGS) -o $@ +libsixel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ libsixel_la-pixelformat.lo libsixel_la-scale.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = libsixel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libsixel_la_CFLAGS) \ $(CFLAGS) $(libsixel_la_LDFLAGS) $(LDFLAGS) -o $@ @@ -169,8 +182,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(libsixel_la_SOURCES) -DIST_SOURCES = $(libsixel_la_SOURCES) +SOURCES = $(libsixel_imageio_la_SOURCES) $(libsixel_la_SOURCES) +DIST_SOURCES = $(libsixel_imageio_la_SOURCES) $(libsixel_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -337,11 +350,30 @@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov -lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c +lib_LTLIBRARIES = libsixel.la libsixel-imageio.la +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c \ + quant.c dither.c pixelformat.c \ + scale.c + libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ + $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) + libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + +libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h +libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ +libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ + $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) + +libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + dist_man_MANS = sixel.5 all: all-am @@ -413,6 +445,9 @@ clean-libLTLIBRARIES: rm -f $${locs}; \ } +libsixel-imageio.la: $(libsixel_imageio_la_OBJECTS) $(libsixel_imageio_la_DEPENDENCIES) $(EXTRA_libsixel_imageio_la_DEPENDENCIES) + $(AM_V_CCLD)$(libsixel_imageio_la_LINK) -rpath $(libdir) $(libsixel_imageio_la_OBJECTS) $(libsixel_imageio_la_LIBADD) $(LIBS) + libsixel.la: $(libsixel_la_OBJECTS) $(libsixel_la_DEPENDENCIES) $(EXTRA_libsixel_la_DEPENDENCIES) $(AM_V_CCLD)$(libsixel_la_LINK) -rpath $(libdir) $(libsixel_la_OBJECTS) $(libsixel_la_LIBADD) $(LIBS) @@ -422,6 +457,8 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-frompnm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-loader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-output.Plo@am__quote@ @@ -451,6 +488,20 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< +libsixel_imageio_la-loader.lo: loader.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-loader.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-loader.Tpo -c -o libsixel_imageio_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-loader.Tpo $(DEPDIR)/libsixel_imageio_la-loader.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='loader.c' object='libsixel_imageio_la-loader.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c + +libsixel_imageio_la-frompnm.lo: frompnm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-frompnm.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-frompnm.Tpo -c -o libsixel_imageio_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-frompnm.Tpo $(DEPDIR)/libsixel_imageio_la-frompnm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frompnm.c' object='libsixel_imageio_la-frompnm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c + libsixel_la-output.lo: output.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-output.lo -MD -MP -MF $(DEPDIR)/libsixel_la-output.Tpo -c -o libsixel_la-output.lo `test -f 'output.c' || echo '$(srcdir)/'`output.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-output.Tpo $(DEPDIR)/libsixel_la-output.Plo diff --git a/converters/frompnm.c b/src/frompnm.c similarity index 100% rename from converters/frompnm.c rename to src/frompnm.c diff --git a/converters/frompnm.h b/src/frompnm.h similarity index 100% rename from converters/frompnm.h rename to src/frompnm.h diff --git a/converters/loader.c b/src/loader.c similarity index 99% rename from converters/loader.c rename to src/loader.c index 6e8d3074..272aea5d 100644 --- a/converters/loader.c +++ b/src/loader.c @@ -20,7 +20,6 @@ */ #include "config.h" -#include "malloc_stub.h" #include #include @@ -81,7 +80,6 @@ #include #include "frompnm.h" -#include "loader.h" #include #define STBI_NO_STDIO 1 diff --git a/converters/stb_image.h b/src/stb_image.h similarity index 100% rename from converters/stb_image.h rename to src/stb_image.h From 7a9e56262dd85bd4f014dcf5889001b7bc7bcc6c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 18:40:47 +0900 Subject: [PATCH 016/451] Remove unused dependencies from LIBADD and LDADD --- converters/Makefile.am | 7 ++----- converters/Makefile.in | 16 ++++------------ src/Makefile.am | 6 +----- src/Makefile.in | 12 ++---------- 4 files changed, 9 insertions(+), 32 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 3312ee88..99a2476a 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -20,12 +20,9 @@ bin_PROGRAMS += img2sixel img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ - $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) + $(MAYBE_COVERAGE) img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ - $(top_builddir)/src/libsixel-imageio.la -lm \ - $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + $(top_builddir)/src/libsixel-imageio.la -lm dist_man_MANS += img2sixel.1 dist_bashcompletion_DATA += shell-completion/bash/img2sixel dist_zshcompletion_DATA += shell-completion/zsh/_img2sixel diff --git a/converters/Makefile.in b/converters/Makefile.in index ea042f69..786de44c 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -115,15 +115,9 @@ am__img2sixel_SOURCES_DIST = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@ img2sixel-img2sixel.$(OBJEXT) \ @WANT_IMG2SIXEL_TRUE@ img2sixel-malloc_stub.$(OBJEXT) img2sixel_OBJECTS = $(am_img2sixel_OBJECTS) -am__DEPENDENCIES_1 = @WANT_IMG2SIXEL_TRUE@img2sixel_DEPENDENCIES = \ @WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel.la \ -@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la \ -@WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ -@WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ -@WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ -@WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) \ -@WANT_IMG2SIXEL_TRUE@ $(am__DEPENDENCIES_1) +@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent @@ -138,6 +132,7 @@ am__sixel2png_SOURCES_DIST = sixel2png.c stb_image_write.c \ @WANT_SIXEL2PNG_TRUE@ sixel2png-stb_image_write.$(OBJEXT) \ @WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) sixel2png_OBJECTS = $(am_sixel2png_OBJECTS) +am__DEPENDENCIES_1 = @WANT_SIXEL2PNG_TRUE@sixel2png_DEPENDENCIES = \ @WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la \ @WANT_SIXEL2PNG_TRUE@ $(am__DEPENDENCIES_1) @@ -425,13 +420,10 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ -@WANT_IMG2SIXEL_TRUE@ $(MAYBE_COVERAGE) $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ -@WANT_IMG2SIXEL_TRUE@ $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) +@WANT_IMG2SIXEL_TRUE@ $(MAYBE_COVERAGE) @WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ -@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la -lm \ -@WANT_IMG2SIXEL_TRUE@ $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ -@WANT_IMG2SIXEL_TRUE@ $(LIBJPEG_LIBS) $(LIBPNG_LIBS) +@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la -lm @WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c stb_image_write.c malloc_stub.c \ @WANT_SIXEL2PNG_TRUE@ stb_image_write.h malloc_stub.h diff --git a/src/Makefile.am b/src/Makefile.am index d6f0b6fd..7c8dcf4e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,12 +10,8 @@ libsixel_la_SOURCES = output.c fromsixel.c tosixel.c \ quant.c dither.c pixelformat.c \ scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ - $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) +libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) -libsixel_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) lib_LTLIBRARIES += libsixel-imageio.la libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h diff --git a/src/Makefile.in b/src/Makefile.in index 83917c54..53b2fa27 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -137,9 +137,7 @@ libsixel_imageio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libsixel_imageio_la_CFLAGS) $(CFLAGS) \ $(libsixel_imageio_la_LDFLAGS) $(LDFLAGS) -o $@ -libsixel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) +libsixel_la_LIBADD = am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ @@ -356,14 +354,8 @@ libsixel_la_SOURCES = output.c fromsixel.c tosixel.c \ scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ - $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) - +libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) -libsixel_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) - libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ From 491d45cb6970e8b6ec7d9a0098a2568f29d8c6ad Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 18:42:44 +0900 Subject: [PATCH 017/451] Update libsixel.pc.in --- libsixel.pc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsixel.pc.in b/libsixel.pc.in index 6333f026..db1f8244 100644 --- a/libsixel.pc.in +++ b/libsixel.pc.in @@ -6,5 +6,5 @@ includedir=@includedir@ Name: libsixel Description: @PACKAGE_DESCRIPTION@ Version: @PACKAGE_VERSION@ -Libs: -L${libdir} -lsixel +Libs: -L${libdir} -lsixel -lsixel-imageio Cflags: -I${includedir} From 6d570dec28a61ac39da40b63a3248e338b06dfcf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 19:17:46 +0900 Subject: [PATCH 018/451] Add missing sixel-imageio.h.in --- include/sixel-imageio.h.in | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 include/sixel-imageio.h.in diff --git a/include/sixel-imageio.h.in b/include/sixel-imageio.h.in new file mode 100644 index 00000000..b783b015 --- /dev/null +++ b/include/sixel-imageio.h.in @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_SIXEL_IMAGEIO_H +#define LIBSIXEL_SIXEL_IMAGEIO_H + +/* loader API */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* load image from file */ +int +sixel_helper_load_image_file( + unsigned char /* out */ **ppixels, /* loaded pixel data */ + unsigned char /* out */ **ppalette, /* loaded palette data */ + int /* out */ *psx, /* image width */ + int /* out */ *psy, /* image height */ + int /* out */ *pncolors, /* palette colors */ + int /* out */ *ppixelformat, /* one of enum pixelFormat */ + int /* out */ *pframe_count, /* frame count */ + int /* out */ *ploop_count, /* loop count */ + int /* out */ **ppdelay, /* delay for each frames */ + char const /* in */ *filename, /* source file name */ + int /* in */ fstatic, /* whether to extract static image */ + int /* in */ reqcolors); /* requested number of colors */ + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_SIXEL_IMAGEIO_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From d5b42bbb575e17f3147d93317c0504c3360a6f02 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 19:18:03 +0900 Subject: [PATCH 019/451] Minor fixes --- converters/Makefile.am | 14 +++++------ converters/Makefile.in | 56 +++++++++++++++++++----------------------- src/Makefile.am | 10 +++----- src/Makefile.in | 11 +++------ 4 files changed, 39 insertions(+), 52 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 99a2476a..6125f3ec 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -19,10 +19,9 @@ if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) -img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ - $(MAYBE_COVERAGE) +img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ - $(top_builddir)/src/libsixel-imageio.la -lm + $(top_builddir)/src/libsixel-imageio.la dist_man_MANS += img2sixel.1 dist_bashcompletion_DATA += shell-completion/bash/img2sixel dist_zshcompletion_DATA += shell-completion/zsh/_img2sixel @@ -30,12 +29,11 @@ endif if WANT_SIXEL2PNG bin_PROGRAMS += sixel2png -sixel2png_SOURCES = sixel2png.c stb_image_write.c malloc_stub.c \ - stb_image_write.h malloc_stub.h +sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h \ + stb_image_write.c stb_image_write.h sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) -sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ - $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) -sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) +sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LDFLAGS) dist_man_MANS += sixel2png.1 endif diff --git a/converters/Makefile.in b/converters/Makefile.in index 786de44c..ae7a124c 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -125,17 +125,15 @@ am__v_lt_1 = img2sixel_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(img2sixel_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__sixel2png_SOURCES_DIST = sixel2png.c stb_image_write.c \ - malloc_stub.c stb_image_write.h malloc_stub.h +am__sixel2png_SOURCES_DIST = sixel2png.c malloc_stub.c malloc_stub.h \ + stb_image_write.c stb_image_write.h @WANT_SIXEL2PNG_TRUE@am_sixel2png_OBJECTS = \ @WANT_SIXEL2PNG_TRUE@ sixel2png-sixel2png.$(OBJEXT) \ -@WANT_SIXEL2PNG_TRUE@ sixel2png-stb_image_write.$(OBJEXT) \ -@WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) +@WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) \ +@WANT_SIXEL2PNG_TRUE@ sixel2png-stb_image_write.$(OBJEXT) sixel2png_OBJECTS = $(am_sixel2png_OBJECTS) -am__DEPENDENCIES_1 = @WANT_SIXEL2PNG_TRUE@sixel2png_DEPENDENCIES = \ -@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la \ -@WANT_SIXEL2PNG_TRUE@ $(am__DEPENDENCIES_1) +@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la sixel2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sixel2png_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -419,20 +417,16 @@ dist_zshcompletion_DATA = $(am__append_4) CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) -@WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ -@WANT_IMG2SIXEL_TRUE@ $(MAYBE_COVERAGE) - +@WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) @WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ -@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la -lm +@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la -@WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c stb_image_write.c malloc_stub.c \ -@WANT_SIXEL2PNG_TRUE@ stb_image_write.h malloc_stub.h +@WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h \ +@WANT_SIXEL2PNG_TRUE@ stb_image_write.c stb_image_write.h @WANT_SIXEL2PNG_TRUE@sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) -@WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) \ -@WANT_SIXEL2PNG_TRUE@ $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) - -@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +@WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) +@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LDFLAGS) all: all-recursive .SUFFIXES: @@ -600,20 +594,6 @@ sixel2png-sixel2png.obj: sixel2png.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-sixel2png.obj `if test -f 'sixel2png.c'; then $(CYGPATH_W) 'sixel2png.c'; else $(CYGPATH_W) '$(srcdir)/sixel2png.c'; fi` -sixel2png-stb_image_write.o: stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-stb_image_write.o -MD -MP -MF $(DEPDIR)/sixel2png-stb_image_write.Tpo -c -o sixel2png-stb_image_write.o `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-stb_image_write.Tpo $(DEPDIR)/sixel2png-stb_image_write.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='sixel2png-stb_image_write.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-stb_image_write.o `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c - -sixel2png-stb_image_write.obj: stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-stb_image_write.obj -MD -MP -MF $(DEPDIR)/sixel2png-stb_image_write.Tpo -c -o sixel2png-stb_image_write.obj `if test -f 'stb_image_write.c'; then $(CYGPATH_W) 'stb_image_write.c'; else $(CYGPATH_W) '$(srcdir)/stb_image_write.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-stb_image_write.Tpo $(DEPDIR)/sixel2png-stb_image_write.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='sixel2png-stb_image_write.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-stb_image_write.obj `if test -f 'stb_image_write.c'; then $(CYGPATH_W) 'stb_image_write.c'; else $(CYGPATH_W) '$(srcdir)/stb_image_write.c'; fi` - sixel2png-malloc_stub.o: malloc_stub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-malloc_stub.o -MD -MP -MF $(DEPDIR)/sixel2png-malloc_stub.Tpo -c -o sixel2png-malloc_stub.o `test -f 'malloc_stub.c' || echo '$(srcdir)/'`malloc_stub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-malloc_stub.Tpo $(DEPDIR)/sixel2png-malloc_stub.Po @@ -628,6 +608,20 @@ sixel2png-malloc_stub.obj: malloc_stub.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-malloc_stub.obj `if test -f 'malloc_stub.c'; then $(CYGPATH_W) 'malloc_stub.c'; else $(CYGPATH_W) '$(srcdir)/malloc_stub.c'; fi` +sixel2png-stb_image_write.o: stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-stb_image_write.o -MD -MP -MF $(DEPDIR)/sixel2png-stb_image_write.Tpo -c -o sixel2png-stb_image_write.o `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-stb_image_write.Tpo $(DEPDIR)/sixel2png-stb_image_write.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='sixel2png-stb_image_write.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-stb_image_write.o `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c + +sixel2png-stb_image_write.obj: stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-stb_image_write.obj -MD -MP -MF $(DEPDIR)/sixel2png-stb_image_write.Tpo -c -o sixel2png-stb_image_write.obj `if test -f 'stb_image_write.c'; then $(CYGPATH_W) 'stb_image_write.c'; else $(CYGPATH_W) '$(srcdir)/stb_image_write.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-stb_image_write.Tpo $(DEPDIR)/sixel2png-stb_image_write.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='sixel2png-stb_image_write.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-stb_image_write.obj `if test -f 'stb_image_write.c'; then $(CYGPATH_W) 'stb_image_write.c'; else $(CYGPATH_W) '$(srcdir)/stb_image_write.c'; fi` + mostlyclean-libtool: -rm -f *.lo diff --git a/src/Makefile.am b/src/Makefile.am index 7c8dcf4e..af0fb4fe 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,9 +6,7 @@ endif CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c \ - quant.c dither.c pixelformat.c \ - scale.c +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) @@ -17,10 +15,10 @@ lib_LTLIBRARIES += libsixel-imageio.la libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ - $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) + $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) dist_man_MANS = sixel.5 diff --git a/src/Makefile.in b/src/Makefile.in index 53b2fa27..ab661eba 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -349,22 +349,19 @@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la libsixel-imageio.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c \ - quant.c dither.c pixelformat.c \ - scale.c - +libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ - $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) + $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ + $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) dist_man_MANS = sixel.5 all: all-am From e3f1be61f76d8d48dec9308d67b0419087e91ef3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Dec 2014 19:27:00 +0900 Subject: [PATCH 020/451] Add -lm to LDADD of libsixel --- src/Makefile.am | 1 + src/Makefile.in | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index af0fb4fe..42e89aa8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,6 +10,7 @@ libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelforma libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_la_LIBADD = -lm lib_LTLIBRARIES += libsixel-imageio.la libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h diff --git a/src/Makefile.in b/src/Makefile.in index ab661eba..e197d455 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -137,7 +137,7 @@ libsixel_imageio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libsixel_imageio_la_CFLAGS) $(CFLAGS) \ $(libsixel_imageio_la_LDFLAGS) $(LDFLAGS) -o $@ -libsixel_la_LIBADD = +libsixel_la_DEPENDENCIES = am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ @@ -353,6 +353,7 @@ libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelforma libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_la_LIBADD = -lm libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ From 84b2d60e96613327cc2bf701a63415dea1773826 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 30 Dec 2014 02:57:47 +0900 Subject: [PATCH 021/451] Build fix --- converters/Makefile.am | 2 +- converters/Makefile.in | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 6125f3ec..e8f46d4c 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -33,7 +33,7 @@ sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h \ stb_image_write.c stb_image_write.h sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) -sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LDFLAGS) +sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) dist_man_MANS += sixel2png.1 endif diff --git a/converters/Makefile.in b/converters/Makefile.in index ae7a124c..45e15589 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -132,8 +132,10 @@ am__sixel2png_SOURCES_DIST = sixel2png.c malloc_stub.c malloc_stub.h \ @WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) \ @WANT_SIXEL2PNG_TRUE@ sixel2png-stb_image_write.$(OBJEXT) sixel2png_OBJECTS = $(am_sixel2png_OBJECTS) +am__DEPENDENCIES_1 = @WANT_SIXEL2PNG_TRUE@sixel2png_DEPENDENCIES = \ -@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la +@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la \ +@WANT_SIXEL2PNG_TRUE@ $(am__DEPENDENCIES_1) sixel2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sixel2png_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -426,7 +428,7 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe @WANT_SIXEL2PNG_TRUE@sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) -@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LDFLAGS) +@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) all: all-recursive .SUFFIXES: From c5a4cfc9d4328d91ad3fbbf71ff69ac15e9e85a3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 30 Dec 2014 03:25:58 +0900 Subject: [PATCH 022/451] Build fix for MinGW --- src/Makefile.am | 2 +- src/Makefile.in | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 42e89aa8..47b0c774 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,6 +20,6 @@ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) libsixel.la dist_man_MANS = sixel.5 diff --git a/src/Makefile.in b/src/Makefile.in index e197d455..3f3cda56 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -125,7 +125,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libsixel_imageio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) libsixel.la am_libsixel_imageio_la_OBJECTS = libsixel_imageio_la-loader.lo \ libsixel_imageio_la-frompnm.lo libsixel_imageio_la_OBJECTS = $(am_libsixel_imageio_la_OBJECTS) @@ -362,7 +362,7 @@ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) libsixel.la dist_man_MANS = sixel.5 all: all-am From e25aa13bba2dca4ed4fa650fd98f710aaf373069 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 30 Dec 2014 04:28:33 +0900 Subject: [PATCH 023/451] Arrange palette with 3byte per color format --- src/fromsixel.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fromsixel.c b/src/fromsixel.c index 12c7cde7..2a1f44b0 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -169,6 +169,7 @@ hls2rgb(int hue, int lum, int sat) return RGB(r * 255 / 100, g * 255 / 100, b * 255 / 100); } + static unsigned char * sixel_getparams(unsigned char *p, int *param, int *len) { @@ -536,10 +537,9 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ *ncolors = max_color_index + 1; *palette = allocator(*ncolors * 4); for (n = 0; n < *ncolors; ++n) { - (*palette)[n * 4 + 0] = sixel_palet[n] >> 16 & 0xff; - (*palette)[n * 4 + 1] = sixel_palet[n] >> 8 & 0xff; - (*palette)[n * 4 + 2] = sixel_palet[n] & 0xff; - (*palette)[n * 4 + 3] = 0xff; + (*palette)[n * 3 + 0] = sixel_palet[n] >> 16 & 0xff; + (*palette)[n * 3 + 1] = sixel_palet[n] >> 8 & 0xff; + (*palette)[n * 3 + 2] = sixel_palet[n] & 0xff; } return 0; } From 9c746379773bebbc55b67f259b23cda5571f9fac Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 30 Dec 2014 05:09:11 +0900 Subject: [PATCH 024/451] Cleanup sixel2png.c --- converters/Makefile.am | 2 +- converters/Makefile.in | 2 +- converters/sixel2png.c | 193 +++++++++++++++++++++++------------------ src/Makefile.am | 2 +- src/Makefile.in | 5 +- src/loader.c | 18 ++-- 6 files changed, 119 insertions(+), 103 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index e8f46d4c..d729985a 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -69,7 +69,7 @@ if WANT_IMG2SIXEL test ! $$(echo -n a | $(WINE) ./img2sixel) $(WINE) ./img2sixel -H $(WINE) ./img2sixel -V - $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | img2sixel | tee snake.sixel + $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 < ../images/snake.jpg > snake3.sixel $(WINE) ./img2sixel -w105% -h100 -djajuni -rnearest < ../images/snake.gif diff --git a/converters/Makefile.in b/converters/Makefile.in index 45e15589..fd744321 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1034,7 +1034,7 @@ test: all @WANT_IMG2SIXEL_TRUE@ test ! $$(echo -n a | $(WINE) ./img2sixel) @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -H @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -V -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | img2sixel | tee snake.sixel +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 < ../images/snake.jpg > snake3.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -djajuni -rnearest < ../images/snake.gif diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 2124d807..5e87f0a0 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -78,101 +78,36 @@ stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, static int -sixel_to_png(const char *input, const char *output) +sixel_helper_write_image_file( + char const /* in */ *filename, + unsigned char /* in */ *data, + int /* in */ sx, + int /* in */ sy, + int /* in */ pixelformat) { - unsigned char *raw_data, *png_data = NULL; - int sx, sy; - int raw_len; - int max; - int n; - FILE *input_fp = NULL, *output_fp = NULL; - unsigned char *indexed_pixels; - unsigned char *palette; - int ncolors; - unsigned char *pixels; - int x, y; int ret = 0; + FILE *output_fp = NULL; + unsigned char *pixels = NULL; + unsigned char *new_pixels = NULL; #if HAVE_LIBPNG png_structp png_ptr = NULL; png_infop info_ptr = NULL; unsigned char **rows = NULL; #else + unsigned char *png_data = NULL; int png_len; int write_len; #endif /* HAVE_LIBPNG */ - if (strcmp(input, "-") == 0) { - /* for windows */ -#if defined(O_BINARY) -# if HAVE__SETMODE - _setmode(fileno(stdin), O_BINARY); -# elif HAVE_SETMODE - setmode(fileno(stdin), O_BINARY); -# endif /* HAVE_SETMODE */ -#endif /* defined(O_BINARY) */ - input_fp = stdin; + if (pixelformat != PIXELFORMAT_RGB888) { + pixels = new_pixels = malloc(sx * sy * 3); + ret = sixel_helper_normalize_pixelformat(pixels, data, + sx, sy, PIXELFORMAT_PAL8); } else { - input_fp = fopen(input, "rb"); - if (!input_fp) { -#if HAVE_ERRNO_H - fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", - input, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); - } + pixels = data; } - raw_len = 0; - max = 64 * 1024; - - if ((raw_data = (unsigned char *)malloc(max)) == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "malloc(%d) failed.\n" "reason: %s.\n", - max, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); - } - - for (;;) { - if ((max - raw_len) < 4096) { - max *= 2; - if ((raw_data = (unsigned char *)realloc(raw_data, max)) == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "realloc(raw_data, %d) failed.\n" - "reason: %s.\n", - max, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); - } - } - if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) - break; - raw_len += n; - } - - if (input_fp != stdout) { - fclose(input_fp); - } - - ret = sixel_decode(raw_data, raw_len, &indexed_pixels, - &sx, &sy, &palette, &ncolors, malloc); - - if (ret != 0) { - fprintf(stderr, "sixel_decode failed.\n"); - goto end; - } - - pixels = malloc(sx * sy * 3); - for (y = 0; y < sy; ++y) { - for (x = 0; x < sx; ++x) { - n = indexed_pixels[sx * y + x]; - pixels[sx * 3 * y + x * 3 + 0] = palette[n * 4 + 0]; - pixels[sx * 3 * y + x * 3 + 1] = palette[n * 4 + 1]; - pixels[sx * 3 * y + x * 3 + 2] = palette[n * 4 + 2]; - } - } - - if (strcmp(output, "-") == 0) { + if (strcmp(filename, "-") == 0) { #if defined(O_BINARY) # if HAVE__SETMODE _setmode(fileno(stdout), O_BINARY); @@ -182,11 +117,10 @@ sixel_to_png(const char *input, const char *output) #endif /* defined(O_BINARY) */ output_fp = stdout; } else { - output_fp = fopen(output, "wb"); + output_fp = fopen(filename, "wb"); if (!output_fp) { #if HAVE_ERRNO_H - fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", - output, strerror(errno)); + perror("fopen() failed.\n"); #endif /* HAVE_ERRNO_H */ ret = -1; goto end; @@ -240,15 +174,104 @@ sixel_to_png(const char *input, const char *output) } #endif /* HAVE_LIBPNG */ + ret = 0; + end: if (output_fp && output_fp != stdout) { fclose(output_fp); } - free(png_data); #if HAVE_LIBPNG free(rows); png_destroy_write_struct (&png_ptr, &info_ptr); +#else + free(png_data); #endif /* HAVE_LIBPNG */ + free(new_pixels); + + return ret; +} + + +static int +sixel_to_png(char const *input, char const *output) +{ + unsigned char *raw_data; + int sx, sy; + int raw_len; + int max; + int n; + FILE *input_fp = NULL; + unsigned char *indexed_pixels; + unsigned char *palette; + int ncolors; + unsigned char *pixels = NULL; + int ret = 0; + + if (strcmp(input, "-") == 0) { + /* for windows */ +#if defined(O_BINARY) +# if HAVE__SETMODE + _setmode(fileno(stdin), O_BINARY); +# elif HAVE_SETMODE + setmode(fileno(stdin), O_BINARY); +# endif /* HAVE_SETMODE */ +#endif /* defined(O_BINARY) */ + input_fp = stdin; + } else { + input_fp = fopen(input, "rb"); + if (!input_fp) { +#if HAVE_ERRNO_H + fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", + input, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } + } + + raw_len = 0; + max = 64 * 1024; + + if ((raw_data = (unsigned char *)malloc(max)) == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "malloc(%d) failed.\n" "reason: %s.\n", + max, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } + + for (;;) { + if ((max - raw_len) < 4096) { + max *= 2; + if ((raw_data = (unsigned char *)realloc(raw_data, max)) == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "realloc(raw_data, %d) failed.\n" + "reason: %s.\n", + max, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } + } + if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) + break; + raw_len += n; + } + + if (input_fp != stdout) { + fclose(input_fp); + } + + ret = sixel_decode(raw_data, raw_len, &indexed_pixels, + &sx, &sy, &palette, &ncolors, malloc); + + if (ret != 0) { + fprintf(stderr, "sixel_decode failed.\n"); + goto end; + } + + ret = sixel_helper_write_image_file(output, indexed_pixels, sx, sy, PIXELFORMAT_PAL8); + +end: + free(pixels); return ret; } diff --git a/src/Makefile.am b/src/Makefile.am index 47b0c774..e3f0ad89 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,6 +20,6 @@ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) libsixel.la + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) $(top_builddir)/src/libsixel.la dist_man_MANS = sixel.5 diff --git a/src/Makefile.in b/src/Makefile.in index 3f3cda56..83ab227e 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -125,7 +125,8 @@ LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libsixel_imageio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) libsixel.la + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(top_builddir)/src/libsixel.la am_libsixel_imageio_la_OBJECTS = libsixel_imageio_la-loader.lo \ libsixel_imageio_la-frompnm.lo libsixel_imageio_la_OBJECTS = $(am_libsixel_imageio_la_OBJECTS) @@ -362,7 +363,7 @@ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) libsixel.la + $(LIBJPEG_LIBS) $(LIBPNG_LIBS) $(top_builddir)/src/libsixel.la dist_man_MANS = sixel.5 all: all-am diff --git a/src/loader.c b/src/loader.c index 272aea5d..bd3c74b3 100644 --- a/src/loader.c +++ b/src/loader.c @@ -424,10 +424,9 @@ load_sixel(unsigned char *buffer, int size, int reqcolors, int *ppixelformat) { - unsigned char *dst; - unsigned char *p; + unsigned char *p = NULL; unsigned char *pixels = NULL; - unsigned char *palette; + unsigned char *palette = NULL; int colors; int i; int ret; @@ -448,9 +447,9 @@ load_sixel(unsigned char *buffer, int size, *pcomp = 3; pixels = malloc(*psx * *psy * *pcomp); for (i = 0; i < *psx * *psy; ++i) { - pixels[i * 3 + 0] = palette[p[i] * 4 + 0]; - pixels[i * 3 + 1] = palette[p[i] * 4 + 1]; - pixels[i * 3 + 2] = palette[p[i] * 4 + 2]; + pixels[i * 3 + 0] = palette[p[i] * 3 + 0]; + pixels[i * 3 + 1] = palette[p[i] * 3 + 1]; + pixels[i * 3 + 2] = palette[p[i] * 3 + 2]; } free(palette); free(p); @@ -460,13 +459,6 @@ load_sixel(unsigned char *buffer, int size, pixels = p; *ppalette = palette; *pncolors = colors; - dst = palette; - while (colors--) { - *(dst++) = *(palette++); - *(dst++) = *(palette++); - *(dst++) = *(palette++); - palette++; - } } return pixels; From 1bccdaecb9ea91f383c1eb6eecac6109106be17c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 30 Dec 2014 13:24:26 +0900 Subject: [PATCH 025/451] Add new API: sixel_helper_write_image_file --- converters/Makefile.am | 8 +- converters/Makefile.in | 34 +--- converters/sixel2png.c | 138 +--------------- include/sixel-imageio.h.in | 25 +++ src/Makefile.am | 3 +- src/Makefile.in | 23 ++- src/loader.c | 16 +- {converters => src}/stb_image_write.c | 0 {converters => src}/stb_image_write.h | 0 src/writer.c | 216 ++++++++++++++++++++++++++ 10 files changed, 280 insertions(+), 183 deletions(-) rename {converters => src}/stb_image_write.c (100%) rename {converters => src}/stb_image_write.h (100%) create mode 100644 src/writer.c diff --git a/converters/Makefile.am b/converters/Makefile.am index d729985a..b34f45d0 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -29,11 +29,11 @@ endif if WANT_SIXEL2PNG bin_PROGRAMS += sixel2png -sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h \ - stb_image_write.c stb_image_write.h +sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) -sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) -sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +sixel2png_LDADD = $(top_builddir)/src/libsixel.la \ + $(top_builddir)/src/libsixel-imageio.la dist_man_MANS += sixel2png.1 endif diff --git a/converters/Makefile.in b/converters/Makefile.in index fd744321..9b5109b5 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -125,17 +125,14 @@ am__v_lt_1 = img2sixel_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(img2sixel_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__sixel2png_SOURCES_DIST = sixel2png.c malloc_stub.c malloc_stub.h \ - stb_image_write.c stb_image_write.h +am__sixel2png_SOURCES_DIST = sixel2png.c malloc_stub.c malloc_stub.h @WANT_SIXEL2PNG_TRUE@am_sixel2png_OBJECTS = \ @WANT_SIXEL2PNG_TRUE@ sixel2png-sixel2png.$(OBJEXT) \ -@WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) \ -@WANT_SIXEL2PNG_TRUE@ sixel2png-stb_image_write.$(OBJEXT) +@WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) sixel2png_OBJECTS = $(am_sixel2png_OBJECTS) -am__DEPENDENCIES_1 = @WANT_SIXEL2PNG_TRUE@sixel2png_DEPENDENCIES = \ @WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la \ -@WANT_SIXEL2PNG_TRUE@ $(am__DEPENDENCIES_1) +@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel-imageio.la sixel2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sixel2png_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -423,12 +420,12 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe @WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ @WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la -@WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h \ -@WANT_SIXEL2PNG_TRUE@ stb_image_write.c stb_image_write.h - +@WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h @WANT_SIXEL2PNG_TRUE@sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) -@WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) $(LIBPNG_CFLAGS) -@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +@WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la \ +@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel-imageio.la + all: all-recursive .SUFFIXES: @@ -531,7 +528,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2sixel-malloc_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-malloc_stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-sixel2png.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixel2png-stb_image_write.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -610,20 +606,6 @@ sixel2png-malloc_stub.obj: malloc_stub.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-malloc_stub.obj `if test -f 'malloc_stub.c'; then $(CYGPATH_W) 'malloc_stub.c'; else $(CYGPATH_W) '$(srcdir)/malloc_stub.c'; fi` -sixel2png-stb_image_write.o: stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-stb_image_write.o -MD -MP -MF $(DEPDIR)/sixel2png-stb_image_write.Tpo -c -o sixel2png-stb_image_write.o `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-stb_image_write.Tpo $(DEPDIR)/sixel2png-stb_image_write.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='sixel2png-stb_image_write.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-stb_image_write.o `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c - -sixel2png-stb_image_write.obj: stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -MT sixel2png-stb_image_write.obj -MD -MP -MF $(DEPDIR)/sixel2png-stb_image_write.Tpo -c -o sixel2png-stb_image_write.obj `if test -f 'stb_image_write.c'; then $(CYGPATH_W) 'stb_image_write.c'; else $(CYGPATH_W) '$(srcdir)/stb_image_write.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sixel2png-stb_image_write.Tpo $(DEPDIR)/sixel2png-stb_image_write.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='sixel2png-stb_image_write.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sixel2png_CPPFLAGS) $(CPPFLAGS) $(sixel2png_CFLAGS) $(CFLAGS) -c -o sixel2png-stb_image_write.obj `if test -f 'stb_image_write.c'; then $(CYGPATH_W) 'stb_image_write.c'; else $(CYGPATH_W) '$(srcdir)/stb_image_write.c'; fi` - mostlyclean-libtool: -rm -f *.lo diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 5e87f0a0..d0370080 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -54,142 +54,8 @@ # include #endif -#if HAVE_SETJMP_H -# include -#endif - -#if HAVE_LIBPNG -# include -#else -# include "stb_image_write.h" -#endif - #include - -#if !defined(O_BINARY) && defined(_O_BINARY) -# define O_BINARY _O_BINARY -#endif /* !defined(O_BINARY) && !defined(_O_BINARY) */ - -#if !HAVE_LIBPNG -unsigned char * -stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, - int x, int y, int n, int *out_len); -#endif - - -static int -sixel_helper_write_image_file( - char const /* in */ *filename, - unsigned char /* in */ *data, - int /* in */ sx, - int /* in */ sy, - int /* in */ pixelformat) -{ - int ret = 0; - FILE *output_fp = NULL; - unsigned char *pixels = NULL; - unsigned char *new_pixels = NULL; -#if HAVE_LIBPNG - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; - unsigned char **rows = NULL; -#else - unsigned char *png_data = NULL; - int png_len; - int write_len; -#endif /* HAVE_LIBPNG */ - - if (pixelformat != PIXELFORMAT_RGB888) { - pixels = new_pixels = malloc(sx * sy * 3); - ret = sixel_helper_normalize_pixelformat(pixels, data, - sx, sy, PIXELFORMAT_PAL8); - } else { - pixels = data; - } - - if (strcmp(filename, "-") == 0) { -#if defined(O_BINARY) -# if HAVE__SETMODE - _setmode(fileno(stdout), O_BINARY); -# elif HAVE_SETMODE - setmode(fileno(stdout), O_BINARY); -# endif /* HAVE_SETMODE */ -#endif /* defined(O_BINARY) */ - output_fp = stdout; - } else { - output_fp = fopen(filename, "wb"); - if (!output_fp) { -#if HAVE_ERRNO_H - perror("fopen() failed.\n"); -#endif /* HAVE_ERRNO_H */ - ret = -1; - goto end; - } - } - -#if HAVE_LIBPNG - rows = malloc(sy * sizeof(unsigned char *)); - for (y = 0; y < sy; ++y) { - rows[y] = pixels + sx * 3 * y; - } - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) { - ret = (-1); - goto end; - } - info_ptr = png_create_info_struct(png_ptr); - if (!png_ptr) { - ret = (-1); - goto end; - } -# if USE_SETJMP && HAVE_SETJMP - if (setjmp(png_jmpbuf(png_ptr))) { - ret = (-1); - goto end; - } -# endif - png_init_io(png_ptr, output_fp); - png_set_IHDR(png_ptr, info_ptr, sx, sy, - /* bit_depth */ 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - png_write_info(png_ptr, info_ptr); - png_write_image(png_ptr, rows); - png_write_end(png_ptr, NULL); -#else - png_data = stbi_write_png_to_mem(pixels, sx * 3, - sx, sy, /* STBI_rgb */ 3, &png_len); - - if (!png_data) { - fprintf(stderr, "stbi_write_png_to_mem failed.\n"); - goto end; - } - write_len = fwrite(png_data, 1, png_len, output_fp); - if (write_len < 0) { -# if HAVE_ERRNO_H - fprintf(stderr, "fwrite failed.\n" "reason: %s.\n", - strerror(errno)); -# endif /* HAVE_ERRNO_H */ - ret = -1; - goto end; - } -#endif /* HAVE_LIBPNG */ - - ret = 0; - -end: - if (output_fp && output_fp != stdout) { - fclose(output_fp); - } -#if HAVE_LIBPNG - free(rows); - png_destroy_write_struct (&png_ptr, &info_ptr); -#else - free(png_data); -#endif /* HAVE_LIBPNG */ - free(new_pixels); - - return ret; -} +#include static int @@ -268,7 +134,7 @@ sixel_to_png(char const *input, char const *output) goto end; } - ret = sixel_helper_write_image_file(output, indexed_pixels, sx, sy, PIXELFORMAT_PAL8); + ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, PIXELFORMAT_PAL8, output, FMT_PNG); end: free(pixels); diff --git a/include/sixel-imageio.h.in b/include/sixel-imageio.h.in index b783b015..2e07095f 100644 --- a/include/sixel-imageio.h.in +++ b/include/sixel-imageio.h.in @@ -24,6 +24,21 @@ /* loader API */ +enum imageFormat { + FMT_GIF = 0, + FMT_PNG = 1, + FMT_BMP = 2, + FMT_JPG = 3, + FMT_TGA = 4, + FMT_WBMP = 5, + FMT_TIFF = 6, + FMT_SIXEL = 7, + FMT_PNM = 8, + FMT_GD2 = 9, + FMT_PSD = 10, + FMT_HDR = 11, +}; + #ifdef __cplusplus extern "C" { #endif @@ -44,6 +59,16 @@ sixel_helper_load_image_file( int /* in */ fstatic, /* whether to extract static image */ int /* in */ reqcolors); /* requested number of colors */ +/* write image to file */ +int +sixel_helper_write_image_file( + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename, /* destination filename */ + int /* in */ imageformat); /* destination imageformat */ + #ifdef __cplusplus } #endif diff --git a/src/Makefile.am b/src/Makefile.am index e3f0ad89..a9608c6a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,7 +13,8 @@ libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_la_LIBADD = -lm lib_LTLIBRARIES += libsixel-imageio.la -libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h +libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h \ + writer.c stb_image_write.c stb_image_write.h libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ diff --git a/src/Makefile.in b/src/Makefile.in index 83ab227e..6cac4eb8 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -128,7 +128,8 @@ libsixel_imageio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/src/libsixel.la am_libsixel_imageio_la_OBJECTS = libsixel_imageio_la-loader.lo \ - libsixel_imageio_la-frompnm.lo + libsixel_imageio_la-frompnm.lo libsixel_imageio_la-writer.lo \ + libsixel_imageio_la-stb_image_write.lo libsixel_imageio_la_OBJECTS = $(am_libsixel_imageio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -355,7 +356,9 @@ libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) libsixel_la_LIBADD = -lm -libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h +libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h \ + writer.c stb_image_write.c stb_image_write.h + libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ @@ -450,6 +453,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-frompnm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-loader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-stb_image_write.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-writer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-output.Plo@am__quote@ @@ -493,6 +498,20 @@ libsixel_imageio_la-frompnm.lo: frompnm.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c +libsixel_imageio_la-writer.lo: writer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-writer.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-writer.Tpo -c -o libsixel_imageio_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-writer.Tpo $(DEPDIR)/libsixel_imageio_la-writer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='writer.c' object='libsixel_imageio_la-writer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c + +libsixel_imageio_la-stb_image_write.lo: stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-stb_image_write.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-stb_image_write.Tpo -c -o libsixel_imageio_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-stb_image_write.Tpo $(DEPDIR)/libsixel_imageio_la-stb_image_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='libsixel_imageio_la-stb_image_write.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c + libsixel_la-output.lo: output.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-output.lo -MD -MP -MF $(DEPDIR)/libsixel_la-output.Tpo -c -o libsixel_la-output.lo `test -f 'output.c' || echo '$(srcdir)/'`output.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-output.Tpo $(DEPDIR)/libsixel_la-output.Plo diff --git a/src/loader.c b/src/loader.c index bd3c74b3..a1fd900f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -81,11 +81,13 @@ #include #include "frompnm.h" #include +#include #define STBI_NO_STDIO 1 #define STB_IMAGE_IMPLEMENTATION 1 #include "stb_image.h" + typedef struct chunk { unsigned char* buffer; @@ -773,20 +775,6 @@ load_with_gdkpixbuf(chunk_t const *pchunk, int *psx, int *psy, #endif /* HAVE_GDK_PIXBUF2 */ #ifdef HAVE_GD - -#define FMT_GIF 0 -#define FMT_PNG 1 -#define FMT_BMP 2 -#define FMT_JPG 3 -#define FMT_TGA 4 -#define FMT_WBMP 5 -#define FMT_TIFF 6 -#define FMT_SIXEL 7 -#define FMT_PNM 8 -#define FMT_GD2 9 -#define FMT_PSD 10 -#define FMT_HDR 11 - static int detect_file_format(int len, unsigned char *data) { diff --git a/converters/stb_image_write.c b/src/stb_image_write.c similarity index 100% rename from converters/stb_image_write.c rename to src/stb_image_write.c diff --git a/converters/stb_image_write.h b/src/stb_image_write.h similarity index 100% rename from converters/stb_image_write.h rename to src/stb_image_write.h diff --git a/src/writer.c b/src/writer.c new file mode 100644 index 00000000..173cca76 --- /dev/null +++ b/src/writer.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2014 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include + +#if HAVE_SETJMP_H +# include +#endif + +#if HAVE_LIBPNG +# include +#else +# include "stb_image_write.h" +#endif + +#include +#include + +#if !defined(HAVE_MEMCPY) +# define memcpy(d, s, n) (bcopy ((s), (d), (n))) +#endif + +#if !defined(HAVE_MEMMOVE) +# define memmove(d, s, n) (bcopy ((s), (d), (n))) +#endif + +#if !defined(O_BINARY) && defined(_O_BINARY) +# define O_BINARY _O_BINARY +#endif /* !defined(O_BINARY) && !defined(_O_BINARY) */ + + +#if !HAVE_LIBPNG +unsigned char * +stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, + int x, int y, int n, int *out_len); +#endif + +static int +write_png_to_file( + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename) /* destination filename */ +{ + int ret = 0; + FILE *output_fp = NULL; + unsigned char *pixels = NULL; + unsigned char *new_pixels = NULL; + int y; +#if HAVE_LIBPNG + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + unsigned char **rows = NULL; +#else + unsigned char *png_data = NULL; + int png_len; + int write_len; +#endif /* HAVE_LIBPNG */ + + if (pixelformat != PIXELFORMAT_RGB888) { + pixels = new_pixels = malloc(width * height * 3); + ret = sixel_helper_normalize_pixelformat(pixels, data, + width, height, + PIXELFORMAT_PAL8); + if (ret != 0) { + goto end; + } + } else { + pixels = data; + } + + if (strcmp(filename, "-") == 0) { +#if defined(O_BINARY) +# if HAVE__SETMODE + _setmode(fileno(stdout), O_BINARY); +# elif HAVE_SETMODE + setmode(fileno(stdout), O_BINARY); +# endif /* HAVE_SETMODE */ +#endif /* defined(O_BINARY) */ + output_fp = stdout; + } else { + output_fp = fopen(filename, "wb"); + if (!output_fp) { +#if HAVE_ERRNO_H + perror("fopen() failed."); +#endif /* HAVE_ERRNO_H */ + ret = -1; + goto end; + } + } + +#if HAVE_LIBPNG + rows = malloc(height * sizeof(unsigned char *)); + for (y = 0; y < height; ++y) { + rows[y] = pixels + width * 3 * y; + } + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) { + ret = (-1); + goto end; + } + info_ptr = png_create_info_struct(png_ptr); + if (!png_ptr) { + ret = (-1); + goto end; + } +# if USE_SETJMP && HAVE_SETJMP + if (setjmp(png_jmpbuf(png_ptr))) { + ret = (-1); + goto end; + } +# endif + png_init_io(png_ptr, output_fp); + png_set_IHDR(png_ptr, info_ptr, width, height, + /* bit_depth */ 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + png_write_info(png_ptr, info_ptr); + png_write_image(png_ptr, rows); + png_write_end(png_ptr, NULL); +#else + png_data = stbi_write_png_to_mem(pixels, width * 3, + width, height, /* STBI_rgb */ 3, &png_len); + + if (!png_data) { + fprintf(stderr, "stbi_write_png_to_mem failed.\n"); + goto end; + } + write_len = fwrite(png_data, 1, png_len, output_fp); + if (write_len < 0) { +# if HAVE_ERRNO_H + perror("fwrite failed."); +# endif /* HAVE_ERRNO_H */ + ret = -1; + goto end; + } +#endif /* HAVE_LIBPNG */ + + ret = 0; + +end: + if (output_fp && output_fp != stdout) { + fclose(output_fp); + } +#if HAVE_LIBPNG + free(rows); + png_destroy_write_struct (&png_ptr, &info_ptr); +#else + free(png_data); +#endif /* HAVE_LIBPNG */ + free(new_pixels); + + return ret; +} + + +int +sixel_helper_write_image_file( + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename, /* destination filename */ + int /* in */ imageformat) /* destination imageformat */ +{ + int nret = (-1); + + switch (imageformat) { + case FMT_PNG: + nret = write_png_to_file(data, width, height, pixelformat, filename); + break; + case FMT_GIF: + case FMT_BMP: + case FMT_JPG: + case FMT_TGA: + case FMT_WBMP: + case FMT_TIFF: + case FMT_SIXEL: + case FMT_PNM: + case FMT_GD2: + case FMT_PSD: + case FMT_HDR: + default: + nret = (-1); + break; + } + + return nret; +} + + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 7fed4048559f706a2731f57a09927b1f13bc39fb Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 13 Jan 2015 14:15:14 +0900 Subject: [PATCH 026/451] Add check-am target to makefiles --- Makefile.am | 2 ++ Makefile.in | 2 ++ converters/Makefile.am | 6 +++++- converters/Makefile.in | 6 +++++- src/loader.c | 2 +- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 713603b2..bf3a2c11 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,6 +12,8 @@ CLEANFILES = valgrind.log test.log all-am: cp package.json.in package.json +check-am: + test: all cd converters && $(MAKE) test 2>&1 |tee test.log diff --git a/Makefile.in b/Makefile.in index f7b32716..be7b1d4f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -882,6 +882,8 @@ uninstall-am: uninstall-pkgconfigDATA all-am: cp package.json.in package.json +check-am: + test: all cd converters && $(MAKE) test 2>&1 |tee test.log diff --git a/converters/Makefile.am b/converters/Makefile.am index b34f45d0..80e9d425 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -37,7 +37,11 @@ sixel2png_LDADD = $(top_builddir)/src/libsixel.la \ dist_man_MANS += sixel2png.1 endif -test: all +check: test_impl + +test: all test_impl + +test_impl: if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -d invalid_option) test ! $$($(WINE) ./img2sixel -r invalid_option) diff --git a/converters/Makefile.in b/converters/Makefile.in index 9b5109b5..1dd60d4d 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -985,7 +985,11 @@ uninstall-man: uninstall-man1 uninstall-dist_zshcompletionDATA uninstall-man uninstall-man1 -test: all +check: test_impl + +test: all test_impl + +test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -d invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -r invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -s invalid_option) diff --git a/src/loader.c b/src/loader.c index a1fd900f..5c17caea 100644 --- a/src/loader.c +++ b/src/loader.c @@ -234,7 +234,7 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) return 0; } # endif /* HAVE_LIBCURL */ - + # if HAVE_JPEG /* import from @uobikiemukot's sdump loader.h */ From 4b9aa1e2647b32cae80b705afe68e81a2afa7f5b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 23 Jan 2015 23:33:44 +0900 Subject: [PATCH 027/451] Use osmesa for opengl-sixel demo --- examples/opengl/Makefile.am | 6 + examples/opengl/Makefile.in | 767 +++ examples/opengl/aclocal.m4 | 1364 ++++ examples/opengl/compile | 347 + examples/opengl/config.h.in | 77 + examples/opengl/configure | 6121 +++++++++++++++++ examples/opengl/configure.ac | 43 + examples/opengl/depcomp | 791 +++ examples/opengl/install-sh | 527 ++ .../{osx/opengl/opengl.c => opengl/main.c} | 188 +- examples/opengl/missing | 215 + examples/osx/opengl/Makefile | 12 - 12 files changed, 10431 insertions(+), 27 deletions(-) create mode 100644 examples/opengl/Makefile.am create mode 100644 examples/opengl/Makefile.in create mode 100644 examples/opengl/aclocal.m4 create mode 100755 examples/opengl/compile create mode 100644 examples/opengl/config.h.in create mode 100755 examples/opengl/configure create mode 100644 examples/opengl/configure.ac create mode 100755 examples/opengl/depcomp create mode 100755 examples/opengl/install-sh rename examples/{osx/opengl/opengl.c => opengl/main.c} (59%) create mode 100755 examples/opengl/missing delete mode 100644 examples/osx/opengl/Makefile diff --git a/examples/opengl/Makefile.am b/examples/opengl/Makefile.am new file mode 100644 index 00000000..53b7b8ff --- /dev/null +++ b/examples/opengl/Makefile.am @@ -0,0 +1,6 @@ + +bin_PROGRAMS = demo +demo_SOURCES = main.c +demo_CFLAGS = -Wall -Wextra $(LIBSIXEL_CFLAGS) $(OSMESA_CFLAGS) +demo_LDADD = -lm $(LIBSIXEL_LIBS) $(OSMESA_LIBS) + diff --git a/examples/opengl/Makefile.in b/examples/opengl/Makefile.in new file mode 100644 index 00000000..24a06fcd --- /dev/null +++ b/examples/opengl/Makefile.in @@ -0,0 +1,767 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +bin_PROGRAMS = demo$(EXEEXT) +subdir = . +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/config.h.in depcomp compile install-sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_demo_OBJECTS = demo-main.$(OBJEXT) +demo_OBJECTS = $(am_demo_OBJECTS) +am__DEPENDENCIES_1 = +demo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +demo_LINK = $(CCLD) $(demo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(demo_SOURCES) +DIST_SOURCES = $(demo_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSIXEL_CFLAGS = @LIBSIXEL_CFLAGS@ +LIBSIXEL_LIBS = @LIBSIXEL_LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +OSMESA_CFLAGS = @OSMESA_CFLAGS@ +OSMESA_LIBS = @OSMESA_LIBS@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +demo_SOURCES = main.c +demo_CFLAGS = -Wall -Wextra $(LIBSIXEL_CFLAGS) $(OSMESA_CFLAGS) +demo_LDADD = -lm $(LIBSIXEL_LIBS) $(OSMESA_LIBS) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +demo$(EXEEXT): $(demo_OBJECTS) $(demo_DEPENDENCIES) $(EXTRA_demo_DEPENDENCIES) + @rm -f demo$(EXEEXT) + $(AM_V_CCLD)$(demo_LINK) $(demo_OBJECTS) $(demo_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo-main.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +demo-main.o: main.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -MT demo-main.o -MD -MP -MF $(DEPDIR)/demo-main.Tpo -c -o demo-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo-main.Tpo $(DEPDIR)/demo-main.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='demo-main.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -c -o demo-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c + +demo-main.obj: main.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -MT demo-main.obj -MD -MP -MF $(DEPDIR)/demo-main.Tpo -c -o demo-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo-main.Tpo $(DEPDIR)/demo-main.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='demo-main.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -c -o demo-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) config.h +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ + clean-binPROGRAMS clean-cscope clean-generic cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-compile distclean-generic \ + distclean-hdr distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/opengl/aclocal.m4 b/examples/opengl/aclocal.m4 new file mode 100644 index 00000000..1f91f85b --- /dev/null +++ b/examples/opengl/aclocal.m4 @@ -0,0 +1,1364 @@ +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + + +# PKG_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable pkgconfigdir as the location where a module +# should install pkg-config .pc files. By default the directory is +# $libdir/pkgconfig, but the default can be changed by passing +# DIRECTORY. The user can override through the --with-pkgconfigdir +# parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_INSTALLDIR + + +# PKG_NOARCH_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable noarch_pkgconfigdir as the location where a +# module should install arch-independent pkg-config .pc files. By +# default the directory is $datadir/pkgconfig, but the default can be +# changed by passing DIRECTORY. The user can override through the +# --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_NOARCH_INSTALLDIR + + +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR + +# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.14' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.14.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.14.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/examples/opengl/compile b/examples/opengl/compile new file mode 100755 index 00000000..531136b0 --- /dev/null +++ b/examples/opengl/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/examples/opengl/config.h.in b/examples/opengl/config.h.in new file mode 100644 index 00000000..ae504834 --- /dev/null +++ b/examples/opengl/config.h.in @@ -0,0 +1,77 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* whether libsixel is available */ +#undef HAVE_LIBSIXEL + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* whether osmesa is available */ +#undef HAVE_OSMESA + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/examples/opengl/configure b/examples/opengl/configure new file mode 100755 index 00000000..794c366e --- /dev/null +++ b/examples/opengl/configure @@ -0,0 +1,6121 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for demo 1.0.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and user@zuse.jp about +$0: your system, including any error possibly output before +$0: this message. Then install a modern shell, or manually +$0: run the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='demo' +PACKAGE_TARNAME='demo' +PACKAGE_VERSION='1.0.0' +PACKAGE_STRING='demo 1.0.0' +PACKAGE_BUGREPORT='user@zuse.jp' +PACKAGE_URL='' + +ac_unique_file="main.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +EGREP +GREP +CPP +OSMESA_LIBS +OSMESA_CFLAGS +LIBSIXEL_LIBS +LIBSIXEL_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +LIBSIXEL_CFLAGS +LIBSIXEL_LIBS +OSMESA_CFLAGS +OSMESA_LIBS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures demo 1.0.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/demo] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of demo 1.0.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + LIBSIXEL_CFLAGS + C compiler flags for LIBSIXEL, overriding pkg-config + LIBSIXEL_LIBS + linker flags for LIBSIXEL, overriding pkg-config + OSMESA_CFLAGS + C compiler flags for OSMESA, overriding pkg-config + OSMESA_LIBS linker flags for OSMESA, overriding pkg-config + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +demo configure 1.0.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## --------------------------- ## +## Report this to user@zuse.jp ## +## --------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by demo $as_me 1.0.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +am__api_version='1.14' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='demo' + VERSION='1.0.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +# Checks for libraries. + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSIXEL" >&5 +$as_echo_n "checking for LIBSIXEL... " >&6; } + +if test -n "$LIBSIXEL_CFLAGS"; then + pkg_cv_LIBSIXEL_CFLAGS="$LIBSIXEL_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsixel\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsixel") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBSIXEL_CFLAGS=`$PKG_CONFIG --cflags "libsixel" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBSIXEL_LIBS"; then + pkg_cv_LIBSIXEL_LIBS="$LIBSIXEL_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsixel\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsixel") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBSIXEL_LIBS=`$PKG_CONFIG --libs "libsixel" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBSIXEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsixel" 2>&1` + else + LIBSIXEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsixel" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBSIXEL_PKG_ERRORS" >&5 + + have_libsixel=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_libsixel=no +else + LIBSIXEL_CFLAGS=$pkg_cv_LIBSIXEL_CFLAGS + LIBSIXEL_LIBS=$pkg_cv_LIBSIXEL_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_libsixel=yes +fi +if test x$have_libsixel != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: libsixel: $have_libsixel" >&5 +$as_echo "$as_me: libsixel: $have_libsixel" >&6;} + +$as_echo "#define HAVE_LIBSIXEL 1" >>confdefs.h + +fi + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OSMESA" >&5 +$as_echo_n "checking for OSMESA... " >&6; } + +if test -n "$OSMESA_CFLAGS"; then + pkg_cv_OSMESA_CFLAGS="$OSMESA_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"osmesa\""; } >&5 + ($PKG_CONFIG --exists --print-errors "osmesa") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OSMESA_CFLAGS=`$PKG_CONFIG --cflags "osmesa" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$OSMESA_LIBS"; then + pkg_cv_OSMESA_LIBS="$OSMESA_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"osmesa\""; } >&5 + ($PKG_CONFIG --exists --print-errors "osmesa") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OSMESA_LIBS=`$PKG_CONFIG --libs "osmesa" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + OSMESA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "osmesa" 2>&1` + else + OSMESA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "osmesa" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$OSMESA_PKG_ERRORS" >&5 + + have_osmesa=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_osmesa=no +else + OSMESA_CFLAGS=$pkg_cv_OSMESA_CFLAGS + OSMESA_LIBS=$pkg_cv_OSMESA_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_osmesa=yes +fi +if test x$have_osmesa != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: osmesa: $have_osmesa" >&5 +$as_echo "$as_me: osmesa: $have_osmesa" >&6;} + +$as_echo "#define HAVE_OSMESA 1" >>confdefs.h + +fi + + + +# Checks for header files. +#AC_PATH_X + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in memory.h stdlib.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + +# Checks for library functions. +for ac_header in stdlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDLIB_H 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 +$as_echo_n "checking for GNU libc compatible malloc... " >&6; } +if ${ac_cv_func_malloc_0_nonnull+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_malloc_0_nonnull=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined STDC_HEADERS || defined HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +return ! malloc (0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_malloc_0_nonnull=yes +else + ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 +$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } +if test $ac_cv_func_malloc_0_nonnull = yes; then : + +$as_echo "#define HAVE_MALLOC 1" >>confdefs.h + +else + $as_echo "#define HAVE_MALLOC 0" >>confdefs.h + + case " $LIBOBJS " in + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" + ;; +esac + + +$as_echo "#define malloc rpl_malloc" >>confdefs.h + +fi + + +for ac_func in memset strstr +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by demo $as_me 1.0.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +demo config.status 1.0.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/examples/opengl/configure.ac b/examples/opengl/configure.ac new file mode 100644 index 00000000..438d8086 --- /dev/null +++ b/examples/opengl/configure.ac @@ -0,0 +1,43 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([demo], [1.0.0], [user@zuse.jp]) +AM_INIT_AUTOMAKE([foreign]) + +AC_CONFIG_SRCDIR([main.c]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. +PKG_CHECK_MODULES([LIBSIXEL], [libsixel], [have_libsixel=yes], [have_libsixel=no]) +if test x$have_libsixel != xno; then + AC_MSG_NOTICE([libsixel: $have_libsixel]) + AC_DEFINE(HAVE_LIBSIXEL, 1, [whether libsixel is available]) +fi +AC_SUBST(LIBSIXEL_CFLAGS) +AC_SUBST(LIBSIXEL_LIBS) + +PKG_CHECK_MODULES([OSMESA], [osmesa], [have_osmesa=yes], [have_osmesa=no]) +if test x$have_osmesa != xno; then + AC_MSG_NOTICE([osmesa: $have_osmesa]) + AC_DEFINE(HAVE_OSMESA, 1, [whether osmesa is available]) +fi +AC_SUBST(OSMESA_CFLAGS) +AC_SUBST(OSMESA_LIBS) + +# Checks for header files. +#AC_PATH_X +AC_CHECK_HEADERS([memory.h stdlib.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_SIZE_T + +# Checks for library functions. +AC_FUNC_MALLOC +AC_CHECK_FUNCS([memset strstr]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/examples/opengl/depcomp b/examples/opengl/depcomp new file mode 100755 index 00000000..4ebd5b3a --- /dev/null +++ b/examples/opengl/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/examples/opengl/install-sh b/examples/opengl/install-sh new file mode 100755 index 00000000..377bb868 --- /dev/null +++ b/examples/opengl/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-11-20.07; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/examples/osx/opengl/opengl.c b/examples/opengl/main.c similarity index 59% rename from examples/osx/opengl/opengl.c rename to examples/opengl/main.c index 787cda8c..e8d57105 100644 --- a/examples/osx/opengl/opengl.c +++ b/examples/opengl/main.c @@ -7,25 +7,52 @@ * This file is offered AS-IS, without any warranty. * */ -#if defined(__APPLE__) && defined(__MACH__) + +#include "config.h" + +#if HAVE_OSMESA +# define USE_OSMESA 1 +#elif defined(__APPLE__) && defined(__MACH__) +# define USE_CGL +#elif HAVE_X11 +# define USE_GLX 1 +#else +#endif + +#if USE_OSMESA +# include +#elif USE_CGL # include -# include # include -#else -# error Now this example only works on OSX. I hope someone port this onto other environments.\n +#elif USE_GLX +# include +# include # include -# include #endif + #include #include #include #include +#include +#include + +#ifndef PI +# define PI 3.1415926535897932386 +#endif #include /* libsixel */ -#if defined(__APPLE__) && defined(__MACH__) +#if USE_OSMESA +static unsigned char *pbuffer; +static OSMesaContext context; +#elif USE_CGL static CGLPBufferObj pbuffer; static CGLContextObj context; +#elif USE_GLX && (defined(GLX_VERSION_1_3) || defined(GLX_VERSION_1_4)) +static Display *display = NULL; +static GLXPbuffer pbuffer = 0; +static GLXContext context; #endif static volatile int signaled = 0; @@ -34,9 +61,16 @@ static void sighandler(int sig) signaled = sig; } -static CGLError setup(int width, int height) +static int setup(int width, int height) { -#if defined(__APPLE__) && defined(__MACH__) +#if USE_OSMESA + const size_t size = width * height * 4; + pbuffer = malloc(size); + memset(pbuffer, 0x21, size); + context = OSMesaCreateContextExt(GL_RGBA, 24, 0, 0, 0); + OSMesaMakeCurrent(context, (void *)pbuffer, GL_UNSIGNED_BYTE, width, height); + return 0; +#elif USE_CGL /* OpenGL PBuffer initialization: OSX specific */ CGLPixelFormatAttribute pfattr[] = { kCGLPFAPBuffer, @@ -44,7 +78,7 @@ static CGLError setup(int width, int height) }; CGLPixelFormatObj pixformat; GLint npixels; - CGLError e; + int e; e = CGLChoosePixelFormat(pfattr, &pixformat, &npixels); if (e != kCGLNoError) { @@ -77,23 +111,132 @@ static CGLError setup(int width, int height) return e; } return kCGLNoError; +#elif USE_GLX + /* Open the X display */ + display = XOpenDisplay(NULL); + if (!display) { + printf("Error: couldn't open default X display.\n"); + return (-1); + } + + /* Get default screen */ + int screen = DefaultScreen(display); + + char *glxversion; + + glxversion = (char *) glXGetClientString(display, GLX_VERSION); + if (!(strstr(glxversion, "1.3") || strstr(glxversion, "1.4"))) { + XCloseDisplay(display); + return (-1); + } + + glxversion = (char *) glXQueryServerString(display, screen, GLX_VERSION); + if (!(strstr(glxversion, "1.3") || strstr(glxversion, "1.4"))) { + XCloseDisplay(display); + return (-1); + } + + /* Create Pbuffer */ + GLXFBConfig *fbConfigs; + GLXFBConfig chosenFBConfig; + GLXFBConfig fbconfig = 0; + GLXPbuffer pbuffer = None; + + int nConfigs; + int fbconfigid; + + int fbAttribs[] = { + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_DEPTH_SIZE, 1, + GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT | GLX_PBUFFER_BIT, + None + }; + + int pbAttribs[] = { + GLX_PBUFFER_WIDTH, 0, + GLX_PBUFFER_HEIGHT, 0, + GLX_LARGEST_PBUFFER, False, + GLX_PRESERVED_CONTENTS, False, + None + }; + + pbAttribs[1] = width; + pbAttribs[3] = height; + + fbConfigs = glXChooseFBConfig(display, screen, fbAttribs, &nConfigs); + + if (0 == nConfigs || !fbConfigs) { + printf("Error: glxChooseFBConfig failed\n"); + XFree(fbConfigs); + XCloseDisplay(display); + return (-1); + } + + chosenFBConfig = fbConfigs[0]; + + glXGetFBConfigAttrib(display, chosenFBConfig, GLX_FBCONFIG_ID, &fbconfigid); + printf("Chose 0x%x as fbconfigid\n", fbconfigid); + + /* Create the pbuffer using first fbConfig in the list that works. */ + pbuffer = glXCreatePbuffer(display, chosenFBConfig, pbAttribs); + + if (pbuffer) { + fbconfig = chosenFBConfig; + } + + XFree(fbConfigs); + + //pbuffer = MakePbuffer(display, screen, width, height); + + if (pbuffer==None) { + printf("Error: couldn't create pbuffer\n"); + XCloseDisplay(display); + return (-1); + } + + /* Create GLX context */ + context = glXCreateNewContext(display, fbconfig, GLX_RGBA_TYPE, NULL, True); + if (context) { + if (!glXIsDirect(display, context)) { + printf("Warning: using indirect GLXContext\n"); + } + } + else { + printf("Error: Couldn't create GLXContext\n"); + XCloseDisplay(display); + return (-1); + } + + /* Bind context to pbuffer */ + if (!glXMakeCurrent(display, pbuffer, context)) { + printf("Error: glXMakeCurrent failed\n"); + XCloseDisplay(display); + return (-1); + } + return 0; #else /* TODO: pbuffer initialization */ return 0; #endif } -static CGLError +static int cleanup(void) { -#if defined(__APPLE__) && defined(__MACH__) +#if USE_OSMESA + OSMesaDestroyContext(context); + free(pbuffer); +#elif USE_CGL (void)CGLDestroyContext(context); (void)CGLDestroyPBuffer(pbuffer); - return kCGLNoError /* 0 */; +#elif USE_GLX + display = XOpenDisplay(NULL); + glXDestroyPbuffer(display, pbuffer); + XCloseDisplay(display); #else /* TODO: cleanup pbuffer and OpenGL context */ - return 0; #endif + return 0; } @@ -196,13 +339,15 @@ output_sixel(unsigned char *pixbuf, int width, int height, return 0; } - int main(int argc, char** argv) { int width = 400; int height = 300; int ncolors = 16; + (void) argc; + (void) argv; + static char *pixbuf; if (signal(SIGINT, sighandler) == SIG_ERR) @@ -219,7 +364,20 @@ int main(int argc, char** argv) glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(45, (GLfloat)width / (GLfloat)height, 0.1, 100); + GLfloat fovy = 45; + GLfloat aspect = (GLfloat)width / (GLfloat)height; + GLfloat znear = 0.1; + GLfloat zfar = 100; + GLfloat radian= 2 * M_PI * fovy / 360.0; + GLfloat t = (GLfloat)(1.0 / tan(radian / 2)); + GLfloat matrix[]={ + t / aspect, 0, 0, 0, + 0, t, 0, 0, + 0, 0, (zfar + znear) / (znear - zfar), -1, + 0, 0, (2 * zfar * znear) / (znear - zfar), 0 + }; + glLoadMatrixf(matrix); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); diff --git a/examples/opengl/missing b/examples/opengl/missing new file mode 100755 index 00000000..db98974f --- /dev/null +++ b/examples/opengl/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/examples/osx/opengl/Makefile b/examples/osx/opengl/Makefile deleted file mode 100644 index af19d4ea..00000000 --- a/examples/osx/opengl/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -CC=cc -CFLAGS=-Wall -Wno-deprecated-declarations `pkg-config --cflags libsixel` -LDFLAGS=`pkg-config --libs libsixel` -framework OpenGL - -all: opengl.c Makefile - $(CC) $(CFLAGS) opengl.c $(LDFLAGS) -o opengl - -run: all - ./opengl - -clean: - rm -f opengl *.o From c62c62a8ce128d31ce4efca6c76a8d5c66fd07ed Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 23 Jan 2015 23:36:34 +0900 Subject: [PATCH 028/451] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51bcf826..95482d21 100644 --- a/README.md +++ b/README.md @@ -494,7 +494,7 @@ The Whole API is described [here](https://github.com/saitoha/libsixel/blob/maste ### Example If you use OSX, a tiny example is available -[here](https://github.com/saitoha/libsixel/blob/master/examples/osx/opengl/). +[here](https://github.com/saitoha/libsixel/blob/master/examples/opengl/). ![opengl example](https://raw.githubusercontent.com/saitoha/libsixel/data/data/example_opengl.gif) From 56bdd9c1530986e487cd25ebba9339d178c34aa1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 24 Jan 2015 01:03:41 +0900 Subject: [PATCH 029/451] Do not free temporary buffer allocated by custom allocator --- src/fromsixel.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/fromsixel.c b/src/fromsixel.c index 2a1f44b0..d3878c2b 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -246,7 +246,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ imsx = 2048; imsy = 2048; - imbuf = allocator(imsx * imsy); + imbuf = malloc(imsx * imsy); if (imbuf == NULL) { return (-1); @@ -361,7 +361,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ if (imsx < attributed_ph || imsy < attributed_pv) { dmsx = imsx > attributed_ph ? imsx : attributed_ph; dmsy = imsy > attributed_pv ? imsy : attributed_pv; - dmbuf = allocator(dmsx * dmsy); + dmbuf = malloc(dmsx * dmsy); if (dmbuf == NULL) { free(imbuf); return (-1); @@ -435,7 +435,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ dmsx = nx; dmsy = ny; - dmbuf = allocator(dmsx * dmsy); + dmbuf = malloc(dmsx * dmsy); if (dmbuf == NULL) { free(imbuf); return (-1); @@ -518,7 +518,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ if (imsx > max_x || imsy > max_y) { dmsx = max_x; dmsy = max_y; - if ((dmbuf = allocator(dmsx * dmsy)) == NULL) { + if ((dmbuf = malloc(dmsx * dmsy)) == NULL) { free(imbuf); return (-1); } @@ -531,11 +531,17 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ imbuf = dmbuf; } - *pixels = imbuf; + if (allocator) { + *pixels = allocator(imsx * imsy); + memcpy(*pixels, imbuf, imsx * imsy); + *palette = allocator(*ncolors * 3); + } else { + *pixels = imbuf; + *palette = malloc(*ncolors * 3); + } *pwidth = imsx; *pheight = imsy; *ncolors = max_color_index + 1; - *palette = allocator(*ncolors * 4); for (n = 0; n < *ncolors; ++n) { (*palette)[n * 3 + 0] = sixel_palet[n] >> 16 & 0xff; (*palette)[n * 3 + 1] = sixel_palet[n] >> 8 & 0xff; From fcddf2672b6c849fe67fbe9523df8cf92926e547 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 24 Jan 2015 13:33:06 +0900 Subject: [PATCH 030/451] Fix mingw build --- src/writer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/writer.c b/src/writer.c index 173cca76..4bb8a1e6 100644 --- a/src/writer.c +++ b/src/writer.c @@ -69,8 +69,8 @@ write_png_to_file( FILE *output_fp = NULL; unsigned char *pixels = NULL; unsigned char *new_pixels = NULL; - int y; #if HAVE_LIBPNG + int y; png_structp png_ptr = NULL; png_infop info_ptr = NULL; unsigned char **rows = NULL; From 6fec41d2d9f8f9a77109f45e9dad39b65e15f65b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 24 Jan 2015 13:33:39 +0900 Subject: [PATCH 031/451] Detect CGL/GLX availability in opengl example configuration --- examples/opengl/Makefile.am | 4 +- examples/opengl/Makefile.in | 29 +- examples/opengl/config.h.in | 9 + examples/opengl/configure | 1159 +++++++++++++++++++++++++++++----- examples/opengl/configure.ac | 56 +- examples/opengl/main.c | 4 +- 6 files changed, 1094 insertions(+), 167 deletions(-) diff --git a/examples/opengl/Makefile.am b/examples/opengl/Makefile.am index 53b7b8ff..5741c6ca 100644 --- a/examples/opengl/Makefile.am +++ b/examples/opengl/Makefile.am @@ -1,6 +1,6 @@ bin_PROGRAMS = demo demo_SOURCES = main.c -demo_CFLAGS = -Wall -Wextra $(LIBSIXEL_CFLAGS) $(OSMESA_CFLAGS) -demo_LDADD = -lm $(LIBSIXEL_LIBS) $(OSMESA_LIBS) +demo_CFLAGS = -Wall -Wextra $(LIBSIXEL_CFLAGS) $(GL_CFLAGS) $(X_CFLAGS) +demo_LDADD = -lm $(LIBSIXEL_LIBS) $(GL_LIBS) $(X_LIBS) diff --git a/examples/opengl/Makefile.in b/examples/opengl/Makefile.in index 24a06fcd..9c9b06c9 100644 --- a/examples/opengl/Makefile.in +++ b/examples/opengl/Makefile.in @@ -76,11 +76,14 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ bin_PROGRAMS = demo$(EXEEXT) subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/config.h.in depcomp compile install-sh missing + $(srcdir)/config.h.in depcomp compile config.guess config.sub \ + install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -96,7 +99,8 @@ PROGRAMS = $(bin_PROGRAMS) am_demo_OBJECTS = demo-main.$(OBJEXT) demo_OBJECTS = $(am_demo_OBJECTS) am__DEPENDENCIES_1 = -demo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +demo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) demo_LINK = $(CCLD) $(demo_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) @@ -197,6 +201,8 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ +GL_CFLAGS = @GL_CFLAGS@ +GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ @@ -212,8 +218,6 @@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ -OSMESA_CFLAGS = @OSMESA_CFLAGS@ -OSMESA_LIBS = @OSMESA_LIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -229,6 +233,11 @@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ @@ -240,14 +249,22 @@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ +build = @build@ build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ +host = @host@ host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ @@ -272,8 +289,8 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ demo_SOURCES = main.c -demo_CFLAGS = -Wall -Wextra $(LIBSIXEL_CFLAGS) $(OSMESA_CFLAGS) -demo_LDADD = -lm $(LIBSIXEL_LIBS) $(OSMESA_LIBS) +demo_CFLAGS = -Wall -Wextra $(LIBSIXEL_CFLAGS) $(GL_CFLAGS) $(X_CFLAGS) +demo_LDADD = -lm $(LIBSIXEL_LIBS) $(GL_LIBS) $(X_LIBS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am diff --git a/examples/opengl/config.h.in b/examples/opengl/config.h.in index ae504834..7b445849 100644 --- a/examples/opengl/config.h.in +++ b/examples/opengl/config.h.in @@ -1,5 +1,11 @@ /* config.h.in. Generated from configure.ac by autoheader. */ +/* whether CGL is available */ +#undef HAVE_CGL + +/* whether GLX is available */ +#undef HAVE_GLX + /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -70,6 +76,9 @@ /* Version number of package */ #undef VERSION +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc diff --git a/examples/opengl/configure b/examples/opengl/configure index 794c366e..e4bfe30f 100755 --- a/examples/opengl/configure +++ b/examples/opengl/configure @@ -627,9 +627,14 @@ LTLIBOBJS LIBOBJS EGREP GREP +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS CPP -OSMESA_LIBS -OSMESA_CFLAGS +XMKMF +GL_LIBS +GL_CFLAGS LIBSIXEL_LIBS LIBSIXEL_CFLAGS PKG_CONFIG_LIBDIR @@ -652,6 +657,14 @@ CPPFLAGS LDFLAGS CFLAGS CC +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V @@ -722,6 +735,7 @@ ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking +with_x ' ac_precious_vars='build_alias host_alias @@ -736,8 +750,9 @@ PKG_CONFIG_PATH PKG_CONFIG_LIBDIR LIBSIXEL_CFLAGS LIBSIXEL_LIBS -OSMESA_CFLAGS -OSMESA_LIBS +GL_CFLAGS +GL_LIBS +XMKMF CPP' @@ -1340,6 +1355,14 @@ Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi @@ -1360,6 +1383,11 @@ Optional Features: --disable-dependency-tracking speeds up one-time build +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-x use the X Window System + Some influential environment variables: CC C compiler command CFLAGS C compiler flags @@ -1377,9 +1405,9 @@ Some influential environment variables: C compiler flags for LIBSIXEL, overriding pkg-config LIBSIXEL_LIBS linker flags for LIBSIXEL, overriding pkg-config - OSMESA_CFLAGS - C compiler flags for OSMESA, overriding pkg-config - OSMESA_LIBS linker flags for OSMESA, overriding pkg-config + GL_CFLAGS C compiler flags for GL, overriding pkg-config + GL_LIBS linker flags for GL, overriding pkg-config + XMKMF Path to xmkmf, Makefile generator for X Window System CPP C preprocessor Use these variables to override the choices made by `configure' or to help @@ -1537,6 +1565,119 @@ fi } # ac_fn_c_try_cpp +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using @@ -1754,119 +1895,6 @@ $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -2831,6 +2859,78 @@ fi ac_config_headers="$ac_config_headers config.h" +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4070,17 +4170,20 @@ $as_echo "$as_me: libsixel: $have_libsixel" >&6;} $as_echo "#define HAVE_LIBSIXEL 1" >>confdefs.h +else + as_fn_error $? "libsixel is not available." "$LINENO" 5 fi +if test x$have_gl != xyes; then pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OSMESA" >&5 -$as_echo_n "checking for OSMESA... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL" >&5 +$as_echo_n "checking for GL... " >&6; } -if test -n "$OSMESA_CFLAGS"; then - pkg_cv_OSMESA_CFLAGS="$OSMESA_CFLAGS" +if test -n "$GL_CFLAGS"; then + pkg_cv_GL_CFLAGS="$GL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"osmesa\""; } >&5 @@ -4088,7 +4191,7 @@ if test -n "$OSMESA_CFLAGS"; then ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_OSMESA_CFLAGS=`$PKG_CONFIG --cflags "osmesa" 2>/dev/null` + pkg_cv_GL_CFLAGS=`$PKG_CONFIG --cflags "osmesa" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -4096,8 +4199,8 @@ fi else pkg_failed=untried fi -if test -n "$OSMESA_LIBS"; then - pkg_cv_OSMESA_LIBS="$OSMESA_LIBS" +if test -n "$GL_LIBS"; then + pkg_cv_GL_LIBS="$GL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"osmesa\""; } >&5 @@ -4105,7 +4208,7 @@ if test -n "$OSMESA_LIBS"; then ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_OSMESA_LIBS=`$PKG_CONFIG --libs "osmesa" 2>/dev/null` + pkg_cv_GL_LIBS=`$PKG_CONFIG --libs "osmesa" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -4126,12 +4229,12 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - OSMESA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "osmesa" 2>&1` + GL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "osmesa" 2>&1` else - OSMESA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "osmesa" 2>&1` + GL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "osmesa" 2>&1` fi # Put the nasty error message in config.log where it belongs - echo "$OSMESA_PKG_ERRORS" >&5 + echo "$GL_PKG_ERRORS" >&5 have_osmesa=no elif test $pkg_failed = untried; then @@ -4139,24 +4242,36 @@ elif test $pkg_failed = untried; then $as_echo "no" >&6; } have_osmesa=no else - OSMESA_CFLAGS=$pkg_cv_OSMESA_CFLAGS - OSMESA_LIBS=$pkg_cv_OSMESA_LIBS + GL_CFLAGS=$pkg_cv_GL_CFLAGS + GL_LIBS=$pkg_cv_GL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_osmesa=yes fi -if test x$have_osmesa != xno; then - { $as_echo "$as_me:${as_lineno-$LINENO}: osmesa: $have_osmesa" >&5 + if test x$have_osmesa != xno; then + have_gl=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: osmesa: $have_osmesa" >&5 $as_echo "$as_me: osmesa: $have_osmesa" >&6;} $as_echo "#define HAVE_OSMESA 1" >>confdefs.h + fi fi +if test x$have_gl != xyes; then + case $host in + *-apple-darwin*) + have_gl=yes + GL_CFLAGS=-Wno-deprecated-declarations + GL_LIBS="-framework OpenGL" +$as_echo "#define HAVE_CGL 1" >>confdefs.h -# Checks for header files. -#AC_PATH_X + ;; + esac +fi + +if test x$have_gl != xyes; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4296,10 +4411,694 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +# Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = xyes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = xyes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if ${ac_cv_lib_posix_remove+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = xyes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if ${ac_cv_lib_ipc_shmat+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + if test x$X_DISPLAY_MISSING = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false @@ -4555,19 +5354,81 @@ fi done -for ac_header in memory.h stdlib.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = xyes; then : + + ac_fn_c_check_header_mongrel "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glx_h" = xyes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lGL" >&5 +$as_echo_n "checking for glXCreateContext in -lGL... " >&6; } +if ${ac_cv_lib_GL_glXCreateContext+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGL $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXCreateContext (); +int +main () +{ +return glXCreateContext (); + ; + return 0; +} _ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_GL_glXCreateContext=yes +else + ac_cv_lib_GL_glXCreateContext=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXCreateContext" >&5 +$as_echo "$ac_cv_lib_GL_glXCreateContext" >&6; } +if test "x$ac_cv_lib_GL_glXCreateContext" = xyes; then : + + have_gl=yes + GL_CFLAGS= + GL_LIBS=-lGL + +$as_echo "#define HAVE_GLX 1" >>confdefs.h + fi -done +fi + + + +fi + + + fi + + +fi + +if test x$have_gl != xyes; then + as_fn_error $? "Please install osmesa (e.g. \"apt-get install libosmesa6-dev\")" "$LINENO" 5 +fi + + + + +# Checks for header files. +#AC_CHECK_HEADERS([memory.h stdlib.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" diff --git a/examples/opengl/configure.ac b/examples/opengl/configure.ac index 438d8086..9dafacb1 100644 --- a/examples/opengl/configure.ac +++ b/examples/opengl/configure.ac @@ -8,6 +8,8 @@ AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) +AC_CANONICAL_HOST + # Checks for programs. AC_PROG_CC @@ -16,21 +18,59 @@ PKG_CHECK_MODULES([LIBSIXEL], [libsixel], [have_libsixel=yes], [have_libsixel=no if test x$have_libsixel != xno; then AC_MSG_NOTICE([libsixel: $have_libsixel]) AC_DEFINE(HAVE_LIBSIXEL, 1, [whether libsixel is available]) +else + AC_MSG_ERROR(libsixel is not available.) fi AC_SUBST(LIBSIXEL_CFLAGS) AC_SUBST(LIBSIXEL_LIBS) -PKG_CHECK_MODULES([OSMESA], [osmesa], [have_osmesa=yes], [have_osmesa=no]) -if test x$have_osmesa != xno; then - AC_MSG_NOTICE([osmesa: $have_osmesa]) - AC_DEFINE(HAVE_OSMESA, 1, [whether osmesa is available]) +if test x$have_gl != xyes; then + PKG_CHECK_MODULES([GL], [osmesa], [have_osmesa=yes], [have_osmesa=no]) + if test x$have_osmesa != xno; then + have_gl=yes + AC_MSG_NOTICE([osmesa: $have_osmesa]) + AC_DEFINE(HAVE_OSMESA, 1, [whether osmesa is available]) + fi +fi + +if test x$have_gl != xyes; then + case $host in + *-apple-darwin*) + have_gl=yes + GL_CFLAGS=-Wno-deprecated-declarations + GL_LIBS="-framework OpenGL" + AC_DEFINE(HAVE_CGL, 1, [whether CGL is available]) + ;; + esac +fi + +if test x$have_gl != xyes; then + AC_PATH_XTRA + if test x$X_DISPLAY_MISSING = x; then + AC_CHECK_HEADER([GL/gl.h], [ + AC_CHECK_HEADER([GL/glx.h], [ + AC_CHECK_LIB([GL], [glXCreateContext], [ + have_gl=yes + GL_CFLAGS= + GL_LIBS=-lGL + AC_DEFINE(HAVE_GLX, 1, [whether GLX is available]) + ]) + ]) + ]) + fi + AC_SUBST(X_CFLAGS) + AC_SUBST(X_LIBS) +fi + +if test x$have_gl != xyes; then + AC_MSG_ERROR([Please install osmesa (e.g. "apt-get install libosmesa6-dev")]) fi -AC_SUBST(OSMESA_CFLAGS) -AC_SUBST(OSMESA_LIBS) + +AC_SUBST(GL_CFLAGS) +AC_SUBST(GL_LIBS) # Checks for header files. -#AC_PATH_X -AC_CHECK_HEADERS([memory.h stdlib.h unistd.h]) +#AC_CHECK_HEADERS([memory.h stdlib.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T diff --git a/examples/opengl/main.c b/examples/opengl/main.c index e8d57105..9bb5866f 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -12,8 +12,8 @@ #if HAVE_OSMESA # define USE_OSMESA 1 -#elif defined(__APPLE__) && defined(__MACH__) -# define USE_CGL +#elif HAVE_CGL +# define USE_CGL 1 #elif HAVE_X11 # define USE_GLX 1 #else From 95196174259d8b645cdc1de969441c3eb0e67424 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 24 Jan 2015 13:41:43 +0900 Subject: [PATCH 032/451] Add missing config.sub and config.guess --- examples/opengl/config.guess | 1568 +++++++++++++++++++++++++++++ examples/opengl/config.sub | 1793 ++++++++++++++++++++++++++++++++++ 2 files changed, 3361 insertions(+) create mode 100755 examples/opengl/config.guess create mode 100755 examples/opengl/config.sub diff --git a/examples/opengl/config.guess b/examples/opengl/config.guess new file mode 100755 index 00000000..9afd6762 --- /dev/null +++ b/examples/opengl/config.guess @@ -0,0 +1,1568 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-11-29' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/examples/opengl/config.sub b/examples/opengl/config.sub new file mode 100755 index 00000000..61cb4bc2 --- /dev/null +++ b/examples/opengl/config.sub @@ -0,0 +1,1793 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-10-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 \ + | or1k | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or1k-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: From 84520e2fe0099551994b7e61bcca26a77a7d2c92 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 24 Jan 2015 14:52:58 +0900 Subject: [PATCH 033/451] Fix a bad allocation error --- src/fromsixel.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/fromsixel.c b/src/fromsixel.c index d3878c2b..143cb430 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -531,17 +531,18 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ imbuf = dmbuf; } + *pwidth = imsx; + *pheight = imsy; + *ncolors = max_color_index + 1; if (allocator) { *pixels = allocator(imsx * imsy); memcpy(*pixels, imbuf, imsx * imsy); + free(imbuf); *palette = allocator(*ncolors * 3); } else { *pixels = imbuf; *palette = malloc(*ncolors * 3); } - *pwidth = imsx; - *pheight = imsy; - *ncolors = max_color_index + 1; for (n = 0; n < *ncolors; ++n) { (*palette)[n * 3 + 0] = sixel_palet[n] >> 16 & 0xff; (*palette)[n * 3 + 1] = sixel_palet[n] >> 8 & 0xff; From 50fac518147d78f50043ad8d263abf8760b582ad Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 27 Jan 2015 22:05:36 +0900 Subject: [PATCH 034/451] OpenGL example: performance improvement --- examples/opengl/main.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/examples/opengl/main.c b/examples/opengl/main.c index 9bb5866f..f91aceeb 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -37,8 +37,8 @@ #include #include -#ifndef PI -# define PI 3.1415926535897932386 +#ifndef M_PI +# define M_PI 3.1415926535897932386 #endif #include /* libsixel */ @@ -326,6 +326,9 @@ output_sixel(unsigned char *pixbuf, int width, int height, context = sixel_output_create(sixel_write, stdout); dither = sixel_dither_create(ncolors); +#if USE_OSMESA + sixel_dither_set_pixelformat(dither, PIXELFORMAT_RGBA8888); +#endif ret = sixel_dither_initialize(dither, pixbuf, width, height, depth, LARGE_AUTO, REP_AUTO, QUALITY_AUTO); if (ret != 0) @@ -341,6 +344,8 @@ output_sixel(unsigned char *pixbuf, int width, int height, int main(int argc, char** argv) { + unsigned char *pixbuf; + int width = 400; int height = 300; int ncolors = 16; @@ -348,8 +353,6 @@ int main(int argc, char** argv) (void) argc; (void) argv; - static char *pixbuf; - if (signal(SIGINT, sighandler) == SIG_ERR) return (-1); if (setup(width, height) != 0) @@ -381,25 +384,33 @@ int main(int argc, char** argv) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - pixbuf = malloc(width * height * 4); +#if !defined(USE_OSMESA) + pixbuf = malloc(width * height * 3); +#endif while (!signaled) { - glLoadIdentity(); glPushMatrix(); glScalef(1, -1, 1); draw_scene(); glPopMatrix(); - glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixbuf); if (signaled) break; printf("\e[3;3H"); - output_sixel((unsigned char *)pixbuf, width, height, ncolors, 3); +#if USE_OSMESA + pixbuf = pbuffer; +#else + glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixbuf); +#endif + output_sixel(pixbuf, width, height, ncolors, /* unused */ 3); } - printf("\e\\"); +#if !defined(USE_OSMESA) free(pixbuf); +#endif + + printf("\e\\"); if (cleanup() != 0) return (-1); From 82c8e5a8a71f5f48722c991754964cff10e999d6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 27 Jan 2015 22:10:29 +0900 Subject: [PATCH 035/451] Update ChangeLog --- ChangeLog | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/ChangeLog b/ChangeLog index e68cb400..350fa94f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,14 +1,100 @@ +2015-01-27 Hayaki Saito + + * examples/opengl/main.c: OpenGL example: performance improvement + +2015-01-24 Hayaki Saito + + * src/fromsixel.c: Fix a bad allocation error + + * examples/opengl/config.guess, examples/opengl/config.sub: Add missing + config.sub and config.guess + + * examples/opengl/Makefile.am, examples/opengl/Makefile.in, + examples/opengl/config.h.in, examples/opengl/configure, + examples/opengl/configure.ac, examples/opengl/main.c: Detect CGL/GLX + availability in opengl example configuration + + * src/writer.c: Fix mingw build + + * src/fromsixel.c: Do not free temporary buffer allocated by custom allocator + +2015-01-23 Hayaki Saito + + * examples/opengl/Makefile.am, examples/opengl/Makefile.in, + examples/opengl/aclocal.m4, examples/opengl/compile, + examples/opengl/config.h.in, examples/opengl/configure, + examples/opengl/configure.ac, examples/opengl/depcomp, + examples/opengl/install-sh, examples/opengl/main.c, examples/opengl/missing, + examples/osx/opengl/Makefile, examples/osx/opengl/opengl.c: Use osmesa for + opengl-sixel demo + +2015-01-13 Hayaki Saito + + * Makefile.am, Makefile.in, converters/Makefile.am, converters/Makefile.in, + src/loader.c: Add check-am target to makefiles + 2014-12-30 Hayaki Saito + * ChangeLog, NEWS: Update NEWS and ChangeLog + * src/dither.c: Add a comment block regarding the behavior of VT340 palette(Issue #12) * src/dither.c: Hotfix for VT-340's rotated palette(Issue #12) + * converters/Makefile.am, converters/Makefile.in, converters/sixel2png.c, + converters/stb_image_write.c, converters/stb_image_write.h, + include/sixel-imageio.h.in, src/Makefile.am, src/Makefile.in, src/loader.c, + src/stb_image_write.c, src/stb_image_write.h, src/writer.c: Add new API: + sixel_helper_write_image_file + + * converters/Makefile.am, converters/Makefile.in, converters/sixel2png.c, + src/Makefile.am, src/Makefile.in, src/loader.c: Cleanup sixel2png.c + + * src/fromsixel.c: Arrange palette with 3byte per color format + + * src/Makefile.am, src/Makefile.in: Build fix for MinGW + + * converters/Makefile.am, converters/Makefile.in: Build fix + 2014-12-29 Hayaki Saito + * src/Makefile.am, src/Makefile.in: Add -lm to LDADD of libsixel + + * converters/Makefile.am, converters/Makefile.in, src/Makefile.am, + src/Makefile.in: Minor fixes + + * include/sixel-imageio.h.in: Add missing sixel-imageio.h.in + + * libsixel.pc.in: Update libsixel.pc.in + + * converters/Makefile.am, converters/Makefile.in, src/Makefile.am, + src/Makefile.in: Remove unused dependencies from LIBADD and LDADD + + * configure, configure.ac, converters/Makefile.am, converters/Makefile.in, + converters/frompnm.c, converters/frompnm.h, converters/img2sixel.c, + converters/loader.c, converters/loader.h, converters/stb_image.c, + converters/stb_image.h, include/Makefile.am, include/Makefile.in, + src/Makefile.am, src/Makefile.in, src/frompnm.c, src/frompnm.h, src/loader.c, + src/stb_image.h: Add new API: sixel_helper_load_image_file + + * converters/Makefile.am, converters/Makefile.in, converters/img2sixel.c, + converters/scale.c, converters/scale.h, include/sixel.h.in, src/Makefile.am, + src/Makefile.in, src/scale.c: Add new API sixel_helper_scale_image + + * converters/img2sixel.c, converters/loader.c, converters/loader.h, + src/pixelformat.c: Cleanup loader.c + * Makefile.am, Makefile.in: Make sure to remove test.log in clean target + * converters/img2sixel.c, converters/scale.c, converters/scale.h, + include/sixel.h.in, src/Makefile.am, src/Makefile.in, src/dither.c, + src/pixelformat.c, src/quant.c, src/tosixel.c: Add new API + sixel_helper_compute_depth and sixel_helper_normalize_pixelformat + + * converters/img2sixel.c, converters/scale.c, converters/scale.h: Cleanup + scale.c + 2014-12-26 Hayaki Saito * converters/img2sixel.c: Minor style improvement From bc01041f8715519941888cf3b49532a09bef01c3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 3 Feb 2015 20:16:49 +0900 Subject: [PATCH 036/451] Detect availabilies for GD functions correctly if gd.h is not in default include path --- Makefile.in | 2 +- configure | 3 +++ configure.ac | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 7d6f7844..8c398d7e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/configure b/configure index 1f6581ed..3186ecff 100755 --- a/configure +++ b/configure @@ -13752,6 +13752,8 @@ fi fi fi if test x$have_gd = xyes; then + CFLAGS_BACKUP=$CFLAGS + CFLAGS="$CFLAGS $LIBPNG_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImageCreateFromGifPtr in -lgd" >&5 $as_echo_n "checking for gdImageCreateFromGifPtr in -lgd... " >&6; } if ${ac_cv_lib_gd_gdImageCreateFromGifPtr+:} false; then : @@ -14262,6 +14264,7 @@ _ACEOF fi + CFLAGS=$CFLAGS_BACKUP $as_echo "#define HAVE_GD 1" >>confdefs.h diff --git a/configure.ac b/configure.ac index 882b96ef..e5f28775 100644 --- a/configure.ac +++ b/configure.ac @@ -262,6 +262,8 @@ if test x$with_gd != xno; then fi fi if test x$have_gd = xyes; then + CFLAGS_BACKUP=$CFLAGS + CFLAGS="$CFLAGS $LIBPNG_CFLAGS" AC_CHECK_LIB([gd], [gdImageCreateFromGifPtr], [AC_CHECK_DECLS([gdImageCreateFromGifPtr], [], [], [ #include ])]) @@ -292,6 +294,7 @@ if test x$with_gd != xno; then AC_CHECK_LIB([gd], [gdImagePaletteToTrueColor], [AC_CHECK_DECLS([gdImagePaletteToTrueColor], [], [], [ #include ])]) + CFLAGS=$CFLAGS_BACKUP AC_DEFINE(HAVE_GD, 1, [whether gd is available]) loaders="${loaders} gd" else From 8ab5efaa7a06225a93f9d3f5940335219df280d1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 3 Feb 2015 22:16:44 +0900 Subject: [PATCH 037/451] Add converters/unittest.log to clean targets --- converters/Makefile.am | 2 +- converters/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 6a9c6ccd..b69c00ba 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -13,7 +13,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe *.log if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel diff --git a/converters/Makefile.in b/converters/Makefile.in index 79029902..9dd312c4 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -425,7 +425,7 @@ dist_man_MANS = $(am__append_2) $(am__append_6) $(am__append_8) dist_bashcompletion_DATA = $(am__append_3) dist_zshcompletion_DATA = $(am__append_4) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe *.log @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) From 0bf48818334ac0d81b8e3fa8dae181b7471c260d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 3 Feb 2015 22:25:07 +0900 Subject: [PATCH 038/451] Update gitignore --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 90738503..f14852fe 100644 --- a/.gitignore +++ b/.gitignore @@ -54,8 +54,8 @@ wic_install.reg wic_uninstall.reg libsixel.pc package.json.in -include/sixel.h -converters/snake.png +include/*.h converters/img2sixel converters/sixel2png -converters/snake.sixel +converters/*.sixel +converters/*.png From e15f07116a82bdf1008e7f52a417f634f37f12b4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 3 Feb 2015 23:06:20 +0900 Subject: [PATCH 039/451] Minor fix --- examples/opengl/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/opengl/main.c b/examples/opengl/main.c index f91aceeb..6554b53f 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -186,9 +186,7 @@ static int setup(int width, int height) XFree(fbConfigs); - //pbuffer = MakePbuffer(display, screen, width, height); - - if (pbuffer==None) { + if (pbuffer == None) { printf("Error: couldn't create pbuffer\n"); XCloseDisplay(display); return (-1); From fc5b63436ce5aa695f19d4f027ef8d986a796c81 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 3 Feb 2015 23:07:01 +0900 Subject: [PATCH 040/451] Add README of OpenGL example --- examples/opengl/README.md | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 examples/opengl/README.md diff --git a/examples/opengl/README.md b/examples/opengl/README.md new file mode 100644 index 00000000..5420801a --- /dev/null +++ b/examples/opengl/README.md @@ -0,0 +1,42 @@ +OpenGL Example +============== + +This example suggests how to port your OpenGL application to SIXEL terminal. + + +How to Build +------------ + +Linux/BSDs: + + 1. Install OSMesa package on your distribution + + $ sudo apt-get install libosmesa6-dev + + 2. Build + + $ ./configure && make + +OSX: + + 1. Build + + $ ./configure && make + + +Run (only works on SIXEL terminals) +----------------------------------- + + $ ./demo + + +License +-------- +Hayaki Saito + +I declared main.c is in Public Domain (CC0 - "No Rights Reserved"). +This example is offered AS-IS, without any warranty. + +Note that some configure scripts and m4 macros are distributed under the terms +of the special exception to the GNU General Public License. + From 18c15f4eeb088ac4a5ade0adf3044551eabdb6c3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 4 Feb 2015 21:45:07 +0900 Subject: [PATCH 041/451] Update stb_image to v2.02 (for Issue #24) --- converters/loader.c | 2 +- converters/stb_image.h | 2965 +++++++++++++++++++++++------- patches/applied/stb_image.h.diff | 85 +- 3 files changed, 2312 insertions(+), 740 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 683824fe..4c222729 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -677,7 +677,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, for (;;) { p = stbi__gif_load_next(&s, &g, pcomp, 4); - if (p == (void *) 1) { + if (p == (void *) &s) { /* end of animated gif marker */ break; } diff --git a/converters/stb_image.h b/converters/stb_image.h index 1c3182d8..f089c06a 100644 --- a/converters/stb_image.h +++ b/converters/stb_image.h @@ -1,17 +1,27 @@ -/* stb_image - v1.41 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c - when you control the images you're loading +/* stb_image - v2.02 - public domain image loader - http://nothings.org/stb_image.h no warranty implied; use at your own risk Do this: #define STB_IMAGE_IMPLEMENTATION before you include this file in *one* C or C++ file to create the implementation. + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + QUICK NOTES: Primarily of interest to game developers and other people who can avoid problematic images and only need the trivial interface - JPEG baseline (no JPEG progressive) - PNG 8-bit-per-channel only + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8-bit-per-channel (16 bpc not supported) TGA (not sure what subset, if a subset) BMP non-1bpp, non-RLE @@ -20,30 +30,140 @@ GIF (*comp always reports as 4-channel) HDR (radiance rgbE format) PIC (Softimage PIC) + PNM (PPM and PGM binary only) - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - decode from arbitrary I/O callbacks - - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) - - Latest revisions: - 1.41 (2014-06-25) fix search&replace that messed up comments/error messages - 1.40 (2014-06-22) gcc warning - 1.39 (2014-06-15) TGA optimization fix, multiple BMP fixes - 1.38 (2014-06-06) suppress MSVC run-time warnings, fix accidental rename of 'skip' - 1.37 (2014-06-04) remove duplicate typedef - 1.36 (2014-06-03) converted to header file, allow reading incorrect iphoned-images without iphone flag - 1.35 (2014-05-27) warnings, bugfixes, TGA optimization, etc - 1.34 (unknown ) warning fix - 1.33 (2011-07-14) minor fixes suggested by Dave Moore + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + + Revision 2.00 release notes: + + - Progressive JPEG is now supported. + + - PPM and PGM binary formats are now supported, thanks to Ken Miller. + + - x86 platforms now make use of SSE2 SIMD instructions for + JPEG decoding, and ARM platforms can use NEON SIMD if requested. + This work was done by Fabian "ryg" Giesen. SSE2 is used by + default, but NEON must be enabled explicitly; see docs. + + With other JPEG optimizations included in this version, we see + 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup + on a JPEG on an ARM machine, relative to previous versions of this + library. The same results will not obtain for all JPGs and for all + x86/ARM machines. (Note that progressive JPEGs are significantly + slower to decode than regular JPEGs.) This doesn't mean that this + is the fastest JPEG decoder in the land; rather, it brings it + closer to parity with standard libraries. If you want the fastest + decode, look elsewhere. (See "Philosophy" section of docs below.) + + See final bullet items below for more info on SIMD. + + - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing + the memory allocator. Unlike other STBI libraries, these macros don't + support a context parameter, so if you need to pass a context in to + the allocator, you'll have to store it in a global or a thread-local + variable. + + - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and + STBI_NO_LINEAR. + STBI_NO_HDR: suppress implementation of .hdr reader format + STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API + + - You can suppress implementation of any of the decoders to reduce + your code footprint by #defining one or more of the following + symbols before creating the implementation. + + STBI_NO_JPEG + STBI_NO_PNG + STBI_NO_BMP + STBI_NO_PSD + STBI_NO_TGA + STBI_NO_GIF + STBI_NO_HDR + STBI_NO_PIC + STBI_NO_PNM (.ppm and .pgm) + + - You can request *only* certain decoders and suppress all other ones + (this will be more forward-compatible, as addition of new decoders + doesn't require you to disable them explicitly): + + STBI_ONLY_JPEG + STBI_ONLY_PNG + STBI_ONLY_BMP + STBI_ONLY_PSD + STBI_ONLY_TGA + STBI_ONLY_GIF + STBI_ONLY_HDR + STBI_ONLY_PIC + STBI_ONLY_PNM (.ppm and .pgm) + + Note that you can define multiples of these, and you will get all + of them ("only x" and "only y" is interpreted to mean "only x&y"). + + - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still + want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB + + - Compilation of all SIMD code can be suppressed with + #define STBI_NO_SIMD + It should not be necessary to disable SIMD unless you have issues + compiling (e.g. using an x86 compiler which doesn't support SSE + intrinsics or that doesn't support the method used to detect + SSE2 support at run-time), and even those can be reported as + bugs so I can refine the built-in compile-time checking to be + smarter. + + - The old STBI_SIMD system which allowed installing a user-defined + IDCT etc. has been removed. If you need this, don't upgrade. My + assumption is that almost nobody was doing this, and those who + were will find the built-in SIMD more satisfactory anyway. + + - RGB values computed for JPEG images are slightly different from + previous versions of stb_image. (This is due to using less + integer precision in SIMD.) The C code has been adjusted so + that the same RGB values will be computed regardless of whether + SIMD support is available, so your app should always produce + consistent results. But these results are slightly different from + previous versions. (Specifically, about 3% of available YCbCr values + will compute different RGB results from pre-1.49 versions by +-1; + most of the deviating values are one smaller in the G channel.) + + - If you must produce consistent results with previous versions of + stb_image, #define STBI_JPEG_OLD and you will get the same results + you used to; however, you will not get the SIMD speedups for + the YCbCr-to-RGB conversion step (although you should still see + significant JPEG speedup from the other changes). + + Please note that STBI_JPEG_OLD is a temporary feature; it will be + removed in future versions of the library. It is only intended for + near-term back-compatibility use. + + + Latest revision history: + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD + progressive JPEG + PGM/PPM support + STBI_MALLOC,STBI_REALLOC,STBI_FREE + STBI_NO_*, STBI_ONLY_* + GIF bugfix + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted) + optimize PNG + fix bug in interlaced PNG with user-specified channel count + 1.46 (2014-08-26) fix broken tRNS chunk in non-paletted PNG + 1.45 (2014-08-16) workaround MSVC-ARM internal compiler error by wrapping malloc See end of file for full revision history. - TODO: - stbi_info support for BMP,PSD,HDR,PIC - ============================ Contributors ========================= - + Image formats Bug fixes & warning fixes Sean Barrett (jpeg, png, bmp) Marc LeBlanc Nicolas Schulz (hdr, psd) Christpher Lloyd @@ -51,40 +171,55 @@ Jean-Marc Lienher (gif) Won Chun Tom Seddon (pic) the Horde3D community Thatcher Ulrich (psd) Janez Zemva - Jonathan Blow + Ken Miller (pgm, ppm) Jonathan Blow Laurent Gomila - Extensions, features Aruelien Pocheville - Jetro Lauha (stbi_info) Ryamond Barbiero - James "moose2000" Brown (iPhone PNG) David Woo - Ben "Disch" Wenger (io callbacks) Roy Eltham - Martin "SpartanJ" Golini Luke Graham - Thomas Ruf + Aruelien Pocheville + Extensions, features Ryamond Barbiero + Jetro Lauha (stbi_info) David Woo + Martin "SpartanJ" Golini (stbi_info) Martin Golini + James "moose2000" Brown (iPhone PNG) Roy Eltham + Ben "Disch" Wenger (io callbacks) Luke Graham + Omar Cornut (1/2/4-bit PNG) Thomas Ruf John Bartholomew - Optimizations & bugfixes Ken Hamada - Fabian "ryg" Giesen Cort Stratton - Arseny Kapoulkine Blazej Dariusz Roszkowski - Thibault Reuille - If your name should be here but Paul Du Bois - isn't, let Sean know. Guillaume George - Jerry Jansson - Hayaki Saito + Ken Hamada + Optimizations & bugfixes Cort Stratton + Fabian "ryg" Giesen Blazej Dariusz Roszkowski + Arseny Kapoulkine Thibault Reuille + Paul Du Bois + Guillaume George + If your name should be here but Jerry Jansson + isn't, let Sean know. Hayaki Saito Johan Duparc + Ronny Chevalier + Michal Cichon + Tero Hanninen + Sergio Gonzalez + Cass Everitt + Engin Manap + +License: + This software is in the public domain. Where that dedication is not + recognized, you are granted a perpetual, irrevocable license to copy + and modify this file however you want. + */ #ifndef STBI_INCLUDE_STB_IMAGE_H #define STBI_INCLUDE_STB_IMAGE_H +// DOCUMENTATION +// // Limitations: -// - no jpeg progressive support -// - non-HDR formats support 8-bit samples only (jpeg, png) -// - no delayed line count (jpeg) -- IJG doesn't support either +// - no 16-bit-per-channel PNG +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding // - no 1-bit BMP // - GIF always returns *comp=4 // -// Basic usage (see HDR discussion below): +// Basic usage (see HDR discussion below for HDR usage): // int x,y,n; // unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... +// // ... process data if not NULL ... // // ... x = width, y = height, n = # 8-bit components per pixel ... // // ... replace '0' with '1'..'4' to force that many components per pixel // // ... but 'n' will always be the number that it would have been if you said 0 @@ -97,14 +232,16 @@ // int req_comp -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points -// to the pixel data. The pixel data consists of *y scanlines of *x pixels, +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, // with each pixel consisting of N interleaved 8-bit components; the first // pixel pointed to is top-left-most in the image. There is no padding between // image scanlines or between pixels, regardless of format. The number of // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. // If req_comp is non-zero, *comp has the number of components that _would_ // have been output otherwise. E.g. if you set req_comp to 4, you will always -// get RGBA output, but you can check *comp to easily see if it's opaque. +// get RGBA output, but you can check *comp to see if it's trivially opaque +// because e.g. there were only 3 channels in the source image. // // An output image with N components has the following components interleaved // in this order in each pixel: @@ -126,18 +263,66 @@ // // =========================================================================== // -// iPhone PNG support: +// Philosophy // -// By default we convert iphone-formatted PNGs back to RGB; nominally they -// would silently load as BGR, except the existing code should have just -// failed on such iPhone PNGs. But you can disable this conversion by -// by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through. +// stb libraries are designed with the following priorities: // -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy to use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// make more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// The output of the JPEG decoder is slightly different from versions where +// SIMD support was introduced (that is, for versions before 1.49). The +// difference is only +-1 in the 8-bit RGB channels, and only on a small +// fraction of pixels. You can force the pre-1.49 behavior by defining +// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path +// and hence cost some performance. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. // // =========================================================================== // @@ -160,7 +345,7 @@ // (linear) floats to preserve the full dynamic range: // // float *data = stbi_loadf(filename, &x, &y, &n, 0); -// +// // If you load LDR images through this interface, those images will // be promoted to floating point values, run through the inverse of // constants corresponding to the above: @@ -177,24 +362,22 @@ // // =========================================================================== // -// I/O callbacks +// iPhone PNG support: // -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). // -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). #ifndef STBI_NO_STDIO - -#if defined(_MSC_VER) && _MSC_VER >= 1400 -#define _CRT_SECURE_NO_WARNINGS // suppress warnings about fopen() -#pragma warning(push) -#pragma warning(disable:4996) // suppress even more warnings about fopen() -#endif #include #endif // STBI_NO_STDIO @@ -231,41 +414,43 @@ extern "C" { // load image by filename, open file, or memory buffer // -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - typedef struct { - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative int (*eof) (void *user); // returns nonzero if we are at end of file/data } stbi_io_callbacks; -STBIDEF stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_HDR - STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); #endif - - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); +#endif +#ifndef STBI_NO_HDR STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif +#ifndef STBI_NO_LINEAR STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); STBIDEF void stbi_ldr_to_hdr_scale(float scale); #endif // STBI_NO_HDR -// stbi_is_hdr is always defined +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); #ifndef STBI_NO_STDIO @@ -276,7 +461,7 @@ STBIDEF int stbi_is_hdr_from_file(FILE *f); // get a VERY brief reason for failure // NOT THREADSAFE -STBIDEF const char *stbi_failure_reason (void); +STBIDEF const char *stbi_failure_reason (void); // free the loaded image -- this is just free() STBIDEF void stbi_image_free (void *retval_from_stbi_load); @@ -314,26 +499,6 @@ STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); -// define faster low-level operations (typically SIMD support) -#ifdef STBI_SIMD -typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); -// compute an integer IDCT on "input" -// input[x] = data[x] * dequantize[x] -// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' -// CLAMP results to 0..255 -typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); -// compute a conversion from YCbCr to RGB -// 'count' pixels -// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B -// y: Y input channel -// cb: Cb input channel; scale/biased to be 0..255 -// cr: Cr input channel; scale/biased to be 0..255 - -STBIDEF void stbi_install_idct(stbi_idct_8x8 func); -STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); -#endif // STBI_SIMD - - #ifdef __cplusplus } #endif @@ -345,19 +510,62 @@ STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); #ifdef STB_IMAGE_IMPLEMENTATION -#ifndef STBI_NO_HDR +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) #include // ldexp -#include // strcmp, strtok #endif #ifndef STBI_NO_STDIO #include #endif -#include -#include + +#ifndef STBI_ASSERT #include -#include -#include // ptrdiff_t on osx +#define STBI_ASSERT(x) assert(x) +#endif + #ifndef _MSC_VER #ifdef __cplusplus @@ -402,6 +610,94 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) #endif +#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,sz) realloc(p,sz) +#define STBI_FREE(p) free(p) +#endif + +#if defined(__GNUC__) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; +// this is just broken and gcc are jerks for not fixing it properly +// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available() +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available() +{ +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later + // GCC 4.8+ has a nice way to do this + return __builtin_cpu_supports("sse2"); +#else + // portable way to do this, preferably without using GCC inline ASM? + // just bail for now. + return 0; +#endif +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + /////////////////////////////////////////////// // // stbi__context struct and start_xxx functions @@ -411,9 +707,8 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; typedef struct { stbi__uint32 img_x, img_y; - int depth; int img_n, img_out_n; - + stbi_io_callbacks io; void *io_user_data; @@ -489,29 +784,59 @@ static void stbi__rewind(stbi__context *s) s->img_buffer = s->img_buffer_original; } +#ifndef STBI_NO_JPEG static int stbi__jpeg_test(stbi__context *s); static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG static int stbi__png_test(stbi__context *s); static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_BMP static int stbi__bmp_test(stbi__context *s); static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA static int stbi__tga_test(stbi__context *s); static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s); static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +#endif + #ifndef STBI_NO_HDR static int stbi__hdr_test(stbi__context *s); static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); #endif + +#ifndef STBI_NO_PIC static int stbi__pic_test(stbi__context *s); static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF static int stbi__gif_test(stbi__context *s); static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif // this is not threadsafe static const char *stbi__g_failure_reason; @@ -527,6 +852,11 @@ static int stbi__err(const char *str) return 0; } +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + // stbi__err - error // stbi__errpf - error returning pointer to float // stbi__errpuc - error returning pointer to unsigned char @@ -544,22 +874,40 @@ static int stbi__err(const char *str) STBIDEF void stbi_image_free(void *retval_from_stbi_load) { - free(retval_from_stbi_load); + STBI_FREE(retval_from_stbi_load); } -#ifndef STBI_NO_HDR +#ifndef STBI_NO_LINEAR static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); #endif static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) { + #ifndef STBI_NO_JPEG if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PNG if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_BMP if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_GIF if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PSD if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PIC if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp); + #endif #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { @@ -568,16 +916,33 @@ static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp } #endif + #ifndef STBI_NO_TGA // test tga last because it's a crappy test! if (stbi__tga_test(s)) return stbi__tga_load(s,x,y,comp,req_comp); + #endif + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); } #ifndef STBI_NO_STDIO -STBIDEF unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) + +static FILE *stbi__fopen(char const *filename, char const *mode) { - FILE *f = fopen(filename, "rb"); + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); unsigned char *result; if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); result = stbi_load_from_file(f,x,y,comp,req_comp); @@ -585,7 +950,7 @@ STBIDEF unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp return result; } -STBIDEF unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { unsigned char *result; stbi__context s; @@ -599,23 +964,22 @@ STBIDEF unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, i } #endif //!STBI_NO_STDIO -STBIDEF unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); return stbi_load_main(&s,x,y,comp,req_comp); } -unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi_load_main(&s,x,y,comp,req_comp); } -#ifndef STBI_NO_HDR - -float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +#ifndef STBI_NO_LINEAR +static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) { unsigned char *data; #ifndef STBI_NO_HDR @@ -628,14 +992,14 @@ float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); } -float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); return stbi_loadf_main(&s,x,y,comp,req_comp); } -float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); @@ -643,17 +1007,17 @@ float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int } #ifndef STBI_NO_STDIO -float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) { - FILE *f = fopen(filename, "rb"); float *result; + FILE *f = stbi__fopen(filename, "rb"); if (!f) return stbi__errpf("can't fopen", "Unable to open file"); result = stbi_loadf_from_file(f,x,y,comp,req_comp); fclose(f); return result; } -float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_file(&s,f); @@ -661,13 +1025,13 @@ float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) } #endif // !STBI_NO_STDIO -#endif // !STBI_NO_HDR +#endif // !STBI_NO_LINEAR -// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is -// defined, for API simplicity; if STBI_NO_HDR is defined, it always +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always // reports false! -int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) { #ifndef STBI_NO_HDR stbi__context s; @@ -683,7 +1047,7 @@ int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) #ifndef STBI_NO_STDIO STBIDEF int stbi_is_hdr (char const *filename) { - FILE *f = fopen(filename, "rb"); + FILE *f = stbi__fopen(filename, "rb"); int result=0; if (f) { result = stbi_is_hdr_from_file(f); @@ -715,17 +1079,17 @@ STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void #endif } -#ifndef STBI_NO_HDR static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; -void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - -void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#ifndef STBI_NO_LINEAR +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } #endif +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + ////////////////////////////////////////////////////////////////////////////// // @@ -734,9 +1098,9 @@ void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } enum { - SCAN_load=0, - SCAN_type, - SCAN_header + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header }; static void stbi__refill_buffer(stbi__context *s) @@ -744,7 +1108,7 @@ static void stbi__refill_buffer(stbi__context *s) int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); if (n == 0) { // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, stbi__err.g. 0-byte file + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file s->read_from_callbacks = 0; s->img_buffer = s->buffer_start; s->img_buffer_end = s->buffer_start+1; @@ -775,7 +1139,7 @@ stbi_inline static int stbi__at_eof(stbi__context *s) if (s->read_from_callbacks == 0) return 1; } - return s->img_buffer >= s->img_buffer_end; + return s->img_buffer >= s->img_buffer_end; } static void stbi__skip(stbi__context *s, int n) @@ -799,7 +1163,7 @@ static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) int res, count; memcpy(buffer, s->img_buffer, blen); - + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); res = (count == (n-blen)); s->img_buffer = s->img_buffer_end; @@ -839,10 +1203,13 @@ static stbi__uint32 stbi__get32le(stbi__context *s) return z + (stbi__get16le(s) << 16); } +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + ////////////////////////////////////////////////////////////////////////////// // // generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (stbi__err.g. jpeg +// individual types do this automatically as much as possible (e.g. jpeg // does all cases internally since it needs to colorspace convert anyway, // and it never has alpha, so very few cases ). png can automatically // interleave an alpha=255 channel, but falls back to this for other cases @@ -861,11 +1228,11 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r unsigned char *good; if (req_comp == img_n) return data; - assert(req_comp >= 1 && req_comp <= 4); + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - good = (unsigned char *) malloc(req_comp * x * y); + good = (unsigned char *) stbi__malloc(req_comp * x * y); if (good == NULL) { - free(data); + STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } @@ -890,21 +1257,21 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; - default: assert(0); + default: STBI_ASSERT(0); } #undef CASE } - free(data); + STBI_FREE(data); return good; } -#ifndef STBI_NO_HDR +#ifndef STBI_NO_LINEAR static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; - float *output = (float *) malloc(x * y * comp * sizeof(float)); - if (output == NULL) { free(data); return stbi__errpf("outofmem", "Out of memory"); } + float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { @@ -913,16 +1280,18 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) } if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; } - free(data); + STBI_FREE(data); return output; } +#endif +#ifndef STBI_NO_HDR #define stbi__float2int(x) ((int) (x)) static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; - stbi_uc *output = (stbi_uc *) malloc(x * y * comp); - if (output == NULL) { free(data); return stbi__errpuc("outofmem", "Out of memory"); } + stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { @@ -939,17 +1308,16 @@ static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) output[i*comp + k] = (stbi_uc) stbi__float2int(z); } } - free(data); + STBI_FREE(data); return output; } #endif ////////////////////////////////////////////////////////////////////////////// // -// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) +// "baseline" JPEG/JFIF decoder // // simple implementation -// - channel subsampling of at most 2 in each dimension // - doesn't support delayed output of y-dimension // - simple interface (only one output format: 8-bit interleaved RGB) // - doesn't try to recover corrupt jpegs @@ -963,13 +1331,10 @@ static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) // - quality integer IDCT derived from IJG's 'slow' // performance // - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON // - uses a lot of intermediate memory, could cache poorly -// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 -// stb_jpeg: 1.34 seconds (MSVC6, default release build) -// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) -// IJL11.dll: 1.08 seconds (compiled by intel) -// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) -// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) + +#ifndef STBI_NO_JPEG // huffman decoding acceleration #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache @@ -987,13 +1352,11 @@ typedef struct typedef struct { - #ifdef STBI_SIMD - unsigned short dequant2[4][64]; - #endif stbi__context *s; stbi__huffman huff_dc[4]; stbi__huffman huff_ac[4]; stbi_uc dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; // sizes for components, interleaved MCUs int img_h_max, img_v_max; @@ -1011,17 +1374,31 @@ typedef struct int x,y,w2,h2; stbi_uc *data; - void *raw_data; + void *raw_data, *raw_coeff; stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks } img_comp[4]; - stbi__uint32 code_buffer; // jpeg entropy-coded buffer + stbi__uint32 code_buffer; // jpeg entropy-coded buffer int code_bits; // number of valid bits unsigned char marker; // marker seen while filling entropy buffer int nomore; // flag if we saw a marker so must stop + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int scan_n, order[4]; int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); } stbi__jpeg; static int stbi__build_huffman(stbi__huffman *h, int *count) @@ -1065,6 +1442,33 @@ static int stbi__build_huffman(stbi__huffman *h, int *count) return 1; } +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (-1 << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + static void stbi__grow_buffer_unsafe(stbi__jpeg *j) { do { @@ -1127,7 +1531,7 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) // convert the huffman code to the symbol id c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - assert((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); // convert the id to a symbol j->code_bits -= k; @@ -1135,31 +1539,45 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) return h->values[c]; } +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - #if 1 + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB k = stbi_lrot(j->code_buffer, n); j->code_buffer = k & ~stbi__bmask[n]; k &= stbi__bmask[n]; j->code_bits -= n; - #else - k = (j->code_buffer >> (32 - n)) & stbi__bmask[n]; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; j->code_bits -= n; - j->code_buffer <<= n; - #endif - // the following test is probably a random branch that won't - // predict well. I tried to table accelerate it but failed. - // maybe it's compiling as a conditional move? - if (k < m) - return (-1 << n) + k + 1; - else - return k; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; } // given a value that's at position X in the zigzag stream, @@ -1180,10 +1598,13 @@ static stbi_uc stbi__jpeg_dezigzag[64+15] = }; // decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, int b) +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant) { int diff,dc,k; - int t = stbi__jpeg_huff_decode(j, hdc); + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); // 0 all the ac values now so we can do it 32-bits at a time @@ -1192,28 +1613,189 @@ static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman diff = t ? stbi__extend_receive(j, t) : 0; dc = j->img_comp[b].dc_pred + diff; j->img_comp[b].dc_pred = dc; - data[0] = (short) dc; + data[0] = (short) (dc * dequant[0]); // decode AC components, see JPEG spec k = 1; do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; // decode into unzigzag'd location - data[stbi__jpeg_dezigzag[k++]] = (short) stbi__extend_receive(j,s); + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } } } while (k < 64); return 1; } +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else + r = 16; // r=15 is the code for 16 0s + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + ++k; + } else { + if (r == 0) { + if (s) + data[stbi__jpeg_dezigzag[k++]] = (short) s; + break; + } + --r; + ++k; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + // take a -128..127 value and stbi__clamp it and convert to 0..255 stbi_inline static stbi_uc stbi__clamp(int x) { @@ -1225,21 +1807,21 @@ stbi_inline static stbi_uc stbi__clamp(int x) return (stbi_uc) x; } -#define stbi__f2f(x) (int) (((x) * 4096 + 0.5)) +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) #define stbi__fsh(x) ((x) << 12) // derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ p2 = s2; \ p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ p2 = s0; \ p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ x0 = t0+t3; \ x3 = t0-t3; \ x1 = t1+t2; \ @@ -1252,36 +1834,28 @@ stbi_inline static stbi_uc stbi__clamp(int x) p4 = t1+t3; \ p1 = t0+t3; \ p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ t3 += p1+p4; \ t2 += p2+p3; \ t1 += p2+p4; \ t0 += p1+p3; -#ifdef STBI_SIMD -typedef unsigned short stbi_dequantize_t; -#else -typedef stbi_uc stbi_dequantize_t; -#endif - -// .344 seconds on 3*anemones.jpg -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) { int i,val[64],*v=val; - stbi_dequantize_t *dq = dequantize; stbi_uc *o; short *d = data; // columns - for (i=0; i < 8; ++i,++d,++dq, ++v) { + for (i=0; i < 8; ++i,++d, ++v) { // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 && d[40]==0 && d[48]==0 && d[56]==0) { @@ -1289,11 +1863,10 @@ static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_ // (1|2|3|4|5|6|7)==0 0 seconds // all separate -0.047 seconds // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] * dq[0] << 2; + int dcterm = d[0] << 2; v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; } else { - STBI__IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], - d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) // constants scaled things up by 1<<12; let's bring them back // down, but keep 2 extra bits of precision x0 += 512; x1 += 512; x2 += 512; x3 += 512; @@ -1334,14 +1907,394 @@ static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_ } } -#ifdef STBI_SIMD -static stbi_idct_8x8 stbi__idct_installed = stbi__idct_block; +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } -STBIDEF void stbi_install_idct(stbi_idct_8x8 func) -{ - stbi__idct_installed = func; + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass } -#endif + +#endif // STBI_NEON #define STBI__MARKER_none 0xff // if there's a pending marker from the entropy stream, return that @@ -1372,6 +2325,7 @@ static void stbi__jpeg_reset(stbi__jpeg *j) j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; j->marker = STBI__MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, // since we don't even allow 1<<30 pixels } @@ -1379,73 +2333,151 @@ static void stbi__jpeg_reset(stbi__jpeg *j) static int stbi__parse_entropy_coded_data(stbi__jpeg *z) { stbi__jpeg_reset(z); - if (z->scan_n == 1) { - int i,j; - #ifdef STBI_SIMD - __declspec(align(16)) - #endif - short data[64]; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #ifdef STBI_SIMD - stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } } } + return 1; } - } else { // interleaved! - int i,j,k,x,y; - short data[64]; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #ifdef STBI_SIMD - stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } } } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); } } } } - return 1; } static int stbi__process_marker(stbi__jpeg *z, int m) @@ -1455,9 +2487,6 @@ static int stbi__process_marker(stbi__jpeg *z, int m) case STBI__MARKER_none: // no marker found return stbi__err("expected marker","Corrupt JPEG"); - case 0xC2: // stbi__SOF - progressive - return stbi__err("progressive jpeg","JPEG format not supported (progressive)"); - case 0xDD: // DRI - specify restart interval if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); z->restart_interval = stbi__get16be(z->s); @@ -1473,10 +2502,6 @@ static int stbi__process_marker(stbi__jpeg *z, int m) if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); for (i=0; i < 64; ++i) z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); - #ifdef STBI_SIMD - for (i=0; i < 64; ++i) - z->dequant2[t][i] = z->dequant[t][i]; - #endif L -= 65; } return L==0; @@ -1504,6 +2529,8 @@ static int stbi__process_marker(stbi__jpeg *z, int m) } for (i=0; i < n; ++i) v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); L -= n; } return L==0; @@ -1516,28 +2543,42 @@ static int stbi__process_marker(stbi__jpeg *z, int m) return 0; } -// after we see stbi__SOS +// after we see SOS static int stbi__process_scan_header(stbi__jpeg *z) { int i; int Ls = stbi__get16be(z->s); z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad stbi__SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad stbi__SOS len","Corrupt JPEG"); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); for (i=0; i < z->scan_n; ++i) { int id = stbi__get8(z->s), which; int q = stbi__get8(z->s); for (which = 0; which < z->s->img_n; ++which) if (z->img_comp[which].id == id) break; - if (which == z->s->img_n) return 0; + if (which == z->s->img_n) return 0; // no match z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); z->order[i] = which; } - if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG"); - stbi__get8(z->s); // should be 63, but might be 0 - if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG"); + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } return 1; } @@ -1546,8 +2587,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) { stbi__context *s = z->s; int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires c = stbi__get8(s); @@ -1558,7 +2599,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_comp[i].linebuf = NULL; } - if (Lf != 8+3*s->img_n) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); for (i=0; i < s->img_n; ++i) { z->img_comp[i].id = stbi__get8(s); @@ -1571,7 +2612,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); } - if (scan != SCAN_load) return 1; + if (scan != STBI__SCAN_load) return 1; if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); @@ -1589,64 +2630,78 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; for (i=0; i < s->img_n; ++i) { - // number of effective pixels (stbi__err.g. for non-interleaved MCU) + // number of effective pixels (e.g. for non-interleaved MCU) z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; // to simplify generation, we'll allocate enough memory to decode // the bogus oversized data from using interleaved MCUs and their - // big blocks (stbi__err.g. a 16x16 iMCU on an image of width 33); we won't + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + if (z->img_comp[i].raw_data == NULL) { for(--i; i >= 0; --i) { - free(z->img_comp[i].raw_data); + STBI_FREE(z->img_comp[i].raw_data); z->img_comp[i].data = NULL; } return stbi__err("outofmem", "Out of memory"); } - // align blocks for installable-idct using mmx/sse + // align blocks for idct using mmx/sse z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); z->img_comp[i].linebuf = NULL; + if (z->progressive) { + z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; + z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; + z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } else { + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + } } return 1; } -// use comparisons since in some cases we handle more than one case (stbi__err.g. stbi__SOF) +// use comparisons since in some cases we handle more than one case (e.g. SOF) #define stbi__DNL(x) ((x) == 0xdc) #define stbi__SOI(x) ((x) == 0xd8) #define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) #define stbi__SOS(x) ((x) == 0xda) -static int decode_jpeg_header(stbi__jpeg *z, int scan) +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) { int m; z->marker = STBI__MARKER_none; // initialize cached marker to empty m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no stbi__SOI","Corrupt JPEG"); - if (scan == SCAN_type) return 1; + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; m = stbi__get_marker(z); while (!stbi__SOF(m)) { if (!stbi__process_marker(z,m)) return 0; m = stbi__get_marker(z); while (m == STBI__MARKER_none) { // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no stbi__SOF", "Corrupt JPEG"); + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); m = stbi__get_marker(z); } } + z->progressive = stbi__SOF_progressive(m); if (!stbi__process_frame_header(z, scan)) return 0; return 1; } -static int decode_jpeg_image(stbi__jpeg *j) +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) { int m; j->restart_interval = 0; - if (!decode_jpeg_header(j, SCAN_load)) return 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; m = stbi__get_marker(j); while (!stbi__EOI(m)) { if (stbi__SOS(m)) { @@ -1660,7 +2715,7 @@ static int decode_jpeg_image(stbi__jpeg *j) j->marker = stbi__get8(j->s); break; } else if (x != 0) { - return 0; + return stbi__err("junk before marker", "Corrupt JPEG"); } } // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 @@ -1670,6 +2725,8 @@ static int decode_jpeg_image(stbi__jpeg *j) } m = stbi__get_marker(j); } + if (j->progressive) + stbi__jpeg_finish(j); return 1; } @@ -1753,6 +2810,123 @@ static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc return out; } +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) { // resample with nearest-neighbor @@ -1764,10 +2938,10 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_ return out; } +#ifdef STBI_JPEG_OLD +// this is the same YCbCr-to-RGB calculation that stb_image has used +// historically before the algorithm changes in 1.49 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) - -// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) -// VC6 without processor=Pro is generating multiple LEAs per multiply! static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) { int i; @@ -1792,28 +2966,214 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc out += step; } } +#else +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif -#ifdef STBI_SIMD -static stbi_YCbCr_to_RGB_run stbi__YCbCr_installed = stbi__YCbCr_to_RGB_row; +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif -STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) -{ - stbi__YCbCr_installed = func; + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } } #endif +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} // clean up the temporary component buffers static void stbi__cleanup_jpeg(stbi__jpeg *j) { int i; for (i=0; i < j->s->img_n; ++i) { - if (j->img_comp[i].data) { - free(j->img_comp[i].raw_data); + if (j->img_comp[i].raw_data) { + STBI_FREE(j->img_comp[i].raw_data); + j->img_comp[i].raw_data = NULL; j->img_comp[i].data = NULL; } + if (j->img_comp[i].raw_coeff) { + STBI_FREE(j->img_comp[i].raw_coeff); + j->img_comp[i].raw_coeff = 0; + j->img_comp[i].coeff = 0; + } if (j->img_comp[i].linebuf) { - free(j->img_comp[i].linebuf); + STBI_FREE(j->img_comp[i].linebuf); j->img_comp[i].linebuf = NULL; } } @@ -1824,7 +3184,7 @@ typedef struct resample_row_func resample; stbi_uc *line0,*line1; int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion + int w_lores; // horizontal pixels pre-expansion int ystep; // how far through vertical expansion we are int ypos; // which pre-expansion row we're on } stbi__resample; @@ -1832,12 +3192,13 @@ typedef struct static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) { int n, decode_n; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + // validate req_comp if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - z->s->img_n = 0; - // load a jpeg image from whichever source - if (!decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } // determine actual number of components to generate n = req_comp ? req_comp : z->s->img_n; @@ -1861,7 +3222,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp // allocate line buffer big enough for upsampling off the edges // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) malloc(z->s->img_x + 3); + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } r->hs = z->img_h_max / z->img_comp[k].h; @@ -1874,12 +3235,12 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = stbi__resample_row_hv_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; else r->resample = stbi__resample_row_generic; } // can't error after this so, this is safe - output = (stbi_uc *) malloc(n * z->s->img_x * z->s->img_y + 1); + output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } // now go ahead and resample @@ -1902,11 +3263,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (n >= 3) { stbi_uc *y = coutput[0]; if (z->s->img_n == 3) { - #ifdef STBI_SIMD - stbi__YCbCr_installed(out, y, coutput[1], coutput[2], z->s->img_x, n); - #else - stbi__YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); - #endif + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); } else for (i=0; i < z->s->img_x; ++i) { out[0] = out[1] = out[2] = y[i]; @@ -1933,6 +3290,7 @@ static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *com { stbi__jpeg j; j.s = s; + stbi__setup_jpeg(&j); return load_jpeg_image(&j, x,y,comp,req_comp); } @@ -1941,14 +3299,15 @@ static int stbi__jpeg_test(stbi__context *s) int r; stbi__jpeg j; j.s = s; - r = decode_jpeg_header(&j, SCAN_type); + stbi__setup_jpeg(&j); + r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); stbi__rewind(s); return r; } static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) { - if (!decode_jpeg_header(j, SCAN_header)) { + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { stbi__rewind( j->s ); return 0; } @@ -1964,6 +3323,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) j.s = s; return stbi__jpeg_info_raw(&j, x, y, comp); } +#endif // public domain zlib decode v0.2 Sean Barrett 2006-11-18 // simple implementation @@ -1972,6 +3332,8 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) // performance // - fast huffman +#ifndef STBI_NO_ZLIB + // fast-way is faster to check than jpeg huffman, but slow way is slower #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) @@ -1985,7 +3347,7 @@ typedef struct int maxcode[17]; stbi__uint16 firstsymbol[16]; stbi_uc size[288]; - stbi__uint16 value[288]; + stbi__uint16 value[288]; } stbi__zhuffman; stbi_inline static int stbi__bitreverse16(int n) @@ -1999,9 +3361,9 @@ stbi_inline static int stbi__bitreverse16(int n) stbi_inline static int stbi__bit_reverse(int v, int bits) { - assert(bits <= 16); + STBI_ASSERT(bits <= 16); // to bit reverse n bits, reverse 16 and shift - // stbi__err.g. 11 bits, bit reverse and shift away 5 + // e.g. 11 bits, bit reverse and shift away 5 return stbi__bitreverse16(v) >> (16-bits); } @@ -2012,12 +3374,12 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) // DEFLATE spec for generating codes memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 255, sizeof(z->fast)); - for (i=0; i < num; ++i) + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) ++sizes[sizelist[i]]; sizes[0] = 0; for (i=1; i < 16; ++i) - assert(sizes[i] <= (1 << i)); + STBI_ASSERT(sizes[i] <= (1 << i)); code = 0; for (i=1; i < 16; ++i) { next_code[i] = code; @@ -2035,12 +3397,13 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) int s = sizelist[i]; if (s) { int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); z->size [c] = (stbi_uc ) s; z->value[c] = (stbi__uint16) i; if (s <= STBI__ZFAST_BITS) { int k = stbi__bit_reverse(next_code[s],s); while (k < (1 << STBI__ZFAST_BITS)) { - z->fast[k] = (stbi__uint16) c; + z->fast[k] = fastv; k += (1 << s); } } @@ -2079,7 +3442,7 @@ stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) static void stbi__fill_bits(stbi__zbuf *z) { do { - assert(z->code_buffer < (1U << z->num_bits)); + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); z->code_buffer |= stbi__zget8(z) << z->num_bits; z->num_bits += 8; } while (z->num_bits <= 24); @@ -2092,21 +3455,12 @@ stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) k = z->code_buffer & ((1 << n) - 1); z->code_buffer >>= n; z->num_bits -= n; - return k; + return k; } -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) { int b,s,k; - if (a->num_bits < 16) stbi__fill_bits(a); - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b < 0xffff) { - s = z->size[b]; - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; - } - // not resolved by fast table, so compute it the slow way // use jpeg approach, which requires MSbits at top k = stbi__bit_reverse(a->code_buffer, 16); @@ -2116,22 +3470,37 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) if (s == 16) return -1; // invalid code! // code size is s, so: b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - assert(z->size[b] == s); + STBI_ASSERT(z->size[b] == s); a->code_buffer >>= s; a->num_bits -= s; return z->value[b]; } -static int stbi__zexpand(stbi__zbuf *z, int n) // need to make room for n bytes +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes { char *q; int cur, limit; + z->zout = zout; if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); cur = (int) (z->zout - z->zout_start); limit = (int) (z->zout_end - z->zout_start); while (cur + n > limit) limit *= 2; - q = (char *) realloc(z->zout_start, limit); + q = (char *) STBI_REALLOC(z->zout_start, limit); if (q == NULL) return stbi__err("outofmem", "Out of memory"); z->zout_start = q; z->zout = q + cur; @@ -2144,7 +3513,7 @@ static int stbi__zlength_base[31] = { 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; -static int stbi__zlength_extra[31]= +static int stbi__zlength_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, @@ -2155,16 +3524,23 @@ static int stbi__zdist_extra[32] = static int stbi__parse_huffman_block(stbi__zbuf *a) { + char *zout = a->zout; for(;;) { int z = stbi__zhuffman_decode(a, &a->z_length); if (z < 256) { if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (a->zout >= a->zout_end) if (!stbi__zexpand(a, 1)) return 0; - *a->zout++ = (char) z; + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; } else { stbi_uc *p; int len,dist; - if (z == 256) return 1; + if (z == 256) { + a->zout = zout; + return 1; + } z -= 257; len = stbi__zlength_base[z]; if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); @@ -2172,11 +3548,18 @@ static int stbi__parse_huffman_block(stbi__zbuf *a) if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); dist = stbi__zdist_base[z]; if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (a->zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (a->zout + len > a->zout_end) if (!stbi__zexpand(a, len)) return 0; - p = (stbi_uc *) (a->zout - dist); - while (len--) - *a->zout++ = *p++; + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + do *zout++ = v; while (--len); + } else { + do *zout++ = *p++; while (--len); + } } } } @@ -2203,7 +3586,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) n = 0; while (n < hlit + hdist) { int c = stbi__zhuffman_decode(a, &z_codelength); - assert(c >= 0 && c < 19); + STBI_ASSERT(c >= 0 && c < 19); if (c < 16) lencodes[n++] = (stbi_uc) c; else if (c == 16) { @@ -2215,7 +3598,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) memset(lencodes+n, 0, c); n += c; } else { - assert(c == 18); + STBI_ASSERT(c == 18); c = stbi__zreceive(a,7)+11; memset(lencodes+n, 0, c); n += c; @@ -2240,7 +3623,7 @@ static int stbi__parse_uncomperssed_block(stbi__zbuf *a) a->code_buffer >>= 8; a->num_bits -= 8; } - assert(a->num_bits == 0); + STBI_ASSERT(a->num_bits == 0); // now fill header the normal way while (k < 4) header[k++] = stbi__zget8(a); @@ -2249,7 +3632,7 @@ static int stbi__parse_uncomperssed_block(stbi__zbuf *a) if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, len)) return 0; + if (!stbi__zexpand(a, a->zout, len)) return 0; memcpy(a->zout, a->zbuffer, len); a->zbuffer += len; a->zout += len; @@ -2324,7 +3707,7 @@ static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) { stbi__zbuf a; - char *p = (char *) malloc(initial_size); + char *p = (char *) stbi__malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (stbi_uc *) buffer; a.zbuffer_end = (stbi_uc *) buffer + len; @@ -2332,7 +3715,7 @@ STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { - free(a.zout_start); + STBI_FREE(a.zout_start); return NULL; } } @@ -2345,7 +3728,7 @@ STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) { stbi__zbuf a; - char *p = (char *) malloc(initial_size); + char *p = (char *) stbi__malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (stbi_uc *) buffer; a.zbuffer_end = (stbi_uc *) buffer + len; @@ -2353,7 +3736,7 @@ STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, i if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { - free(a.zout_start); + STBI_FREE(a.zout_start); return NULL; } } @@ -2372,7 +3755,7 @@ STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) { stbi__zbuf a; - char *p = (char *) malloc(16384); + char *p = (char *) stbi__malloc(16384); if (p == NULL) return NULL; a.zbuffer = (stbi_uc *) buffer; a.zbuffer_end = (stbi_uc *) buffer+len; @@ -2380,7 +3763,7 @@ STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { - free(a.zout_start); + STBI_FREE(a.zout_start); return NULL; } } @@ -2395,6 +3778,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char else return -1; } +#endif // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 // simple implementation @@ -2406,15 +3790,13 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char // performance // - uses stb_zlib, a PD zlib implementation with fast huffman decoding - +#ifndef STBI_NO_PNG typedef struct { stbi__uint32 length; stbi__uint32 type; } stbi__pngchunk; -#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) - static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) { stbi__pngchunk c; @@ -2440,13 +3822,23 @@ typedef struct enum { - STBI__F_none=0, STBI__F_sub=1, STBI__F_up=2, STBI__F_avg=3, STBI__F_paeth=4, - STBI__F_avg_first, STBI__F_paeth_first + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first }; static stbi_uc first_row_filter[5] = { - STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first, STBI__F_paeth_first + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first }; static int stbi__paeth(int a, int b, int c) @@ -2460,33 +3852,50 @@ static int stbi__paeth(int a, int b, int c) return c; } -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings +static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; // create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y) +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) { stbi__context *s = a->s; stbi__uint32 i,j,stride = x*out_n; + stbi__uint32 img_len, img_width_bytes; int k; int img_n = s->img_n; // copy it into a local for later - int bpp = s->depth; - assert(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) malloc(x * y * out_n); + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into if (!a->out) return stbi__err("outofmem", "Out of memory"); + + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; if (s->img_x == x && s->img_y == y) { - //if (raw_len != (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); + if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); } else { // interlaced: - if (raw_len < (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); } + for (j=0; j < y; ++j) { stbi_uc *cur = a->out + stride*j; stbi_uc *prior = cur - stride; int filter = *raw++; - if (filter > 4) return stbi__err("invalid filter","Corrupt PNG"); + int filter_bytes = img_n; + int width = x; + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; - // handle first pixel explicitly - for (k=0; k < img_n; ++k) { + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { switch (filter) { case STBI__F_none : cur[k] = raw[k]; break; case STBI__F_sub : cur[k] = raw[k]; break; @@ -2497,53 +3906,39 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r case STBI__F_paeth_first: cur[k] = raw[k]; break; } } - if (img_n != out_n) cur[img_n] = 255; - raw += img_n; - if (bpp == 1) { - cur += out_n * 16; - } else if (bpp == 4) { - cur += out_n * 4; + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; } else { - cur += out_n; + raw += 1; + cur += 1; + prior += 1; } - prior += out_n; - char l; + // this is a little gross, so that we don't switch per-pixel or per-component - if (img_n == out_n) { + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*img_n; #define CASE(f) \ case f: \ - for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ - for (k=0; k < img_n; ++k) + for (k=0; k < nk; ++k) switch (filter) { - case STBI__F_none: - for (i=(x - 1) * bpp / 8; i >= 1; --i) { - for (k = 0; k < img_n; ++k) { - if (bpp == 1) { - for (l = 0; l < 8; ++l) { - cur[(k - 1) * 8 - l] = (raw[k - 1] >> l & 1) * 0xff; - } - } else if (bpp == 4) { - cur[k - 1] = raw[k] >> 4; - cur[k - 0] = raw[k] & 0xf; - } else { - cur[k] = raw[k]; - } - } - raw += img_n; - cur += img_n * 8 / bpp; - prior += img_n; - } - break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-img_n]); break; + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-img_n])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-img_n] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],0,0)); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; } #undef CASE + raw += nk; } else { - assert(img_n+1 == out_n); + STBI_ASSERT(img_n+1 == out_n); #define CASE(f) \ case f: \ for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ @@ -2560,18 +3955,93 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r #undef CASE } } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + // insert alpha = 255 + stbi_uc *cur = a->out + stride*j; + int i; + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + cur[i*2+1] = 255; + cur[i*2+0] = cur[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + cur[i*4+3] = 255; + cur[i*4+2] = cur[i*3+2]; + cur[i*4+1] = cur[i*3+1]; + cur[i*4+0] = cur[i*3+0]; + } + } + } + } + } + return 1; } -static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, int interlaced) +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) { stbi_uc *final; int p; if (!interlaced) - return stbi__create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); // de-interlacing - final = (stbi_uc *) malloc(a->s->img_x * a->s->img_y * out_n); + final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; @@ -2582,17 +4052,22 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_l x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; if (x && y) { - if (!stbi__create_png_image_raw(a, raw, raw_len, out_n, x, y)) { - free(final); + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); return 0; } - for (j=0; j < y; ++j) - for (i=0; i < x; ++i) - memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, a->out + (j*x+i)*out_n, out_n); - free(a->out); - raw += (x*out_n+1)*y; - raw_len -= (x*out_n+1)*y; + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; } } a->out = final; @@ -2608,7 +4083,7 @@ static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) // compute color-based transparency, assuming we've // already got 255 as the alpha value in the output - assert(out_n == 2 || out_n == 4); + STBI_ASSERT(out_n == 2 || out_n == 4); if (out_n == 2) { for (i=0; i < pixel_count; ++i) { @@ -2630,7 +4105,7 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; stbi_uc *p, *temp_out, *orig = a->out; - p = (stbi_uc *) malloc(pixel_count * pal_img_n); + p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); if (p == NULL) return stbi__err("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak @@ -2654,7 +4129,7 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int p += 4; } } - free(a->out); + STBI_FREE(a->out); a->out = temp_out; STBI_NOTUSED(len); @@ -2689,7 +4164,7 @@ static void stbi__de_iphone(stbi__png *z) p += 3; } } else { - assert(s->img_out_n == 4); + STBI_ASSERT(s->img_out_n == 4); if (stbi__unpremultiply_on_load) { // convert bgr to rgb and unpremultiply for (i=0; i < pixel_count; ++i) { @@ -2702,7 +4177,7 @@ static void stbi__de_iphone(stbi__png *z) } else { p[0] = p[2]; p[2] = t; - } + } p += 4; } } else { @@ -2717,12 +4192,14 @@ static void stbi__de_iphone(stbi__png *z) } } +#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) { stbi_uc palette[1024], pal_img_n=0; stbi_uc has_trans=0, tc[3]; stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, is_iphone=0; + int first=1,k,interlace=0, color=0, depth=0, is_iphone=0; stbi__context *s = z->s; z->expanded = NULL; @@ -2731,23 +4208,23 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!stbi__check_png_header(s)) return 0; - if (scan == SCAN_type) return 1; + if (scan == STBI__SCAN_type) return 1; for (;;) { stbi__pngchunk c = stbi__get_chunk_header(s); switch (c.type) { - case PNG_TYPE('C','g','B','I'): + case STBI__PNG_TYPE('C','g','B','I'): is_iphone = 1; stbi__skip(s, c.length); break; - case PNG_TYPE('I','H','D','R'): { - int color,comp,filter; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); first = 0; if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - s->depth = stbi__get8(s); if (s->depth != 8 && s->depth != 4 && s->depth != 1) return stbi__err("8bit/4bit/1bit only","PNG not supported: 8-bit/4-bit/1-bit only"); + depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only"); color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); @@ -2757,7 +4234,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!pal_img_n) { s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == SCAN_header) return 1; + if (scan == STBI__SCAN_header) return 1; } else { // if paletted, then pal_n is our final components, and // img_n is # components to decompress/filter. @@ -2768,7 +4245,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) break; } - case PNG_TYPE('P','L','T','E'): { + case STBI__PNG_TYPE('P','L','T','E'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); pal_len = c.length / 3; @@ -2782,11 +4259,11 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) break; } - case PNG_TYPE('t','R','N','S'): { + case STBI__PNG_TYPE('t','R','N','S'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); if (pal_img_n) { - if (scan == SCAN_header) { s->img_n = 4; return 1; } + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); pal_img_n = 4; @@ -2797,21 +4274,21 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); has_trans = 1; for (k=0; k < s->img_n; ++k) - tc[k] = (stbi_uc) (stbi__get16be(s) & 255); // non 8-bit images will be larger + tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger } break; } - case PNG_TYPE('I','D','A','T'): { + case STBI__PNG_TYPE('I','D','A','T'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } if (ioff + c.length > idata_limit) { stbi_uc *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; while (ioff + c.length > idata_limit) idata_limit *= 2; - p = (stbi_uc *) realloc(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); z->idata = p; } if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); @@ -2819,19 +4296,22 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) break; } - case PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len; + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != SCAN_load) return 1; + if (scan != STBI__SCAN_load) return 1; if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !is_iphone); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); if (z->expanded == NULL) return 0; // zlib should set error - free(z->idata); z->idata = NULL; + STBI_FREE(z->idata); z->idata = NULL; if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) s->img_out_n = s->img_n+1; else s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0; if (has_trans) if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) @@ -2844,7 +4324,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) return 0; } - free(z->expanded); z->expanded = NULL; + STBI_FREE(z->expanded); z->expanded = NULL; return 1; } @@ -2874,7 +4354,7 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req { unsigned char *result=NULL; if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, SCAN_load, req_comp)) { + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { result = p->out; p->out = NULL; if (req_comp && req_comp != p->s->img_out_n) { @@ -2884,11 +4364,11 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req } *x = p->s->img_x; *y = p->s->img_y; - if (n) *n = p->s->img_n; + if (n) *n = p->s->img_out_n; } - free(p->out); p->out = NULL; - free(p->expanded); p->expanded = NULL; - free(p->idata); p->idata = NULL; + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; return result; } @@ -2910,7 +4390,7 @@ static int stbi__png_test(stbi__context *s) static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) { - if (!stbi__parse_png_file(p, SCAN_header, 0)) { + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { stbi__rewind( p->s ); return 0; } @@ -2926,8 +4406,11 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) p.s = s; return stbi__png_info_raw(&p, x, y, comp); } +#endif // Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP static int stbi__bmp_test_raw(stbi__context *s) { int r; @@ -3063,7 +4546,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int return stbi__errpuc("bad BMP", "bad BMP"); } } else { - assert(hsz == 108 || hsz == 124); + STBI_ASSERT(hsz == 108 || hsz == 124); mr = stbi__get32le(s); mg = stbi__get32le(s); mb = stbi__get32le(s); @@ -3086,11 +4569,11 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int target = req_comp; else target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) malloc(target * s->img_x * s->img_y); + out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); if (!out) return stbi__errpuc("outofmem", "Out of memory"); if (bpp < 16) { int z=0; - if (psize == 0 || psize > 256) { free(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } for (i=0; i < psize; ++i) { pal[i][2] = stbi__get8(s); pal[i][1] = stbi__get8(s); @@ -3101,7 +4584,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); if (bpp == 4) width = (s->img_x + 1) >> 1; else if (bpp == 8) width = s->img_x; - else { free(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } pad = (-width)&3; for (j=0; j < (int) s->img_y; ++j) { for (i=0; i < (int) s->img_x; i += 2) { @@ -3139,7 +4622,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int easy = 2; } if (!easy) { - if (!mr || !mg || !mb) { free(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } // right shift amt to put high bit in position #7 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); @@ -3159,13 +4642,13 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int } } else { for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s); + stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s)); int a; out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - if (target == 4) out[z++] = STBI__BYTECAST(a); + if (target == 4) out[z++] = STBI__BYTECAST(a); } } stbi__skip(s, pad); @@ -3192,10 +4675,11 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int if (comp) *comp = s->img_n; return out; } +#endif // Targa Truevision - TGA // by Jonathan Dummer - +#ifndef STBI_NO_TGA static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) { int tga_w, tga_h, tga_comp; @@ -3315,7 +4799,7 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int *y = tga_height; if (comp) *comp = tga_comp; - tga_data = (unsigned char*)malloc( tga_width * tga_height * tga_comp ); + tga_data = (unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp ); if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) @@ -3334,14 +4818,14 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // any data to skip? (offset usually = 0) stbi__skip(s, tga_palette_start ); // load the palette - tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); + tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 ); if (!tga_palette) { - free(tga_data); + STBI_FREE(tga_data); return stbi__errpuc("outofmem", "Out of memory"); } if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { - free(tga_data); - free(tga_palette); + STBI_FREE(tga_data); + STBI_FREE(tga_palette); return stbi__errpuc("bad palette", "Corrupt TGA"); } } @@ -3423,7 +4907,7 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // clear my palette, if I had one if ( tga_palette != NULL ) { - free( tga_palette ); + STBI_FREE( tga_palette ); } } @@ -3451,10 +4935,12 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // OK, done return tga_data; } +#endif // ************************************************************************************************* // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB +#ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s) { int r = (stbi__get32be(s) == 0x38425053); @@ -3489,7 +4975,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int // Read the rows and columns of the image. h = stbi__get32be(s); w = stbi__get32be(s); - + // Make sure the depth is 8 bits. if (stbi__get16be(s) != 8) return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit"); @@ -3525,13 +5011,13 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int return stbi__errpuc("bad compression", "PSD has an unknown compression format"); // Create the destination image. - out = (stbi_uc *) malloc(4 * w*h); + out = (stbi_uc *) stbi__malloc(4 * w*h); if (!out) return stbi__errpuc("outofmem", "Out of memory"); pixelCount = w*h; // Initialize the data to zero. //memset( out, 0, pixelCount * 4 ); - + // Finally, the image data. if (compression) { // RLE as used by .PSD and .TIFF @@ -3549,7 +5035,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int // Read the RLE data by channel. for (channel = 0; channel < 4; channel++) { stbi_uc *p; - + p = out+channel; if (channel >= channelCount) { // Fill this channel with default data. @@ -3587,15 +5073,15 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int } } } - + } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) // where each channel consists of an 8-bit value for each pixel in the image. - + // Read the data by channel. for (channel = 0; channel < 4; channel++) { stbi_uc *p; - + p = out + channel; if (channel > channelCount) { // Fill this channel with default data. @@ -3616,9 +5102,10 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int if (comp) *comp = channelCount; *y = h; *x = w; - + return out; } +#endif // ************************************************************************************************* // Softimage PIC loader @@ -3627,6 +5114,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ +#ifndef STBI_NO_PIC static int stbi__pic_is4(stbi__context *s,const char *str) { int i; @@ -3810,11 +5298,11 @@ static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int re stbi__get16be(s); //skip `pad' // intermediate buffer is RGBA - result = (stbi_uc *) malloc(x*y*4); + result = (stbi_uc *) stbi__malloc(x*y*4); memset(result, 0xff, x*y*4); if (!stbi__pic_load_core(s,x,y,comp, result)) { - free(result); + STBI_FREE(result); result=0; } *px = x; @@ -3831,10 +5319,13 @@ static int stbi__pic_test(stbi__context *s) stbi__rewind(s); return r; } +#endif // ************************************************************************************************* // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb -typedef struct + +#ifndef STBI_NO_GIF +typedef struct { stbi__int16 prefix; stbi_uc first; @@ -3884,8 +5375,8 @@ static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], in pal[i][2] = stbi__get8(s); pal[i][1] = stbi__get8(s); pal[i][0] = stbi__get8(s); - pal[i][3] = transp ? 0 : 255; - } + pal[i][3] = transp == i ? 0 : 255; + } } static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) @@ -3896,8 +5387,8 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in version = stbi__get8(s); if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + stbi__g_failure_reason = ""; g->w = stbi__get16le(s); g->h = stbi__get16le(s); @@ -3918,7 +5409,7 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) { - stbi__gif g; + stbi__gif g; if (!stbi__gif_header(s, &g, comp, 1)) { stbi__rewind( s ); return 0; @@ -3938,7 +5429,7 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) stbi__out_gif_code(g, g->codes[code].prefix); if (g->cur_y >= g->max_y) return; - + p = &g->out[g->cur_x + g->cur_y]; c = &g->color_table[g->codes[code].suffix * 4]; @@ -3992,7 +5483,7 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) if (valid_bits < codesize) { if (len == 0) { len = stbi__get8(s); // start new block - if (len == 0) + if (len == 0) return g->out; } --len; @@ -4037,7 +5528,7 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) } else { return stbi__errpuc("illegal code in raster", "Corrupt GIF"); } - } + } } } @@ -4063,19 +5554,19 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i if (g->out == 0) { if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - g->out = (stbi_uc *) malloc(4 * g->w * g->h); + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); stbi__fill_gif_background(g); } else { // animated-gif-only path if (((g->eflags & 0x1C) >> 2) == 3) { old_out = g->out; - g->out = (stbi_uc *) malloc(4 * g->w * g->h); + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); memcpy(g->out, old_out, g->w*g->h*4); } } - + for (;;) { switch (stbi__get8(s)) { case 0x2C: /* Image Descriptor */ @@ -4110,16 +5601,16 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i if (g->lflags & 0x80) { stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; + g->color_table = (stbi_uc *) g->lpal; } else if (g->flags & 0x80) { for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent - g->pal[i][3] = 255; + g->pal[i][3] = 255; if (g->transparent >= 0 && (g->eflags & 0x01)) g->pal[g->transparent][3] = 0; g->color_table = (stbi_uc *) g->pal; } else return stbi__errpuc("missing color table", "Corrupt GIF"); - + o = stbi__process_gif_raster(s, g); if (o == NULL) return NULL; @@ -4128,7 +5619,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i return o; } - case 0x21: // Extension Introducer + case 0x21: // Comment Extension. { int len; switch (stbi__get8(s)) { @@ -4140,7 +5631,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i len = stbi__get8(s); // block size if (len == 4) { g->eflags = stbi__get8(s); - g->delay = stbi__get16le(s); // delay + stbi__get16le(s); // delay g->transparent = stbi__get8(s); } else { stbi__skip(s, len); @@ -4181,8 +5672,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i } case 0x3B: // gif stream termination code - case 0x3c: // ? (unknown code) - return (stbi_uc *) 1; + return (stbi_uc *) s; // using '1' causes warning on some compilers default: return stbi__errpuc("unknown code", "Corrupt GIF"); @@ -4197,7 +5687,7 @@ static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int memset(&g, 0, sizeof(g)); u = stbi__gif_load_next(s, &g, comp, req_comp); - if (u == (void *) 1) u = 0; // end of animated gif marker + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker if (u) { *x = g.w; *y = g.h; @@ -4210,7 +5700,7 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) { return stbi__gif_info_raw(s,x,y,comp); } - +#endif // ************************************************************************************************* // Radiance RGBE HDR loader @@ -4299,7 +5789,7 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re // Check identifier if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) return stbi__errpf("not HDR", "Corrupt HDR image"); - + // Parse header for(;;) { token = stbi__hdr_gettoken(s,buffer); @@ -4327,7 +5817,7 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re if (req_comp == 0) req_comp = 3; // Read data - hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); + hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); // Load image data // image data is stored as some number of sca @@ -4360,14 +5850,14 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re stbi__hdr_convert(hdr_data, rgbe, req_comp); i = 1; j = 0; - free(scanline); + STBI_FREE(scanline); goto main_decode_loop; // yes, this makes no sense } len <<= 8; len |= stbi__get8(s); - if (len != width) { free(hdr_data); free(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); - + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + for (k = 0; k < 4; ++k) { i = 0; while (i < width) { @@ -4388,7 +5878,7 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re for (i=0; i < width; ++i) stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } - free(scanline); + STBI_FREE(scanline); } return hdr_data; @@ -4434,6 +5924,7 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) } #endif // STBI_NO_HDR +#ifndef STBI_NO_BMP static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) { int hsz; @@ -4461,7 +5952,9 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) *comp = stbi__get16le(s) / 8; return 1; } +#endif +#ifndef STBI_NO_PSD static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) { int channelCount; @@ -4492,7 +5985,9 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) *comp = 4; return 1; } +#endif +#ifndef STBI_NO_PIC static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) { int act_comp=0,num_packets=0,chained; @@ -4537,35 +6032,163 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) return 1; } +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + *x = s->img_x; + *y = s->img_y; + *comp = s->img_n; + + out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv; + char c, p, t; + + stbi__rewind( s ); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) { - if (stbi__jpeg_info(s, x, y, comp)) - return 1; - if (stbi__png_info(s, x, y, comp)) - return 1; - if (stbi__gif_info(s, x, y, comp)) - return 1; - if (stbi__bmp_info(s, x, y, comp)) - return 1; - if (stbi__psd_info(s, x, y, comp)) - return 1; - if (stbi__pic_info(s, x, y, comp)) - return 1; + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) - return 1; + if (stbi__hdr_info(s, x, y, comp)) return 1; #endif + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA if (stbi__tga_info(s, x, y, comp)) return 1; + #endif return stbi__err("unknown image type", "Image not of any known type, or corrupt"); } #ifndef STBI_NO_STDIO STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) { - FILE *f = fopen(filename, "rb"); + FILE *f = stbi__fopen(filename, "rb"); int result; if (!f) return stbi__err("can't fopen", "Unable to open file"); result = stbi_info_from_file(f, x, y, comp); @@ -4601,118 +6224,138 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int #endif // STB_IMAGE_IMPLEMENTATION -#if !defined(STBI_NO_STDIO) && defined(_MSC_VER) && _MSC_VER >= 1400 -#pragma warning(pop) -#endif - - /* revision history: - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) 1.18 2008-08-02 - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 first released version + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 first released version */ diff --git a/patches/applied/stb_image.h.diff b/patches/applied/stb_image.h.diff index 99774f12..662f4e3c 100644 --- a/patches/applied/stb_image.h.diff +++ b/patches/applied/stb_image.h.diff @@ -1,71 +1,6 @@ -diff --git a/stb_image.h b/stb_image.h -index a381630..ea438cd 100644 ---- a/stb_image.h -+++ b/stb_image.h -@@ -2492,11 +2492,14 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r - stbi__uint32 i,j,stride = x*out_n; - int k; - int img_n = s->img_n; // copy it into a local for later -+ int bpp = 8; - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc(x * y * out_n); - if (!a->out) return stbi__err("outofmem", "Out of memory"); - if (s->img_x == x && s->img_y == y) { -- if (raw_len != (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); -+ if (raw_len == (img_n * x / 8 + 1) * y) { -+ bpp = 1; -+ } else if (raw_len != (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); - } else { // interlaced: - if (raw_len < (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); - } -@@ -2521,8 +2524,13 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r - } - if (img_n != out_n) cur[img_n] = 255; - raw += img_n; -+ if (bpp == 1) { -+ cur += out_n * 16; -+ } else { - cur += out_n; -+ } - prior += out_n; -+ char l; - // this is a little gross, so that we don't switch per-pixel or per-component - if (img_n == out_n) { - #define CASE(f) \ -@@ -2530,7 +2538,22 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r - for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ - for (k=0; k < img_n; ++k) - switch (filter) { -- CASE(STBI__F_none) cur[k] = raw[k]; break; -+ case STBI__F_none: -+ for (i=(x - 1) * bpp / 8; i >= 1; --i) { -+ for (k = 0; k < img_n + 1; ++k) { -+ if (bpp == 1) { -+ for (l = 0; l < 8; ++l) { -+ cur[(k - 1) * 8 - l] = (raw[k - 1] >> l & 1) * 0xff; -+ } -+ } else { -+ cur[k] = raw[k]; -+ } -+ } -+ raw += img_n; -+ cur += img_n * 8 / bpp; -+ prior += img_n; -+ } -+ break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-img_n]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-img_n])>>1)); break; -@@ -2744,7 +2767,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); -- depth = stbi__get8(s); if (depth != 8) return stbi__err("8bit only","PNG not supported: 8-bit only"); -+ depth = stbi__get8(s); if (depth != 8 && depth != 1) return stbi__err("8bit/1bit only","PNG not supported: 8-bit/1-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); -@@ -3853,6 +3876,8 @@ typedef struct +--- stb_image.h 2015-02-04 15:31:29.000000000 +0900 ++++ stb_image.h 2015-02-04 21:42:54.000000000 +0900 +@@ -5347,6 +5347,8 @@ int max_x, max_y; int cur_x, cur_y; int line_size; @@ -74,12 +9,8 @@ index a381630..ea438cd 100644 } stbi__gif; static int stbi__gif_test_raw(stbi__context *s) -@@ -4123,19 +4148,52 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i - return o; - } - -- case 0x21: // Comment Extension. -+ case 0x21: // Extension Introducer +@@ -5620,8 +5622,13 @@ + case 0x21: // Comment Extension. { int len; - if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. @@ -93,10 +24,8 @@ index a381630..ea438cd 100644 + len = stbi__get8(s); // block size if (len == 4) { g->eflags = stbi__get8(s); -- stbi__get16le(s); // delay -+ g->delay = stbi__get16le(s); // delay - g->transparent = stbi__get8(s); - } else { + stbi__get16le(s); // delay +@@ -5630,6 +5637,34 @@ stbi__skip(s, len); break; } From ef9398ba056afbae444ae88054ea7a39ba003fcf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 5 Feb 2015 20:53:40 +0900 Subject: [PATCH 042/451] Minor fixes --- Makefile.in | 2 +- converters/Makefile.am | 2 +- converters/Makefile.in | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Makefile.in b/Makefile.in index 1bfc2d21..32d08ea3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/converters/Makefile.am b/converters/Makefile.am index b69c00ba..09924a12 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -42,7 +42,7 @@ bin_PROGRAMS += tests tests_SOURCES = tests.c tests_CPPFLAGS = -I$(top_builddir)/include/ -I$(top_builddir)/src/ $(AM_CPPFLAGS) tests_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -tests_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +tests_LDADD = $(top_builddir)/src/libsixel.la dist_man_MANS += sixel2png.1 endif diff --git a/converters/Makefile.in b/converters/Makefile.in index 9dd312c4..0b81d2b2 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -142,9 +142,7 @@ sixel2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ am__tests_SOURCES_DIST = tests.c @COND_TESTS_TRUE@am_tests_OBJECTS = tests-tests.$(OBJEXT) tests_OBJECTS = $(am_tests_OBJECTS) -am__DEPENDENCIES_1 = -@COND_TESTS_TRUE@tests_DEPENDENCIES = $(top_builddir)/src/libsixel.la \ -@COND_TESTS_TRUE@ $(am__DEPENDENCIES_1) +@COND_TESTS_TRUE@tests_DEPENDENCIES = $(top_builddir)/src/libsixel.la tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(tests_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -441,7 +439,7 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe *.log @COND_TESTS_TRUE@tests_SOURCES = tests.c @COND_TESTS_TRUE@tests_CPPFLAGS = -I$(top_builddir)/include/ -I$(top_builddir)/src/ $(AM_CPPFLAGS) @COND_TESTS_TRUE@tests_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -@COND_TESTS_TRUE@tests_LDADD = $(top_builddir)/src/libsixel.la $(LIBPNG_LIBS) +@COND_TESTS_TRUE@tests_LDADD = $(top_builddir)/src/libsixel.la all: all-recursive .SUFFIXES: From 7ab0071f89c826b3bf0557f175d88c90148e553e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 8 Feb 2015 16:10:30 +0900 Subject: [PATCH 043/451] Add -B/--bgcolor option (for Issue #25) --- converters/img2sixel.c | 111 ++++++++++++++++++++++++++++++++++++++--- converters/loader.c | 28 ++++++++--- converters/loader.h | 3 +- 3 files changed, 129 insertions(+), 13 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 772c2dbe..3916ecd7 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -65,6 +65,7 @@ # include #endif +#include #include #include "scale.h" #include "loader.h" @@ -77,6 +78,88 @@ enum loopMode { LOOP_DISABLE, /* always disable loop */ }; +static int +parse_x_colorspec(char const *spec, unsigned char **bgcolor) +{ + unsigned long long v; + char const *p; + unsigned char components[3]; + int index = 0; + unsigned long component; + char *endptr; + + if (strncmp(spec, "rgb:", 4) == 0) { + p = spec + 4; + while (p) { + component = strtoul(p, &endptr, 16); + if (component == ULONG_MAX) + break; + if (endptr - p == 0) + break; + if (endptr - p > 4) + break; + components[index++] = (unsigned char)(component << ((4 - (endptr - p)) * 4) >> 8); + p = endptr; + if (index == 3) + break; + if (*p == '\0') + break; + if (*p != '/') + break; + ++p; + } + if (*p != '\0' || *p == '/') { + return (-1); + } + if (index != 3) { + return (-1); + } + *bgcolor = malloc(3); + (*bgcolor)[0] = components[0]; + (*bgcolor)[1] = components[1]; + (*bgcolor)[2] = components[2]; + } else if (*spec == '#') { + p = spec + 1; + v = strtoull(p, &endptr, 16); + if (v == ULLONG_MAX) { + return (-1); + } + if (*endptr != '\0') { + return (-1); + } + if (endptr - p > 12) { + return (-1); + } + *bgcolor = malloc(3); + switch (endptr - p) { + case 3: + (*bgcolor)[0] = (unsigned char)((v & 0xf00) >> 4); + (*bgcolor)[1] = (unsigned char)((v & 0x0f0) >> 0); + (*bgcolor)[2] = (unsigned char)((v & 0x00f) << 4); + break; + case 6: + (*bgcolor)[0] = (unsigned char)((v & 0xff0000) >> 16); + (*bgcolor)[1] = (unsigned char)((v & 0x00ff00) >> 8); + (*bgcolor)[2] = (unsigned char)((v & 0x0000ff) >> 0); + break; + case 9: + (*bgcolor)[0] = (unsigned char)((v & 0xfff000000) >> 28); + (*bgcolor)[1] = (unsigned char)((v & 0x000fff000) >> 16); + (*bgcolor)[2] = (unsigned char)((v & 0x000000fff) >> 4); + break; + case 12: + (*bgcolor)[0] = (unsigned char)((v & 0xffff00000000) >> 40); + (*bgcolor)[1] = (unsigned char)((v & 0x0000ffff0000) >> 24); + (*bgcolor)[2] = (unsigned char)((v & 0x00000000ffff) >> 8); + break; + default: + return (-1); + } + } + + return 0; +} + static int sixel_write_callback(char *data, int size, void *priv) @@ -141,7 +224,7 @@ prepare_builtin_palette(int builtin_palette) static sixel_dither_t * -prepare_specified_palette(char const *mapfile, int reqcolors) +prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgcolor) { unsigned char *mappixels; sixel_dither_t *dither = NULL; @@ -162,7 +245,8 @@ prepare_specified_palette(char const *mapfile, int reqcolors) &frame_count, &loop_count, &delays, /* fstatic */ 1, /* reqcolors */ 256, - &mappixels); + &mappixels, + bgcolor); if (ret != 0 || mappixels == NULL || map_sx * map_sy == 0) { goto end; } @@ -249,6 +333,7 @@ typedef struct Settings { int verbose; int show_version; int show_help; + unsigned char *bgcolor; } settings_t; @@ -277,7 +362,8 @@ prepare_palette(sixel_dither_t *former_dither, return former_dither; } dither = prepare_specified_palette(psettings->mapfile, - psettings->reqcolors); + psettings->reqcolors, + psettings->bgcolor); } else if (psettings->builtin_palette) { if (former_dither) { return former_dither; @@ -809,7 +895,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) &frame_count, &loop_count, &delays, psettings->fstatic, psettings->reqcolors, - &pixels); + &pixels, psettings->bgcolor); if (nret != 0 || pixels == NULL || sx * sy == 0) { goto end; @@ -1204,7 +1290,7 @@ main(int argc, char *argv[]) int number; char unit[32]; int parsed; - char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:C:DVH"; + char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:B:C:DVH"; settings_t settings = { -1, /* reqcolors */ @@ -1241,6 +1327,7 @@ main(int argc, char *argv[]) 0, /* pipe_mode */ 0, /* show_version */ 0, /* show_help */ + NULL, /* bgcolor */ }; #if HAVE_GETOPT_LONG @@ -1270,6 +1357,7 @@ main(int argc, char *argv[]) {"macro-number", required_argument, &long_opt, 'n'}, {"penetrate", no_argument, &long_opt, 'P'}, {"encode-policy", required_argument, &long_opt, 'E'}, + {"bgcolor", required_argument, &long_opt, 'B'}, {"complexion-score", required_argument, &long_opt, 'C'}, {"pipe-mode", no_argument, &long_opt, 'D'}, {"version", no_argument, &long_opt, 'V'}, @@ -1511,6 +1599,16 @@ main(int argc, char *argv[]) goto argerr; } break; + case 'B': + /* parse --bgcolor option */ + if (parse_x_colorspec(optarg, &settings.bgcolor) == 0) { + settings.palette_type = PALETTETYPE_AUTO; + } else { + fprintf(stderr, + "Cannot parse bgcolor option.\n"); + goto argerr; + } + break; case 'i': settings.finvert = 1; break; @@ -1683,11 +1781,12 @@ main(int argc, char *argv[]) " [-f findtype] [-s selecttype] [-c geometory] [-w width]\n" " [-h height] [-r resamplingtype] [-q quality] [-l loopmode]\n" " [-t palettetype] [-n macronumber] [-C score] [-b palette]\n" - " [-E encodepolicy] [filename ...]\n" + " [-E encodepolicy] [-B bgcolor] [filename ...]\n" "for more details, type: 'img2sixel -H'.\n"); end: free(settings.mapfile); + free(settings.bgcolor); return exit_code; } diff --git a/converters/loader.c b/converters/loader.c index 683824fe..a13a1d1b 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -234,7 +234,7 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) return 0; } # endif /* HAVE_LIBCURL */ - + # if HAVE_JPEG /* import from @uobikiemukot's sdump loader.h */ @@ -307,7 +307,8 @@ load_png(unsigned char *buffer, int size, int *psx, int *psy, int *pcomp, unsigned char **ppalette, int *pncolors, int reqcolors, - int *pixelformat) + int *pixelformat, + unsigned char *bgcolor) { chunk_t read_chunk; png_uint_32 bitdepth; @@ -317,6 +318,7 @@ load_png(unsigned char *buffer, int size, unsigned char **rows = NULL; unsigned char *result = NULL; png_color *png_palette = NULL; + png_color_16 background; int i; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -332,6 +334,17 @@ load_png(unsigned char *buffer, int size, } read_chunk.buffer = buffer; read_chunk.size = size; + + if (bgcolor) { + background.red = bgcolor[0]; + background.green = bgcolor[1]; + background.blue = bgcolor[2]; + + if (!png_get_bKGD(png_ptr, info_ptr, NULL)) { + png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } + } + png_set_read_fn(png_ptr,(png_voidp)&read_chunk, read_png); png_read_info(png_ptr, info_ptr); *psx = png_get_image_width(png_ptr, info_ptr); @@ -616,7 +629,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, unsigned char **ppalette, int *pncolors, int *ppixelformat, int *pframe_count, int *ploop_count, int **ppdelay, - int fstatic, int reqcolors) + int fstatic, int reqcolors, unsigned char *bgcolor) { unsigned char *p; unsigned char *pixels = NULL; @@ -663,10 +676,12 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, pixels = load_png(pchunk->buffer, pchunk->size, psx, psy, pcomp, ppalette, pncolors, reqcolors, - ppixelformat); + ppixelformat, bgcolor); *pframe_count = 1; *ploop_count = 1; } +#else + (void) bgcolor; #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { chunk_init(&frames, 1024); @@ -1006,7 +1021,8 @@ load_image_file(char const *filename, int *psx, int *psy, int *ppixelformat, int *pframe_count, int *ploop_count, int **ppdelay, int fstatic, int reqcolors, - unsigned char **ppixels) + unsigned char **ppixels, + unsigned char *bgcolor) { int comp; int stride = (-1); @@ -1046,7 +1062,7 @@ load_image_file(char const *filename, int *psx, int *psy, *ppixels = load_with_builtin(&chunk, psx, psy, &comp, &stride, ppalette, pncolors, ppixelformat, pframe_count, ploop_count, ppdelay, - fstatic, reqcolors); + fstatic, reqcolors, bgcolor); } free(chunk.buffer); if (*ppixels && stride > 0 && comp == 4 && (!ppalette || (ppalette && !*ppalette))) { diff --git a/converters/loader.h b/converters/loader.h index d1a1ebe9..81d80a9f 100644 --- a/converters/loader.h +++ b/converters/loader.h @@ -32,7 +32,8 @@ load_image_file(char const *filename, int *psx, int *psy, int *ppixelformat, int *pframe_count, int *ploop_count, int **ppdelay, int fstatic, int reqcolors, - unsigned char **ppixels); + unsigned char **ppixels, + unsigned char *bgcolor); #ifdef __cplusplus } From 365f274ebf7347a7144d4fef3978512d04d0c03f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 8 Feb 2015 16:29:35 +0900 Subject: [PATCH 044/451] Fix build error when --without-png configure option is specified --- converters/loader.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index a13a1d1b..a4d028b9 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -639,6 +639,10 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, chunk_t delays; int pixelformat = PIXELFORMAT_RGB888; +#if !defined(HAVE_LIBPNG) + (void) bgcolor; +#endif + if (chunk_is_sixel(pchunk)) { pixels = load_sixel(pchunk->buffer, pchunk->size, psx, psy, pcomp, @@ -680,8 +684,6 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, *pframe_count = 1; *ploop_count = 1; } -#else - (void) bgcolor; #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { chunk_init(&frames, 1024); From 94d905d8de8e56b8c693dd605ef7e47f50e8e669 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 8 Feb 2015 16:42:26 +0900 Subject: [PATCH 045/451] Add the brief of -B option to README and manpage --- README.md | 12 ++++++++++++ converters/img2sixel.1 | 22 ++++++++++++++++++++++ converters/img2sixel.c | 13 +++++++++++++ 3 files changed, 47 insertions(+) diff --git a/README.md b/README.md index 51bcf826..df7b62e2 100644 --- a/README.md +++ b/README.md @@ -441,6 +441,18 @@ Options: fast -> encode as fast as possible size -> encode to as small sixel sequence as possible +-B BGCOLOR, --bgcolor=BGCOLOR + specify background color + BGCOLOR is represented by the + following syntax + #rgb + #rrggbb + #rrrgggbbb + #rrrrggggbbbb + rgb:r/g/b + rgb:rr/gg/bb + rgb:rrr/ggg/bbb + rgb:rrrr/gggg/bbbb -P, --penetrate penetrate GNU Screen using DCS pass-through sequence -D, --pipe-mode read source images from stdin diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 4ff6e13b..48bd2ec8 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -221,6 +221,28 @@ fast -> encode as fast as possible .br size -> encode to as small sixel sequence as possible .TP 5 +.B \-B \fIBGCOLOR\fP, \-\-bgcolor=\fIBGCOLOR\fP +.br +specify background color +.br +\fIBGCOLOR\fP is represented by the following syntax +.br +#rgb +.br +#rrggbb +.br +#rrrgggbbb +.br +#rrrrggggbbbb +.br +rgb:r/g/b +.br +rgb:rr/gg/bb +.br +rgb:rrr/ggg/bbb +.br +rgb:rrrr/gggg/bbbb +.TP 5 .B \-P, \-\-penetrate penetrate GNU Screen using DCS pass-through sequence. .TP 5 diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 3916ecd7..c2e1f87b 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -78,6 +78,7 @@ enum loopMode { LOOP_DISABLE, /* always disable loop */ }; + static int parse_x_colorspec(char const *spec, unsigned char **bgcolor) { @@ -1252,6 +1253,18 @@ void show_help(void) " fast -> encode as fast as possible\n" " size -> encode to as small sixel\n" " sequence as possible\n" + "-B BGCOLOR, --bgcolor=BGCOLOR\n" + " specify background color\n" + " BGCOLOR is represented by the\n" + " following syntax\n" + " #rgb\n" + " #rrggbb\n" + " #rrrgggbbb\n" + " #rrrrggggbbbb\n" + " rgb:r/g/b\n" + " rgb:rr/gg/bb\n" + " rgb:rrr/ggg/bbb\n" + " rgb:rrrr/gggg/bbbb\n" "-P, --penetrate penetrate GNU Screen using DCS\n" " pass-through sequence\n" "-D, --pipe-mode read source images from stdin\n" From e3feddd50e80ccf62efa870fa1e705ac9c5e3204 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 9 Feb 2015 02:11:12 +0900 Subject: [PATCH 046/451] Consider the behavior of libpng1.2 around background color support(for Issue #25) --- converters/loader.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index a4d028b9..8bbb90e5 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -335,16 +335,6 @@ load_png(unsigned char *buffer, int size, read_chunk.buffer = buffer; read_chunk.size = size; - if (bgcolor) { - background.red = bgcolor[0]; - background.green = bgcolor[1]; - background.blue = bgcolor[2]; - - if (!png_get_bKGD(png_ptr, info_ptr, NULL)) { - png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } - } - png_set_read_fn(png_ptr,(png_voidp)&read_chunk, read_png); png_read_info(png_ptr, info_ptr); *psx = png_get_image_width(png_ptr, info_ptr); @@ -353,6 +343,13 @@ load_png(unsigned char *buffer, int size, if (bitdepth == 16) { png_set_strip_16(png_ptr); } + + if (bgcolor) { + background.red = bgcolor[0]; + background.green = bgcolor[1]; + background.blue = bgcolor[2]; + } + switch (png_get_color_type(png_ptr, info_ptr)) { case PNG_COLOR_TYPE_PALETTE: palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, &png_palette, pncolors); @@ -417,7 +414,11 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB_ALPHA: - png_set_strip_alpha(png_ptr); + if (bgcolor && !png_get_bKGD(png_ptr, info_ptr, NULL)) { + png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } else { + png_set_strip_alpha(png_ptr); + } *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; From f99418a817d9b7d088faaab1e6cbd2e8bb58f4db Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 10 Feb 2015 01:15:49 +0900 Subject: [PATCH 047/451] Background color support for 8bpp paletted PNG with tRNS chunk using libpng (for Issue #25) --- converters/loader.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 8bbb90e5..9f2dbb73 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -319,6 +319,8 @@ load_png(unsigned char *buffer, int size, unsigned char *result = NULL; png_color *png_palette = NULL; png_color_16 background; + png_bytep trans = NULL; + int num_trans = 0; int i; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -353,15 +355,28 @@ load_png(unsigned char *buffer, int size, switch (png_get_color_type(png_ptr, info_ptr)) { case PNG_COLOR_TYPE_PALETTE: palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, &png_palette, pncolors); - if (ppalette && png_palette && bitdepth == 8 && palette_bitdepth == 8 && *pncolors <= reqcolors) { + if (ppalette && png_palette && bitdepth == 8 && palette_bitdepth == 8 + && *pncolors <= reqcolors) { *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { goto cleanup; } + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { + png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); + } for (i = 0; i < *pncolors; ++i) { - (*ppalette)[i * 3 + 0] = png_palette[i].red; - (*ppalette)[i * 3 + 1] = png_palette[i].green; - (*ppalette)[i * 3 + 2] = png_palette[i].blue; + if (bgcolor && i < num_trans) { + (*ppalette)[i * 3 + 0] = ((0xff - trans[i]) * bgcolor[0] + + trans[i] * png_palette[i].red ) >> 8; + (*ppalette)[i * 3 + 1] = ((0xff - trans[i]) * bgcolor[1] + + trans[i] * png_palette[i].green) >> 8; + (*ppalette)[i * 3 + 2] = ((0xff - trans[i]) * bgcolor[2] + + trans[i] * png_palette[i].blue ) >> 8; + } else { + (*ppalette)[i * 3 + 0] = png_palette[i].red; + (*ppalette)[i * 3 + 1] = png_palette[i].green; + (*ppalette)[i * 3 + 2] = png_palette[i].blue; + } } *pcomp = 1; *pixelformat = PIXELFORMAT_PAL8; From 999db7301042c614a6d2ecabc2fcdeed69c06824 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 11 Feb 2015 21:20:12 +0900 Subject: [PATCH 048/451] Add -B option to shell completion settings --- converters/shell-completion/bash/img2sixel | 1 + converters/shell-completion/zsh/_img2sixel | 1 + 2 files changed, 2 insertions(+) diff --git a/converters/shell-completion/bash/img2sixel b/converters/shell-completion/bash/img2sixel index 9095f49b..cdd33396 100644 --- a/converters/shell-completion/bash/img2sixel +++ b/converters/shell-completion/bash/img2sixel @@ -133,6 +133,7 @@ _img2sixel() -t --palette-type \ -b --builtin-palette \ -E --encode-policy \ + -B --bgcolor \ -P --penetrate \ -D --pipe-mode \ -v --verbose \ diff --git a/converters/shell-completion/zsh/_img2sixel b/converters/shell-completion/zsh/_img2sixel index e124bae4..6d42ff5f 100644 --- a/converters/shell-completion/zsh/_img2sixel +++ b/converters/shell-completion/zsh/_img2sixel @@ -123,6 +123,7 @@ _arguments -S -s -A "-*" -S \ {-t,--palette-type=}'[select palette color space type]':palettetype:_palettetype \ {-b,--builtin-palette=}'[select built-in palette type]':builtinpalette:_builtinpalette \ {-E,--encode-policy=}'[select encoding policy]':encodepolicy:_encodepolicy \ + {-B,--bgcolor=}'[select background color]' \ {-P,--penetrate}'[penetrate GNU Screen using DCS pass-through sequence]' \ {-D,--pipe-mode}'[read source images from stdin continuously]' \ {-v,--verbose}'[show debugging information]' \ From 51a37f6fec61f2c27b61d587762fe680418d49ee Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 11 Feb 2015 21:20:45 +0900 Subject: [PATCH 049/451] Minor style fix --- converters/loader.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 9f2dbb73..27cc7d4e 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -354,7 +354,8 @@ load_png(unsigned char *buffer, int size, switch (png_get_color_type(png_ptr, info_ptr)) { case PNG_COLOR_TYPE_PALETTE: - palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, &png_palette, pncolors); + palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, + &png_palette, pncolors); if (ppalette && png_palette && bitdepth == 8 && palette_bitdepth == 8 && *pncolors <= reqcolors) { *ppalette = malloc(*pncolors * 3); @@ -367,11 +368,14 @@ load_png(unsigned char *buffer, int size, for (i = 0; i < *pncolors; ++i) { if (bgcolor && i < num_trans) { (*ppalette)[i * 3 + 0] = ((0xff - trans[i]) * bgcolor[0] - + trans[i] * png_palette[i].red ) >> 8; + + trans[i] * png_palette[i].red) + >> 8; (*ppalette)[i * 3 + 1] = ((0xff - trans[i]) * bgcolor[1] - + trans[i] * png_palette[i].green) >> 8; + + trans[i] * png_palette[i].green) + >> 8; (*ppalette)[i * 3 + 2] = ((0xff - trans[i]) * bgcolor[2] - + trans[i] * png_palette[i].blue ) >> 8; + + trans[i] * png_palette[i].blue) + >> 8; } else { (*ppalette)[i * 3 + 0] = png_palette[i].red; (*ppalette)[i * 3 + 1] = png_palette[i].green; @@ -1083,11 +1087,13 @@ load_image_file(char const *filename, int *psx, int *psy, fstatic, reqcolors, bgcolor); } free(chunk.buffer); - if (*ppixels && stride > 0 && comp == 4 && (!ppalette || (ppalette && !*ppalette))) { - /* RGBA to RGB */ - ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count); - if (ret != 0) { - goto end; + if (*ppixels && stride > 0 && comp == 4) { + if (!ppalette || (ppalette && !*ppalette)) { + /* RGBA to RGB */ + ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count); + if (ret != 0) { + goto end; + } } } From 05321aa3a71c1a64cbf8d4cffeb03b54551b694b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 12 Feb 2015 14:10:13 +0900 Subject: [PATCH 050/451] Fix a leak around parsing -B option --- converters/img2sixel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index f5053646..0183b06b 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1617,6 +1617,9 @@ main(int argc, char *argv[]) break; case 'B': /* parse --bgcolor option */ + if (settings.bgcolor) } + free(settings.bgcolor); + } if (parse_x_colorspec(optarg, &settings.bgcolor) == 0) { settings.palette_type = PALETTETYPE_AUTO; } else { From 39ad14f3b7ee239714d3fc2315f55e142d6aac65 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 13 Feb 2015 21:22:17 +0900 Subject: [PATCH 051/451] Fix a syntax error caused by a typo --- Makefile.in | 2 +- converters/img2sixel.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index a2aaa90f..4a30a971 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 0183b06b..1c36c2af 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1617,7 +1617,7 @@ main(int argc, char *argv[]) break; case 'B': /* parse --bgcolor option */ - if (settings.bgcolor) } + if (settings.bgcolor) { free(settings.bgcolor); } if (parse_x_colorspec(optarg, &settings.bgcolor) == 0) { From e565c949a06aeb116d18a4995bf612fc98da62a2 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 00:02:20 +0900 Subject: [PATCH 052/451] Parse X11 color spec without strtoul/strtoull --- converters/img2sixel.c | 145 ++++++++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 59 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 1c36c2af..8d5ed650 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -65,7 +65,6 @@ # include #endif -#include #include #include "scale.h" #include "loader.h" @@ -79,86 +78,127 @@ enum loopMode { }; +static char * +arg_strdup(char const *s) +{ + char *p; + + p = malloc(strlen(s) + 1); + if (p) { + strcpy(p, s); + } + return p; +} + + static int -parse_x_colorspec(char const *spec, unsigned char **bgcolor) +parse_x_colorspec(char const *s, unsigned char **bgcolor) { - unsigned long long v; - char const *p; + char *p; unsigned char components[3]; int index = 0; - unsigned long component; + int ret = 0; + unsigned long v; char *endptr; - - if (strncmp(spec, "rgb:", 4) == 0) { - p = spec + 4; - while (p) { - component = strtoul(p, &endptr, 16); - if (component == ULONG_MAX) - break; - if (endptr - p == 0) + char *buf = NULL; + + if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { + p = buf = arg_strdup(s + 4); + while (*p) { + v = 0; + for (endptr = p; endptr - p <= 12; ++endptr) { + if (*endptr >= '0' && *endptr <= '9') { + v = v << 4 | *endptr - '0'; + } else if (*endptr >= 'a' && *endptr <= 'f') { + v = v << 4 | *endptr - 'a' + 10; + } else if (*endptr >= 'A' && *endptr <= 'F') { + v = v << 4 | *endptr - 'A' + 10; + } else { + break; + } + } + if (endptr - p == 0) { break; - if (endptr - p > 4) + } + if (endptr - p > 4) { break; - components[index++] = (unsigned char)(component << ((4 - (endptr - p)) * 4) >> 8); + } + v = v << ((4 - (endptr - p)) * 4) >> 8; + components[index++] = (unsigned char)v; p = endptr; - if (index == 3) + if (index == 3) { break; - if (*p == '\0') + } + if (*p == '\0') { break; - if (*p != '/') + } + if (*p != '/') { break; + } ++p; } - if (*p != '\0' || *p == '/') { - return (-1); - } - if (index != 3) { - return (-1); + if (index != 3 || *p != '\0' || *p == '/') { + ret = (-1); + goto end; } *bgcolor = malloc(3); (*bgcolor)[0] = components[0]; (*bgcolor)[1] = components[1]; (*bgcolor)[2] = components[2]; - } else if (*spec == '#') { - p = spec + 1; - v = strtoull(p, &endptr, 16); - if (v == ULLONG_MAX) { - return (-1); - } - if (*endptr != '\0') { - return (-1); + } else if (*s == '#') { + buf = arg_strdup(s + 1); + for (p = endptr = buf; endptr - p <= 12; ++endptr) { + if (*endptr >= '0' && *endptr <= '9') { + *endptr -= '0'; + } else if (*endptr >= 'a' && *endptr <= 'f') { + *endptr -= 'a' - 10; + } else if (*endptr >= 'A' && *endptr <= 'F') { + *endptr -= 'A' - 10; + } else if (*endptr == '\0') { + break; + } else { + ret = (-1); + goto end; + } } if (endptr - p > 12) { - return (-1); + ret = (-1); + goto end; } *bgcolor = malloc(3); switch (endptr - p) { case 3: - (*bgcolor)[0] = (unsigned char)((v & 0xf00) >> 4); - (*bgcolor)[1] = (unsigned char)((v & 0x0f0) >> 0); - (*bgcolor)[2] = (unsigned char)((v & 0x00f) << 4); + (*bgcolor)[0] = (unsigned char)(p[0] << 4); + (*bgcolor)[1] = (unsigned char)(p[1] << 4); + (*bgcolor)[2] = (unsigned char)(p[2] << 4); break; case 6: - (*bgcolor)[0] = (unsigned char)((v & 0xff0000) >> 16); - (*bgcolor)[1] = (unsigned char)((v & 0x00ff00) >> 8); - (*bgcolor)[2] = (unsigned char)((v & 0x0000ff) >> 0); + (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); + (*bgcolor)[1] = (unsigned char)(p[2] << 4 | p[3]); + (*bgcolor)[2] = (unsigned char)(p[4] << 4 | p[4]); break; case 9: - (*bgcolor)[0] = (unsigned char)((v & 0xfff000000) >> 28); - (*bgcolor)[1] = (unsigned char)((v & 0x000fff000) >> 16); - (*bgcolor)[2] = (unsigned char)((v & 0x000000fff) >> 4); + (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); + (*bgcolor)[1] = (unsigned char)(p[3] << 4 | p[4]); + (*bgcolor)[2] = (unsigned char)(p[6] << 4 | p[7]); break; case 12: - (*bgcolor)[0] = (unsigned char)((v & 0xffff00000000) >> 40); - (*bgcolor)[1] = (unsigned char)((v & 0x0000ffff0000) >> 24); - (*bgcolor)[2] = (unsigned char)((v & 0x00000000ffff) >> 8); + (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); + (*bgcolor)[1] = (unsigned char)(p[4] << 4 | p[5]); + (*bgcolor)[2] = (unsigned char)(p[8] << 4 | p[9]); break; default: - return (-1); + ret = (-1); + goto end; } } - return 0; + ret = 0; + +end: + free(buf); + + return ret; } @@ -1276,19 +1316,6 @@ void show_help(void) } -static char * -arg_strdup(char const *s) -{ - char *p; - - p = malloc(strlen(s) + 1); - if (p) { - strcpy(p, s); - } - return p; -} - - int main(int argc, char *argv[]) { From 60113b0b7577efed33bec014e11df6b61bb0e27a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 00:03:49 +0900 Subject: [PATCH 053/451] Check strtoul and availability --- Makefile.in | 2 +- config.h.in | 6 ++++++ configure | 3 ++- configure.ac | 3 ++- src/dither.c | 7 +++++-- src/quant.c | 7 +++++-- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Makefile.in b/Makefile.in index 4a30a971..a2aaa90f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/config.h.in b/config.h.in index 2d6a9df6..594c6787 100644 --- a/config.h.in +++ b/config.h.in @@ -114,6 +114,9 @@ /* whether libpng is available */ #undef HAVE_LIBPNG +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC @@ -164,6 +167,9 @@ /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H diff --git a/configure b/configure index 86ae7270..8075bf69 100755 --- a/configure +++ b/configure @@ -13229,6 +13229,7 @@ for ac_header in memory.h \ sys/stat.h \ fcntl.h \ errno.h \ + limits.h \ sys/time.h \ time.h \ signal.h \ @@ -13425,12 +13426,12 @@ fi for ac_func in memcpy \ memmove \ - strtol \ setmode \ _setmode \ signal \ usleep \ strdup \ + strtoul \ calloc \ clock \ clearerr \ diff --git a/configure.ac b/configure.ac index 489b7f6d..d96424db 100644 --- a/configure.ac +++ b/configure.ac @@ -157,6 +157,7 @@ AC_CHECK_HEADERS([memory.h \ sys/stat.h \ fcntl.h \ errno.h \ + limits.h \ sys/time.h \ time.h \ signal.h \ @@ -185,12 +186,12 @@ AM_CONDITIONAL([HAVE_GETOPT_LONG], [test x$have_getopt_long = xyes]) AC_CHECK_FUNCS([memcpy \ memmove \ - strtol \ setmode \ _setmode \ signal \ usleep \ strdup \ + strtoul \ calloc \ clock \ clearerr \ diff --git a/src/dither.c b/src/dither.c index f8696720..d33b5f5f 100644 --- a/src/dither.c +++ b/src/dither.c @@ -25,9 +25,12 @@ #include #include #include -#include -#if defined(HAVE_INTTYPES_H) +#if HAVE_LIMITS_H +# include +#endif + +#if HAVE_INTTYPES_H # include #endif diff --git a/src/quant.c b/src/quant.c index fa8c7a60..a8e3d7c3 100644 --- a/src/quant.c +++ b/src/quant.c @@ -50,9 +50,12 @@ #include #include #include -#include -#if defined(HAVE_INTTYPES_H) +#if HAVE_LIMITS_H +# include +#endif + +#if HAVE_INTTYPES_H # include #endif From 18e1e8e927d92efc5b8c73c76fedf629ac4317e3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 01:14:25 +0900 Subject: [PATCH 054/451] Fix GCC a warning caused by comparison of signed and unsigned type in conditional expression --- converters/stb_image.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converters/stb_image.h b/converters/stb_image.h index f089c06a..81c8039f 100644 --- a/converters/stb_image.h +++ b/converters/stb_image.h @@ -4642,7 +4642,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int } } else { for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s)); + stbi__uint32 v = bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s); int a; out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); From 9d5c5b1f06b2e59fe68d7e55557baec8869aabc4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 01:26:59 +0900 Subject: [PATCH 055/451] Add some parentheses arithmetic operator '|', for suppressing GCC warnings --- Makefile.in | 2 +- converters/img2sixel.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.in b/Makefile.in index a2aaa90f..4a30a971 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 8d5ed650..e3010b1d 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -108,11 +108,11 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) v = 0; for (endptr = p; endptr - p <= 12; ++endptr) { if (*endptr >= '0' && *endptr <= '9') { - v = v << 4 | *endptr - '0'; + v = (v << 4) | (*endptr - '0'); } else if (*endptr >= 'a' && *endptr <= 'f') { - v = v << 4 | *endptr - 'a' + 10; + v = (v << 4) | (*endptr - 'a' + 10); } else if (*endptr >= 'A' && *endptr <= 'F') { - v = v << 4 | *endptr - 'A' + 10; + v = (v << 4) | (*endptr - 'A' + 10); } else { break; } From 8db31ac867f32bfaa7a22151970a6661a4993d73 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 01:33:36 +0900 Subject: [PATCH 056/451] Update ChangeLog --- ChangeLog | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ChangeLog b/ChangeLog index 7022ee25..ebdc5ccc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2015-02-14 Hayaki Saito + + * converters/stb_image.h: Fix GCC a warning caused by comparison of signed + and unsigned type in conditional expression + +2015-02-08 Hayaki Saito + + * converters/img2sixel.c: Fix noise problem when applying palette (for issue + #26) + + * src/quant.c: Correct wrong histgram processing (for Issue #26) + +2015-02-04 Hayaki Saito + + * converters/loader.c, converters/stb_image.h, + patches/applied/stb_image.h.diff: Update stb_image to v2.02 (for Issue #24) + + * ChangeLog: Update ChnageLog + +2015-02-03 Hayaki Saito + + * examples/opengl/README.md: Add README of OpenGL example + + * examples/opengl/main.c: Minor fix + 2015-02-02 Hayaki Saito * config.h.in, converters/loader.c: Fix some wrong config.h declaration: From 5f746b7801c87fe87da1eb35d29c564b21ec3b4e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 10:49:25 +0900 Subject: [PATCH 057/451] Rebuild Makefile.in --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 8c398d7e..7d6f7844 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ From 0c4a875404a523ef185aa6c0caefd7d5855d84ed Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 14 Feb 2015 19:30:41 +0900 Subject: [PATCH 058/451] Add test case whether stb_image can load a progressive jpeg (for issue #24) --- converters/Makefile.am | 2 -- converters/Makefile.in | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 80e9d425..1d6c75f9 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -128,9 +128,7 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -ldisable -dnone -g ../images/seq2gif.gif $(WINE) ./img2sixel -ldisable -dnone -u -g ../images/seq2gif.gif $(WINE) ./img2sixel -S -datkinson ../images/seq2gif.gif -if HAVE_JPEG $(WINE) ./img2sixel ../images/snake-progressive.jpg -endif if HAVE_PNG $(WINE) ./img2sixel ../images/snake.png endif diff --git a/converters/Makefile.in b/converters/Makefile.in index 1dd60d4d..54326174 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1075,7 +1075,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -ldisable -dnone -g ../images/seq2gif.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -ldisable -dnone -u -g ../images/seq2gif.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -S -datkinson ../images/seq2gif.gif -@HAVE_JPEG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake-progressive.jpg +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake-progressive.jpg @HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.png @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel file:///test) @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel file:///$$(pwd)/../images/snake.jpg From 746ab595f65ffbd5c095f8d41b28129122466a9d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 06:07:02 +0900 Subject: [PATCH 059/451] Minor fixes --- converters/sixel2png.c | 3 ++- include/sixel-imageio.h.in | 26 +++++++++++----------- src/loader.c | 44 +++++++++++++++++++------------------- src/writer.c | 28 ++++++++++++------------ 4 files changed, 51 insertions(+), 50 deletions(-) diff --git a/converters/sixel2png.c b/converters/sixel2png.c index d0370080..de694785 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -134,7 +134,8 @@ sixel_to_png(char const *input, char const *output) goto end; } - ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, PIXELFORMAT_PAL8, output, FMT_PNG); + ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, + PIXELFORMAT_PAL8, output, FORMAT_PNG); end: free(pixels); diff --git a/include/sixel-imageio.h.in b/include/sixel-imageio.h.in index 2e07095f..ccfe7026 100644 --- a/include/sixel-imageio.h.in +++ b/include/sixel-imageio.h.in @@ -25,18 +25,18 @@ /* loader API */ enum imageFormat { - FMT_GIF = 0, - FMT_PNG = 1, - FMT_BMP = 2, - FMT_JPG = 3, - FMT_TGA = 4, - FMT_WBMP = 5, - FMT_TIFF = 6, - FMT_SIXEL = 7, - FMT_PNM = 8, - FMT_GD2 = 9, - FMT_PSD = 10, - FMT_HDR = 11, + FORMAT_GIF = 0, /* read only */ + FORMAT_PNG = 1, /* read/write */ + FORMAT_BMP = 2, /* read only */ + FORMAT_JPG = 3, /* read only */ + FORMAT_TGA = 4, /* read only */ + FORMAT_WBMP = 5, /* read only with --with-gd configure option */ + FORMAT_TIFF = 6, /* read only */ + FORMAT_SIXEL = 7, /* read only */ + FORMAT_PNM = 8, /* read only */ + FORMAT_GD2 = 9, /* read only with --with-gd configure option */ + FORMAT_PSD = 10, /* read only */ + FORMAT_HDR = 11, /* read only */ }; #ifdef __cplusplus @@ -67,7 +67,7 @@ sixel_helper_write_image_file( int /* in */ height, /* source data height */ int /* in */ pixelformat, /* source pixelFormat */ char const /* in */ *filename, /* destination filename */ - int /* in */ imageformat); /* destination imageformat */ + int /* in */ imageformat); /* one of enum imageformat */ #ifdef __cplusplus } diff --git a/src/loader.c b/src/loader.c index 406e3678..b3c8d411 100644 --- a/src/loader.c +++ b/src/loader.c @@ -798,59 +798,59 @@ static int detect_file_format(int len, unsigned char *data) { if (memcmp("TRUEVISION", data + len - 18, 10) == 0) { - return FMT_TGA; + return FORMAT_TGA; } if (memcmp("GIF", data, 3) == 0) { - return FMT_GIF; + return FORMAT_GIF; } if (memcmp("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", data, 8) == 0) { - return FMT_PNG; + return FORMAT_PNG; } if (memcmp("BM", data, 2) == 0) { - return FMT_BMP; + return FORMAT_BMP; } if (memcmp("\xFF\xD8", data, 2) == 0) { - return FMT_JPG; + return FORMAT_JPG; } if (memcmp("\x00\x00", data, 2) == 0) { - return FMT_WBMP; + return FORMAT_WBMP; } if (memcmp("\x4D\x4D", data, 2) == 0) { - return FMT_TIFF; + return FORMAT_TIFF; } if (memcmp("\x49\x49", data, 2) == 0) { - return FMT_TIFF; + return FORMAT_TIFF; } if (memcmp("\033P", data, 2) == 0) { - return FMT_SIXEL; + return FORMAT_SIXEL; } if (data[0] == 0x90 && (data[len-1] == 0x9C || data[len-2] == 0x9C)) { - return FMT_SIXEL; + return FORMAT_SIXEL; } if (data[0] == 'P' && data[1] >= '1' && data[1] <= '6') { - return FMT_PNM; + return FORMAT_PNM; } if (memcmp("gd2", data, 3) == 0) { - return FMT_GD2; + return FORMAT_GD2; } if (memcmp("8BPS", data, 4) == 0) { - return FMT_PSD; + return FORMAT_PSD; } if (memcmp("#?RADIANCE\n", data, 11) == 0) { - return FMT_HDR; + return FORMAT_HDR; } return (-1); @@ -868,22 +868,22 @@ load_with_gd(chunk_t const *pchunk, int *psx, int *psy, int *pcomp, int *pstride switch(detect_file_format(pchunk->size, pchunk->buffer)) { #if 0 # if HAVE_DECL_GDIMAGECREATEFROMGIFPTR - case FMT_GIF: + case FORMAT_GIF: im = gdImageCreateFromGifPtr(pchunk->size, pchunk->buffer); break; # endif /* HAVE_DECL_GDIMAGECREATEFROMGIFPTR */ #endif #if HAVE_DECL_GDIMAGECREATEFROMPNGPTR - case FMT_PNG: + case FORMAT_PNG: im = gdImageCreateFromPngPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMPNGPTR */ #if HAVE_DECL_GDIMAGECREATEFROMBMPPTR - case FMT_BMP: + case FORMAT_BMP: im = gdImageCreateFromBmpPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMBMPPTR */ - case FMT_JPG: + case FORMAT_JPG: #if HAVE_DECL_GDIMAGECREATEFROMJPEGPTREX im = gdImageCreateFromJpegPtrEx(pchunk->size, pchunk->buffer, 1); #elif HAVE_DECL_GDIMAGECREATEFROMJPEGPTR @@ -891,22 +891,22 @@ load_with_gd(chunk_t const *pchunk, int *psx, int *psy, int *pcomp, int *pstride #endif /* HAVE_DECL_GDIMAGECREATEFROMJPEGPTREX */ break; #if HAVE_DECL_GDIMAGECREATEFROMTGAPTR - case FMT_TGA: + case FORMAT_TGA: im = gdImageCreateFromTgaPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMTGAPTR */ #if HAVE_DECL_GDIMAGECREATEFROMWBMPPTR - case FMT_WBMP: + case FORMAT_WBMP: im = gdImageCreateFromWBMPPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMWBMPPTR */ #if HAVE_DECL_GDIMAGECREATEFROMTIFFPTR - case FMT_TIFF: + case FORMAT_TIFF: im = gdImageCreateFromTiffPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMTIFFPTR */ #if HAVE_DECL_GDIMAGECREATEFROMGD2PTR - case FMT_GD2: + case FORMAT_GD2: im = gdImageCreateFromGd2Ptr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMGD2PTR */ diff --git a/src/writer.c b/src/writer.c index 4bb8a1e6..6fdc3ec5 100644 --- a/src/writer.c +++ b/src/writer.c @@ -142,8 +142,8 @@ write_png_to_file( png_write_end(png_ptr, NULL); #else png_data = stbi_write_png_to_mem(pixels, width * 3, - width, height, /* STBI_rgb */ 3, &png_len); - + width, height, + /* STBI_rgb */ 3, &png_len); if (!png_data) { fprintf(stderr, "stbi_write_png_to_mem failed.\n"); goto end; @@ -188,20 +188,20 @@ sixel_helper_write_image_file( int nret = (-1); switch (imageformat) { - case FMT_PNG: + case FORMAT_PNG: nret = write_png_to_file(data, width, height, pixelformat, filename); break; - case FMT_GIF: - case FMT_BMP: - case FMT_JPG: - case FMT_TGA: - case FMT_WBMP: - case FMT_TIFF: - case FMT_SIXEL: - case FMT_PNM: - case FMT_GD2: - case FMT_PSD: - case FMT_HDR: + case FORMAT_GIF: + case FORMAT_BMP: + case FORMAT_JPG: + case FORMAT_TGA: + case FORMAT_WBMP: + case FORMAT_TIFF: + case FORMAT_SIXEL: + case FORMAT_PNM: + case FORMAT_GD2: + case FORMAT_PSD: + case FORMAT_HDR: default: nret = (-1); break; From 8231a918d5721daf76900a67489540f0c02efa13 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 06:40:52 +0900 Subject: [PATCH 060/451] Update CONTRIBUTERS section of man pages --- converters/img2sixel.1 | 12 ++++++++++-- converters/sixel2png.1 | 12 +++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 4ff6e13b..acd852dd 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -1,5 +1,5 @@ .\" vi:set wm=5 -.TH IMG2SIXEL 1 "May 2014" +.TH IMG2SIXEL 1 "Feb 2015" .if n .ds Q \&" .if n .ds U \&" .if t .ds Q `` @@ -247,7 +247,7 @@ and imported some code from \fIpnmquant.c (netpbm library)\fP for image quantiza .SH COPYRIGHT -Copyright (c) 2014 Hayaki Saito +Copyright (c) 2014-2015 Hayaki Saito .PP Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -375,7 +375,15 @@ MagickCore's resize.c. .SH CONTRIBUTORS .nf Araki Ken (@arakiken), +Markus Elfring (@elfring) +isaki68k (@isaki68k) +NOKUBI Takatsugu (@knok) +mattn (@mattn) Iwamoto Kouichi (@ttdoda) +Izumi Tsutsui (@tsutsui) +uobikiemukot (@uobikiemukot) +Vertis Sidus (@vrtsds) +Bruce Mitchener (@waywardmonkeys) Kazuhiro YOSHIKAWA (@yoshikaw) .fi diff --git a/converters/sixel2png.1 b/converters/sixel2png.1 index 49ec4e68..4308b768 100644 --- a/converters/sixel2png.1 +++ b/converters/sixel2png.1 @@ -1,5 +1,5 @@ .\" vi:set wm=5 -.TH SIXEL2PNG 1 "May 2014" +.TH SIXEL2PNG 1 "May 2015" .if n .ds Q \&" .if n .ds U \&" .if t .ds Q `` @@ -43,11 +43,11 @@ sixel(5) img2sixel(1) .SH AUTHORS \fIsixel2png\fP is maintained by Hayaki Saito. -We imported whole code of \fIstbiw-0.92\fP, written by Sean Barrett and its contributers, for loading PNG/JPEG images, +We imported whole code of \fIstbiw-0.92\fP, written by Sean Barrett and its contributers, for writing PNG images, .SH COPYRIGHT -Copyright (c) 2014 Hayaki Saito +Copyright (c) 2014-2015 Hayaki Saito .PP Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -77,6 +77,12 @@ a public domain PNG/BMP/TGA writer. .B http://nothings.org/stb/stb_image_write.h +.SH CONTRIBUTORS +.nf +Bruce Mitchener (@waywardmonkeys) +.fi + + .SH BUGS .PD .IP \(bu From 715f6abff64af12c3f54f74d61b3bf7009aaefa2 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 07:17:53 +0900 Subject: [PATCH 061/451] Respect -B/--bgcolor option in libpng loader when PNG color type is RGB (for issue #25) --- converters/loader.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/converters/loader.c b/converters/loader.c index 27cc7d4e..6b2a5bea 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -434,7 +434,8 @@ load_png(unsigned char *buffer, int size, break; case PNG_COLOR_TYPE_RGB_ALPHA: if (bgcolor && !png_get_bKGD(png_ptr, info_ptr, NULL)) { - png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); } else { png_set_strip_alpha(png_ptr); } @@ -442,6 +443,10 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB: + if (bgcolor && !png_get_bKGD(png_ptr, info_ptr, NULL)) { + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; From 7f27e42e4ddc1dfe998436813065d56aca1ab4e8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 07:38:58 +0900 Subject: [PATCH 062/451] Don't check bKGD chunk before setting background color --- converters/loader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 6b2a5bea..10052cc1 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -433,7 +433,7 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB_ALPHA: - if (bgcolor && !png_get_bKGD(png_ptr, info_ptr, NULL)) { + if (bgcolor) { png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); } else { @@ -443,7 +443,7 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB: - if (bgcolor && !png_get_bKGD(png_ptr, info_ptr, NULL)) { + if (bgcolor) { png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); } From 8002d5118e8d911466a429f9f2e4c4d2c9c9d681 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 17:34:57 +0900 Subject: [PATCH 063/451] libpng loader: Support 2bpp paletted PNG with tRNS chunk (for issue #25) --- converters/img2sixel.c | 1 + converters/loader.c | 104 ++++++++++++++++++++++++++++------------- include/sixel.h.in | 2 + src/dither.c | 74 +++++++++++++++++++++-------- src/tosixel.c | 12 ++++- 5 files changed, 140 insertions(+), 53 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e3010b1d..8ad62d23 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -641,6 +641,7 @@ compute_depth_from_pixelformat(int pixelformat) break; case PIXELFORMAT_G8: case PIXELFORMAT_PAL8: + case PIXELFORMAT_PAL2: depth = 1; break; default: diff --git a/converters/loader.c b/converters/loader.c index 10052cc1..cca992a7 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -302,6 +302,36 @@ read_png(png_structp png_ptr, png_bytep data, png_size_t length) } +static void +read_palette(png_structp png_ptr, png_infop info_ptr, + unsigned char *palette, int ncolors, + png_color *png_palette, unsigned char *bgcolor) +{ + png_bytep trans = NULL; + int num_trans = 0; + int i; + + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { + png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); + } + for (i = 0; i < ncolors; ++i) { + if (bgcolor && i < num_trans) { + palette[i * 3 + 0] = ((0xff - trans[i]) * bgcolor[0] + + trans[i] * png_palette[i].red) >> 8; + palette[i * 3 + 1] = ((0xff - trans[i]) * bgcolor[1] + + trans[i] * png_palette[i].green) >> 8; + palette[i * 3 + 2] = ((0xff - trans[i]) * bgcolor[2] + + trans[i] * png_palette[i].blue) >> 8; + } else { + palette[i * 3 + 0] = png_palette[i].red; + palette[i * 3 + 1] = png_palette[i].green; + palette[i * 3 + 2] = png_palette[i].blue; + } + } +} + + + static unsigned char * load_png(unsigned char *buffer, int size, int *psx, int *psy, int *pcomp, @@ -319,8 +349,6 @@ load_png(unsigned char *buffer, int size, unsigned char *result = NULL; png_color *png_palette = NULL; png_color_16 background; - png_bytep trans = NULL; - int num_trans = 0; int i; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -356,38 +384,39 @@ load_png(unsigned char *buffer, int size, case PNG_COLOR_TYPE_PALETTE: palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, &png_palette, pncolors); - if (ppalette && png_palette && bitdepth == 8 && palette_bitdepth == 8 - && *pncolors <= reqcolors) { - *ppalette = malloc(*pncolors * 3); - if (*ppalette == NULL) { - goto cleanup; - } - if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { - png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); - } - for (i = 0; i < *pncolors; ++i) { - if (bgcolor && i < num_trans) { - (*ppalette)[i * 3 + 0] = ((0xff - trans[i]) * bgcolor[0] - + trans[i] * png_palette[i].red) - >> 8; - (*ppalette)[i * 3 + 1] = ((0xff - trans[i]) * bgcolor[1] - + trans[i] * png_palette[i].green) - >> 8; - (*ppalette)[i * 3 + 2] = ((0xff - trans[i]) * bgcolor[2] - + trans[i] * png_palette[i].blue) - >> 8; - } else { - (*ppalette)[i * 3 + 0] = png_palette[i].red; - (*ppalette)[i * 3 + 1] = png_palette[i].green; - (*ppalette)[i * 3 + 2] = png_palette[i].blue; - } - } - *pcomp = 1; - *pixelformat = PIXELFORMAT_PAL8; - } else { + if (ppalette == NULL || png_palette == NULL || + palette_bitdepth != 8 || *pncolors > reqcolors) { png_set_palette_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; + } else { + switch (bitdepth) { + case 8: + *ppalette = malloc(*pncolors * 3); + if (*ppalette == NULL) { + goto cleanup; + } + read_palette(png_ptr, info_ptr, *ppalette, + *pncolors, png_palette, bgcolor); + *pcomp = 1; + *pixelformat = PIXELFORMAT_PAL8; + break; + case 2: + *ppalette = malloc(*pncolors * 3); + if (*ppalette == NULL) { + goto cleanup; + } + read_palette(png_ptr, info_ptr, *ppalette, + *pncolors, png_palette, bgcolor); + *pcomp = 1; + *pixelformat = PIXELFORMAT_PAL2; + break; + default: + png_set_palette_to_rgb(png_ptr); + *pcomp = 3; + *pixelformat = PIXELFORMAT_RGB888; + break; + } } break; case PNG_COLOR_TYPE_GRAY: @@ -456,8 +485,17 @@ load_png(unsigned char *buffer, int size, } result = malloc(*pcomp * *psx * *psy); rows = malloc(*psy * sizeof(unsigned char *)); - for (i = 0; i < *psy; ++i) { - rows[i] = result + *pcomp * *psx * i; + switch (*pixelformat) { + case PIXELFORMAT_PAL2: + for (i = 0; i < *psy; ++i) { + rows[i] = result + *pcomp * *psx * i / 4; + } + break; + default: + for (i = 0; i < *psy; ++i) { + rows[i] = result + *pcomp * *psx * i; + } + break; } #if USE_SETJMP && HAVE_SETJMP if (setjmp(png_jmpbuf(png_ptr))) { diff --git a/include/sixel.h.in b/include/sixel.h.in index f51421ad..25c73773 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -123,7 +123,9 @@ enum pixelFormat { PIXELFORMAT_GA88 = FORMATTYPE_GRAYSCALE | 0x23, /* 16bpp gray+alpha */ #if 0 PIXELFORMAT_PAL1 = FORMATTYPE_PALETTE | 0x00, /* monochrome */ +#endif PIXELFORMAT_PAL2 = FORMATTYPE_PALETTE | 0x01, /* 2bpp palette */ +#if 0 PIXELFORMAT_PAL4 = FORMATTYPE_PALETTE | 0x02, /* 4bpp palette */ #endif PIXELFORMAT_PAL8 = FORMATTYPE_PALETTE | 0x03, /* 8bpp palette */ diff --git a/src/dither.c b/src/dither.c index d33b5f5f..a3cb7220 100644 --- a/src/dither.c +++ b/src/dither.c @@ -368,17 +368,59 @@ get_rgb(unsigned char *data, int const pixelformat, int depth, } +static void +expand_rgb(unsigned char *dst, unsigned char *src, + int width, int height, int pixelformat, int depth) +{ + int x; + int y; + int dst_offset; + int src_offset; + unsigned char r, g, b; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + src_offset = depth * (y * width + x); + dst_offset = 3 * (y * width + x); + get_rgb(src + src_offset, pixelformat, depth, &r, &g, &b); + + *(dst + dst_offset + 0) = r; + *(dst + dst_offset + 1) = g; + *(dst + dst_offset + 2) = b; + } + } +} + + +static void +expand_palette(unsigned char *dst, unsigned char const *src, + int width, int height, int const pixelformat) +{ + int i; + + switch (pixelformat) { + case PIXELFORMAT_PAL2: + for (i = 0; i < width * height / 4; ++i, ++src) { + *dst++ = *src >> 6; + *dst++ = *src >> 4 & 0x3; + *dst++ = *src >> 2 & 0x3; + *dst++ = *src & 0x3; + } + break; + default: + break; + } +} + + int sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, int width, int height, int const pixelformat) { - int x, y, dst_offset, src_offset, depth; - unsigned char r, g, b; - switch (pixelformat) { case PIXELFORMAT_G8: - depth = 1; + expand_rgb(dst, src, width, height, pixelformat, 1); break; case PIXELFORMAT_RGB565: case PIXELFORMAT_RGB555: @@ -386,32 +428,26 @@ sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, case PIXELFORMAT_BGR555: case PIXELFORMAT_GA88: case PIXELFORMAT_AG88: - depth = 2; + expand_rgb(dst, src, width, height, pixelformat, 2); break; case PIXELFORMAT_RGB888: case PIXELFORMAT_BGR888: - depth = 3; + expand_rgb(dst, src, width, height, pixelformat, 3); break; case PIXELFORMAT_RGBA8888: case PIXELFORMAT_ARGB8888: - depth = 4; + expand_rgb(dst, src, width, height, pixelformat, 4); + break; + case PIXELFORMAT_PAL2: + expand_palette(dst, src, width, height, pixelformat); + break; + case PIXELFORMAT_PAL8: + memcpy(dst, src, width * height); break; default: return (-1); } - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - src_offset = depth * (y * width + x); - dst_offset = 3 * (y * width + x); - get_rgb(src + src_offset, pixelformat, depth, &r, &g, &b); - - *(dst + dst_offset + 0) = r; - *(dst + dst_offset + 1) = g; - *(dst + dst_offset + 2) = b; - } - } - return 0; } diff --git a/src/tosixel.c b/src/tosixel.c index 93e362ce..ff41565e 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -577,6 +577,15 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, int nret = (-1); switch (dither->pixelformat) { + case PIXELFORMAT_PAL2: + paletted_pixels = malloc(width * height * 3); + if (paletted_pixels == NULL) { + goto end; + } + sixel_normalize_pixelformat(paletted_pixels, pixels, width, height, + dither->pixelformat); + input_pixels = paletted_pixels; + break; case PIXELFORMAT_PAL8: case PIXELFORMAT_G8: case PIXELFORMAT_GA88: @@ -585,7 +594,8 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, break; default: /* apply palette */ - paletted_pixels = sixel_dither_apply_palette(dither, pixels, width, height); + paletted_pixels = sixel_dither_apply_palette(dither, pixels, + width, height); if (paletted_pixels == NULL) { goto end; } From 156513665323daf14e089990367ea153f667f9ad Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 18:23:47 +0900 Subject: [PATCH 064/451] libpng loader: Support 1bpp paletted PNG with tRNS chunk (for issue #25) --- converters/img2sixel.c | 3 ++- converters/loader.c | 17 ++++++++++++++--- include/sixel.h.in | 4 +--- src/dither.c | 18 ++++++++++++++++++ src/tosixel.c | 1 + 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 8ad62d23..0c3f3a24 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -640,8 +640,9 @@ compute_depth_from_pixelformat(int pixelformat) depth = 2; break; case PIXELFORMAT_G8: - case PIXELFORMAT_PAL8: + case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL8: depth = 1; break; default: diff --git a/converters/loader.c b/converters/loader.c index cca992a7..3a57fc98 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -391,7 +391,7 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; } else { switch (bitdepth) { - case 8: + case 1: *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { goto cleanup; @@ -399,7 +399,7 @@ load_png(unsigned char *buffer, int size, read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, bgcolor); *pcomp = 1; - *pixelformat = PIXELFORMAT_PAL8; + *pixelformat = PIXELFORMAT_PAL1; break; case 2: *ppalette = malloc(*pncolors * 3); @@ -411,6 +411,16 @@ load_png(unsigned char *buffer, int size, *pcomp = 1; *pixelformat = PIXELFORMAT_PAL2; break; + case 8: + *ppalette = malloc(*pncolors * 3); + if (*ppalette == NULL) { + goto cleanup; + } + read_palette(png_ptr, info_ptr, *ppalette, + *pncolors, png_palette, bgcolor); + *pcomp = 1; + *pixelformat = PIXELFORMAT_PAL8; + break; default: png_set_palette_to_rgb(png_ptr); *pcomp = 3; @@ -486,9 +496,10 @@ load_png(unsigned char *buffer, int size, result = malloc(*pcomp * *psx * *psy); rows = malloc(*psy * sizeof(unsigned char *)); switch (*pixelformat) { + case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: for (i = 0; i < *psy; ++i) { - rows[i] = result + *pcomp * *psx * i / 4; + rows[i] = result + *pcomp * *psx * i * bitdepth / 8; } break; default: diff --git a/include/sixel.h.in b/include/sixel.h.in index 25c73773..fbfcc750 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -121,9 +121,7 @@ enum pixelFormat { PIXELFORMAT_GA44 = FORMATTYPE_GRAYSCALE | 0x22, /* 8bpp gray+alpha */ #endif PIXELFORMAT_GA88 = FORMATTYPE_GRAYSCALE | 0x23, /* 16bpp gray+alpha */ -#if 0 - PIXELFORMAT_PAL1 = FORMATTYPE_PALETTE | 0x00, /* monochrome */ -#endif + PIXELFORMAT_PAL1 = FORMATTYPE_PALETTE | 0x00, /* 1bpp palette */ PIXELFORMAT_PAL2 = FORMATTYPE_PALETTE | 0x01, /* 2bpp palette */ #if 0 PIXELFORMAT_PAL4 = FORMATTYPE_PALETTE | 0x02, /* 4bpp palette */ diff --git a/src/dither.c b/src/dither.c index a3cb7220..a793557b 100644 --- a/src/dither.c +++ b/src/dither.c @@ -399,6 +399,18 @@ expand_palette(unsigned char *dst, unsigned char const *src, int i; switch (pixelformat) { + case PIXELFORMAT_PAL1: + for (i = 0; i < width * height / 8; ++i, ++src) { + *dst++ = *src >> 7; + *dst++ = *src >> 6 & 0x1; + *dst++ = *src >> 5 & 0x1; + *dst++ = *src >> 4 & 0x1; + *dst++ = *src >> 3 & 0x1; + *dst++ = *src >> 2 & 0x1; + *dst++ = *src >> 1 & 0x1; + *dst++ = *src & 0x1; + } + break; case PIXELFORMAT_PAL2: for (i = 0; i < width * height / 4; ++i, ++src) { *dst++ = *src >> 6; @@ -407,6 +419,11 @@ expand_palette(unsigned char *dst, unsigned char const *src, *dst++ = *src & 0x3; } break; + case PIXELFORMAT_PAL8: + for (i = 0; i < width * height; ++i, ++src) { + *dst++ = *src; + } + break; default: break; } @@ -438,6 +455,7 @@ sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, case PIXELFORMAT_ARGB8888: expand_rgb(dst, src, width, height, pixelformat, 4); break; + case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: expand_palette(dst, src, width, height, pixelformat); break; diff --git a/src/tosixel.c b/src/tosixel.c index ff41565e..cd0bcdc7 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -577,6 +577,7 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, int nret = (-1); switch (dither->pixelformat) { + case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: paletted_pixels = malloc(width * height * 3); if (paletted_pixels == NULL) { From fe0749ba65cfe23bf3ee60a726dae1665904250a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 18:30:49 +0900 Subject: [PATCH 065/451] libpng loader: Support 4bpp paletted PNG with tRNS chunk (for issue #25) --- converters/img2sixel.c | 1 + converters/loader.c | 11 +++++++++++ include/sixel.h.in | 2 -- src/dither.c | 7 +++++++ src/tosixel.c | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 0c3f3a24..000ac7f6 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -642,6 +642,7 @@ compute_depth_from_pixelformat(int pixelformat) case PIXELFORMAT_G8: case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: case PIXELFORMAT_PAL8: depth = 1; break; diff --git a/converters/loader.c b/converters/loader.c index 3a57fc98..2d1d3fbd 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -411,6 +411,16 @@ load_png(unsigned char *buffer, int size, *pcomp = 1; *pixelformat = PIXELFORMAT_PAL2; break; + case 4: + *ppalette = malloc(*pncolors * 3); + if (*ppalette == NULL) { + goto cleanup; + } + read_palette(png_ptr, info_ptr, *ppalette, + *pncolors, png_palette, bgcolor); + *pcomp = 1; + *pixelformat = PIXELFORMAT_PAL4; + break; case 8: *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { @@ -498,6 +508,7 @@ load_png(unsigned char *buffer, int size, switch (*pixelformat) { case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: for (i = 0; i < *psy; ++i) { rows[i] = result + *pcomp * *psx * i * bitdepth / 8; } diff --git a/include/sixel.h.in b/include/sixel.h.in index fbfcc750..8bbf959f 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -123,9 +123,7 @@ enum pixelFormat { PIXELFORMAT_GA88 = FORMATTYPE_GRAYSCALE | 0x23, /* 16bpp gray+alpha */ PIXELFORMAT_PAL1 = FORMATTYPE_PALETTE | 0x00, /* 1bpp palette */ PIXELFORMAT_PAL2 = FORMATTYPE_PALETTE | 0x01, /* 2bpp palette */ -#if 0 PIXELFORMAT_PAL4 = FORMATTYPE_PALETTE | 0x02, /* 4bpp palette */ -#endif PIXELFORMAT_PAL8 = FORMATTYPE_PALETTE | 0x03, /* 8bpp palette */ }; diff --git a/src/dither.c b/src/dither.c index a793557b..c475b25d 100644 --- a/src/dither.c +++ b/src/dither.c @@ -419,6 +419,12 @@ expand_palette(unsigned char *dst, unsigned char const *src, *dst++ = *src & 0x3; } break; + case PIXELFORMAT_PAL4: + for (i = 0; i < width * height / 2; ++i, ++src) { + *dst++ = *src >> 4; + *dst++ = *src & 0xf; + } + break; case PIXELFORMAT_PAL8: for (i = 0; i < width * height; ++i, ++src) { *dst++ = *src; @@ -457,6 +463,7 @@ sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, break; case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: expand_palette(dst, src, width, height, pixelformat); break; case PIXELFORMAT_PAL8: diff --git a/src/tosixel.c b/src/tosixel.c index cd0bcdc7..42991cc0 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -579,6 +579,7 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, switch (dither->pixelformat) { case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: paletted_pixels = malloc(width * height * 3); if (paletted_pixels == NULL) { goto end; From d178e6783cbfd875299b451e8178e09ab5684f7e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 18:43:24 +0900 Subject: [PATCH 066/451] Pass PLTE chunk of 1/2/4 bpp paletted PNG specified by -m option directly to dither object --- converters/img2sixel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 000ac7f6..a680a718 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -294,6 +294,9 @@ prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgc free(delays); switch (pixelformat) { + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: case PIXELFORMAT_PAL8: if (palette == NULL) { goto end; From 52e127bacfa20f7aee29a7f6fe3c5e31fa01af57 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 21:24:14 +0900 Subject: [PATCH 067/451] libpng loader: background color support for glayscale-alpha PNG (for issue #25) --- converters/loader.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/converters/loader.c b/converters/loader.c index 2d1d3fbd..69c8e038 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -477,6 +477,12 @@ load_png(unsigned char *buffer, int size, } break; case PNG_COLOR_TYPE_GRAY_ALPHA: + if (bgcolor) { + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } else { + png_set_strip_alpha(png_ptr); + } png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; From ac4d2f3e60c0e98ec4c5ea8b93556d394b67a916 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 22:43:23 +0900 Subject: [PATCH 068/451] Blend background color to RGBA image pixels with respecting alpha channel --- src/loader.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/loader.c b/src/loader.c index 59b6af4d..f7b484bf 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1065,20 +1065,30 @@ load_with_gd(chunk_t const *pchunk, int *psx, int *psy, int *pcomp, int *pstride static int -arrange_pixelformat(unsigned char *pixels, int width, int height) +arrange_pixelformat(unsigned char *pixels, int width, int height, + unsigned char *bgcolor) { int x; int y; unsigned char *src; unsigned char *dst; + unsigned char alpha; src = dst = pixels; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { - *(dst++) = *(src++); /* R */ - *(dst++) = *(src++); /* G */ - *(dst++) = *(src++); /* B */ - src++; /* A */ + if (bgcolor) { + alpha = src[3]; + *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; + src++; + } else { + *dst++ = *src++; /* R */ + *dst++ = *src++; /* R */ + *dst++ = *src++; /* R */ + src++; /* A */ + } } } @@ -1146,7 +1156,7 @@ sixel_helper_load_image_file( if (*ppixels && stride > 0 && comp == 4) { if (!ppalette || (ppalette && !*ppalette)) { /* RGBA to RGB */ - ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count); + ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count, bgcolor); if (ret != 0) { goto end; } From 77e50aad39687f2d8a40a1dcab0d24656a29f4f7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 15 Feb 2015 23:15:49 +0900 Subject: [PATCH 069/451] Respect -B option regarding with GIF images with transparent index (for Issue #25) --- converters/loader.c | 2 +- converters/stb_image.h | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 69c8e038..6734d518 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -784,7 +784,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, memset(&g, 0, sizeof(g)); for (;;) { - p = stbi__gif_load_next(&s, &g, pcomp, 4); + p = stbi__gif_load_next(&s, &g, pcomp, 4, bgcolor); if (p == (void *) 1) { /* end of animated gif marker */ break; diff --git a/converters/stb_image.h b/converters/stb_image.h index 1c3182d8..c576de02 100644 --- a/converters/stb_image.h +++ b/converters/stb_image.h @@ -4056,7 +4056,7 @@ static void stbi__fill_gif_background(stbi__gif *g) } // this function is designed to support animated gifs, although stb_image doesn't support it -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *bgcolor) { int i; stbi_uc *old_out = 0; @@ -4114,8 +4114,16 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i } else if (g->flags & 0x80) { for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent g->pal[i][3] = 255; - if (g->transparent >= 0 && (g->eflags & 0x01)) - g->pal[g->transparent][3] = 0; + if (g->transparent >= 0 && (g->eflags & 0x01)) { + if (bgcolor) { + g->pal[g->transparent][0] = bgcolor[2]; + g->pal[g->transparent][1] = bgcolor[1]; + g->pal[g->transparent][2] = bgcolor[0]; + g->pal[g->transparent][3] = 0xff; + } else { + g->pal[g->transparent][3] = 0; + } + } g->color_table = (stbi_uc *) g->pal; } else return stbi__errpuc("missing color table", "Corrupt GIF"); @@ -4196,7 +4204,7 @@ static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int stbi__gif g; memset(&g, 0, sizeof(g)); - u = stbi__gif_load_next(s, &g, comp, req_comp); + u = stbi__gif_load_next(s, &g, comp, req_comp, NULL); if (u == (void *) 1) u = 0; // end of animated gif marker if (u) { *x = g.w; From 1488be873de164a534724f9a642c3280f5bf6829 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 16 Feb 2015 20:13:14 +0900 Subject: [PATCH 070/451] Always set background color and respect bKGD chunk again (for Issue #31) --- converters/loader.c | 46 ++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 6734d518..0d84c6a6 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -342,13 +342,14 @@ load_png(unsigned char *buffer, int size, { chunk_t read_chunk; png_uint_32 bitdepth; - png_uint_32 palette_bitdepth; + png_uint_32 png_status; png_structp png_ptr; png_infop info_ptr; unsigned char **rows = NULL; unsigned char *result = NULL; png_color *png_palette = NULL; png_color_16 background; + png_color_16p default_background; int i; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -378,14 +379,27 @@ load_png(unsigned char *buffer, int size, background.red = bgcolor[0]; background.green = bgcolor[1]; background.blue = bgcolor[2]; + background.gray = (bgcolor[0] + bgcolor[1] + bgcolor[2]) / 3; + } else if (png_get_bKGD(png_ptr, info_ptr, &default_background) == PNG_INFO_bKGD) { + memcpy(&background, default_background, sizeof(background)); + } else { + background.red = 0; + background.green = 0; + background.blue = 0; + background.gray = 0; } switch (png_get_color_type(png_ptr, info_ptr)) { case PNG_COLOR_TYPE_PALETTE: - palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, - &png_palette, pncolors); - if (ppalette == NULL || png_palette == NULL || - palette_bitdepth != 8 || *pncolors > reqcolors) { + png_status = png_get_PLTE(png_ptr, info_ptr, + &png_palette, pncolors); + if (png_status != PNG_INFO_PLTE || png_palette == NULL) { + fprintf(stderr, "invalid PNG header is detected.\n"); + goto cleanup; + } + if (ppalette == NULL || *pncolors > reqcolors) { + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; @@ -477,31 +491,21 @@ load_png(unsigned char *buffer, int size, } break; case PNG_COLOR_TYPE_GRAY_ALPHA: - if (bgcolor) { - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } else { - png_set_strip_alpha(png_ptr); - } + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB_ALPHA: - if (bgcolor) { - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } else { - png_set_strip_alpha(png_ptr); - } + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB: - if (bgcolor) { - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; From 757c630886e6d4e2c19dee163d5350b9b0f912e1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 16 Feb 2015 23:52:34 +0900 Subject: [PATCH 071/451] Fix sixel2png available (for issue #30) --- converters/sixel2png.c | 2 +- include/sixel-imageio.h.in | 1 + src/writer.c | 55 ++++++++++++++++++++++++++++++++++---- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/converters/sixel2png.c b/converters/sixel2png.c index de694785..20698d01 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -134,7 +134,7 @@ sixel_to_png(char const *input, char const *output) goto end; } - ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, + ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, PIXELFORMAT_PAL8, output, FORMAT_PNG); end: diff --git a/include/sixel-imageio.h.in b/include/sixel-imageio.h.in index d16802bd..4d9848dd 100644 --- a/include/sixel-imageio.h.in +++ b/include/sixel-imageio.h.in @@ -66,6 +66,7 @@ sixel_helper_write_image_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ int /* in */ pixelformat, /* source pixelFormat */ char const /* in */ *filename, /* destination filename */ int /* in */ imageformat); /* one of enum imageformat */ diff --git a/src/writer.c b/src/writer.c index 6fdc3ec5..811c509c 100644 --- a/src/writer.c +++ b/src/writer.c @@ -62,6 +62,7 @@ write_png_to_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ int /* in */ pixelformat, /* source pixelFormat */ char const /* in */ *filename) /* destination filename */ { @@ -79,17 +80,59 @@ write_png_to_file( int png_len; int write_len; #endif /* HAVE_LIBPNG */ + int i; + unsigned char *src; + unsigned char *dst; - if (pixelformat != PIXELFORMAT_RGB888) { + switch (pixelformat) { + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + new_pixels = malloc(width * height * 4); + src = new_pixels + width * height * 3; + dst = pixels = new_pixels; + ret = sixel_helper_normalize_pixelformat(src, data, + width, height, + pixelformat); + if (ret != 0) { + goto end; + } + for (i = 0; i < width * height; ++i, ++src) { + *dst++ = *(palette + *src * 3 + 0); + *dst++ = *(palette + *src * 3 + 1); + *dst++ = *(palette + *src * 3 + 2); + } + break; + case PIXELFORMAT_PAL8: + src = data; + dst = pixels = new_pixels = malloc(width * height * 3); + for (i = 0; i < width * height; ++i, ++src) { + *dst++ = *(palette + *src * 3 + 0); + *dst++ = *(palette + *src * 3 + 1); + *dst++ = *(palette + *src * 3 + 2); + } + break; + case PIXELFORMAT_RGB888: + pixels = data; + break; + case PIXELFORMAT_G8: + case PIXELFORMAT_RGB565: + case PIXELFORMAT_RGB555: + case PIXELFORMAT_BGR565: + case PIXELFORMAT_BGR555: + case PIXELFORMAT_GA88: + case PIXELFORMAT_AG88: + case PIXELFORMAT_BGR888: + case PIXELFORMAT_RGBA8888: + case PIXELFORMAT_ARGB8888: pixels = new_pixels = malloc(width * height * 3); ret = sixel_helper_normalize_pixelformat(pixels, data, width, height, - PIXELFORMAT_PAL8); + pixelformat); if (ret != 0) { goto end; } - } else { - pixels = data; + break; } if (strcmp(filename, "-") == 0) { @@ -181,6 +224,7 @@ sixel_helper_write_image_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ int /* in */ pixelformat, /* source pixelFormat */ char const /* in */ *filename, /* destination filename */ int /* in */ imageformat) /* destination imageformat */ @@ -189,7 +233,8 @@ sixel_helper_write_image_file( switch (imageformat) { case FORMAT_PNG: - nret = write_png_to_file(data, width, height, pixelformat, filename); + nret = write_png_to_file(data, width, height, palette, + pixelformat, filename); break; case FORMAT_GIF: case FORMAT_BMP: From c7a4495d42ce2ba23a13a4d31b9fe0983e20bd48 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 19 Feb 2015 00:19:43 +0900 Subject: [PATCH 072/451] Add descriptions about source image formats to manpage of img2sixel(for Issue #24) --- converters/img2sixel.1 | 122 ++++++++++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 44 deletions(-) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index c8872e53..26be149f 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -19,8 +19,7 @@ img2sixel \- image converter to DEC SIXEL graphics .SH DESCRIPTION -.I img2sixel -convert JPEG/PNG images into DEC SIXEL image format. +\fIimg2sixel\fP converts various images into high quality DEC SIXEL image format. .SH "COMMAND-LINE OPTIONS" @@ -258,13 +257,87 @@ show version and license info. .B \-H, \-\-help print help. + +.SH Image loaders + +\fIimg2sixel\fP includes two or more image decoder components. + +.TP 5 +.B stb_image + +\fIlibsixel\fP includes \fIstb_image\fP, a public domain image loader. +.br +\fIimg2sixel\fP uses it as default built-in image decoder. +It can decode almost all images. but a few images can not be decoded by its limitations. + +.B Supported source formats: + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8-bit-per-channel + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels) + GIF/Animated GIF + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + +.B Limitations: + no 16-bit-per-channel PNG + no 12-bit-per-channel JPEG + no JPEGs with arithmetic coding / JPEG 2000 + no 1-bit BMP + +.TP 5 +.B libpng + + If \fIlibpng\fP library is linked at compile time, \fIimg2sixel\fP uses it for decoding PNG image. + +.TP 5 +.B libjpeg + + If \fIlibjpeg\fP library is linked at compile time, \fIimg2sixel\fP uses it for decoding JPEG image. + +.TP 5 +.B gdk-pixbuf2 + + If \fIgdk-pixbuf2\fP library is linked at compile time, \fIimg2sixel\fP uses it automatically in some cases. + +.TP 5 +.B GD + + If \fIGD\fP library is linked at compile time, \fIimg2sixel\fP uses it automatically in some cases. + +.TP 5 +.B libsixel + + \fIimg2sixel\fP can load SIXEL as source image format, because it uses \fIlibsixel\fP as a SIXEL image decoder. + + +.SH HISTORY + +Former SIXEL encoders(such as \fIppmtosixel\fP) are mainly designed for dot-matrix printers. +They minimize the amount of printer-head movement distance. +But nowadays this method did not represent the best performance for displaying sixel data on terminal emulators. +Encoded SIXEL data for VT-2xx/VT-3xx terminals were found in 80's Usenet, +But the technology of how to create them seems to be lost. + +\fBkmiya's sixel\fP(kmiya,2014) introduces an efficient encoding method which is re-designed for terminal emulators to +optimize the overhead of transporting SIXEL with keeping compatibility with former SIXEL terminal. +Now \fIlibsixel\fP and \fIImageMagick\fP's sixel coder follow it. + +\fBAraki Ken\fP, known as the maintainer of mlterm, proposed the method for more compressed SIXEL encoding. +Now \fIlibsixel\fP adopted that method. +\fBAraki Ken\fP describes about the way to generate high quality SIXEL. + +See http://mlterm.sourceforge.net/libsixel.pdf(in Japanese). + + .SH "SEE ALSO" sixel(5) sixel2png(1) .SH AUTHORS \fIimg2sixel\fP is maintained by Hayaki Saito. -We imported whole code of \fIstbi-1.41\fP, written by Sean Barrett and its contributers, for loading PNG/JPEG images, +We imported whole code of \fIstb_image v2.02\fP, written by Sean Barrett and its contributers, for loading various images, and imported some code from \fIpnmquant.c (netpbm library)\fP for image quantization. @@ -292,8 +365,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This software derives from the following implementations. .br .TP 5 -.B stbi-1.41 -This software includes \fIstbi-1.41\fP (stb_image.h), +.B stb_image-v2.02 +This software includes \fIstb_image-v2.02\fP (stb_image.h), a public domain JPEG/PNG reader. .br .B https://github.com/nothings/stb @@ -323,45 +396,6 @@ documentation. This software is provided "as is" without express or implied warranty. \fP -.TP 5 -.B monosixel (arakiken's tw) - -The pattern dither algorithm implemented in quant.c is imported from -\fImonosixel/main.c\fP in \fIarakiken's tw "sixel" branch\fP. -.br -https://bitbucket.org/arakiken/tw/branch/sixel -.br -This tool is written by Araki Ken, and we regard it as a derivative of. -original tw, created by Sho Hashimoto. -.br -\fB -.br -Copyright (c) 2012 Sho Hashimoto -.br -.br -Copyright (c) 2014 Araki Ken -.br -.br -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: -.br -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. -.br -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -\fP - .TP 5 .B sixel 2014-3-2 From afad173c33b81777ff69da401b12f88202fb518d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 19 Feb 2015 22:23:52 +0900 Subject: [PATCH 073/451] Add logging --- converters/loader.c | 35 ++++++++++++++++++++++++++++------- src/dither.c | 23 ++++++++++++++--------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 6734d518..7c011148 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -342,7 +342,7 @@ load_png(unsigned char *buffer, int size, { chunk_t read_chunk; png_uint_32 bitdepth; - png_uint_32 palette_bitdepth; + png_uint_32 png_status; png_structp png_ptr; png_infop info_ptr; unsigned char **rows = NULL; @@ -382,11 +382,28 @@ load_png(unsigned char *buffer, int size, switch (png_get_color_type(png_ptr, info_ptr)) { case PNG_COLOR_TYPE_PALETTE: - palette_bitdepth = png_get_PLTE(png_ptr, info_ptr, - &png_palette, pncolors); - if (ppalette == NULL || png_palette == NULL || - palette_bitdepth != 8 || *pncolors > reqcolors) { +# if HAVE_DEBUG + fprintf(stderr, "paletted PNG(PNG_COLOR_TYPE_PALETTE)\n"); +# endif + png_status = png_get_PLTE(png_ptr, info_ptr, + &png_palette, pncolors); + if (png_status != PNG_INFO_PLTE || png_palette == NULL) { + fprintf(stderr, "PLTE chunk not found\n"); + goto cleanup; + } +# if HAVE_DEBUG + fprintf(stderr, "palette colors: %d\n", *pncolors); + fprintf(stderr, "bitdepth: %d\n", bitdepth); +# endif + if (ppalette == NULL || *pncolors > reqcolors) { +# if HAVE_DEBUG + fprintf(stderr, "detected more colors than reqired(>%d).\n", + reqcolors); +# endif + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); + png_set_strip_alpha(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; } else { @@ -440,6 +457,10 @@ load_png(unsigned char *buffer, int size, } break; case PNG_COLOR_TYPE_GRAY: +# if HAVE_DEBUG + fprintf(stderr, "grayscale PNG(PNG_COLOR_TYPE_GRAY)\n"); + fprintf(stderr, "bitdepth: %d\n", bitdepth); +# endif switch (bitdepth) { case 1: case 2: @@ -460,7 +481,7 @@ load_png(unsigned char *buffer, int size, break; case 8: - if (ppalette && *pncolors <= 1 << 8) { + if (ppalette) { *pcomp = 1; *pixelformat = PIXELFORMAT_G8; } else { @@ -516,7 +537,7 @@ load_png(unsigned char *buffer, int size, case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: for (i = 0; i < *psy; ++i) { - rows[i] = result + *pcomp * *psx * i * bitdepth / 8; + rows[i] = result + (*pcomp * *psx * bitdepth + 7) / 8 * i; } break; default: diff --git a/src/dither.c b/src/dither.c index c475b25d..71504c26 100644 --- a/src/dither.c +++ b/src/dither.c @@ -397,18 +397,23 @@ expand_palette(unsigned char *dst, unsigned char const *src, int width, int height, int const pixelformat) { int i; + int x; + int y; switch (pixelformat) { case PIXELFORMAT_PAL1: - for (i = 0; i < width * height / 8; ++i, ++src) { - *dst++ = *src >> 7; - *dst++ = *src >> 6 & 0x1; - *dst++ = *src >> 5 & 0x1; - *dst++ = *src >> 4 & 0x1; - *dst++ = *src >> 3 & 0x1; - *dst++ = *src >> 2 & 0x1; - *dst++ = *src >> 1 & 0x1; - *dst++ = *src & 0x1; + for (y = 0; y < height; ++y) { + for (x = 0; x < width / 8; ++x) { + for (i = 0; i < 8; ++i) { + *dst++ = *src >> (7 - i) & 0x1; + } + src++; + } + x = width - x * 8; + while (x) { + *dst++ = *src >> x-- & 0x1; + } + src++; } break; case PIXELFORMAT_PAL2: From 1b5e956f5b1a1c88fb5cd0e0f4a0c6b52df38ddf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 19 Feb 2015 22:52:01 +0900 Subject: [PATCH 074/451] Suppress printf() formatter warings --- converters/loader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/converters/loader.c b/converters/loader.c index 7c011148..f6bc9c90 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -393,7 +393,7 @@ load_png(unsigned char *buffer, int size, } # if HAVE_DEBUG fprintf(stderr, "palette colors: %d\n", *pncolors); - fprintf(stderr, "bitdepth: %d\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", bitdepth); # endif if (ppalette == NULL || *pncolors > reqcolors) { # if HAVE_DEBUG @@ -459,7 +459,7 @@ load_png(unsigned char *buffer, int size, case PNG_COLOR_TYPE_GRAY: # if HAVE_DEBUG fprintf(stderr, "grayscale PNG(PNG_COLOR_TYPE_GRAY)\n"); - fprintf(stderr, "bitdepth: %d\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", bitdepth); # endif switch (bitdepth) { case 1: From 9a4cae6266aa407164eb97b4801b47d375d210f5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 02:30:37 +0900 Subject: [PATCH 075/451] Reset bitdepth after calling png_set_strip_16() --- converters/loader.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/converters/loader.c b/converters/loader.c index f6bc9c90..b346c38e 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -371,7 +371,12 @@ load_png(unsigned char *buffer, int size, *psy = png_get_image_height(png_ptr, info_ptr); bitdepth = png_get_bit_depth(png_ptr, info_ptr); if (bitdepth == 16) { +# if HAVE_DEBUG + fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "stripping to 8bit...\n"); +# endif png_set_strip_16(png_ptr); + bitdepth = 8; } if (bgcolor) { From cdb06665abe3335146d9d5a7e8cce3b114f11e3c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 02:51:01 +0900 Subject: [PATCH 076/451] Expand 1/2/4 bpp palette with considering surplus bits --- src/dither.c | 53 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/src/dither.c b/src/dither.c index 71504c26..2535bb41 100644 --- a/src/dither.c +++ b/src/dither.c @@ -402,6 +402,9 @@ expand_palette(unsigned char *dst, unsigned char const *src, switch (pixelformat) { case PIXELFORMAT_PAL1: +#if HAVE_DEBUG + printf("Expanding PAL1 to PAL8...\n"); +#endif for (y = 0; y < height; ++y) { for (x = 0; x < width / 8; ++x) { for (i = 0; i < 8; ++i) { @@ -410,24 +413,52 @@ expand_palette(unsigned char *dst, unsigned char const *src, src++; } x = width - x * 8; - while (x) { - *dst++ = *src >> x-- & 0x1; + if (x) { + while (x) { + *dst++ = *src >> x-- & 0x1; + } + src++; } - src++; } break; case PIXELFORMAT_PAL2: - for (i = 0; i < width * height / 4; ++i, ++src) { - *dst++ = *src >> 6; - *dst++ = *src >> 4 & 0x3; - *dst++ = *src >> 2 & 0x3; - *dst++ = *src & 0x3; +#if HAVE_DEBUG + printf("Expanding PAL2 to PAL8...\n"); +#endif + for (y = 0; y < height; ++y) { + for (x = 0; x < width / 4; ++x) { + for (i = 0; i < 4; ++i) { + *dst++ = *src >> (3 - i) * 2 & 0x3; + } + src++; + } + x = width - x * 4; + if (x) { + while (x) { + *dst++ = *src >> x-- * 2 & 0x3; + } + src++; + } } break; case PIXELFORMAT_PAL4: - for (i = 0; i < width * height / 2; ++i, ++src) { - *dst++ = *src >> 4; - *dst++ = *src & 0xf; +#if HAVE_DEBUG + printf("Expanding PAL4 to PAL8...\n"); +#endif + for (y = 0; y < height; ++y) { + for (x = 0; x < width / 2; ++x) { + for (i = 0; i < 2; ++i) { + *dst++ = *src >> (1 - i) * 4 & 0xf; + } + src++; + } + x = width - x * 2; + if (x) { + while (x) { + *dst++ = *src >> x-- * 4 & 0xf; + } + src++; + } } break; case PIXELFORMAT_PAL8: From de660ab35c8f04b780997d3302914e25bc38bfae Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 02:58:48 +0900 Subject: [PATCH 077/451] Add more logs --- converters/loader.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/converters/loader.c b/converters/loader.c index b346c38e..1de27eb8 100644 --- a/converters/loader.c +++ b/converters/loader.c @@ -503,6 +503,10 @@ load_png(unsigned char *buffer, int size, } break; case PNG_COLOR_TYPE_GRAY_ALPHA: +# if HAVE_DEBUG + fprintf(stderr, "grayscale-alpha PNG(PNG_COLOR_TYPE_GRAY_ALPHA)\n"); + fprintf(stderr, "bitdepth: %u\n", bitdepth); +# endif if (bgcolor) { png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); @@ -514,6 +518,10 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB_ALPHA: +# if HAVE_DEBUG + fprintf(stderr, "RGBA PNG(PNG_COLOR_TYPE_RGB_ALPHA)\n"); + fprintf(stderr, "bitdepth: %u\n", bitdepth); +# endif if (bgcolor) { png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); @@ -524,6 +532,10 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB: +# if HAVE_DEBUG + fprintf(stderr, "RGB PNG(PNG_COLOR_TYPE_RGB)\n"); + fprintf(stderr, "bitdepth: %u\n", bitdepth); +# endif if (bgcolor) { png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); From 9941c905baa60a480c76ee3f44e4b696e854ba88 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 03:27:53 +0900 Subject: [PATCH 078/451] Expand grayscale PNG to RGB format if needed --- src/loader.c | 67 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/src/loader.c b/src/loader.c index 0a1f824b..720c1063 100644 --- a/src/loader.c +++ b/src/loader.c @@ -413,6 +413,7 @@ load_png(unsigned char *buffer, int size, # if HAVE_DEBUG fprintf(stderr, "detected more colors than reqired(>%d).\n", reqcolors); + fprintf(stderr, "expand to RGB format...\n"); # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); @@ -463,6 +464,8 @@ load_png(unsigned char *buffer, int size, *pixelformat = PIXELFORMAT_PAL8; break; default: + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; @@ -475,40 +478,54 @@ load_png(unsigned char *buffer, int size, fprintf(stderr, "grayscale PNG(PNG_COLOR_TYPE_GRAY)\n"); fprintf(stderr, "bitdepth: %u\n", bitdepth); # endif - switch (bitdepth) { - case 1: - case 2: - case 4: -# if HAVE_DECL_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 - png_set_expand_gray_1_2_4_to_8(png_ptr); - *pcomp = 1; - *pixelformat = PIXELFORMAT_G8; -# elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 - png_set_gray_1_2_4_to_8(png_ptr); - *pcomp = 1; - *pixelformat = PIXELFORMAT_G8; -# else + if (1 << bitdepth > reqcolors) { +# if HAVE_DEBUG + fprintf(stderr, "detected more colors than reqired(>%d).\n", + reqcolors); + fprintf(stderr, "expand to RGB format...\n"); +# endif + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; -# endif - break; - - case 8: - if (ppalette) { + } else { + switch (bitdepth) { + case 1: + case 2: + case 4: +# if HAVE_DECL_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 + png_set_expand_gray_1_2_4_to_8(png_ptr); *pcomp = 1; *pixelformat = PIXELFORMAT_G8; - } else { +# elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 + png_set_gray_1_2_4_to_8(png_ptr); + *pcomp = 1; + *pixelformat = PIXELFORMAT_G8; +# else png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; +# endif + break; + case 8: + if (ppalette) { + *pcomp = 1; + *pixelformat = PIXELFORMAT_G8; + } else { + png_set_gray_to_rgb(png_ptr); + *pcomp = 3; + *pixelformat = PIXELFORMAT_RGB888; + } + break; + default: + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + png_set_gray_to_rgb(png_ptr); + *pcomp = 3; + *pixelformat = PIXELFORMAT_RGB888; + break; } - break; - default: - png_set_gray_to_rgb(png_ptr); - *pcomp = 3; - *pixelformat = PIXELFORMAT_RGB888; - break; } break; case PNG_COLOR_TYPE_GRAY_ALPHA: From f805c562ab03078d9dc8f5aaf4dca463313c3825 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 10:26:16 +0900 Subject: [PATCH 079/451] Logging to stderr instead of stdout --- src/dither.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dither.c b/src/dither.c index e55510a1..3d01d779 100644 --- a/src/dither.c +++ b/src/dither.c @@ -403,7 +403,7 @@ expand_palette(unsigned char *dst, unsigned char const *src, switch (pixelformat) { case PIXELFORMAT_PAL1: #if HAVE_DEBUG - printf("Expanding PAL1 to PAL8...\n"); + fprintf(stderr, "expanding PAL1 to PAL8...\n"); #endif for (y = 0; y < height; ++y) { for (x = 0; x < width / 8; ++x) { @@ -423,7 +423,7 @@ expand_palette(unsigned char *dst, unsigned char const *src, break; case PIXELFORMAT_PAL2: #if HAVE_DEBUG - printf("Expanding PAL2 to PAL8...\n"); + fprintf(stderr, "expanding PAL2 to PAL8...\n"); #endif for (y = 0; y < height; ++y) { for (x = 0; x < width / 4; ++x) { @@ -443,7 +443,7 @@ expand_palette(unsigned char *dst, unsigned char const *src, break; case PIXELFORMAT_PAL4: #if HAVE_DEBUG - printf("Expanding PAL4 to PAL8...\n"); + fprintf(stderr, "expanding PAL4 to PAL8...\n"); #endif for (y = 0; y < height; ++y) { for (x = 0; x < width / 2; ++x) { From 209c55b5abcd807b43c1fffb9dd32b63e4c46276 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 23:16:00 +0900 Subject: [PATCH 080/451] Fixes for passing PngSuite odd sizes test (for Issue #25) http://www.schaik.com/pngsuite/pngsuite_siz_png.html --- src/dither.c | 91 ++++++++++++++++++---------------------------------- 1 file changed, 32 insertions(+), 59 deletions(-) diff --git a/src/dither.c b/src/dither.c index 3d01d779..449493da 100644 --- a/src/dither.c +++ b/src/dither.c @@ -368,7 +368,7 @@ get_rgb(unsigned char *data, int const pixelformat, int depth, } -static void +static int expand_rgb(unsigned char *dst, unsigned char *src, int width, int height, int pixelformat, int depth) { @@ -389,86 +389,59 @@ expand_rgb(unsigned char *dst, unsigned char *src, *(dst + dst_offset + 2) = b; } } + + return 0; } -static void +static int expand_palette(unsigned char *dst, unsigned char const *src, int width, int height, int const pixelformat) { - int i; int x; int y; + int i; + int bpp; /* bit per plane */ switch (pixelformat) { case PIXELFORMAT_PAL1: -#if HAVE_DEBUG - fprintf(stderr, "expanding PAL1 to PAL8...\n"); -#endif - for (y = 0; y < height; ++y) { - for (x = 0; x < width / 8; ++x) { - for (i = 0; i < 8; ++i) { - *dst++ = *src >> (7 - i) & 0x1; - } - src++; - } - x = width - x * 8; - if (x) { - while (x) { - *dst++ = *src >> x-- & 0x1; - } - src++; - } - } + bpp = 1; break; case PIXELFORMAT_PAL2: -#if HAVE_DEBUG - fprintf(stderr, "expanding PAL2 to PAL8...\n"); -#endif - for (y = 0; y < height; ++y) { - for (x = 0; x < width / 4; ++x) { - for (i = 0; i < 4; ++i) { - *dst++ = *src >> (3 - i) * 2 & 0x3; - } - src++; - } - x = width - x * 4; - if (x) { - while (x) { - *dst++ = *src >> x-- * 2 & 0x3; - } - src++; - } - } + bpp = 2; break; case PIXELFORMAT_PAL4: -#if HAVE_DEBUG - fprintf(stderr, "expanding PAL4 to PAL8...\n"); -#endif - for (y = 0; y < height; ++y) { - for (x = 0; x < width / 2; ++x) { - for (i = 0; i < 2; ++i) { - *dst++ = *src >> (1 - i) * 4 & 0xf; - } - src++; - } - x = width - x * 2; - if (x) { - while (x) { - *dst++ = *src >> x-- * 4 & 0xf; - } - src++; - } - } + bpp = 4; break; case PIXELFORMAT_PAL8: for (i = 0; i < width * height; ++i, ++src) { *dst++ = *src; } - break; + return 0; default: - break; + return (-1); } + +#if HAVE_DEBUG + fprintf(stderr, "expanding PAL%d to PAL8...\n", bpp); +#endif + + for (y = 0; y < height; ++y) { + for (x = 0; x < width * bpp / 8; ++x) { + for (i = 0; i < 8 / bpp; ++i) { + *dst++ = *src >> (8 / bpp - 1 - i) * bpp & (1 << bpp) - 1; + } + src++; + } + x = width - x * 8 / bpp; + if (x > 0) { + for (i = 0; i < x; ++i) { + *dst++ = *src >> (8 - (i + 1) * bpp) & (1 << bpp) - 1; + } + src++; + } + } + return 0; } From 61610b32996fda47a6d7c81146b7f8af6dabdd03 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Feb 2015 23:16:57 +0900 Subject: [PATCH 081/451] Change the signature of sixel_normalize_pixelformat() --- src/dither.c | 27 +++++++++++++++++---------- src/dither.h | 5 +++-- src/tosixel.c | 4 ++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/dither.c b/src/dither.c index 449493da..752e7a5c 100644 --- a/src/dither.c +++ b/src/dither.c @@ -446,13 +446,18 @@ expand_palette(unsigned char *dst, unsigned char const *src, int -sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, - int width, int height, - int const pixelformat) +sixel_normalize_pixelformat( + unsigned char /* out */ *dst, /* destination buffer */ + int /* out */ *dst_pixelformat, /* converted pixelformat, RGB888 or PAL8 */ + unsigned char /* in */ *src, /* source pixels */ + int const /* in */ src_pixelformat, /* pixel format of source image */ + int /* in */ width, /* width of source image */ + int /* in */ height) /* height of source image */ { - switch (pixelformat) { + switch (src_pixelformat) { case PIXELFORMAT_G8: - expand_rgb(dst, src, width, height, pixelformat, 1); + (void) expand_rgb(dst, src, width, height, src_pixelformat, 1); + *dst_pixelformat = PIXELFORMAT_RGB888; break; case PIXELFORMAT_RGB565: case PIXELFORMAT_RGB555: @@ -460,21 +465,23 @@ sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, case PIXELFORMAT_BGR555: case PIXELFORMAT_GA88: case PIXELFORMAT_AG88: - expand_rgb(dst, src, width, height, pixelformat, 2); + (void) expand_rgb(dst, src, width, height, src_pixelformat, 2); + *dst_pixelformat = PIXELFORMAT_RGB888; break; case PIXELFORMAT_RGB888: case PIXELFORMAT_BGR888: - expand_rgb(dst, src, width, height, pixelformat, 3); + (void) expand_rgb(dst, src, width, height, src_pixelformat, 3); + *dst_pixelformat = PIXELFORMAT_RGB888; break; case PIXELFORMAT_RGBA8888: case PIXELFORMAT_ARGB8888: - expand_rgb(dst, src, width, height, pixelformat, 4); + (void) expand_rgb(dst, src, width, height, src_pixelformat, 4); + *dst_pixelformat = PIXELFORMAT_RGB888; break; case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: - expand_palette(dst, src, width, height, pixelformat); - break; + return expand_palette(dst, src, width, height, src_pixelformat); case PIXELFORMAT_PAL8: memcpy(dst, src, width * height); break; diff --git a/src/dither.h b/src/dither.h index a7fae9a1..464a2053 100644 --- a/src/dither.h +++ b/src/dither.h @@ -54,8 +54,9 @@ sixel_dither_apply_palette(sixel_dither_t *dither, int width, int height); int -sixel_normalize_pixelformat(unsigned char *dst, unsigned char *src, - int width, int height, int const pixelformat); +sixel_normalize_pixelformat(unsigned char *dst, int *dst_pixelformat, + unsigned char *src, int const pixelformat, + int width, int height); #ifdef __cplusplus } diff --git a/src/tosixel.c b/src/tosixel.c index d396dadd..43091bd2 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -584,8 +584,8 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, if (paletted_pixels == NULL) { goto end; } - sixel_normalize_pixelformat(paletted_pixels, pixels, width, height, - dither->pixelformat); + sixel_normalize_pixelformat(paletted_pixels, &dither->pixelformat, + pixels, dither->pixelformat, width, height); input_pixels = paletted_pixels; break; case PIXELFORMAT_PAL8: From 08b9527e39efe96f6f93babafda02a442a7d83d7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 19:43:39 +0900 Subject: [PATCH 082/451] Add some malloc() error handlings and fix leaks --- src/loader.c | 88 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 20 deletions(-) diff --git a/src/loader.c b/src/loader.c index 720c1063..efe15d38 100644 --- a/src/loader.c +++ b/src/loader.c @@ -214,6 +214,13 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) CURLcode code; chunk_init(pchunk, 1024); + if (pchunk->buffer == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "get_chunk_from_url('%s'): malloc failed.\n" "reason: %s.\n", + url, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); @@ -482,7 +489,7 @@ load_png(unsigned char *buffer, int size, # if HAVE_DEBUG fprintf(stderr, "detected more colors than reqired(>%d).\n", reqcolors); - fprintf(stderr, "expand to RGB format...\n"); + fprintf(stderr, "expand into RGB format...\n"); # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); @@ -495,14 +502,25 @@ load_png(unsigned char *buffer, int size, case 2: case 4: # if HAVE_DECL_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 +# if HAVE_DEBUG + fprintf(stderr, "expand %d bpp to 8bpp format...\n", bitdepth); +# endif png_set_expand_gray_1_2_4_to_8(png_ptr); *pcomp = 1; *pixelformat = PIXELFORMAT_G8; # elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 +# if HAVE_DEBUG + fprintf(stderr, "expand %d bpp to 8bpp format...\n", bitdepth); +# endif png_set_gray_1_2_4_to_8(png_ptr); *pcomp = 1; *pixelformat = PIXELFORMAT_G8; # else +# if HAVE_DEBUG + fprintf(stderr, "expand into RGB format...\n"); +# endif + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; @@ -513,12 +531,20 @@ load_png(unsigned char *buffer, int size, *pcomp = 1; *pixelformat = PIXELFORMAT_G8; } else { +# if HAVE_DEBUG + fprintf(stderr, "expand into RGB format...\n"); +# endif + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; } break; default: +# if HAVE_DEBUG + fprintf(stderr, "expand into RGB format...\n"); +# endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); @@ -532,13 +558,10 @@ load_png(unsigned char *buffer, int size, # if HAVE_DEBUG fprintf(stderr, "grayscale-alpha PNG(PNG_COLOR_TYPE_GRAY_ALPHA)\n"); fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "expand to RGB format...\n"); # endif - if (bgcolor) { - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } else { - png_set_strip_alpha(png_ptr); - } + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; @@ -547,13 +570,10 @@ load_png(unsigned char *buffer, int size, # if HAVE_DEBUG fprintf(stderr, "RGBA PNG(PNG_COLOR_TYPE_RGB_ALPHA)\n"); fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "expand to RGB format...\n"); # endif - if (bgcolor) { - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } else { - png_set_strip_alpha(png_ptr); - } + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; @@ -562,10 +582,8 @@ load_png(unsigned char *buffer, int size, fprintf(stderr, "RGB PNG(PNG_COLOR_TYPE_RGB)\n"); fprintf(stderr, "bitdepth: %u\n", bitdepth); # endif - if (bgcolor) { - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; @@ -574,7 +592,13 @@ load_png(unsigned char *buffer, int size, goto cleanup; } result = malloc(*pcomp * *psx * *psy); + if (result == NULL) { + goto cleanup; + } rows = malloc(*psy * sizeof(unsigned char *)); + if (rows == NULL) { + goto cleanup; + } switch (*pixelformat) { case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: @@ -635,21 +659,28 @@ load_sixel(unsigned char *buffer, int size, *ppixelformat = PIXELFORMAT_RGB888; *pcomp = 3; pixels = malloc(*psx * *psy * *pcomp); + if (pixels == NULL) { + goto cleanup; + } for (i = 0; i < *psx * *psy; ++i) { pixels[i * 3 + 0] = palette[p[i] * 3 + 0]; pixels[i * 3 + 1] = palette[p[i] * 3 + 1]; pixels[i * 3 + 2] = palette[p[i] * 3 + 2]; } - free(palette); - free(p); } else { *ppixelformat = PIXELFORMAT_PAL8; *pcomp = 1; pixels = p; *ppalette = palette; *pncolors = colors; + p = NULL; + palette = NULL; } +cleanup: + free(palette); + free(p); + return pixels; } @@ -834,7 +865,22 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { chunk_init(&frames, 1024); + if (frames.buffer == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "load_with_builtin: malloc failed.\n" "reason: %s.\n", + strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return NULL; + } chunk_init(&delays, 1024); + if (delays.buffer == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "load_with_builtin: malloc failed.\n" "reason: %s.\n", + strerror(errno)); +#endif /* HAVE_ERRNO_H */ + free(frames.buffer); + return NULL; + } stbi__start_mem(&s, pchunk->buffer, pchunk->size); *pframe_count = 0; memset(&g, 0, sizeof(g)); @@ -864,6 +910,8 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, *ppdelay = (int *)delays.buffer; if (!pixels) { + free(delays.buffer); + free(frames.buffer); fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", stbi_failure_reason()); return NULL; @@ -1189,7 +1237,7 @@ sixel_helper_load_image_file( ret = get_chunk(filename, &chunk); if (ret != 0) { - return (-1); + return ret; } /* if input date is empty or 1 byte LF, ignore it and return successfully */ From c7ad1861207ed9c7c2e4f9dc1a5d1acbee177c05 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 19:54:10 +0900 Subject: [PATCH 083/451] Retrive delay information from animated GIF correctory --- src/stb_image.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stb_image.h b/src/stb_image.h index 9a9ffb09..35f5bd56 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -5639,7 +5639,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i len = stbi__get8(s); // block size if (len == 4) { g->eflags = stbi__get8(s); - stbi__get16le(s); // delay + g->delay = stbi__get16le(s); // delay g->transparent = stbi__get8(s); } else { stbi__skip(s, len); From ee945d6da4f5eaab53e700435d10c910df51f922 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 20:11:40 +0900 Subject: [PATCH 084/451] Add some parentheses for suppressing GCC warnings --- src/dither.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dither.c b/src/dither.c index 752e7a5c..1984c524 100644 --- a/src/dither.c +++ b/src/dither.c @@ -429,14 +429,14 @@ expand_palette(unsigned char *dst, unsigned char const *src, for (y = 0; y < height; ++y) { for (x = 0; x < width * bpp / 8; ++x) { for (i = 0; i < 8 / bpp; ++i) { - *dst++ = *src >> (8 / bpp - 1 - i) * bpp & (1 << bpp) - 1; + *dst++ = *src >> (8 / bpp - 1 - i) * bpp & ((1 << bpp) - 1); } src++; } x = width - x * 8 / bpp; if (x > 0) { for (i = 0; i < x; ++i) { - *dst++ = *src >> (8 - (i + 1) * bpp) & (1 << bpp) - 1; + *dst++ = *src >> (8 - (i + 1) * bpp) & ((1 << bpp) - 1); } src++; } From 1e0edab1134a38e00e0dff89d589e64cbad74efd Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 21:04:14 +0900 Subject: [PATCH 085/451] Suppress printf() formatter warings --- src/loader.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/loader.c b/src/loader.c index efe15d38..05806e1a 100644 --- a/src/loader.c +++ b/src/loader.c @@ -380,7 +380,7 @@ load_png(unsigned char *buffer, int size, bitdepth = png_get_bit_depth(png_ptr, info_ptr); if (bitdepth == 16) { # if HAVE_DEBUG - fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", (unsigned int)bitdepth); fprintf(stderr, "stripping to 8bit...\n"); # endif png_set_strip_16(png_ptr); @@ -414,7 +414,7 @@ load_png(unsigned char *buffer, int size, } # if HAVE_DEBUG fprintf(stderr, "palette colors: %d\n", *pncolors); - fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", (unsigned int)bitdepth); # endif if (ppalette == NULL || *pncolors > reqcolors) { # if HAVE_DEBUG @@ -483,7 +483,7 @@ load_png(unsigned char *buffer, int size, case PNG_COLOR_TYPE_GRAY: # if HAVE_DEBUG fprintf(stderr, "grayscale PNG(PNG_COLOR_TYPE_GRAY)\n"); - fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", (unsigned int)bitdepth); # endif if (1 << bitdepth > reqcolors) { # if HAVE_DEBUG @@ -503,14 +503,16 @@ load_png(unsigned char *buffer, int size, case 4: # if HAVE_DECL_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 # if HAVE_DEBUG - fprintf(stderr, "expand %d bpp to 8bpp format...\n", bitdepth); + fprintf(stderr, "expand %u bpp to 8bpp format...\n", + (unsigned int)bitdepth); # endif png_set_expand_gray_1_2_4_to_8(png_ptr); *pcomp = 1; *pixelformat = PIXELFORMAT_G8; # elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 # if HAVE_DEBUG - fprintf(stderr, "expand %d bpp to 8bpp format...\n", bitdepth); + fprintf(stderr, "expand %u bpp to 8bpp format...\n", + (unsigned int)bitdepth); # endif png_set_gray_1_2_4_to_8(png_ptr); *pcomp = 1; @@ -557,7 +559,7 @@ load_png(unsigned char *buffer, int size, case PNG_COLOR_TYPE_GRAY_ALPHA: # if HAVE_DEBUG fprintf(stderr, "grayscale-alpha PNG(PNG_COLOR_TYPE_GRAY_ALPHA)\n"); - fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", (unsigned int)bitdepth); fprintf(stderr, "expand to RGB format...\n"); # endif png_set_background(png_ptr, &background, @@ -569,7 +571,7 @@ load_png(unsigned char *buffer, int size, case PNG_COLOR_TYPE_RGB_ALPHA: # if HAVE_DEBUG fprintf(stderr, "RGBA PNG(PNG_COLOR_TYPE_RGB_ALPHA)\n"); - fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", (unsigned int)bitdepth); fprintf(stderr, "expand to RGB format...\n"); # endif png_set_background(png_ptr, &background, @@ -580,7 +582,7 @@ load_png(unsigned char *buffer, int size, case PNG_COLOR_TYPE_RGB: # if HAVE_DEBUG fprintf(stderr, "RGB PNG(PNG_COLOR_TYPE_RGB)\n"); - fprintf(stderr, "bitdepth: %u\n", bitdepth); + fprintf(stderr, "bitdepth: %u\n", (unsigned int)bitdepth); # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); From 11508de63a14fd89e1409d82caf5bbab62e6a62b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 21:15:55 +0900 Subject: [PATCH 086/451] Apply default background color to paletted PNG with tRNS chunk --- src/loader.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/loader.c b/src/loader.c index efe15d38..9b72b858 100644 --- a/src/loader.c +++ b/src/loader.c @@ -312,7 +312,7 @@ read_png(png_structp png_ptr, png_bytep data, png_size_t length) static void read_palette(png_structp png_ptr, png_infop info_ptr, unsigned char *palette, int ncolors, - png_color *png_palette, unsigned char *bgcolor) + png_color *png_palette, png_color_16 *pbackground) { png_bytep trans = NULL; int num_trans = 0; @@ -322,12 +322,12 @@ read_palette(png_structp png_ptr, png_infop info_ptr, png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); } for (i = 0; i < ncolors; ++i) { - if (bgcolor && i < num_trans) { - palette[i * 3 + 0] = ((0xff - trans[i]) * bgcolor[0] + if (pbackground && i < num_trans) { + palette[i * 3 + 0] = ((0xff - trans[i]) * pbackground->red + trans[i] * png_palette[i].red) >> 8; - palette[i * 3 + 1] = ((0xff - trans[i]) * bgcolor[1] + palette[i * 3 + 1] = ((0xff - trans[i]) * pbackground->green + trans[i] * png_palette[i].green) >> 8; - palette[i * 3 + 2] = ((0xff - trans[i]) * bgcolor[2] + palette[i * 3 + 2] = ((0xff - trans[i]) * pbackground->blue + trans[i] * png_palette[i].blue) >> 8; } else { palette[i * 3 + 0] = png_palette[i].red; @@ -436,7 +436,7 @@ load_png(unsigned char *buffer, int size, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, bgcolor); + *pncolors, png_palette, &background); *pcomp = 1; *pixelformat = PIXELFORMAT_PAL1; break; @@ -446,7 +446,7 @@ load_png(unsigned char *buffer, int size, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, bgcolor); + *pncolors, png_palette, &background); *pcomp = 1; *pixelformat = PIXELFORMAT_PAL2; break; @@ -456,7 +456,7 @@ load_png(unsigned char *buffer, int size, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, bgcolor); + *pncolors, png_palette, &background); *pcomp = 1; *pixelformat = PIXELFORMAT_PAL4; break; @@ -466,7 +466,7 @@ load_png(unsigned char *buffer, int size, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, bgcolor); + *pncolors, png_palette, &background); *pcomp = 1; *pixelformat = PIXELFORMAT_PAL8; break; From c6c5e75e0238ada7cecc40dc56957d4c6757d476 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 22:55:19 +0900 Subject: [PATCH 087/451] Integrate some duplicated code around sixel_helper_normalize_pixelformat() --- include/sixel.h.in | 35 +++----- src/dither.c | 216 +++------------------------------------------ src/dither.h | 6 -- src/pixelformat.c | 120 ++++++++++++++++++++++--- src/scale.c | 22 +++-- src/tosixel.c | 15 +++- src/writer.c | 16 ++-- 7 files changed, 165 insertions(+), 265 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 5b18af82..e4ee353c 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -109,17 +109,7 @@ enum pixelFormat { PIXELFORMAT_G4 = FORMATTYPE_GRAYSCALE | 0x02, /* 4bpp grayscale */ #endif PIXELFORMAT_G8 = FORMATTYPE_GRAYSCALE | 0x03, /* 8bpp grayscale */ -#if 0 - PIXELFORMAT_AG11 = FORMATTYPE_GRAYSCALE | 0x10, /* 2bpp gray+alpha */ - PIXELFORMAT_AG22 = FORMATTYPE_GRAYSCALE | 0x11, /* 4bpp gray+alpha */ - PIXELFORMAT_AG44 = FORMATTYPE_GRAYSCALE | 0x12, /* 8bpp gray+alpha */ -#endif PIXELFORMAT_AG88 = FORMATTYPE_GRAYSCALE | 0x13, /* 16bpp gray+alpha */ -#if 0 - PIXELFORMAT_GA11 = FORMATTYPE_GRAYSCALE | 0x20, /* 2bpp gray+alpha */ - PIXELFORMAT_GA22 = FORMATTYPE_GRAYSCALE | 0x21, /* 4bpp gray+alpha */ - PIXELFORMAT_GA44 = FORMATTYPE_GRAYSCALE | 0x22, /* 8bpp gray+alpha */ -#endif PIXELFORMAT_GA88 = FORMATTYPE_GRAYSCALE | 0x23, /* 16bpp gray+alpha */ PIXELFORMAT_PAL1 = FORMATTYPE_PALETTE | 0x00, /* 1bpp palette */ PIXELFORMAT_PAL2 = FORMATTYPE_PALETTE | 0x01, /* 2bpp palette */ @@ -378,24 +368,25 @@ sixel_helper_compute_depth( /* convert pixelFormat into PIXELFORMAT_RGB888 */ int sixel_helper_normalize_pixelformat( - unsigned char /* out */ *dst, /* destination image */ - unsigned char const /* in */ *src, /* source image */ - int /* in */ width, /* source image width */ - int /* in */ height, /* source image height */ - int const /* in */ pixelformat /* source image pixelformat */ + unsigned char /* out */ *dst, /* destination buffer */ + int /* out */ *dst_pixelformat, /* converted pixelformat */ + unsigned char const /* in */ *src, /* source pixels */ + int /* in */ src_pixelformat, /* format of source image */ + int /* in */ width, /* width of source image */ + int /* in */ height /* height of source image */ ); /* scale image to specified size */ int sixel_helper_scale_image( - unsigned char /* out */ *dst, + unsigned char /* out */ *dst, /* destination buffer */ unsigned char const /* in */ *src, /* source image data */ - int const /* in */ srcw, /* source image width */ - int const /* in */ srch, /* source image height */ - int const /* in */ pixelformat, /* one of enum pixelFormat */ - int const /* in */ dstw, /* destination image width */ - int const /* in */ dsth, /* destination image height */ - int const /* in */ method_for_resampling /* one of methodForResampling */ + int /* in */ srcw, /* source image width */ + int /* in */ srch, /* source image height */ + int /* in */ pixelformat, /* one of enum pixelFormat */ + int /* in */ dstw, /* destination image width */ + int /* in */ dsth, /* destination image height */ + int /* in */ method_for_resampling /* one of methodForResampling */ ); #ifdef __cplusplus diff --git a/src/dither.c b/src/dither.c index 1984c524..74779d8b 100644 --- a/src/dither.c +++ b/src/dither.c @@ -294,205 +294,6 @@ sixel_dither_get(int builtin_dither) } -static void -get_rgb(unsigned char *data, int const pixelformat, int depth, - unsigned char *r, unsigned char *g, unsigned char *b) -{ - unsigned int pixels = 0, low, high; - int count = 0; - - while (count < depth) { - pixels = *(data + count) | (pixels << 8); - count++; - } - - /* TODO: we should swap bytes (only necessary on LSByte first hardware?) */ - if (depth == 2) { - low = pixels & 0xff; - high = (pixels >> 8) & 0xff; - pixels = (low << 8) | high; - } - - switch (pixelformat) { - case PIXELFORMAT_RGB555: - *r = ((pixels >> 10) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x1f) << 3; - *b = ((pixels >> 0) & 0x1f) << 3; - break; - case PIXELFORMAT_RGB565: - *r = ((pixels >> 11) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x3f) << 2; - *b = ((pixels >> 0) & 0x1f) << 3; - break; - case PIXELFORMAT_RGB888: - *r = (pixels >> 0) & 0xff; - *g = (pixels >> 8) & 0xff; - *b = (pixels >> 16) & 0xff; - break; - case PIXELFORMAT_BGR555: - *r = ((pixels >> 0) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x1f) << 3; - *b = ((pixels >> 10) & 0x1f) << 3; - break; - case PIXELFORMAT_BGR565: - *r = ((pixels >> 0) & 0x1f) << 3; - *g = ((pixels >> 5) & 0x3f) << 2; - *b = ((pixels >> 11) & 0x1f) << 3; - break; - case PIXELFORMAT_BGR888: - *r = (pixels >> 16) & 0xff; - *g = (pixels >> 8) & 0xff; - *b = (pixels >> 0) & 0xff; - break; - case PIXELFORMAT_RGBA8888: - *r = (pixels >> 24) & 0xff; - *g = (pixels >> 16) & 0xff; - *b = (pixels >> 8) & 0xff; - break; - case PIXELFORMAT_ARGB8888: - *r = (pixels >> 16) & 0xff; - *g = (pixels >> 8) & 0xff; - *b = (pixels >> 0) & 0xff; - break; - case PIXELFORMAT_GA88: - *r = *g = *b = (pixels >> 8) & 0xff; - break; - case PIXELFORMAT_G8: - case PIXELFORMAT_AG88: - *r = *g = *b = pixels & 0xff; - break; - default: - *r = *g = *b = 0; - break; - } -} - - -static int -expand_rgb(unsigned char *dst, unsigned char *src, - int width, int height, int pixelformat, int depth) -{ - int x; - int y; - int dst_offset; - int src_offset; - unsigned char r, g, b; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - src_offset = depth * (y * width + x); - dst_offset = 3 * (y * width + x); - get_rgb(src + src_offset, pixelformat, depth, &r, &g, &b); - - *(dst + dst_offset + 0) = r; - *(dst + dst_offset + 1) = g; - *(dst + dst_offset + 2) = b; - } - } - - return 0; -} - - -static int -expand_palette(unsigned char *dst, unsigned char const *src, - int width, int height, int const pixelformat) -{ - int x; - int y; - int i; - int bpp; /* bit per plane */ - - switch (pixelformat) { - case PIXELFORMAT_PAL1: - bpp = 1; - break; - case PIXELFORMAT_PAL2: - bpp = 2; - break; - case PIXELFORMAT_PAL4: - bpp = 4; - break; - case PIXELFORMAT_PAL8: - for (i = 0; i < width * height; ++i, ++src) { - *dst++ = *src; - } - return 0; - default: - return (-1); - } - -#if HAVE_DEBUG - fprintf(stderr, "expanding PAL%d to PAL8...\n", bpp); -#endif - - for (y = 0; y < height; ++y) { - for (x = 0; x < width * bpp / 8; ++x) { - for (i = 0; i < 8 / bpp; ++i) { - *dst++ = *src >> (8 / bpp - 1 - i) * bpp & ((1 << bpp) - 1); - } - src++; - } - x = width - x * 8 / bpp; - if (x > 0) { - for (i = 0; i < x; ++i) { - *dst++ = *src >> (8 - (i + 1) * bpp) & ((1 << bpp) - 1); - } - src++; - } - } - return 0; -} - - -int -sixel_normalize_pixelformat( - unsigned char /* out */ *dst, /* destination buffer */ - int /* out */ *dst_pixelformat, /* converted pixelformat, RGB888 or PAL8 */ - unsigned char /* in */ *src, /* source pixels */ - int const /* in */ src_pixelformat, /* pixel format of source image */ - int /* in */ width, /* width of source image */ - int /* in */ height) /* height of source image */ -{ - switch (src_pixelformat) { - case PIXELFORMAT_G8: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 1); - *dst_pixelformat = PIXELFORMAT_RGB888; - break; - case PIXELFORMAT_RGB565: - case PIXELFORMAT_RGB555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 2); - *dst_pixelformat = PIXELFORMAT_RGB888; - break; - case PIXELFORMAT_RGB888: - case PIXELFORMAT_BGR888: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 3); - *dst_pixelformat = PIXELFORMAT_RGB888; - break; - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 4); - *dst_pixelformat = PIXELFORMAT_RGB888; - break; - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - return expand_palette(dst, src, width, height, src_pixelformat); - case PIXELFORMAT_PAL8: - memcpy(dst, src, width * height); - break; - default: - return (-1); - } - - return 0; -} - - static void sixel_dither_set_method_for_largest(sixel_dither_t *dither, int method_for_largest) { @@ -545,8 +346,10 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, } if (pixelformat != PIXELFORMAT_RGB888) { - nret = sixel_helper_normalize_pixelformat(normalized_pixels, data, - width, height, pixelformat); + nret = sixel_helper_normalize_pixelformat(normalized_pixels, + &pixelformat, + data, pixelformat, + width, height); if (nret != 0) { goto end; } @@ -718,10 +521,13 @@ sixel_dither_apply_palette(sixel_dither_t *dither, if (normalized_pixels == NULL) { goto end; } - sixel_helper_normalize_pixelformat(normalized_pixels, - pixels, - width, height, - dither->pixelformat); + ret = sixel_helper_normalize_pixelformat(normalized_pixels, + &dither->pixelformat, + pixels, dither->pixelformat, + width, height); + if (ret != 0) { + goto end; + } input_pixels = normalized_pixels; } else { input_pixels = pixels; diff --git a/src/dither.h b/src/dither.h index 464a2053..146e2177 100644 --- a/src/dither.h +++ b/src/dither.h @@ -52,12 +52,6 @@ unsigned char * sixel_dither_apply_palette(sixel_dither_t *dither, unsigned char *pixels, int width, int height); - -int -sixel_normalize_pixelformat(unsigned char *dst, int *dst_pixelformat, - unsigned char *src, int const pixelformat, - int width, int height); - #ifdef __cplusplus } #endif diff --git a/src/pixelformat.c b/src/pixelformat.c index c11acea5..b8c4e8c2 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -22,6 +22,8 @@ #include "config.h" #include "sixel.h" +#include +#include static void @@ -141,24 +143,17 @@ sixel_helper_compute_depth(int pixelformat) } -int -sixel_helper_normalize_pixelformat( - unsigned char /* out */ *dst, /* destination image */ - unsigned char const /* in */ *src, /* source image */ - int /* in */ width, /* source image width */ - int /* in */ height, /* source image height */ - int const /* in */ pixelformat) /* source image pixelformat */ +static int +expand_rgb(unsigned char *dst, + unsigned char const *src, + int width, int height, + int pixelformat, int depth) { int x; int y; int dst_offset; int src_offset; - int depth; - unsigned char r; - unsigned char g; - unsigned char b; - - depth = sixel_helper_compute_depth(pixelformat); + unsigned char r, g, b; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { @@ -175,6 +170,105 @@ sixel_helper_normalize_pixelformat( return 0; } + +static int +expand_palette(unsigned char *dst, unsigned char const *src, + int width, int height, int const pixelformat) +{ + int x; + int y; + int i; + int bpp; /* bit per plane */ + + switch (pixelformat) { + case PIXELFORMAT_PAL1: + bpp = 1; + break; + case PIXELFORMAT_PAL2: + bpp = 2; + break; + case PIXELFORMAT_PAL4: + bpp = 4; + break; + case PIXELFORMAT_PAL8: + for (i = 0; i < width * height; ++i, ++src) { + *dst++ = *src; + } + return 0; + default: + return (-1); + } + +#if HAVE_DEBUG + fprintf(stderr, "expanding PAL%d to PAL8...\n", bpp); +#endif + + for (y = 0; y < height; ++y) { + for (x = 0; x < width * bpp / 8; ++x) { + for (i = 0; i < 8 / bpp; ++i) { + *dst++ = *src >> (8 / bpp - 1 - i) * bpp & ((1 << bpp) - 1); + } + src++; + } + x = width - x * 8 / bpp; + if (x > 0) { + for (i = 0; i < x; ++i) { + *dst++ = *src >> (8 - (i + 1) * bpp) & ((1 << bpp) - 1); + } + src++; + } + } + return 0; +} + + +int +sixel_helper_normalize_pixelformat( + unsigned char /* out */ *dst, /* destination buffer */ + int /* out */ *dst_pixelformat, /* converted pixelformat */ + unsigned char const /* in */ *src, /* source pixels */ + int /* in */ src_pixelformat, /* format of source image */ + int /* in */ width, /* width of source image */ + int /* in */ height) /* height of source image */ +{ + switch (src_pixelformat) { + case PIXELFORMAT_G8: + (void) expand_rgb(dst, src, width, height, src_pixelformat, 1); + *dst_pixelformat = PIXELFORMAT_RGB888; + break; + case PIXELFORMAT_RGB565: + case PIXELFORMAT_RGB555: + case PIXELFORMAT_BGR565: + case PIXELFORMAT_BGR555: + case PIXELFORMAT_GA88: + case PIXELFORMAT_AG88: + (void) expand_rgb(dst, src, width, height, src_pixelformat, 2); + *dst_pixelformat = PIXELFORMAT_RGB888; + break; + case PIXELFORMAT_RGB888: + case PIXELFORMAT_BGR888: + (void) expand_rgb(dst, src, width, height, src_pixelformat, 3); + *dst_pixelformat = PIXELFORMAT_RGB888; + break; + case PIXELFORMAT_RGBA8888: + case PIXELFORMAT_ARGB8888: + (void) expand_rgb(dst, src, width, height, src_pixelformat, 4); + *dst_pixelformat = PIXELFORMAT_RGB888; + break; + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + return expand_palette(dst, src, width, height, src_pixelformat); + case PIXELFORMAT_PAL8: + memcpy(dst, src, width * height); + break; + default: + return (-1); + } + + return 0; +} + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/scale.c b/src/scale.c index 067149cd..4cddfb58 100644 --- a/src/scale.c +++ b/src/scale.c @@ -307,31 +307,35 @@ int sixel_helper_scale_image( unsigned char /* out */ *dst, unsigned char const /* in */ *src, /* source image data */ - int const /* in */ srcw, /* source image width */ - int const /* in */ srch, /* source image height */ - int const /* in */ pixelformat, /* one of enum pixelFormat */ - int const /* in */ dstw, /* destination image width */ - int const /* in */ dsth, /* destination image height */ - int const /* in */ method_for_resampling) /* one of methodForResampling */ + int /* in */ srcw, /* source image width */ + int /* in */ srch, /* source image height */ + int /* in */ pixelformat, /* one of enum pixelFormat */ + int /* in */ dstw, /* destination image width */ + int /* in */ dsth, /* destination image height */ + int /* in */ method_for_resampling) /* one of methodForResampling */ { int const depth = sixel_helper_compute_depth(pixelformat); unsigned char *new_src = NULL; int nret; + int new_pixelformat; if (depth != 3) { new_src = malloc(srcw * srch * 3); if (new_src == NULL) { return (-1); } - - nret = sixel_helper_normalize_pixelformat(new_src, src, - srcw, srch, pixelformat); + nret = sixel_helper_normalize_pixelformat(new_src, + &new_pixelformat, + src, pixelformat, + srcw, srch); if (nret != 0) { free(new_src); return (-1); } src = new_src; + } else { + new_pixelformat = pixelformat; } /* choose re-sampling strategy */ diff --git a/src/tosixel.c b/src/tosixel.c index 43091bd2..14a21425 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -584,8 +584,14 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, if (paletted_pixels == NULL) { goto end; } - sixel_normalize_pixelformat(paletted_pixels, &dither->pixelformat, - pixels, dither->pixelformat, width, height); + nret = sixel_helper_normalize_pixelformat(paletted_pixels, + &dither->pixelformat, + pixels, + dither->pixelformat, + width, height); + if (nret != 0) { + goto end; + } input_pixels = paletted_pixels; break; case PIXELFORMAT_PAL8: @@ -1029,9 +1035,10 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, goto error; } nret = sixel_helper_normalize_pixelformat(normalized_pixels, + &dither->pixelformat, pixels, - width, height, - dither->pixelformat); + dither->pixelformat, + width, height); if (nret != 0) { goto error; } diff --git a/src/writer.c b/src/writer.c index 811c509c..4f2564e0 100644 --- a/src/writer.c +++ b/src/writer.c @@ -91,9 +91,11 @@ write_png_to_file( new_pixels = malloc(width * height * 4); src = new_pixels + width * height * 3; dst = pixels = new_pixels; - ret = sixel_helper_normalize_pixelformat(src, data, - width, height, - pixelformat); + ret = sixel_helper_normalize_pixelformat(src, + &pixelformat, + data, + pixelformat, + width, height); if (ret != 0) { goto end; } @@ -126,9 +128,11 @@ write_png_to_file( case PIXELFORMAT_RGBA8888: case PIXELFORMAT_ARGB8888: pixels = new_pixels = malloc(width * height * 3); - ret = sixel_helper_normalize_pixelformat(pixels, data, - width, height, - pixelformat); + ret = sixel_helper_normalize_pixelformat(pixels, + &pixelformat, + data, + pixelformat, + width, height); if (ret != 0) { goto end; } From 5d94d7557908b1213134bac570b428d0dd497639 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 23:13:04 +0900 Subject: [PATCH 088/451] Update copyright notice --- converters/img2sixel.c | 4 ++-- converters/loader.h | 2 +- converters/malloc_stub.c | 2 +- converters/malloc_stub.h | 2 +- converters/sixel2png.c | 4 ++-- include/sixel-imageio.h.in | 2 +- include/sixel.h.in | 2 +- src/dither.c | 2 +- src/dither.h | 2 +- src/frompnm.c | 2 +- src/frompnm.h | 2 +- src/loader.c | 2 +- src/output.c | 2 +- src/output.h | 2 +- src/pixelformat.c | 2 +- src/quant.c | 2 +- src/quant.h | 2 +- src/scale.c | 2 +- src/stb_image_write.c | 2 +- src/writer.c | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index ee728625..279d9f74 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -1104,7 +1104,7 @@ static void show_version(void) { printf("img2sixel " PACKAGE_VERSION "\n" - "Copyright (C) 2014 Hayaki Saito .\n" + "Copyright (C) 2014,2015 Hayaki Saito .\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining a copy of\n" "this software and associated documentation files (the \"Software\"), to deal in\n" diff --git a/converters/loader.h b/converters/loader.h index 81d80a9f..da094052 100644 --- a/converters/loader.h +++ b/converters/loader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/converters/malloc_stub.c b/converters/malloc_stub.c index d037358d..de47e879 100644 --- a/converters/malloc_stub.c +++ b/converters/malloc_stub.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/converters/malloc_stub.h b/converters/malloc_stub.h index f4a8a485..89dcfbc0 100644 --- a/converters/malloc_stub.h +++ b/converters/malloc_stub.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 20698d01..45d259a7 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -147,7 +147,7 @@ static void show_version(void) { printf("sixel2png " PACKAGE_VERSION "\n" - "Copyright (C) 2014 Hayaki Saito .\n" + "Copyright (C) 2014,2015 Hayaki Saito .\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining a copy of\n" "this software and associated documentation files (the \"Software\"), to deal in\n" diff --git a/include/sixel-imageio.h.in b/include/sixel-imageio.h.in index 4d9848dd..f7c1d72f 100644 --- a/include/sixel-imageio.h.in +++ b/include/sixel-imageio.h.in @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/include/sixel.h.in b/include/sixel.h.in index e4ee353c..26042a87 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/dither.c b/src/dither.c index 74779d8b..89ccae59 100644 --- a/src/dither.c +++ b/src/dither.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/dither.h b/src/dither.h index 146e2177..aef67744 100644 --- a/src/dither.h +++ b/src/dither.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/frompnm.c b/src/frompnm.c index 8e8b758c..2c0cb6b4 100644 --- a/src/frompnm.c +++ b/src/frompnm.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2014 kmiya@culti - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/frompnm.h b/src/frompnm.h index 9464f32d..e5ebc7c3 100644 --- a/src/frompnm.h +++ b/src/frompnm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/loader.c b/src/loader.c index c89975c4..66a44d6b 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/output.c b/src/output.c index d0ef2702..9ac0e2e2 100644 --- a/src/output.c +++ b/src/output.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/output.h b/src/output.h index 870507f6..316edb62 100644 --- a/src/output.h +++ b/src/output.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/pixelformat.c b/src/pixelformat.c index b8c4e8c2..2fb2f1ad 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/quant.c b/src/quant.c index 3e32fd91..796031d6 100644 --- a/src/quant.c +++ b/src/quant.c @@ -22,7 +22,7 @@ * * ****************************************************************************** * - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/quant.h b/src/quant.h index 3f9064f0..3e04d121 100644 --- a/src/quant.h +++ b/src/quant.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/scale.c b/src/scale.c index 4cddfb58..64ef39aa 100644 --- a/src/scale.c +++ b/src/scale.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/stb_image_write.c b/src/stb_image_write.c index 87c72f78..addd65d8 100644 --- a/src/stb_image_write.c +++ b/src/stb_image_write.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/src/writer.c b/src/writer.c index 4f2564e0..8a4e9ddb 100644 --- a/src/writer.c +++ b/src/writer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Hayaki Saito + * Copyright (c) 2014,2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in From 03906406a815b6bae5198ef75bc3f0b5efdd6e0f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 23:26:57 +0900 Subject: [PATCH 089/451] Raise error if invalid -B option is given --- converters/img2sixel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index ee728625..16cc352c 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -189,6 +189,9 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) ret = (-1); goto end; } + } else { + ret = (-1); + goto end; } ret = 0; From 44fcb6f63618d9dfb7693bb0e7f8a7000d045255 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 21 Feb 2015 23:31:28 +0900 Subject: [PATCH 090/451] Add convenient tests for -B option (issue #25) --- Makefile.in | 2 +- converters/Makefile.am | 6 ++++-- converters/Makefile.in | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Makefile.in b/Makefile.in index 7d6f7844..8c398d7e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/converters/Makefile.am b/converters/Makefile.am index 1d6c75f9..05cb9770 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -54,6 +54,7 @@ if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -l invalid_option) test ! $$($(WINE) ./img2sixel -b invalid_option) test ! $$($(WINE) ./img2sixel -E invalid_option) + test ! $$($(WINE) ./img2sixel -B invalid_option) test ! $$($(WINE) ./img2sixel -%) test ! $$($(WINE) ./img2sixel invalid_filename) test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @@ -78,12 +79,12 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 < ../images/snake.jpg > snake3.sixel $(WINE) ./img2sixel -w105% -h100 -djajuni -rnearest < ../images/snake.gif $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga - $(WINE) ./img2sixel -p300 -8 -scenter -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff + $(WINE) ./img2sixel -p300 -8 -scenter -Brgb:0/f/A -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff $(WINE) ./img2sixel -8 -qauto -thls -e ../images/snake.pgm $(WINE) ./img2sixel -8 -m ../images/map8-palette.png -Esize ../images/snake.ppm $(WINE) ./img2sixel -7 -m ../images/map16-palette.png -Efast ../images/snake.jpg $(WINE) ./img2sixel -7 -w300 ../images/snake-palette.png - $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 ../images/snake.pbm + $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B#aB3 ../images/snake.pbm $(WINE) ./img2sixel -I -dstucki -thls ../images/snake.ppm $(WINE) ./img2sixel -bvt340color ../images/snake.ppm $(WINE) ./img2sixel -bvt340mono ../images/snake.tga @@ -156,6 +157,7 @@ endif sleep 1; \ fi rm -f sixel.pipe + sleep 1 grep ^\.B img2sixel.1 | cut -f2 -d " " | grep "^\\\\" | tr -d '\\' | tr -d , > options2.txt grep ' --' shell-completion/bash/img2sixel| grep -v "' "| sed 's/.* \(-.\) .*/\1/' > options3.txt grep '{-' shell-completion/zsh/_img2sixel|cut -f1 -d,|cut -f2 -d'{' > options4.txt diff --git a/converters/Makefile.in b/converters/Makefile.in index 54326174..cad2ccc2 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1001,6 +1001,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -l invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -b invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -E invalid_option) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -%) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel invalid_filename) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @@ -1025,12 +1026,12 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 < ../images/snake.jpg > snake3.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -djajuni -rnearest < ../images/snake.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p300 -8 -scenter -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p300 -8 -scenter -Brgb:0/f/A -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -8 -qauto -thls -e ../images/snake.pgm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -8 -m ../images/map8-palette.png -Esize ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -m ../images/map16-palette.png -Efast ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w300 ../images/snake-palette.png -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 ../images/snake.pbm +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B#aB3 ../images/snake.pbm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -dstucki -thls ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340color ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340mono ../images/snake.tga @@ -1097,6 +1098,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ sleep 1; \ @WANT_IMG2SIXEL_TRUE@ fi @WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe +@WANT_IMG2SIXEL_TRUE@ sleep 1 @WANT_IMG2SIXEL_TRUE@ grep ^\.B img2sixel.1 | cut -f2 -d " " | grep "^\\\\" | tr -d '\\' | tr -d , > options2.txt @WANT_IMG2SIXEL_TRUE@ grep ' --' shell-completion/bash/img2sixel| grep -v "' "| sed 's/.* \(-.\) .*/\1/' > options3.txt @WANT_IMG2SIXEL_TRUE@ grep '{-' shell-completion/zsh/_img2sixel|cut -f1 -d,|cut -f2 -d'{' > options4.txt From fb72317635b27e4d1c924f76f6219d29aa53196d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 16:16:27 +0900 Subject: [PATCH 091/451] Combine libsixel-imageio with core library --- Makefile.in | 2 +- converters/Makefile.am | 6 +- converters/Makefile.in | 14 ++-- src/Makefile.am | 40 ++++++++---- src/Makefile.in | 141 +++++++++++++++++++++-------------------- 5 files changed, 105 insertions(+), 98 deletions(-) diff --git a/Makefile.in b/Makefile.in index 7d6f7844..8c398d7e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/converters/Makefile.am b/converters/Makefile.am index 1d6c75f9..8161c6b2 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -20,8 +20,7 @@ bin_PROGRAMS += img2sixel img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ - $(top_builddir)/src/libsixel-imageio.la +img2sixel_LDADD = $(top_builddir)/src/libsixel.la dist_man_MANS += img2sixel.1 dist_bashcompletion_DATA += shell-completion/bash/img2sixel dist_zshcompletion_DATA += shell-completion/zsh/_img2sixel @@ -32,8 +31,7 @@ bin_PROGRAMS += sixel2png sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -sixel2png_LDADD = $(top_builddir)/src/libsixel.la \ - $(top_builddir)/src/libsixel-imageio.la +sixel2png_LDADD = $(top_builddir)/src/libsixel.la dist_man_MANS += sixel2png.1 endif diff --git a/converters/Makefile.in b/converters/Makefile.in index 54326174..74250081 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -116,8 +116,7 @@ am__img2sixel_SOURCES_DIST = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@ img2sixel-malloc_stub.$(OBJEXT) img2sixel_OBJECTS = $(am_img2sixel_OBJECTS) @WANT_IMG2SIXEL_TRUE@img2sixel_DEPENDENCIES = \ -@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel.la \ -@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la +@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent @@ -131,8 +130,7 @@ am__sixel2png_SOURCES_DIST = sixel2png.c malloc_stub.c malloc_stub.h @WANT_SIXEL2PNG_TRUE@ sixel2png-malloc_stub.$(OBJEXT) sixel2png_OBJECTS = $(am_sixel2png_OBJECTS) @WANT_SIXEL2PNG_TRUE@sixel2png_DEPENDENCIES = \ -@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la \ -@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel-imageio.la +@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel.la sixel2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sixel2png_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -417,15 +415,11 @@ CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -@WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la \ -@WANT_IMG2SIXEL_TRUE@ $(top_builddir)/src/libsixel-imageio.la - +@WANT_IMG2SIXEL_TRUE@img2sixel_LDADD = $(top_builddir)/src/libsixel.la @WANT_SIXEL2PNG_TRUE@sixel2png_SOURCES = sixel2png.c malloc_stub.c malloc_stub.h @WANT_SIXEL2PNG_TRUE@sixel2png_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_SIXEL2PNG_TRUE@sixel2png_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la \ -@WANT_SIXEL2PNG_TRUE@ $(top_builddir)/src/libsixel-imageio.la - +@WANT_SIXEL2PNG_TRUE@sixel2png_LDADD = $(top_builddir)/src/libsixel.la all: all-recursive .SUFFIXES: diff --git a/src/Makefile.am b/src/Makefile.am index a9608c6a..a437ccaa 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,21 +6,33 @@ endif CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c +libsixel_la_SOURCES = output.c \ + fromsixel.c \ + tosixel.c \ + quant.c \ + dither.c \ + pixelformat.c \ + scale.c \ + loader.c \ + frompnm.c \ + frompnm.h \ + stb_image.h \ + writer.c \ + stb_image_write.c \ + stb_image_write.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) +libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ + $(LIBCURL_CFLAGS) \ + $(LIBPNG_CFLAGS) \ + $(LIBJPEG_CFLAGS) \ + $(GDK_PIXBUF_CFLAGS) \ + $(GD_CFLAGS) libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) -libsixel_la_LIBADD = -lm - -lib_LTLIBRARIES += libsixel-imageio.la -libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h \ - writer.c stb_image_write.c stb_image_write.h -libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ - $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) -libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) -libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) $(top_builddir)/src/libsixel.la +libsixel_la_LIBADD = -lm \ + $(LIBCURL_LIBS) \ + $(LIBPNG_LIBS) \ + $(LIBJPEG_LIBS) \ + $(GDK_PIXBUF_LIBS) \ + $(GD_LIBS) dist_man_MANS = sixel.5 diff --git a/src/Makefile.in b/src/Makefile.in index 6cac4eb8..e2ea47ef 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -123,28 +123,20 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man5dir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = -libsixel_imageio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ +libsixel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(top_builddir)/src/libsixel.la -am_libsixel_imageio_la_OBJECTS = libsixel_imageio_la-loader.lo \ - libsixel_imageio_la-frompnm.lo libsixel_imageio_la-writer.lo \ - libsixel_imageio_la-stb_image_write.lo -libsixel_imageio_la_OBJECTS = $(am_libsixel_imageio_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -libsixel_imageio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(libsixel_imageio_la_CFLAGS) $(CFLAGS) \ - $(libsixel_imageio_la_LDFLAGS) $(LDFLAGS) -o $@ -libsixel_la_DEPENDENCIES = + $(am__DEPENDENCIES_1) am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ - libsixel_la-pixelformat.lo libsixel_la-scale.lo + libsixel_la-pixelformat.lo libsixel_la-scale.lo \ + libsixel_la-loader.lo libsixel_la-frompnm.lo \ + libsixel_la-writer.lo libsixel_la-stb_image_write.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = libsixel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libsixel_la_CFLAGS) \ $(CFLAGS) $(libsixel_la_LDFLAGS) $(LDFLAGS) -o $@ @@ -182,8 +174,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(libsixel_imageio_la_SOURCES) $(libsixel_la_SOURCES) -DIST_SOURCES = $(libsixel_imageio_la_SOURCES) $(libsixel_la_SOURCES) +SOURCES = $(libsixel_la_SOURCES) +DIST_SOURCES = $(libsixel_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -350,23 +342,37 @@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov -lib_LTLIBRARIES = libsixel.la libsixel-imageio.la -libsixel_la_SOURCES = output.c fromsixel.c tosixel.c quant.c dither.c pixelformat.c scale.c -libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) -libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) -libsixel_la_LIBADD = -lm -libsixel_imageio_la_SOURCES = loader.c frompnm.c frompnm.h stb_image.h \ - writer.c stb_image_write.c stb_image_write.h +lib_LTLIBRARIES = libsixel.la +libsixel_la_SOURCES = output.c \ + fromsixel.c \ + tosixel.c \ + quant.c \ + dither.c \ + pixelformat.c \ + scale.c \ + loader.c \ + frompnm.c \ + frompnm.h \ + stb_image.h \ + writer.c \ + stb_image_write.c \ + stb_image_write.h -libsixel_imageio_la_CPPFLAGS = -I$(top_builddir)/include/ -libsixel_imageio_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ - $(GDK_PIXBUF_CFLAGS) $(LIBCURL_CFLAGS) \ - $(GD_CFLAGS) $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) +libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ +libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ + $(LIBCURL_CFLAGS) \ + $(LIBPNG_CFLAGS) \ + $(LIBJPEG_CFLAGS) \ + $(GDK_PIXBUF_CFLAGS) \ + $(GD_CFLAGS) -libsixel_imageio_la_LDFLAGS = -version-info $(LS_LTVERSION) -libsixel_imageio_la_LIBADD = $(GDK_PIXBUF_LIBS) $(LIBCURL_LIBS) $(GD_LIBS) \ - $(LIBJPEG_LIBS) $(LIBPNG_LIBS) $(top_builddir)/src/libsixel.la +libsixel_la_LDFLAGS = -version-info $(LS_LTVERSION) +libsixel_la_LIBADD = -lm \ + $(LIBCURL_LIBS) \ + $(LIBPNG_LIBS) \ + $(LIBJPEG_LIBS) \ + $(GDK_PIXBUF_LIBS) \ + $(GD_LIBS) dist_man_MANS = sixel.5 all: all-am @@ -439,9 +445,6 @@ clean-libLTLIBRARIES: rm -f $${locs}; \ } -libsixel-imageio.la: $(libsixel_imageio_la_OBJECTS) $(libsixel_imageio_la_DEPENDENCIES) $(EXTRA_libsixel_imageio_la_DEPENDENCIES) - $(AM_V_CCLD)$(libsixel_imageio_la_LINK) -rpath $(libdir) $(libsixel_imageio_la_OBJECTS) $(libsixel_imageio_la_LIBADD) $(LIBS) - libsixel.la: $(libsixel_la_OBJECTS) $(libsixel_la_DEPENDENCIES) $(EXTRA_libsixel_la_DEPENDENCIES) $(AM_V_CCLD)$(libsixel_la_LINK) -rpath $(libdir) $(libsixel_la_OBJECTS) $(libsixel_la_LIBADD) $(LIBS) @@ -451,17 +454,17 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-frompnm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-loader.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-stb_image_write.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_imageio_la-writer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frompnm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-loader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-output.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-pixelformat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-quant.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-scale.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-stb_image_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-tosixel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-writer.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -484,34 +487,6 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< -libsixel_imageio_la-loader.lo: loader.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-loader.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-loader.Tpo -c -o libsixel_imageio_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-loader.Tpo $(DEPDIR)/libsixel_imageio_la-loader.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='loader.c' object='libsixel_imageio_la-loader.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c - -libsixel_imageio_la-frompnm.lo: frompnm.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-frompnm.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-frompnm.Tpo -c -o libsixel_imageio_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-frompnm.Tpo $(DEPDIR)/libsixel_imageio_la-frompnm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frompnm.c' object='libsixel_imageio_la-frompnm.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c - -libsixel_imageio_la-writer.lo: writer.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-writer.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-writer.Tpo -c -o libsixel_imageio_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-writer.Tpo $(DEPDIR)/libsixel_imageio_la-writer.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='writer.c' object='libsixel_imageio_la-writer.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c - -libsixel_imageio_la-stb_image_write.lo: stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -MT libsixel_imageio_la-stb_image_write.lo -MD -MP -MF $(DEPDIR)/libsixel_imageio_la-stb_image_write.Tpo -c -o libsixel_imageio_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_imageio_la-stb_image_write.Tpo $(DEPDIR)/libsixel_imageio_la-stb_image_write.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='libsixel_imageio_la-stb_image_write.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_imageio_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_imageio_la_CFLAGS) $(CFLAGS) -c -o libsixel_imageio_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c - libsixel_la-output.lo: output.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-output.lo -MD -MP -MF $(DEPDIR)/libsixel_la-output.Tpo -c -o libsixel_la-output.lo `test -f 'output.c' || echo '$(srcdir)/'`output.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-output.Tpo $(DEPDIR)/libsixel_la-output.Plo @@ -561,6 +536,34 @@ libsixel_la-scale.lo: scale.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-scale.lo `test -f 'scale.c' || echo '$(srcdir)/'`scale.c +libsixel_la-loader.lo: loader.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-loader.lo -MD -MP -MF $(DEPDIR)/libsixel_la-loader.Tpo -c -o libsixel_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-loader.Tpo $(DEPDIR)/libsixel_la-loader.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='loader.c' object='libsixel_la-loader.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c + +libsixel_la-frompnm.lo: frompnm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-frompnm.lo -MD -MP -MF $(DEPDIR)/libsixel_la-frompnm.Tpo -c -o libsixel_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-frompnm.Tpo $(DEPDIR)/libsixel_la-frompnm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frompnm.c' object='libsixel_la-frompnm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c + +libsixel_la-writer.lo: writer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-writer.lo -MD -MP -MF $(DEPDIR)/libsixel_la-writer.Tpo -c -o libsixel_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-writer.Tpo $(DEPDIR)/libsixel_la-writer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='writer.c' object='libsixel_la-writer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c + +libsixel_la-stb_image_write.lo: stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-stb_image_write.lo -MD -MP -MF $(DEPDIR)/libsixel_la-stb_image_write.Tpo -c -o libsixel_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-stb_image_write.Tpo $(DEPDIR)/libsixel_la-stb_image_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stb_image_write.c' object='libsixel_la-stb_image_write.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c + mostlyclean-libtool: -rm -f *.lo From d916958f4bc2734a17579c59c2fdb69b4da2f4d8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 16:29:58 +0900 Subject: [PATCH 092/451] Aggregate sixel-imageio.h and sixel.h into the one header --- configure | 3 +- configure.ac | 1 - converters/img2sixel.c | 2 +- converters/sixel2png.c | 1 - include/Makefile.am | 2 +- include/Makefile.in | 9 ++--- include/sixel-imageio.h.in | 82 -------------------------------------- include/sixel.h.in | 54 +++++++++++++++++++++++++ src/loader.c | 1 - src/writer.c | 1 - 10 files changed, 60 insertions(+), 96 deletions(-) delete mode 100644 include/sixel-imageio.h.in diff --git a/configure b/configure index 7b9c1b82..8075bf69 100755 --- a/configure +++ b/configure @@ -14797,7 +14797,7 @@ else fi -ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h include/sixel-imageio.h src/Makefile include/Makefile converters/Makefile" +ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h src/Makefile include/Makefile converters/Makefile" cat >confcache <<\_ACEOF @@ -15849,7 +15849,6 @@ do "libsixel.pc") CONFIG_FILES="$CONFIG_FILES libsixel.pc" ;; "package.json.in") CONFIG_FILES="$CONFIG_FILES package.json.in" ;; "include/sixel.h") CONFIG_FILES="$CONFIG_FILES include/sixel.h" ;; - "include/sixel-imageio.h") CONFIG_FILES="$CONFIG_FILES include/sixel-imageio.h" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "converters/Makefile") CONFIG_FILES="$CONFIG_FILES converters/Makefile" ;; diff --git a/configure.ac b/configure.ac index a2bca34d..d96424db 100644 --- a/configure.ac +++ b/configure.ac @@ -420,7 +420,6 @@ AC_CONFIG_FILES([Makefile libsixel.pc package.json.in include/sixel.h - include/sixel-imageio.h src/Makefile include/Makefile converters/Makefile]) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 279d9f74..716ff021 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -66,7 +66,7 @@ #endif #include -#include + /* loop modes */ enum loopMode { diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 45d259a7..4637a2f3 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -55,7 +55,6 @@ #endif #include -#include static int diff --git a/include/Makefile.am b/include/Makefile.am index fe97ffb8..0043c256 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1 +1 @@ -include_HEADERS = sixel.h sixel-imageio.h +include_HEADERS = sixel.h diff --git a/include/Makefile.in b/include/Makefile.in index 693a0e2d..42c4d437 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -80,8 +80,7 @@ build_triplet = @build@ host_triplet = @host@ subdir = include DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/sixel.h.in $(srcdir)/sixel-imageio.h.in \ - $(include_HEADERS) + $(srcdir)/sixel.h.in $(include_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -92,7 +91,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = sixel.h sixel-imageio.h +CONFIG_CLEAN_FILES = sixel.h CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) @@ -298,7 +297,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ -include_HEADERS = sixel.h sixel-imageio.h +include_HEADERS = sixel.h all: all-am .SUFFIXES: @@ -334,8 +333,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): sixel.h: $(top_builddir)/config.status $(srcdir)/sixel.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -sixel-imageio.h: $(top_builddir)/config.status $(srcdir)/sixel-imageio.h.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo diff --git a/include/sixel-imageio.h.in b/include/sixel-imageio.h.in deleted file mode 100644 index f7c1d72f..00000000 --- a/include/sixel-imageio.h.in +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2014,2015 Hayaki Saito - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIBSIXEL_SIXEL_IMAGEIO_H -#define LIBSIXEL_SIXEL_IMAGEIO_H - -/* loader API */ - -enum imageFormat { - FORMAT_GIF = 0, /* read only */ - FORMAT_PNG = 1, /* read/write */ - FORMAT_BMP = 2, /* read only */ - FORMAT_JPG = 3, /* read only */ - FORMAT_TGA = 4, /* read only */ - FORMAT_WBMP = 5, /* read only with --with-gd configure option */ - FORMAT_TIFF = 6, /* read only */ - FORMAT_SIXEL = 7, /* read only */ - FORMAT_PNM = 8, /* read only */ - FORMAT_GD2 = 9, /* read only with --with-gd configure option */ - FORMAT_PSD = 10, /* read only */ - FORMAT_HDR = 11, /* read only */ -}; - -#ifdef __cplusplus -extern "C" { -#endif - -/* load image from file */ -int -sixel_helper_load_image_file( - unsigned char /* out */ **ppixels, /* loaded pixel data */ - unsigned char /* out */ **ppalette, /* loaded palette data */ - int /* out */ *psx, /* image width */ - int /* out */ *psy, /* image height */ - int /* out */ *pncolors, /* palette colors */ - int /* out */ *ppixelformat, /* one of enum pixelFormat */ - int /* out */ *pframe_count, /* frame count */ - int /* out */ *ploop_count, /* loop count */ - int /* out */ **ppdelay, /* delay for each frames */ - char const /* in */ *filename, /* source file name */ - int /* in */ fstatic, /* whether to extract static image */ - int /* in */ reqcolors, /* requested number of colors */ - unsigned char /* in */ *bgcolor); /* background color */ - -/* write image to file */ -int -sixel_helper_write_image_file( - unsigned char /* in */ *data, /* source pixel data */ - int /* in */ width, /* source data width */ - int /* in */ height, /* source data height */ - unsigned char /* in */ *palette, /* palette of source data */ - int /* in */ pixelformat, /* source pixelFormat */ - char const /* in */ *filename, /* destination filename */ - int /* in */ imageformat); /* one of enum imageformat */ - -#ifdef __cplusplus -} -#endif - -#endif /* LIBSIXEL_SIXEL_IMAGEIO_H */ - -/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ -/* vim: set expandtab ts=4 : */ -/* EOF */ diff --git a/include/sixel.h.in b/include/sixel.h.in index 26042a87..9c2abd72 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -393,6 +393,60 @@ sixel_helper_scale_image( } #endif +/* image loader/writer API */ + +enum imageFormat { + FORMAT_GIF = 0, /* read only */ + FORMAT_PNG = 1, /* read/write */ + FORMAT_BMP = 2, /* read only */ + FORMAT_JPG = 3, /* read only */ + FORMAT_TGA = 4, /* read only */ + FORMAT_WBMP = 5, /* read only with --with-gd configure option */ + FORMAT_TIFF = 6, /* read only */ + FORMAT_SIXEL = 7, /* read only */ + FORMAT_PNM = 8, /* read only */ + FORMAT_GD2 = 9, /* read only with --with-gd configure option */ + FORMAT_PSD = 10, /* read only */ + FORMAT_HDR = 11, /* read only */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/* load image from file */ +int +sixel_helper_load_image_file( + unsigned char /* out */ **ppixels, /* loaded pixel data */ + unsigned char /* out */ **ppalette, /* loaded palette data */ + int /* out */ *psx, /* image width */ + int /* out */ *psy, /* image height */ + int /* out */ *pncolors, /* palette colors */ + int /* out */ *ppixelformat, /* one of enum pixelFormat */ + int /* out */ *pframe_count, /* frame count */ + int /* out */ *ploop_count, /* loop count */ + int /* out */ **ppdelay, /* delay for each frames */ + char const /* in */ *filename, /* source file name */ + int /* in */ fstatic, /* whether to extract static image */ + int /* in */ reqcolors, /* requested number of colors */ + unsigned char /* in */ *bgcolor); /* background color */ + +/* write image to file */ +int +sixel_helper_write_image_file( + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename, /* destination filename */ + int /* in */ imageformat); /* one of enum imageformat */ + +#ifdef __cplusplus +} +#endif + + #endif /* LIBSIXEL_SIXEL_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/loader.c b/src/loader.c index 66a44d6b..fbb730c7 100644 --- a/src/loader.c +++ b/src/loader.c @@ -81,7 +81,6 @@ #include #include "frompnm.h" #include -#include #define STBI_NO_STDIO 1 #define STB_IMAGE_IMPLEMENTATION 1 diff --git a/src/writer.c b/src/writer.c index 8a4e9ddb..c93a4006 100644 --- a/src/writer.c +++ b/src/writer.c @@ -36,7 +36,6 @@ #endif #include -#include #if !defined(HAVE_MEMCPY) # define memcpy(d, s, n) (bcopy ((s), (d), (n))) From 9af31ae6955eda676fc19779ffcd1f89f4c6053b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 19:18:05 +0900 Subject: [PATCH 093/451] Import PngSuite images and add its license description --- LICENSE.pngsuite | 8 ++++++++ README.md | 14 ++++++++++++-- images/pngsuite/background/bgai4a08.png | Bin 0 -> 214 bytes images/pngsuite/background/bgai4a16.png | Bin 0 -> 2855 bytes images/pngsuite/background/bgan6a08.png | Bin 0 -> 184 bytes images/pngsuite/background/bgan6a16.png | Bin 0 -> 3435 bytes images/pngsuite/background/bgbn4a08.png | Bin 0 -> 140 bytes images/pngsuite/background/bggn4a16.png | Bin 0 -> 2220 bytes images/pngsuite/background/bgwn6a08.png | Bin 0 -> 202 bytes images/pngsuite/background/bgyn6a16.png | Bin 0 -> 3453 bytes images/pngsuite/basic/basn0g01.png | Bin 0 -> 164 bytes images/pngsuite/basic/basn0g02.png | Bin 0 -> 104 bytes images/pngsuite/basic/basn0g04.png | Bin 0 -> 145 bytes images/pngsuite/basic/basn0g08.png | Bin 0 -> 138 bytes images/pngsuite/basic/basn0g16.png | Bin 0 -> 167 bytes images/pngsuite/basic/basn2c08.png | Bin 0 -> 145 bytes images/pngsuite/basic/basn2c16.png | Bin 0 -> 302 bytes images/pngsuite/basic/basn3p01.png | Bin 0 -> 112 bytes images/pngsuite/basic/basn3p02.png | Bin 0 -> 146 bytes images/pngsuite/basic/basn3p04.png | Bin 0 -> 216 bytes images/pngsuite/basic/basn3p08.png | Bin 0 -> 1286 bytes images/pngsuite/basic/basn4a08.png | Bin 0 -> 126 bytes images/pngsuite/basic/basn4a16.png | Bin 0 -> 2206 bytes images/pngsuite/basic/basn6a08.png | Bin 0 -> 184 bytes images/pngsuite/basic/basn6a16.png | Bin 0 -> 3435 bytes images/pngsuite/chunk/ccwn2c08.png | Bin 0 -> 1514 bytes images/pngsuite/chunk/ccwn3p08.png | Bin 0 -> 1554 bytes images/pngsuite/chunk/cdfn2c08.png | Bin 0 -> 404 bytes images/pngsuite/chunk/cdhn2c08.png | Bin 0 -> 344 bytes images/pngsuite/chunk/cdsn2c08.png | Bin 0 -> 232 bytes images/pngsuite/chunk/cdun2c08.png | Bin 0 -> 724 bytes images/pngsuite/chunk/ch1n3p04.png | Bin 0 -> 258 bytes images/pngsuite/chunk/ch2n3p08.png | Bin 0 -> 1810 bytes images/pngsuite/chunk/cm0n0g04.png | Bin 0 -> 292 bytes images/pngsuite/chunk/cm7n0g04.png | Bin 0 -> 292 bytes images/pngsuite/chunk/cm9n0g04.png | Bin 0 -> 292 bytes images/pngsuite/chunk/cs3n2c16.png | Bin 0 -> 214 bytes images/pngsuite/chunk/cs3n3p08.png | Bin 0 -> 259 bytes images/pngsuite/chunk/cs5n2c08.png | Bin 0 -> 186 bytes images/pngsuite/chunk/cs5n3p08.png | Bin 0 -> 271 bytes images/pngsuite/chunk/cs8n2c08.png | Bin 0 -> 149 bytes images/pngsuite/chunk/cs8n3p08.png | Bin 0 -> 256 bytes images/pngsuite/chunk/ct0n0g04.png | Bin 0 -> 273 bytes images/pngsuite/chunk/ct1n0g04.png | Bin 0 -> 792 bytes images/pngsuite/chunk/cten0g04.png | Bin 0 -> 742 bytes images/pngsuite/chunk/ctfn0g04.png | Bin 0 -> 716 bytes images/pngsuite/chunk/ctgn0g04.png | Bin 0 -> 1182 bytes images/pngsuite/chunk/cthn0g04.png | Bin 0 -> 1269 bytes images/pngsuite/chunk/ctjn0g04.png | Bin 0 -> 941 bytes images/pngsuite/chunk/ctzn0g04.png | Bin 0 -> 753 bytes images/pngsuite/corrupted/xc1n0g08.png | Bin 0 -> 138 bytes images/pngsuite/corrupted/xc9n2c08.png | Bin 0 -> 145 bytes images/pngsuite/corrupted/xcrn0g04.png | Bin 0 -> 145 bytes images/pngsuite/corrupted/xcsn0g01.png | Bin 0 -> 164 bytes images/pngsuite/corrupted/xd0n2c08.png | Bin 0 -> 145 bytes images/pngsuite/corrupted/xd3n2c08.png | Bin 0 -> 145 bytes images/pngsuite/corrupted/xd9n2c08.png | Bin 0 -> 145 bytes images/pngsuite/corrupted/xdtn0g01.png | Bin 0 -> 61 bytes images/pngsuite/corrupted/xhdn0g08.png | Bin 0 -> 138 bytes images/pngsuite/corrupted/xlfn0g04.png | Bin 0 -> 145 bytes images/pngsuite/corrupted/xs1n0g01.png | Bin 0 -> 164 bytes images/pngsuite/corrupted/xs2n0g01.png | Bin 0 -> 164 bytes images/pngsuite/corrupted/xs4n0g01.png | Bin 0 -> 164 bytes images/pngsuite/corrupted/xs7n0g01.png | Bin 0 -> 164 bytes images/pngsuite/filter/f00n0g08.png | Bin 0 -> 319 bytes images/pngsuite/filter/f00n2c08.png | Bin 0 -> 2475 bytes images/pngsuite/filter/f01n0g08.png | Bin 0 -> 321 bytes images/pngsuite/filter/f01n2c08.png | Bin 0 -> 1180 bytes images/pngsuite/filter/f02n0g08.png | Bin 0 -> 355 bytes images/pngsuite/filter/f02n2c08.png | Bin 0 -> 1729 bytes images/pngsuite/filter/f03n0g08.png | Bin 0 -> 389 bytes images/pngsuite/filter/f03n2c08.png | Bin 0 -> 1291 bytes images/pngsuite/filter/f04n0g08.png | Bin 0 -> 269 bytes images/pngsuite/filter/f04n2c08.png | Bin 0 -> 985 bytes images/pngsuite/filter/f99n0g04.png | Bin 0 -> 426 bytes images/pngsuite/gamma/g03n0g16.png | Bin 0 -> 345 bytes images/pngsuite/gamma/g03n2c08.png | Bin 0 -> 370 bytes images/pngsuite/gamma/g03n3p04.png | Bin 0 -> 214 bytes images/pngsuite/gamma/g04n0g16.png | Bin 0 -> 363 bytes images/pngsuite/gamma/g04n2c08.png | Bin 0 -> 377 bytes images/pngsuite/gamma/g04n3p04.png | Bin 0 -> 219 bytes images/pngsuite/gamma/g05n0g16.png | Bin 0 -> 339 bytes images/pngsuite/gamma/g05n2c08.png | Bin 0 -> 350 bytes images/pngsuite/gamma/g05n3p04.png | Bin 0 -> 206 bytes images/pngsuite/gamma/g07n0g16.png | Bin 0 -> 321 bytes images/pngsuite/gamma/g07n2c08.png | Bin 0 -> 340 bytes images/pngsuite/gamma/g07n3p04.png | Bin 0 -> 207 bytes images/pngsuite/gamma/g10n0g16.png | Bin 0 -> 262 bytes images/pngsuite/gamma/g10n2c08.png | Bin 0 -> 285 bytes images/pngsuite/gamma/g10n3p04.png | Bin 0 -> 214 bytes images/pngsuite/gamma/g25n0g16.png | Bin 0 -> 383 bytes images/pngsuite/gamma/g25n2c08.png | Bin 0 -> 405 bytes images/pngsuite/gamma/g25n3p04.png | Bin 0 -> 215 bytes images/pngsuite/interlacing/basi0g01.png | Bin 0 -> 217 bytes images/pngsuite/interlacing/basi0g02.png | Bin 0 -> 154 bytes images/pngsuite/interlacing/basi0g04.png | Bin 0 -> 247 bytes images/pngsuite/interlacing/basi0g08.png | Bin 0 -> 254 bytes images/pngsuite/interlacing/basi0g16.png | Bin 0 -> 299 bytes images/pngsuite/interlacing/basi2c08.png | Bin 0 -> 315 bytes images/pngsuite/interlacing/basi2c16.png | Bin 0 -> 595 bytes images/pngsuite/interlacing/basi3p01.png | Bin 0 -> 132 bytes images/pngsuite/interlacing/basi3p02.png | Bin 0 -> 193 bytes images/pngsuite/interlacing/basi3p04.png | Bin 0 -> 327 bytes images/pngsuite/interlacing/basi3p08.png | Bin 0 -> 1527 bytes images/pngsuite/interlacing/basi4a08.png | Bin 0 -> 214 bytes images/pngsuite/interlacing/basi4a16.png | Bin 0 -> 2855 bytes images/pngsuite/interlacing/basi6a08.png | Bin 0 -> 361 bytes images/pngsuite/interlacing/basi6a16.png | Bin 0 -> 4180 bytes images/pngsuite/odd/s01i3p01.png | Bin 0 -> 113 bytes images/pngsuite/odd/s01n3p01.png | Bin 0 -> 113 bytes images/pngsuite/odd/s02i3p01.png | Bin 0 -> 114 bytes images/pngsuite/odd/s02n3p01.png | Bin 0 -> 115 bytes images/pngsuite/odd/s03i3p01.png | Bin 0 -> 118 bytes images/pngsuite/odd/s03n3p01.png | Bin 0 -> 120 bytes images/pngsuite/odd/s04i3p01.png | Bin 0 -> 126 bytes images/pngsuite/odd/s04n3p01.png | Bin 0 -> 121 bytes images/pngsuite/odd/s05i3p02.png | Bin 0 -> 134 bytes images/pngsuite/odd/s05n3p02.png | Bin 0 -> 129 bytes images/pngsuite/odd/s06i3p02.png | Bin 0 -> 143 bytes images/pngsuite/odd/s06n3p02.png | Bin 0 -> 131 bytes images/pngsuite/odd/s07i3p02.png | Bin 0 -> 149 bytes images/pngsuite/odd/s07n3p02.png | Bin 0 -> 138 bytes images/pngsuite/odd/s08i3p02.png | Bin 0 -> 149 bytes images/pngsuite/odd/s08n3p02.png | Bin 0 -> 139 bytes images/pngsuite/odd/s09i3p02.png | Bin 0 -> 147 bytes images/pngsuite/odd/s09n3p02.png | Bin 0 -> 143 bytes images/pngsuite/odd/s32i3p04.png | Bin 0 -> 355 bytes images/pngsuite/odd/s32n3p04.png | Bin 0 -> 263 bytes images/pngsuite/odd/s33i3p04.png | Bin 0 -> 385 bytes images/pngsuite/odd/s33n3p04.png | Bin 0 -> 329 bytes images/pngsuite/odd/s34i3p04.png | Bin 0 -> 349 bytes images/pngsuite/odd/s34n3p04.png | Bin 0 -> 248 bytes images/pngsuite/odd/s35i3p04.png | Bin 0 -> 399 bytes images/pngsuite/odd/s35n3p04.png | Bin 0 -> 338 bytes images/pngsuite/odd/s36i3p04.png | Bin 0 -> 356 bytes images/pngsuite/odd/s36n3p04.png | Bin 0 -> 258 bytes images/pngsuite/odd/s37i3p04.png | Bin 0 -> 393 bytes images/pngsuite/odd/s37n3p04.png | Bin 0 -> 336 bytes images/pngsuite/odd/s38i3p04.png | Bin 0 -> 357 bytes images/pngsuite/odd/s38n3p04.png | Bin 0 -> 245 bytes images/pngsuite/odd/s39i3p04.png | Bin 0 -> 420 bytes images/pngsuite/odd/s39n3p04.png | Bin 0 -> 352 bytes images/pngsuite/odd/s40i3p04.png | Bin 0 -> 357 bytes images/pngsuite/odd/s40n3p04.png | Bin 0 -> 256 bytes images/pngsuite/order/oi1n0g16.png | Bin 0 -> 167 bytes images/pngsuite/order/oi1n2c16.png | Bin 0 -> 302 bytes images/pngsuite/order/oi2n0g16.png | Bin 0 -> 179 bytes images/pngsuite/order/oi2n2c16.png | Bin 0 -> 314 bytes images/pngsuite/order/oi4n0g16.png | Bin 0 -> 203 bytes images/pngsuite/order/oi4n2c16.png | Bin 0 -> 338 bytes images/pngsuite/order/oi9n0g16.png | Bin 0 -> 1283 bytes images/pngsuite/order/oi9n2c16.png | Bin 0 -> 3038 bytes images/pngsuite/palette/pp0n2c16.png | Bin 0 -> 962 bytes images/pngsuite/palette/pp0n6a08.png | Bin 0 -> 818 bytes images/pngsuite/palette/ps1n0g08.png | Bin 0 -> 1456 bytes images/pngsuite/palette/ps1n2c16.png | Bin 0 -> 1620 bytes images/pngsuite/palette/ps2n0g08.png | Bin 0 -> 2320 bytes images/pngsuite/palette/ps2n2c16.png | Bin 0 -> 2484 bytes images/pngsuite/transparency/tbbn0g04.png | Bin 0 -> 429 bytes images/pngsuite/transparency/tbbn2c16.png | Bin 0 -> 2041 bytes images/pngsuite/transparency/tbbn3p08.png | Bin 0 -> 1499 bytes images/pngsuite/transparency/tbgn2c16.png | Bin 0 -> 2041 bytes images/pngsuite/transparency/tbgn3p08.png | Bin 0 -> 1499 bytes images/pngsuite/transparency/tbrn2c08.png | Bin 0 -> 1633 bytes images/pngsuite/transparency/tbwn0g16.png | Bin 0 -> 1313 bytes images/pngsuite/transparency/tbwn3p08.png | Bin 0 -> 1496 bytes images/pngsuite/transparency/tbyn3p08.png | Bin 0 -> 1499 bytes images/pngsuite/transparency/tm3n3p02.png | Bin 0 -> 116 bytes images/pngsuite/transparency/tp0n0g08.png | Bin 0 -> 719 bytes images/pngsuite/transparency/tp0n2c08.png | Bin 0 -> 1594 bytes images/pngsuite/transparency/tp0n3p08.png | Bin 0 -> 1476 bytes images/pngsuite/transparency/tp1n3p08.png | Bin 0 -> 1483 bytes images/pngsuite/zlib/z00n2c08.png | Bin 0 -> 3172 bytes images/pngsuite/zlib/z03n2c08.png | Bin 0 -> 232 bytes images/pngsuite/zlib/z06n2c08.png | Bin 0 -> 224 bytes images/pngsuite/zlib/z09n2c08.png | Bin 0 -> 224 bytes 176 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 LICENSE.pngsuite create mode 100644 images/pngsuite/background/bgai4a08.png create mode 100644 images/pngsuite/background/bgai4a16.png create mode 100644 images/pngsuite/background/bgan6a08.png create mode 100644 images/pngsuite/background/bgan6a16.png create mode 100644 images/pngsuite/background/bgbn4a08.png create mode 100644 images/pngsuite/background/bggn4a16.png create mode 100644 images/pngsuite/background/bgwn6a08.png create mode 100644 images/pngsuite/background/bgyn6a16.png create mode 100644 images/pngsuite/basic/basn0g01.png create mode 100644 images/pngsuite/basic/basn0g02.png create mode 100644 images/pngsuite/basic/basn0g04.png create mode 100644 images/pngsuite/basic/basn0g08.png create mode 100644 images/pngsuite/basic/basn0g16.png create mode 100644 images/pngsuite/basic/basn2c08.png create mode 100644 images/pngsuite/basic/basn2c16.png create mode 100644 images/pngsuite/basic/basn3p01.png create mode 100644 images/pngsuite/basic/basn3p02.png create mode 100644 images/pngsuite/basic/basn3p04.png create mode 100644 images/pngsuite/basic/basn3p08.png create mode 100644 images/pngsuite/basic/basn4a08.png create mode 100644 images/pngsuite/basic/basn4a16.png create mode 100644 images/pngsuite/basic/basn6a08.png create mode 100644 images/pngsuite/basic/basn6a16.png create mode 100644 images/pngsuite/chunk/ccwn2c08.png create mode 100644 images/pngsuite/chunk/ccwn3p08.png create mode 100644 images/pngsuite/chunk/cdfn2c08.png create mode 100644 images/pngsuite/chunk/cdhn2c08.png create mode 100644 images/pngsuite/chunk/cdsn2c08.png create mode 100644 images/pngsuite/chunk/cdun2c08.png create mode 100644 images/pngsuite/chunk/ch1n3p04.png create mode 100644 images/pngsuite/chunk/ch2n3p08.png create mode 100644 images/pngsuite/chunk/cm0n0g04.png create mode 100644 images/pngsuite/chunk/cm7n0g04.png create mode 100644 images/pngsuite/chunk/cm9n0g04.png create mode 100644 images/pngsuite/chunk/cs3n2c16.png create mode 100644 images/pngsuite/chunk/cs3n3p08.png create mode 100644 images/pngsuite/chunk/cs5n2c08.png create mode 100644 images/pngsuite/chunk/cs5n3p08.png create mode 100644 images/pngsuite/chunk/cs8n2c08.png create mode 100644 images/pngsuite/chunk/cs8n3p08.png create mode 100644 images/pngsuite/chunk/ct0n0g04.png create mode 100644 images/pngsuite/chunk/ct1n0g04.png create mode 100644 images/pngsuite/chunk/cten0g04.png create mode 100644 images/pngsuite/chunk/ctfn0g04.png create mode 100644 images/pngsuite/chunk/ctgn0g04.png create mode 100644 images/pngsuite/chunk/cthn0g04.png create mode 100644 images/pngsuite/chunk/ctjn0g04.png create mode 100644 images/pngsuite/chunk/ctzn0g04.png create mode 100644 images/pngsuite/corrupted/xc1n0g08.png create mode 100644 images/pngsuite/corrupted/xc9n2c08.png create mode 100644 images/pngsuite/corrupted/xcrn0g04.png create mode 100644 images/pngsuite/corrupted/xcsn0g01.png create mode 100644 images/pngsuite/corrupted/xd0n2c08.png create mode 100644 images/pngsuite/corrupted/xd3n2c08.png create mode 100644 images/pngsuite/corrupted/xd9n2c08.png create mode 100644 images/pngsuite/corrupted/xdtn0g01.png create mode 100644 images/pngsuite/corrupted/xhdn0g08.png create mode 100644 images/pngsuite/corrupted/xlfn0g04.png create mode 100644 images/pngsuite/corrupted/xs1n0g01.png create mode 100644 images/pngsuite/corrupted/xs2n0g01.png create mode 100644 images/pngsuite/corrupted/xs4n0g01.png create mode 100644 images/pngsuite/corrupted/xs7n0g01.png create mode 100644 images/pngsuite/filter/f00n0g08.png create mode 100644 images/pngsuite/filter/f00n2c08.png create mode 100644 images/pngsuite/filter/f01n0g08.png create mode 100644 images/pngsuite/filter/f01n2c08.png create mode 100644 images/pngsuite/filter/f02n0g08.png create mode 100644 images/pngsuite/filter/f02n2c08.png create mode 100644 images/pngsuite/filter/f03n0g08.png create mode 100644 images/pngsuite/filter/f03n2c08.png create mode 100644 images/pngsuite/filter/f04n0g08.png create mode 100644 images/pngsuite/filter/f04n2c08.png create mode 100644 images/pngsuite/filter/f99n0g04.png create mode 100644 images/pngsuite/gamma/g03n0g16.png create mode 100644 images/pngsuite/gamma/g03n2c08.png create mode 100644 images/pngsuite/gamma/g03n3p04.png create mode 100644 images/pngsuite/gamma/g04n0g16.png create mode 100644 images/pngsuite/gamma/g04n2c08.png create mode 100644 images/pngsuite/gamma/g04n3p04.png create mode 100644 images/pngsuite/gamma/g05n0g16.png create mode 100644 images/pngsuite/gamma/g05n2c08.png create mode 100644 images/pngsuite/gamma/g05n3p04.png create mode 100644 images/pngsuite/gamma/g07n0g16.png create mode 100644 images/pngsuite/gamma/g07n2c08.png create mode 100644 images/pngsuite/gamma/g07n3p04.png create mode 100644 images/pngsuite/gamma/g10n0g16.png create mode 100644 images/pngsuite/gamma/g10n2c08.png create mode 100644 images/pngsuite/gamma/g10n3p04.png create mode 100644 images/pngsuite/gamma/g25n0g16.png create mode 100644 images/pngsuite/gamma/g25n2c08.png create mode 100644 images/pngsuite/gamma/g25n3p04.png create mode 100644 images/pngsuite/interlacing/basi0g01.png create mode 100644 images/pngsuite/interlacing/basi0g02.png create mode 100644 images/pngsuite/interlacing/basi0g04.png create mode 100644 images/pngsuite/interlacing/basi0g08.png create mode 100644 images/pngsuite/interlacing/basi0g16.png create mode 100644 images/pngsuite/interlacing/basi2c08.png create mode 100644 images/pngsuite/interlacing/basi2c16.png create mode 100644 images/pngsuite/interlacing/basi3p01.png create mode 100644 images/pngsuite/interlacing/basi3p02.png create mode 100644 images/pngsuite/interlacing/basi3p04.png create mode 100644 images/pngsuite/interlacing/basi3p08.png create mode 100644 images/pngsuite/interlacing/basi4a08.png create mode 100644 images/pngsuite/interlacing/basi4a16.png create mode 100644 images/pngsuite/interlacing/basi6a08.png create mode 100644 images/pngsuite/interlacing/basi6a16.png create mode 100644 images/pngsuite/odd/s01i3p01.png create mode 100644 images/pngsuite/odd/s01n3p01.png create mode 100644 images/pngsuite/odd/s02i3p01.png create mode 100644 images/pngsuite/odd/s02n3p01.png create mode 100644 images/pngsuite/odd/s03i3p01.png create mode 100644 images/pngsuite/odd/s03n3p01.png create mode 100644 images/pngsuite/odd/s04i3p01.png create mode 100644 images/pngsuite/odd/s04n3p01.png create mode 100644 images/pngsuite/odd/s05i3p02.png create mode 100644 images/pngsuite/odd/s05n3p02.png create mode 100644 images/pngsuite/odd/s06i3p02.png create mode 100644 images/pngsuite/odd/s06n3p02.png create mode 100644 images/pngsuite/odd/s07i3p02.png create mode 100644 images/pngsuite/odd/s07n3p02.png create mode 100644 images/pngsuite/odd/s08i3p02.png create mode 100644 images/pngsuite/odd/s08n3p02.png create mode 100644 images/pngsuite/odd/s09i3p02.png create mode 100644 images/pngsuite/odd/s09n3p02.png create mode 100644 images/pngsuite/odd/s32i3p04.png create mode 100644 images/pngsuite/odd/s32n3p04.png create mode 100644 images/pngsuite/odd/s33i3p04.png create mode 100644 images/pngsuite/odd/s33n3p04.png create mode 100644 images/pngsuite/odd/s34i3p04.png create mode 100644 images/pngsuite/odd/s34n3p04.png create mode 100644 images/pngsuite/odd/s35i3p04.png create mode 100644 images/pngsuite/odd/s35n3p04.png create mode 100644 images/pngsuite/odd/s36i3p04.png create mode 100644 images/pngsuite/odd/s36n3p04.png create mode 100644 images/pngsuite/odd/s37i3p04.png create mode 100644 images/pngsuite/odd/s37n3p04.png create mode 100644 images/pngsuite/odd/s38i3p04.png create mode 100644 images/pngsuite/odd/s38n3p04.png create mode 100644 images/pngsuite/odd/s39i3p04.png create mode 100644 images/pngsuite/odd/s39n3p04.png create mode 100644 images/pngsuite/odd/s40i3p04.png create mode 100644 images/pngsuite/odd/s40n3p04.png create mode 100644 images/pngsuite/order/oi1n0g16.png create mode 100644 images/pngsuite/order/oi1n2c16.png create mode 100644 images/pngsuite/order/oi2n0g16.png create mode 100644 images/pngsuite/order/oi2n2c16.png create mode 100644 images/pngsuite/order/oi4n0g16.png create mode 100644 images/pngsuite/order/oi4n2c16.png create mode 100644 images/pngsuite/order/oi9n0g16.png create mode 100644 images/pngsuite/order/oi9n2c16.png create mode 100644 images/pngsuite/palette/pp0n2c16.png create mode 100644 images/pngsuite/palette/pp0n6a08.png create mode 100644 images/pngsuite/palette/ps1n0g08.png create mode 100644 images/pngsuite/palette/ps1n2c16.png create mode 100644 images/pngsuite/palette/ps2n0g08.png create mode 100644 images/pngsuite/palette/ps2n2c16.png create mode 100644 images/pngsuite/transparency/tbbn0g04.png create mode 100644 images/pngsuite/transparency/tbbn2c16.png create mode 100644 images/pngsuite/transparency/tbbn3p08.png create mode 100644 images/pngsuite/transparency/tbgn2c16.png create mode 100644 images/pngsuite/transparency/tbgn3p08.png create mode 100644 images/pngsuite/transparency/tbrn2c08.png create mode 100644 images/pngsuite/transparency/tbwn0g16.png create mode 100644 images/pngsuite/transparency/tbwn3p08.png create mode 100644 images/pngsuite/transparency/tbyn3p08.png create mode 100644 images/pngsuite/transparency/tm3n3p02.png create mode 100644 images/pngsuite/transparency/tp0n0g08.png create mode 100644 images/pngsuite/transparency/tp0n2c08.png create mode 100644 images/pngsuite/transparency/tp0n3p08.png create mode 100644 images/pngsuite/transparency/tp1n3p08.png create mode 100644 images/pngsuite/zlib/z00n2c08.png create mode 100644 images/pngsuite/zlib/z03n2c08.png create mode 100644 images/pngsuite/zlib/z06n2c08.png create mode 100644 images/pngsuite/zlib/z09n2c08.png diff --git a/LICENSE.pngsuite b/LICENSE.pngsuite new file mode 100644 index 00000000..6f96cebe --- /dev/null +++ b/LICENSE.pngsuite @@ -0,0 +1,8 @@ +PngSuite +-------- + +Permission to use, copy, modify and distribute these images for any +purpose and without fee is hereby granted. + + +(c) Willem van Schaik, 1996, 2011 diff --git a/README.md b/README.md index 5568bf7f..3ed19e20 100644 --- a/README.md +++ b/README.md @@ -843,6 +843,18 @@ images/vimperator3.png is in the public domain. url: http://quadrantem.com/~k_wizard/vimprtan/ +#### PngSuite + +Images under the directory images/pngsuite/ are imported from +[PngSuite](http://www.schaik.com/pngsuite/) created by Willem van Schaik. + +> Permission to use, copy, modify and distribute these images for any +> purpose and without fee is hereby granted. +> +> +>(c) Willem van Schaik, 1996, 2011 + + ## References ### ImageMagick @@ -981,5 +993,3 @@ img2sixel in reference to the line-up of filters of MagickCore's resize.c. - [SIXEL to PostScript converter](http://t.co/zTC7LhRbBc) - - diff --git a/images/pngsuite/background/bgai4a08.png b/images/pngsuite/background/bgai4a08.png new file mode 100644 index 0000000000000000000000000000000000000000..398132be5faadf83e159ac59c212213bcd43a894 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE!oa||uB7QDki(Mh=l@|1T-)pTTjSfo?;6Ga8{R(IDkmelNXRj)ZH9oA|PM{kg$m&gMT07S3iqx$gt>#1~b*D~%?ISJ;?`E{!%Qxx!#mpQpGpa(A8H z_iZ|MVh@5=q!mUuvSsYMxvKp95>weV2Kff8ej5&Q`t30L(azh))$_*RmQyw|G#2PE N22WQ%mvv4FO#oeUP~QLm literal 0 HcmV?d00001 diff --git a/images/pngsuite/background/bgai4a16.png b/images/pngsuite/background/bgai4a16.png new file mode 100644 index 0000000000000000000000000000000000000000..51192e731106e77cec52a3acda3d0c3cd54a16d5 GIT binary patch literal 2855 zcmV+?3)u9DP)g!L)UG2f4l6J=4p4#(2+)EA zvXHcTS1ax6t#q~OA5Tm&Z9J1dzH`ppKkj_bx#xV(x!C~bO!&>~VAnvFITMTviN3hTRvvh5o9_Li#WZ{Cau%@5fj4SqfkHXeXW_kl8PG~_?ADWrA$ zH!S0goyyC9fY0`aGL_B#ZB3zaMcUqyN1D1DLhN@e}=^4=3 z34M)_RrMTn4OBh9u@5%(!^-c#e@=DqtErHss}R!u2+M$o_#+hMmhS%WC0(uX!iWbF z{{dH%(3XVCx6jrq541zuHeEfwO;^`G1Dyr%>+i$8*=Os&bQqyL&<;y_pydy`dg>`% zediiHlykOz>5mY_`#`zB3#1Fy9)S}=SASGt88e?ogreD)z#MoT#Z_WQ5&;M zzG>OMZg4k3ZXYOzL9q-N?F2gl!|Pz618#l~B2UAP$1J0w0uH_m-a1&+1k)Bk!C`Q} z4|y6W5dmT@^t}T&zYG_?205!OBkZzRzZWrcI~@8~XwJa?-B7&(X77RNQz5t&vNj%o z?y&Ce*ruzla?PxY!jdRdoq(z+6mN&~E8*Oq;Cv0tOUCT7S7Wvk5s=kp8MEHDsN8^< zwF_pAL-9WFghAN~+Ic8zhOuT)zXe52aQzW@uNks56Lj_SAq^Jk` zFeMKDI3)X>#7@LP{w<6IArXXl5PE{p6@*wJ=xS`lH7g7*Q!_iZ>FO<8SNndVtAq1( z)jpxCnMZVWEMHfX-_zBB>$=)gtE)F(*VU_qx;nexVW?DY0QUm8TCSOw7x+!zvoP(p z^Q4($koJM~5_FfswRX684=ieo+2wI4RzaB+2H$y@5`|9|YUTySZx+=;Wi7~WL9zor zYk@02gEOtL>{iUKoCC$HA$a$K!c!28g8vEly<0O+&+(hH(=hrm4AjFXcc7&gYS+Z< zxwoNYF9hP?Q^8fa0p_QicdxF7a2t3wYi8tWT^;(hu3j$H)g!&Sy0r*uYvI1z@P$UF zQ}w$HWE4iDF!C5Iei)WUpk=jYo?GcRzkL8+SQoSB-G)FdcuzxKBjm(EQ9%hDgUpMN z$%pYWkdH$7DyY~2OP6WpYp)8UDhm0#Ah!aP_rSFoT)%)U6O?OjLR!GcN*Fu_cdFsy z{jh%-e0(NmA3TV0_&7%BJ}7U2Kq*XV0JR2kZOC3*uCBSg(67WU`;|{d{YqP{UwLJP zU)gm^$iF%%WbP6nk3VJC{Qg5bGI~bHwMO;!TXyD==(>a=jU@Z+H4zPr>vu@P8fLNpKB8ZaesH zL(y9>V>JwW;nH%9_8>;uhHUGKx@J~bNL>n9HebklHVIjrE#%ZCLI$@Anf@Cghd&ZB zbx6qcppddn$jpmE4m8^}R-YZo(o7JB*62S9fn#vj{-r*^z-9;5mcQJ$wt!}e21QpP z5e6&lH?MEe%t8}}8(`!Dq%$yn9wv@}Yd7RHfO--j~&R3_VTIa~wXq1U-Y$#pKz9>&NOt^KuJOvOX@5mkP8JV$d7|J44z+25=d`=k$;Ai2FXT9EC*{U^sj*K zZok=fQZwhyh2aMwvmNsO4z%TtZh#Z{op<5JA-LQGSDN6;NvP0;QN6-43U7ly3cl0e z{WtK$!TnE=_Yac<#=3&y%2KjMfM zKz9T#u7nRBfzvZ!@jhX!Z?lZzS0E5@+Gt7?+|PoVg1mmn4MWb|8W<15_-{cbK|T*- zQAlqFyBbm{7&-|9)1mtmTwd)r_g~Y@kQIfj0?4`rS#ikP0Q?jbVL)ax zWIT{*gz<-9`~t|iFxCm9qhL2dD&*`4J->yElM%o6sxSZ^-UK@ygGF6Xyb`o}@I*lE zfZSZj@qy9=*^43jb#SenoGAt#sAlU|q1PmO8&jeik3Y^~L zr22(*f~u(V1TU# zJ_oi3QVlR%1Bp(sehIz3&{geJ_Tpp0*jgl5{6mj#6p#Oci(*~VgPCM1E5mdB8 z#V#n%gFurrqQUXYJ79blxZ9y<4RjpGXo*4D44AghnMhhUR3W`33X(1<~qBSrz1pX~BWewzo zoI(P~YlSKAg1;3;TVWysN-MZq9lZ!NLT@X^#lujz2mC=OcoTdjlfOlASZlPl_{~7d z`4t66KF9uQ69q@qvsAXt%q9I#IP^;|7^ix6>=L_yx>`2dh@V`j`6FF=a$IAc!002ovPDHLk FV1na*GhqM# literal 0 HcmV?d00001 diff --git a/images/pngsuite/background/bgan6a08.png b/images/pngsuite/background/bgan6a08.png new file mode 100644 index 0000000000000000000000000000000000000000..e6087387639b9cefaaafb696e29a8bd910ee0680 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+U~W1%@xC#RK{Io-U3d z6?5KRGvsP8;BkAXo|56e@Vk8|OTXfgyGLCsWP@G=X#A1))wtQkXb@LjH|PH@<7U}X zR(Ix8Y%6~9Ml4|WGnG@SZHQ?Kc`Uubi9hC!9z&%<$E5#{7BHGEsCHnVVk5wElR+}T f%%Pr9`U69dg47%_{vAF*s~J39{an^LB{Ts5$SFGl literal 0 HcmV?d00001 diff --git a/images/pngsuite/background/bgan6a16.png b/images/pngsuite/background/bgan6a16.png new file mode 100644 index 0000000000000000000000000000000000000000..984a99525f5246cbc5d7083dd79006c7efa0ab0b GIT binary patch literal 3435 zcmZu!c{tPy7yiwHA^TDk8bxze5;JmTFJcJU8M34%B>R?S{F;j_VaO70WeZum*~v0U z*|P7(3}t6VvJ;#28T78k1v z&nS8Zj|V!+Cq~}>9rPQ;ykO8hV z2EKCW7Ddi#?XnvF3Yult6PMiPefz4+jy&;)2U&ZfrSX*a=6K)yD>qi0s>$H~iV=n} zmbEi-{m_7ald!QN#R$~+L9$zWq*+fDHpPsDjGb$c^vc8$=d|&{uCi(c*Lau4j4I*v zv)&ew29i^ye2PVU{l0ESsGRKT9>jP6b$EZcKFVNmqFh<-8#Q}JV}B=JsL{YfgVmtI z0bRJ0Z|Bg#?Uq=UUBQcye=r9SSwqfLKgttV$Tc=hXWjfd{nh?U$^cOUXI6y`9T%7LIF@9s4 zD&J~;LGi>8FXppsHqhPIC8)MmaAY#UsqMXrOTYUVHCT7e`!P7>S)1>7q>I9hMB4O4 z5_0&`4R0RQoxW$rk-3_DuV6LO=5tg$`B_r64NIZUPAzY2(j1ZI8NIVUTk;ggdfIpl zS|o%VrP(rDyjmC?#)JNE^fe7?##Zp%VFBC8bSaW_p6XCto==v*aU~k=HoXJBT770I zopJn)+20m^?Z8B|O3ejeazQ^iB#Kr$8~Lo$$N&duguqq35wAA+3$=&;5ylTS&HuvrEXrjT2CC_zn&%< z_T5xOtH<4cC)wlhM&$D5dLv?3Rlapu%j*-4HJL%*W6$7uC<5AbNCWWC2Q9!fo&iaK5t<;@GY~pk2j^m zKED-44p(XXScLI887(yv9j)wVqWj)@@glTnWmSozx9h=@{28S1k2XlN-juMK|JRAB zO4zwg$b}4{M%T%7g;{)Ay4Ck0$b>KqSHIP9~rQ@CMR)dPTZV_KN@G; zir$G4S#CQfLaEP-+wMtC;fV~(c76y^vysKlry?7MWLG+iO!Jb5Xc*L$0RQC4Q;KTt*fs|L@?DU6=H(1*_E#JYR!z=$r0GeNco3$I$%PET z8S|dvkQ_7OxHjYWCZh^Pu3pFcWdPam2+_23Q)C{J^^9T*XrxRALb8nMDq!{JU18+z z!+p1jAh0-Z)KUI_AtmMifn=x-h9K5wb47CsE~-?ScboEIY!3D;$(N*sX3S%^L#lAZ zFoS(MBwsZpkS9atg$Nu0rLrI{+3+BP$bq8BG(Q$#hRXKGch-F$a0k_VHTAvQ7-XL* z#!+s(TU(H?T~7^7pj69y{YM<~4Ih6zSdfy|*If=#&7Cu99-(u8^l##BtPc6sj$DlYdLbbl#2?gpxXmS|ce@T-=Q9XF+uwSv2tjdTgt=}?owG!~+0Q2+?en2Nn1A7X z>(dty?OQ7z;6~A=pjui7dw-NEoTez-;yra5u#1AK?G?xd=n5Ssx>fE1CKDCwXl1BW zg==}T^M6U)G;7HJw@M!kJ_x1Mef`Kv>e1yoQgb(A|Ly$mc{2}z6;C7Rdr{pUs711p zn}}WT6Hzdl0%75zF8HB3S>R&L*c z1HJ^-fY)73#TuHxJR~&}eU=LteSw8E5$+nfEI(`RB}hD}r2x1~GH($t;;VR#kH7Yvy$V;RMtZXLcjSggIw|W{g0fDdVku?(->(O zW*!X#g15g!)SQ~-7$di_gN#o0j}Ft@z{mNPQ@~_rA2Wc8qNH=sTw}~DS8>dMwUuD?ewH!t zHP@fBNhMy`rH6Tlr98?Ym)Svw=N9W!!kbjgr+gotV)GvIo|g05FoR5nr~-EllcQ@` zmv}4WccDmuAL#z!$&0~D!RuYkc}9EdU&%v$B@JZ+MKuha4j`yM8#o^&$a|GPfj2SY zg?xj`_XGe2pFJ&BQv%o)uwS^{x~hWQtITR=+F-A8zIve%EmU*5`TN6!+{sbM@pgPW zj@XFpeEOvx5o3E}OWh-W>ILaJsLbgrl#oy!R;pgf8S|%-aR?`oXYI4tX%;`0Nx>SK z5A?@i&PWMVBYwGAPscrOn;8s|SYTQ3w-xmNc5awbs;SE2ek8T$n-005TvzOw9bbtH zl9hXDCV2zxiM?HD`el1qCmNM8kGyP}smK*0^o3Jru|pMNC@`s%^N<{Ho3LosA>Lifn47S?7fNix$x`(x(%35p98Y6emi)Wf8&Wp zfF{BgSG5bS=|<&#b?%74`Jg|cjQ@x?YMnW^F=;3@v`p%3f4Z>5+e7M(irxs06nKqN zAMg<0vPwSaHyNL?*bB{6;)BcH$`+F}*LwE-b;%`c_2ZVA`RF&>8-Tb#9fA~ur*d#B z>a%m})i41^?(Xc!>vU1#L{7`JtAq<%SMJw>#nQel-jQW3G4rCNdUi~6d>UTM~d)wr)`X#0DdGI0}-A2tW8v5Yan7j?{7s!Zv@(HiY@%kHGP7nEWJd20wnm@QPnoS$AOl1cVuJk zM{h)`k{&jn%5XSoR`um2`CMpVQy?sBfJP7dj(*Pw_rBA**T2&5vV9WtZmMM`-5zfN z+Iv>CAPIU~!jrk8+>X|6!A89uwfrwrq;HO>6_Cl$ak}!Web`Ev%4EUyF0sE!T~HMnmVFEd|128zI!?sqI|)r;q4bxSQ2*OvWaet z5f3aqL23P^%IhdCyV{8~nc8z@e7M(U~>X2cs)3#S;}jkH04XtEsP1a>I`JFHHZ5 AY5)KL literal 0 HcmV?d00001 diff --git a/images/pngsuite/background/bgbn4a08.png b/images/pngsuite/background/bgbn4a08.png new file mode 100644 index 0000000000000000000000000000000000000000..7cbefc3bff08a9d91666d6b0f8b5cb1c896b7987 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtq=#3k+XOiwE+VlDyqr z7#LRdDjNZLrk*a2Ar*6y|C~Q?fU$K>hKZrl9G&};8q7NOZTlD(CmKkxg%~E72)G|^ k&|>Rhdz2v&aF~JNzLrAmk=Ly!fCeyly85}Sb4q9e08Xzba{vGU literal 0 HcmV?d00001 diff --git a/images/pngsuite/background/bggn4a16.png b/images/pngsuite/background/bggn4a16.png new file mode 100644 index 0000000000000000000000000000000000000000..13fd85ba193369dbd84a0dc07f73d3340485fa6a GIT binary patch literal 2220 zcmV;d2vhfoP))?Z7@1GU()&K|^FGh>0bpfeScg5Q zVAO&a&cd+)IQ~b-4#C+!!^K_j-evgc3Haw<;qG2ozb?Ob_sZEvPslSDcgg=`hvYMk z4ajGXTJjykx_l>qW@VvfTe+?o@D-uE0$LFQyCHB0^d^MfhURr>7s1nDV+1ouL#<%toKz$mb>Sfw9$NoD zuRm}G@SOqQg}(RtLucx>YCvShv8{A1qgh$$yvv2EVP$$}{d$u=YBv+<<$> zz}W)TgRndc{U;qe;zHjHm@&lxtq9sLq;uaKEX`V3-=m=IgJ2Bwy%W850@T-__AjWmVEHyI&BE5vnjOu6RR!~1=)I3XU^n=GCa`N` z;CmDn3z4kv4ER5Q;0hQe2%muUIyBz`Zv{55N&()8oUQv|^#s&Q;Jg6KM`6i?#R3eZ z9lJjPkqnrxK)47!^9q5$AqbRZ=Ke3GbKe=Lm{wMcLvRp`K?o0mH3*GCXzzi}pcK$9 zL8Am~C8+-$oDwXT;6Ej(lp$8H*;_w@XaM?lK=@nenE~T33IV+d`W_*ieo zO65pa(?Hjuw-+o6To+m`=yarjR!h$6b*NThX$dM7D3xI_?${64p??Cb3WR?RJ!vqC z5Sms9gx-eGE@69UQDz=okTDWGOUB@SPF0`qa$JzcYho`!)75RHPl z0=;Pn{Q>l6Aovdm6v2NV0Z)VWYa%kO4`tQX>q0oo64?7{V3c7l9?3=$Fr0u!LJC;C z2LHYdbGKn{*|B#%3EM1)rol9!rw*Ys=wlH0IryIke-SiKA+Rw58`nhPywkGh&9{W@ zt}8R&vQ0XVB;e|8D;wVrKRqf1e0~nDz7GcyHG5YXVy7T_7s5ke7@&U#!B@e55VYf< z-GuHL=)R>8=sXJ@L*#Yiu!xMeBCFPF3E|vPfqggu@%?b_d?Y(QE(M%B4==yu*pHWC zpbXYD7_*=+Kp+7A1<=yay<3UhFGc=+?4Mpnn7YQ=m5Rv)f6IrzbiJJX*S!NE>`GEvny$wzr zcK+&nYq$+UdC*^jKvS(@O0A(|ON?rTRG9FTrJfLDsa8c^7d{q|*;{t(U5f4cH&VdB zKIzm|r1R#46x<$$Mgv?E+`KZQHzT}wcx9w z?OlokT3+@%loz&}1(|uXAf0#8(okm}W>PYu^r);W8@8JR^Rt9T!*Y8c_vY7KIBmWzUV9!uD`ZX5KDJ=baoZPeI3qP6{?` z`0=l1jx86($c$r0QtHO?uFCB*D!mpZ!v%_xWV+QwwyP)w_>!XS{*)+OFe!U(B!%s* zl+4^qO6Qw1;G|$Pt2kg~YZ)socQrF6H=--;jDE40000rKjw}eL#0B;r2mf= uFq$o>c3_`kBfxT#K{CM1p`KCt14EF4)EqJX9X>#-89ZJ6T-G@yGywoV#zE8o literal 0 HcmV?d00001 diff --git a/images/pngsuite/background/bgyn6a16.png b/images/pngsuite/background/bgyn6a16.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3e9be58a823cf7c6535b1cadd96c45f15cca8b GIT binary patch literal 3453 zcmZu!c{J2rAOFpQA^TDknu_L8NzBM&r-(_&&X6TFA=$SqRR!&z?FhQ8d*nMdeLOqTE|7V`D^xEi9ev#PogWB$~k{h_)@{l)Pz zW!dl4tR0R0oj9QeeRmC3{c?MB!A_p7eLJ^nLTOexFGlX+96)3ZK2!BLS4=*~$RLe% z^V`%nyRXUpgw;(GS+Ll4qa^aD!e9CWKt=jbP1(kqw+~Jzyk+6{M!nk$%oIE_{i5qN zp(YSR7u)d=e^k#XebiB;At1-Ex< zcw-Xhh%}F=o%Pw`XE@f=Mx)R|A>;_nhS~h}!pIOF^n0tPsb4+1g6|6T-%g@SlB9A~ z2WxY^GX;*7Xt-JT^!sS_nkIL|@;79CU--2H6VWO$6M)GE{^SrZTYb`u8-YCW^LhEK{7z2O; z*=<>p?+~SKR)^V>;sKfDpKyt&?h7*dsMS=RFWjAKn=(D&HW zc^-*?w(U{?{L4WzFokD8)po=g->;wLequIop~pkjzr71D_xS2SfWN;#(nfEi@Kzix ze>9&%y_?TVSQdQ8tnKYZX}8O3fsw;h8a@?byiZ0+PDe#4`x@(fuv)wXEnHbu;^^so zxFmN5Dg2`q(xf{ntmgM^e6j*|eiL#rU8uojB29i4Uz#R+YH2r6h3i-iRz$PT%g9}` z*QCrRAL6s%&|0wklcUbs(8{&OW7cH-aeR%adV&@(Q^j*2b`f_NTXd zhV~=;H`ipv56y_1^YF)Gj9XDV(IU&O$3`gidUD%7tu8o`ZqddMA!;_T*m{>|!I11q zXOXF%au5yu+7h6JPp=l@eDA~syE|fXkggr??~|R2m^4aZ^{N89-uE^En@SqeR8yq1Tmu`y8Lo%OJ zYygeqi2z8Z5nTnW`m!sG+BcN0k#ARz9WFR>}6q)MF0!&lc z{+MCi_Xc-RP1jOBxQ;^hnW7zJ$GWry`Py{V&;&}AoacYSAy@zD$HN6lDLtL#VAY&C z!=_<6_b0zb?uM%1?`=5N;yR}l`MBDOLF?JiJPYNdH+u7l?c(+xFGQgRj1jRmfCAVCxCXXHzEn7RJD^A$cnP69`bs*@^bFcI(D znC_%zDmI3jW>H>*NXJdUG2j2W30BwlQ{?Qni*b(IS9gQwiqNjB1Yz5S`b9^ucCxmD zBR#;)kr{~|onWIWOSrlf7>G8yKVbF|mw=9-+fD)jDnh`AoIWThn-l{zw_Adk^EvMG zXurVpzW9{*D)pc<`*Qw}W#-_&<2n5IF;-PBIttd5;POq+y-l_$XS=!GR=3ENt15gN zI^wrJO#l^r+Y!}FLeiG5Gr$2~Jgfhk&c-4QO<*39l7T+U1&qAJLK+G844s#sH}w$2 zpVm+S+-2!^h?jAdyhgGh)(GcB2{)xcZZ*Bqz6x2LCXD!fG_COg=nAalSTdFM5Q5Na zy2l`wKl$(@d!x>eHvKGG3Wk|S!+@aeui@3FW;sU5t?VG9gZ-2J)Hd*GzWEd|(b3Bc zpdu-095m+`DPRP9zj7GHdCAV`59w;qVE3YQowzFcZ{945Mw691=PzneQt{hRMc*bv zNDb;Ux~gtH%Be>gp@Z(5-?LzSlLDz)?@LVH0PLP218VyyPCe+-X@=LGD##wlQt6S2|t0 z*nk$QKHW6)C_ZOm1ajOR-;E(QVmh9EtwTiH+}KigkDGi+dI2hP`Uu6xmxY$7S8zuE zsbmz)N#t4ka_%&XFUy2rwe&~&6EJ(Y7^)Gs+@yQkEq0q33>IHtS@5$F^!t8(h*F}d z%Hnn;x#yDxxuINJ)l_v}0UwL+!-SI_7c=BGo}l-KGxu~H)@c|-ZKy(h5u$3Nu2 zv-;`QU>ne)x5JsRhY{){sEBhIj8`uxU(f#l#a zsiW=L!V+&csVg#SBPc@P4NAS=U2MxT>7dVeY}$M;BtwZ0E^{mEoP?Ry^O-lrm$6k( zny2TZ-fnLIVgj`YQXrnn!L6vr&aGR`1RS}!u_G1eqQvp+<|!9(XSU9qZ~2QQy<5D) z%Ub8m3KNqq_n0IE^;(4BnPfB(F~nev`(b7Ymxz`jGyAq@L&~70JcU^#QAjNm%QL~I zp}7{LzN5T$nVbKdCx2??nG&cE&r+hlxGx+j!rzs;F?s^{kzfRbcj&P;QiZL6@NIcj z2Xte;0@?K8z3-pim)@>+cVs?(fxMfo%~(d8kDhp)`x*UUD?Dl=z;^T8!tY#DCuqu2 zOXR0Oytge?ZDS@Dw6MJ^6a64+BSMw*sOeO?{Ylfxudm4GLjoEDV43|idgu)L10&4q zZp&WZN}u!gNzkjYhMjb0tQlzQUeSWY>uw28MJ1M%|4bbXg19DUfAsJ>~1j!u$W-tfCllQZPNR0 zXI#6iSn$QMt&{Yg{^o zYpv&mVXpj{@@{hKUThOVnW)v_*~fnPE^!T4<*+=THUzM zH@Yw**nEyRnJl5cj{b1=Ub7c_p@G8-+18KZ;096baIs1jYMP3#kodv+(;effu5uAS zf9UG$a`=&C^14&XgNog&4=N&rTv}V<4_x~XwcL-+tf@X6S!pgB TFaLS`e*&EE@`;w61 literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn0g01.png b/images/pngsuite/basic/basn0g01.png new file mode 100644 index 0000000000000000000000000000000000000000..1d722423aa5157fe2b029af4e2bb07f478ebe8bb GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk~Bp9L@-6Me%OS+@4BLidG0>c;6;z7cmE{-7; zb9B#azopr0C;FL=l}o! literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn0g02.png b/images/pngsuite/basic/basn0g02.png new file mode 100644 index 0000000000000000000000000000000000000000..508332418fa86637d39e95268ec1d3658d120cae GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk`Bp75C+I9jdmUKs7M+U~W1%@xC#RK{Bo-U3d z6?2jkIAXub_k1+y2sp$L+}6)%%qgEdVJADoUeEf*ZqCk?AR|0o{an^LB{Ts5miHSU literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn0g04.png b/images/pngsuite/basic/basn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf3687863d8a1f53bef0aa24b841b21b0e04d9e GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk^Bp4c;6;(>fePZ!6K ziaE(C2`UUC949vOu(I~>b7=nfE^nVuX&@tFa7u7Oddi~87#=p(p8gM~{{27yqy1T- hp#)Io!PL|g7KVVQ{|ZeX-G~HP;_2$=vd$@?2>|oDDeM3M literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn0g16.png b/images/pngsuite/basic/basn0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c82f78eb954be5be51c35bd287e00018c69d82 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3Lq>1BpBEle`W(ImUKs7M+U~W1%@xC#RK_qo-U3d z6?3j$GUPg7z~dZf8U4Qg*qsHF4`@^yUDaY)e6!!)qG9=taAD!(1y)T7vK%uR?lygM zIK}cp><*ign#1-5wiApPcd>47oWOZOH-mqPPlA0u`y2l+k{0Ld8N_aQ--utQJ^wn$ N1)i>cF6*2UngAzTID!BG literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn2c08.png b/images/pngsuite/basic/basn2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..db5ad15865f56e48e4bae5b43661d2dbc4e847e3 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WSkfJR9T^zg78t&m77yfmc)B=- zRLpsM^&lsM0S}Wy>zj#xw-*UpyJ&w|_~YC|?Jc}4)(u=DKV%lXeNyXF;n2v$@6|4U rsD)ibtrx; literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn2c16.png b/images/pngsuite/basic/basn2c16.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1cb91a0171e9f34991b079fe932f5f0bb16d6 GIT binary patch literal 302 zcmV+}0nz@6P)NTxus~-YE?|ew94KIo9tHTv?hhRR zwrA%J^h9UxCeRmyPjW#d?oxNFL9(uFDZ1gBle+D$rIj`J+5;}Xa zfF63WfGT3xy1iYa$zve>zUI)9x>;M1&07*qoM6N<$g8PGj A5dZ)H literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn3p01.png b/images/pngsuite/basic/basn3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..b145c2b8eff1f4298e540bfae5c1351d015a3592 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^zg78t&m77ygJ1^9%x zzWcAFl=eSI>XI5zMAXy8F{ENn@&k4zHj_up0tD0@h%3W?AY}Lt#0>va?X`CSX(dk=$B>FS$v@Vz>816FsF9(VN75txh7sS~8e>Vez z3y|e3}y1F=z>r=LEEca@LnZf*~BA0ROZ5~$d#4)lIa>n+tGAx#s~NCh;!h=Q?&7t5~~Lk>mL*|1x+L`Ivp6mn?kJ^kK$c6a~%|NrOteLPR)ru^*4 zh?oc>ipx)wHw!xP<||VqG2mh2yNQ1IZKr30Xr(I7PBXU z(o_;ftk^?X5O*qmM)+A^aUR*s!>r3PlcI=3mc_D63M-aHQVj83+hHDKi)~wG8A%eb zMRFVzAa0kL4aW(lxy(-(A3@r7{KRdCcI^9^ zBwSWlMY4uMp(p@%T`0C7K$rnonuoRmLY9xP#5bTx(RKJi zCYfG^*s^*-{Ro^e4Kgw{Dlmv)JpjQ5bKwF@CLI|%59=nhA>e#HJh5GNjRLr(&Jco- zL=roU($L^w70~)&xPh+uFV&-K!K0w3W-9Hy@g@HWXL3ML4|%5ULen8 zlT@|D2@;VI*iada4446_ptp_#Sul*Cx7Y6>PlSiq8TyN-q=y}cXZX&@20)p=ihIP{CfA$Z*4W@ zEr$zzJ<~t_(0G1&!T9U{_Iz>DPFy@Dgq4(i*+1}U*ZiG1m)32#<4sRFJ5!AP>yZ}L zzdq~5lB&|C6*=qgy?nj!is#SN$*Gwo6M?qJgKJtd1_tvb_xS3qJuRh&eH)f1f0J@< z)4uq(Z_li{H~+s=+3L-xjU7X)ZvEUC-CLA+t^7d7$jI)tsK~;c&XdnBOC5Txp}1)@ zusm-vWl2G`{dnN}K>pDE=;yi{rVB@Y3B-HrtGOePxNz#}j}FD`z3|nlwikX+ZZ56= zAY&lKTUG9w&2^VN89D}o5=^>%~&6ID5>`0fk%7K&zZcY&F#znJTW|E zB5&cFwM~ly35&;HdZq5*>W9rM<&V4Wr%mNt{B`@CxYpR8I;^7!?Tc=wu6t&Du2Ec< zKIiz-xXN3dttqGahAW20Qo6MzgSk7e_{!(?CKyw`*?j|NY=7wG%F`JaWZ(VOm8CUr z$$no_)1uMK%W6)nN!IrL6EB>puUj#i+1xg}<&qUPnY6#j4&NW^MpZNn{t+Cq+^l@L JEAySt{s-!kV`~5a literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn4a08.png b/images/pngsuite/basic/basn4a08.png new file mode 100644 index 0000000000000000000000000000000000000000..3e13052201c9f8b90172ea2491b18d6d121c2786 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtq=#3k+XOiwE*eJzX3_ zD&{2rIe*{)W9ys@6GNprI`<_tn04&i_AxF_G>~EoF-$NKa6jCj#n!|2C_^IPFayJV XErr@6uUk(54Pfwe^>bP0l+XkK+-D@M literal 0 HcmV?d00001 diff --git a/images/pngsuite/basic/basn4a16.png b/images/pngsuite/basic/basn4a16.png new file mode 100644 index 0000000000000000000000000000000000000000..8243644d0743ebd1fdacb7923069fefbb01dab0e GIT binary patch literal 2206 zcmV;P2x0e$P)kEEkx>-b1@Qb$y-ohUek5*oTfx-A#6y^c`Q zE+sS)yU66wLTO83iFXm5i(N>*n3Idp^rFd-7Fe(v0)u8Hg(Rko(t3o_;+1WoY3fR? z;u%**k?mvsIhJ?vei@;3*EJZKPsh^xKJW8B&+`FbWnox{J*QyQf)~!hu>m;#N5~Gr z*+0X@UGUyz_~;4v=U?IOURb{_zjyb_*+);vGZ%Ns|73^cGmZ_&XO3F(9mBeOCxB*U zp=MjTt{LzZp}PWF5dym*a0v7!gx-ecb!ZpC(_mu+I?n=c$cJ>2a^`8!UXW*-DOjHb z_YkaIf>i_R6{x46R)AUxtZXgQHLOFeVC9@tBpY?%Ar~H6|39xka0c+50pEqb_xeL; z>a}V>WX7?rbSB#R07d+ApMY-yAH>T3O$tpzVWT4D`KV9D#5e8fT$B0UQ0W`4d&ZJhZPsBMV$%MrM45S^qKLL>pn6E&%2tD%( zfxsaMlx61rFQs$e8K{_6R*OS$5R5?x4}vuajX`MdfzF^5&@Mrv1ZyRz{~eqXESKOv zC8(4kRQ&NCC3e`!t zTZ4s<;Z`0-CLBBdHEi7qkvf2J|EZXCOGP5NH>n6_-74c*6GZ37L6suXG-K z4CW`TtWk#kGCXQS`*SIvW& ze;)x)gZ678GOZ6~)z<4mILi{)`)Xj6VJ;rYMiMZbfJQTN3< z-w!`MDg}Ig4z9ir2NE@VR~cfbAbJpyzjJG1I)@lji+);sjI05nfaPE90J3cN2oI4LMzvS4Dmtmj`)-)Kipf5lm0R9Eg z($KwIiQO+n{(bK$1b72BlcMdLkBGu;UX?xXbcF5RDVcdAA)Swp!;446R4=_#v$t=D zz6+p#1O8K>O@QxD;PZj64qX$_)dyW8(DgUyDgtM~$B+D@)ok(ejv=nLaagq78xe(T zwPerTQDOVyHJSOj^U^uMi$~z)m*DX-4D18zgc`veH3Ac~yc)q}HG(AgY|tG00TSjE z39l#;mV|^Wv$E%vxUl`|`!e(G+og+_Uy_0jBw$w@Vv`WfKS07T1Ph9UIYq+fpnH!( z;D2j4rPeSn#&p)`Qj5U(Rr4MKU)UxPqX ztzk;7p<_#oYK2so@RX&V5M!xUMP3&^7LnOocI;h>?fN%Tz`#D~+=;_n9NcNR_n;7s zK<_CC-2h!vLX-smkV2q&9h#r2B=eN=^OCsQ(voQVt-L7Q&L?Hht!ZI9$joDt(z!bg z^OMk=0QYNHU4=*(%mVbj1IA4y#YrW_j;#XZ?^TR?UBZO(f>>&$BE~W@;n+h@D`@Wu z$+QV6z?hYpZ?mNH=7bd79)?B(Toc^9GNU(@8Kod-D+Jaj!40VlcSDlQ@=@{gQdwLr z{7&Zb}S~Y7L5w23`5q-r&J^mkTcViXI59GbI+3oJQLb^Xa=CM0~+5#BMC-O zA+UA{R^F8K>THn=w^)!Q^Kf1Hd0kwsr!Ly=Ul4@@*>gQCY&S<_=B_E7dnQy&=%m3* zDCd0zS}ADFD+E>zs2dWUs|O`O4x}A>>t~W=B5CF4X>qmStD@~)iUV3+_B@mqwwnc+ zd9xs$chb^OXB50E(5^x|39aW80`&^qb0xPgtMuBRkPK&4ggm`H%Fo9{P`Y=EwuAib zKPY=1x*=>g=Va#1fOOs&mBuk$A(S{Hf;FuuV#)d7sbeoV@Fcz z#`3Pp?K3L97A3<4ijriy)kU_eC)55wWCbpQYW07*qoM6N<$f()7k8vpR?S{F;j_VaO70WeZum*~v0U z*|P7(3}t6VvJ;#28T78k1v z&nS8Zj|V!+Cq~}>9rPQ;ykO8hV z2EKCW7Ddi#?XnvF3Yult6PMiPefz4+jy&;)2U&ZfrSX*a=6K)yD>qi0s>$H~iV=n} zmbEi-{m_7ald!QN#R$~+L9$zWq*+fDHpPsDjGb$c^vc8$=d|&{uCi(c*Lau4j4I*v zv)&ew29i^ye2PVU{l0ESsGRKT9>jP6b$EZcKFVNmqFh<-8#Q}JV}B=JsL{YfgVmtI z0bRJ0Z|Bg#?Uq=UUBQcye=r9SSwqfLKgttV$Tc=hXWjfd{nh?U$^cOUXI6y`9T%7LIF@9s4 zD&J~;LGi>8FXppsHqhPIC8)MmaAY#UsqMXrOTYUVHCT7e`!P7>S)1>7q>I9hMB4O4 z5_0&`4R0RQoxW$rk-3_DuV6LO=5tg$`B_r64NIZUPAzY2(j1ZI8NIVUTk;ggdfIpl zS|o%VrP(rDyjmC?#)JNE^fe7?##Zp%VFBC8bSaW_p6XCto==v*aU~k=HoXJBT770I zopJn)+20m^?Z8B|O3ejeazQ^iB#Kr$8~Lo$$N&duguqq35wAA+3$=&;5ylTS&HuvrEXrjT2CC_zn&%< z_T5xOtH<4cC)wlhM&$D5dLv?3Rlapu%j*-4HJL%*W6$7uC<5AbNCWWC2Q9!fo&iaK5t<;@GY~pk2j^m zKED-44p(XXScLI887(yv9j)wVqWj)@@glTnWmSozx9h=@{28S1k2XlN-juMK|JRAB zO4zwg$b}4{M%T%7g;{)Ay4Ck0$b>KqSHIP9~rQ@CMR)dPTZV_KN@G; zir$G4S#CQfLaEP-+wMtC;fV~(c76y^vysKlry?7MWLG+iO!Jb5Xc*L$0RQC4Q;KTt*fs|L@?DU6=H(1*_E#JYR!z=$r0GeNco3$I$%PET z8S|dvkQ_7OxHjYWCZh^Pu3pFcWdPam2+_23Q)C{J^^9T*XrxRALb8nMDq!{JU18+z z!+p1jAh0-Z)KUI_AtmMifn=x-h9K5wb47CsE~-?ScboEIY!3D;$(N*sX3S%^L#lAZ zFoS(MBwsZpkS9atg$Nu0rLrI{+3+BP$bq8BG(Q$#hRXKGch-F$a0k_VHTAvQ7-XL* z#!+s(TU(H?T~7^7pj69y{YM<~4Ih6zSdfy|*If=#&7Cu99-(u8^l##BtPc6sj$DlYdLbbl#2?gpxXmS|ce@T-=Q9XF+uwSv2tjdTgt=}?owG!~+0Q2+?en2Nn1A7X z>(dty?OQ7z;6~A=pjui7dw-NEoTez-;yra5u#1AK?G?xd=n5Ssx>fE1CKDCwXl1BW zg==}T^M6U)G;7HJw@M!kJ_x1Mef`Kv>e1yoQgb(A|Ly$mc{2}z6;C7Rdr{pUs711p zn}}WT6Hzdl0%75zF8HB3S>R&L*c z1HJ^-fY)73#TuHxJR~&}eU=LteSw8E5$+nfEI(`RB}hD}r2x1~GH($t;;VR#kH7Yvy$V;RMtZXLcjSggIw|W{g0fDdVku?(->(O zW*!X#g15g!)SQ~-7$di_gN#o0j}Ft@z{mNPQ@~_rA2Wc8qNH=sTw}~DS8>dMwUuD?ewH!t zHP@fBNhMy`rH6Tlr98?Ym)Svw=N9W!!kbjgr+gotV)GvIo|g05FoR5nr~-EllcQ@` zmv}4WccDmuAL#z!$&0~D!RuYkc}9EdU&%v$B@JZ+MKuha4j`yM8#o^&$a|GPfj2SY zg?xj`_XGe2pFJ&BQv%o)uwS^{x~hWQtITR=+F-A8zIve%EmU*5`TN6!+{sbM@pgPW zj@XFpeEOvx5o3E}OWh-W>ILaJsLbgrl#oy!R;pgf8S|%-aR?`oXYI4tX%;`0Nx>SK z5A?@i&PWMVBYwGAPscrOn;8s|SYTQ3w-xmNc5awbs;SE2ek8T$n-005TvzOw9bbtH zl9hXDCV2zxiM?HD`el1qCmNM8kGyP}smK*0^o3Jru|pMNC@`s%^N<{Ho3LosA>Lifn47S?7fNix$x`(x(%35p98Y6emi)Wf8&Wp zfF{BgSG5bS=|<&#b?%74`Jg|cjQ@x?YMnW^F=;3@v`p%3f4Z>5+e7M(irxs06nKqN zAMg<0vPwSaHyNL?*bB{6;)BcH$`+F}*LwE-b;%`c_2ZVA`RF&>8-Tb#9fA~ur*d#B z>a%m})i41^?(Xc!>vU1#L{7`JtAq<%SMJw>#nQel-jQW3G4rCNdUi~6d>UTM~d)wr)`X#0DdGI0}-A2tW8v5Yan7j?{7s!Zv@(HiY@%kHGP7nEWJd20wnm@QPnoS$AOl1cVuJk zM{h)`k{&jn%5XSoR`um2`CMpVQy?sBfJP7dj(*Pw_rBA**T2&5vV9WtZmMM`-5zfN z+Iv>CAPIU~!jrk8+>X|6!A89uwfrwrq;HO>6_Cl$ak}!Web`Ev%4EUyF0sE!T~HMnmVFEd|128zI!?sqI|)r;q4bxSQ2*OvWaet z5f3aqL23P^%IhdCyV{8~nc8z@e7M(U~>X2cs)3#S;}jkH04XtEsP1a>I`JFHHZ5 AY5)KL literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ccwn2c08.png b/images/pngsuite/chunk/ccwn2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..47c24817b79c1e2df8eb3f4fe43798f249a063d6 GIT binary patch literal 1514 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw000Gb zNkl1!`#jIX%gn1pggd$P9Zd(E8@>1o|NOaq`y>7F!|ZsTJzwK126G#Ly6%XM z@b-^5>QWhU%dqD1!_57RBTumVe+8~Hq9eTb8gGRJAwh?*OV}a2z_~^C|CZMU`+s$C zf=f^GMjIPqJ*EzYFsfNGT)Lap?PPm7_!7VJ=-g%pukx;sAJU$c-=j0zF+ofa5q!)a ze#6rhquT+FvGf6bpLReH((V#=343&VbR#+uVMHe)7;@qr4%Ccq1-RxEz0QX|?KUbv zg-D3?a5PfW@#w_lF{X>|p$bm?jc2~d`wI6~f#a;6WITuOqXKjXI#{2ULDi%_otUzR z>7gTt5je5J^Sd~Dle2ye@C#0R_#V2AZlgm~2OH2hsG43tH)a~4d#D*O2R?ta&G)tW z>8Ar@roZFTCSclIO*Ag1ArI+AG!Z7+1hzr17QOyU)Mwc7+NS`==$DuP*T?vqO>|IQ ztcPnUI`m>BLib<}*@i@om~~+l){c| zVM7=SBVi=G`3mjN^Uzb*0scX@ir!A!MZ4%0+DG}A03D)xh@t5bN9Y)dtvG|t!e{A2 zVJr-VH(rqM{a!t^`;)+*NnHXL-9oj{tt~?bm>$Z7h&)1VrgJrYXc=0@ma%1G8KuoD z&+_AUoChDj1~`crIu6P~xu_ZAq5Z4pRfm`!Wn^(jTpi2MGMYsT(bw1_m z-{DWcW?RoW2Sx1%q6`?p5#3d|Bp`vxK|FMT+rjJ7PN`Fx6q_I^ zHsSO@o_kdt`-!tWMURz18H)xjXp0u5EYvg!dKD%@(vVc71xZelk*1^>Sw>ormt<42 zhFmB#g+t{FiXi4}-?><#$4U#@DlI4r4PvoVssT2+X;jvbP04Gr zio7B#DN2fhGApO!Ash15FNBNxItO+uXX|?4s1n(L1}xIhR7?x<%j`IhKSXD!3`rZZ zhRl*T6jO>R>MU|4RaMv=y0F$9} zR4$TPn>VItC~Z@fNxj~;XU>`>Z{Pj*Eq?Q{1ADY{!yAorm%^@LYwChBA?vgK9NhuV zEWJQVYm2(9vPpCPqMTgf?}Pc|ffx6F>Cg}2g?nz4y9M0qW3N!>6l2^z@iOrMH$#`G zQl@pW(kx$*<@%1VVyS645OM(au{s2+Lb!Cm*v-(Kz~fjhVU4fw3PM64Z& QC;$Ke07*qoM6N<$g6Hha`2YX_ literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ccwn3p08.png b/images/pngsuite/chunk/ccwn3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb2c10981594a83b7a8981436225d0b2241d27b GIT binary patch literal 1554 zcmWkudo+{@9Q~wiYbxpxyQH*PvQk+jg_3M0kMUetMjk0^ibC6FT8+ng>|mu<;>-?$ zm5gBE76za z`V2rL-V2)_s6XvdI|05qg3CyUFdEKU;xM`LGPZ>qA>#tN;_w)^vQv<0j}{EP(no$i z`mo0!AQSgK>Bh#O1Uo1c%9qgC08SDbT*Rc~7NA^cjuaHHr)sr@p!{AFnbKlF+h0Dke2lZ=BJFa3_1Pd-&6R(7q2>7?e`@` z2+zSi67nJu@aa}f)U3dTH8`j}NbZC|_wRhnwqpDkdIZnq^Mw#AAXh1rk|hC1a$`e# zV-YlQO+>2x#2+~ArqX?p(+hMM6oVzgAuTW+d5|lVcJnG(%P3BD)?#ZSHf%!Zby(CP zbrt$P!C~!psuiF|p!y)PNs5DXbQ*5lJ!*k+RpmZhEtn@Gs0a|;pZ zu~mOaE5qA45~jygEACV%-f(amkFH*arp)TM<_{!(td=Z&Rf=QC&qd6qVjPAfD<3nC zh_J^_V+ezxPwstYijw1t$B&EU&4{COWt zVR8e2Z{dXU?a)tyb#R1Iirg-^pTWKhiHJp<1{^AoqaTColG2eP?A-^hB^piMsr0bp zJVwAA0PXX=m^&{c!SpeNZ7$J;AsYN{&O*xN0eV#q7~bv=)=g+*8hLJE5TG$3=Ore@ zlDBF%NJ@Yi>YMI%3XnaBS#bVnhFOQ!p^C+C=TZ+i`hL#|-?g9Ev8Jly(eTN>(I6qk zs-@Z6yPEsqewkrTVN==Wzva^UFWypuE-|9M5ejGMwBbk&+nr}rsz)C=6Mg;7!p`W{ z*3~{qezB>k(KS802c-H%MJtOML$`!vXDrv4dA&B^?EA>Laq)wJ`AA9-`)?bXpnYtZ z**8#nC9r6}lYe*V7X^NmwdatS!q&aTv2GK}t$pbuI?lXOqlte1o8O&f1YZsfs{L&1 zZoz%=oa51tY^i+zB#M=_j$sXzMB?(7N*Xj(?)<=@b}om6+jNTRdt1f!@iLHfQk z`Im$Q_8Q769>r)~P>^hRDA_iy_5h*$Kk5ptj>x+)kf| zUCti|wcqQxc@1b(iexLF45xdH9&YI{Rtz*|(b+mwZY$GfOU5Nji;Hn)EvInIyw&H6VI7pV{6m$_g05>{kkUx-_69w3hFaYQorBj zDX_=;D|R(DV{iZR3fwcX5XUT6UNQ*_n^{<5*q_TfRA5^dnUj}yFa2X1o3rN@lnb*< z!|vRg*cA5kc1HTa*M$`o>FG@i|HPJ@sFVg?HagxLeoW@3zx4@sz5b)(>a_fdH;*5O z)i?OfjnGg^KQwW7n2!*3?6#5{%QaA_=g+OQ^R1n-BcAPeo8I7%7X;;=;1%j1i zZ)bCl8v&97rVft|P_iC!Ccs>)Nfzav-)4vs=ljCt>^(xPQBFB!f~}2 z33c`L-70SCvR3s|4U=$oHH9TFzjO1%!~RfY+0z-VM(^3 zbZpsM^d4*^09(kX9^w*ZmI5XJmB^)Ql!H<7e6ZY) zc`+QeUEqwtD6lI*MoSDvI5{}WC480&PtuOH*-2AVaV?E<`JCD_tpv-j#9PIaBFEN! ya5NvsJwe(+v{{WEX}38N*-?K$b^NQk+{YgmGj*nOAn>;U0000d_tM6?Z=$-SxY}-ICRK&4y|1 zVwc#f!dHA1xV88oBj*}@g$RWy_hMZ-KIm-D*-?;qSET3(i^4(8Km2Jkn4dfq@Se&3 zTKj@moXkY~bFu#0PPnZ(e1e0$_)enlnWhXC=IqbUUkI-WEMadnm^fjTNZTC0CDs-P zO1_Hd{`ll}k%^K0x`I<0XS2iy+u$b!SFTK5^fGI1n`4Un+K*`hy-NEv><+L^T&{2S kcJ9aK_IoSqvM<+joQ+wPvG4a1ptl)3UHx3vIVCg!05sc)VE_OC literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cdsn2c08.png b/images/pngsuite/chunk/cdsn2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..076c32cc082066dc870e1282b97c15ec22192407 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^mUKs7M+U~W1%@xC#RK`w#ZI0f zEG#VLKejFgaybh;B8!1EBN+Ru9=Qf&RC~HOhE&XPJr~G($U(&AVsKMqdZO+XCv8UV z2nJ4tMy~^h!kDxdYA>9+p~j^3=S&}?ojYTl4JO=Jai&15=FGw*d!IX*;+1!`qwm#r zn`WQ%3^IuS{KD+pZL<&+b@wcnUV-Cw0nJZSYySkqa&Hnkl_)Oke>c9oU4*NKQEP+# V1@X9R>wwN+@O1TaS?83{1OP3BOWptg literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cdun2c08.png b/images/pngsuite/chunk/cdun2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..846033be6b4fdec08cc010aa0abb35428b6659d0 GIT binary patch literal 724 zcmV;_0xSKAP)9p$>iIc zM9BG}R?-GyZPG$D`^%XGf`^qAr06IYS+9p{fK&k*ZoATR1wD8|WCM=~607$j`vY7L zV8zwkB3t?J3uaPidN3!<*KK9Z0BA!^-Kg`Xnb*QIyQ{+A355#ayA z0cpp|nK|8N%npZU=nH)H(bhrG@~;!&M3?XV2(`}^e@baTp03|x0oH!)@bHo=j4KQ0 zuY|$dbUuo5Y|+T(H30UBc@<4A(dF}I3{b5$!14M1g8c&!K-bPLY`YQw0000Vz>816FsF9(VN75txh7sS~8e>Vez z3y|esg8)MVP)qc0!95k9*}y}5sLX|@B3D-GMbkBlwnNjonHwIy z9EcJJF%{78L==oIJhA+`7;;cFolQHd7RYGxEQK6edY*pw@2LCip7ZW~-{<*#JkP!5 zYYTEB!lT29C?YRceiiRU!SD1?JmuDki+F_~O=B_)K_Hn((}+hbb3KVH`hCQ#8wM+c zbFwxPsNG;gO(S62+sIEOu%KnpUADK`#I{M2L=HJ6NYwOv+-H@D_X=#9?oI+MS;V>y zl^XVO2yC09!Icb&nREm`f)AWc25B~!P{MT$qI?}Geug!qSF%UJX^=e(A@Tsq&y_e(IV5N zc2ombmUg;9iHZVhFq;*ili#)pv6lr^Wf$(E5sCtE*M(vW0)!C2(rmO95VCxjCB6Yo zimt;CGRgER#Fo_!>WATkX^@enQK3N$>j4Nhm?Bc~Cc@4FTut;EC7;Rd?q$9UQBAH#yE#JE|Q0|h>!DU_)gvGGGRzl1C&lfZjR|WWg|k-fq8#JmDTaBI#^STUG9+W$DsWo438O zx%khhimTsDdcDtYX^8l8`@k~2aals#tw5h$TvR^EzC~aJtyXxM{*Nd)reoq~rm{KwpXnEYf zqB*0lzd&-2CvWIFQhLa@dP&k(Dd*Pij(dA}O2xf7|D4KEZ$_?Z8(4n($A+lx;)H8u z)fq!W+gl8UebBY<#K*_xetq?5tDJr_srucF zRWSz=YaUiV+I4>B_%&@-PtL)FX`y5J^WLm!j19!cj=uCt?f&G4P0QquI_{@U+1wXV|N8?-P52vntW^|UZqc(l!@kKG^x7(XjPW24#8yrdL)E4&VZN1_vo8296 zO!#K>^qsN&VVBEKXIzkd_mj&@tKO3RzQo4)w=OTPI2+x=IZaHg(y>8-4$mKjGb gSyRUo_cYqm_AGEC_tp3R7W~7>%Px>RvflahUvG13wg3PC literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cm0n0g04.png b/images/pngsuite/chunk/cm0n0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..9fba5db3b82ca7725816efca47adfb44d61292f0 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk^Bp4a_!xt_BxxKPq}K;y)F)+dv$%Po8B#%=u~U{}NXebp5O&tsV_+x6KC z`n6Ov-e|q7d~>yV!S#P~w_ZMf;qcvgkAe_q@|8lddEI`uLzP=J4Gp*J^)`wY2|W3b o#w`BCU_;}R^bC!qjU|5>nikk@kH_`o5%P%0-tcHxz2242t zZVAjc7P#3?WtxA)Gw_j&*7KvKZ>J=PsTO88@_NksIICmj$1M%HOyBFza{Sr);QoBh zi@mlwB0JLF_+GF!ImvlsMh zsc5{>dRh7AYV(5Y|Kx7HeE!1WyYn6eA`4jdmiWEU!L;8G5Gbb{58QQCkh zC%`R%`Nje_+o??Rk9Y_%RXc^_wWto*p8A(!cU{aKDbTOZt? z&v~)eR!3w<+8cjwuIKCvE|l~g&^Ym)^~t2`a?9Sjaa+F#*wwIpUv)*n^H^rfc767O zek~P^H(D<%-&}28aQ&a$t(VVVIDB{BqaehYe5FuqUbo-vP~{d)L&NQQy^W$p0#81q oF^fMj*wFYSJwsz@W656zxtoVvfBf&v2KtG?)78&qol`;+0Fu^nQ~&?~ literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cs3n2c16.png b/images/pngsuite/chunk/cs3n2c16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5fd20a20445fb7c9cf5d38a6ac4cd0fb28de29 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3Lq@N1SHpV7(M_}Ea{HEjtq=#3k+XOiwE+Vi=8|} zczJm*nD-t8a_c-@978JRyq$iK_lN@rGdt(YQy#z8YiT}?Tf!kXZS7nxn;(ocNRJS_ct9{9$oSsu1^4G$9qOxF^ITqWf!_v|1&zuJmL90#Z}{$h z;X$oW3rB}@4oBt#ju#pq{&7g{v2S8~pRDBMFgMZFh1uQVB)dVdT4qdrSvt@q44$rj JF6*2UngG#&N@f56 literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cs3n3p08.png b/images/pngsuite/chunk/cs3n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a66237bfb3a113b7874d569367932762cd0ba8 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtq=#3k+XOiwE+Vi=8|} zn3vvNsN)kh^hn zQh3OQxBHhXtGq91lkmGBUgcb!!F~1uvkcz_zD4pSt$G)@WaeGq$X&o%(w=ugNaorF hmc0uYt(@e4Fe^D2KP>;UP7P=dgQu&X%Q~loCIF6>U!?#5 literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cs5n2c08.png b/images/pngsuite/chunk/cs5n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..40f947c33e477af3d4c13e3a56efcf32e6871be2 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WSkfJR9T^zg78t&m77yez7dv@| zu(GmBsNHi0a+5q=978JRyq&sHu)%@n@Dyu(NA}wKUA0-b10Ep zFS_6slkGtcsjSnkCm!EZ->w_6&B5QGsqfG`#!m_?Kf_rn1^#&$H05(u3N+bpIQ|n& cya`qx_w<}dzJS2a44`ccp00i_>zopr06uR!@c;k- literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cs5n3p08.png b/images/pngsuite/chunk/cs5n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd6e6e6ecfcf1d0be69730fb34292c8b6561376 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtq=#3k+XOiwE+Vi=8|} zSXo&m)b2S0xd{P2A+G-=8Jzwz9R1J0@V}bj|6Ydw{~3U6Ab;uq|M!3d14Huv|8p1^ z6#xH^0;;k4Zv_-!cm`I*@IOisq;U=dQ0cS(K&=cd|AA%zO#~X&0+Nz+*Khp_w9DJm z#WAE}PU}Hd#sdrt4F>Ptz55$&$0R-3;cHXa2ac?Rsv0cq2_h{`K_9r-92Fv1Rz46e wX^Ir!40F`E!P1!^p3)Rkz@>FiH{%HZu|hk>x7R-I1{%xY>FVdQ&MBb@0QH?@PXGV_ literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cs8n2c08.png b/images/pngsuite/chunk/cs8n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..8e01d3294ff71ea83918aa7f99589c7f88da81c4 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WSkfJR9T^zg78t&m77yh6c)B=- zRLpsM)sdIMfX69t)`R5F>$8F{b!Pm_R9NudWu=&O_QeBy0tqv+c5v)_Q~Q&J!@#%m wUE>4C4G-c4A22Uq;csH)Zz^SCk$A@V`i@Ax+rlTSfaWrIy85}Sb4q9e0Oq;wP*-)CT0@c;jQ z2B6XdAldyud4`1l|LYkT9R35fGAR598n(G{b288_Z%-G;kcv622U!^p0CgC=d-v{d zv>lW5Rt15YCienPzJp3LSeh3I<}^i2;MQ`~516SSqSE9Pz!h~+uY+af0^y#f$PHY6 d2X!ls@@qb_WBltft&4Aruj!a10Ts~ zJwICdc1nVnYGHOGugAQPvpQCO+|rQC^u7Kp$Dgea?$77E*lVjJvLo${zc<%&_5~M8 z`VMHEc+dJ|(sj9IZ{4`9Uj*!GSii5jqTqQfvt_$JdqKaJipCqQmz8g>HZQpTPwv*s z=Pw+-JMU2t;!M6$C^oO#?{=tii>9IBcD>$4(ISB-AJUk`pBQXte3G7_v9z(|FN568 VL#{vmcV>h9>gnp|vd$@?2>`oyZOi}w literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ct1n0g04.png b/images/pngsuite/chunk/ct1n0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba110aa764ff4e5ee642b7c0788229a4924d383 GIT binary patch literal 792 zcmYL_OH30%7{`}afYlm95ECCT0X3y5D?Mmv3<;G|C`zfeL@oq|?R0nSc4yh0QW_6Z zB`Pss;_F}x)Pp8ol!HcNj8URV4;m%W;Nzf@CWQndoG|e@TZkTZXTJH*|M$)JANBiM zE&Mi~<2Z}A&3%-u!2Al?kGu3WUCWk2$<^WF^3J3j^H+OWy@|GT(;%h_;{2)(`~)QFCN!|B{t=iEQyFKl3pA11?%3{l4##YE*?fOXKY0?i7L zFo3{7)ZE}Gl#l^L9YKmhfD%BFK>?K!KL~Y9VoW0n(d%eJWA~VYNr1%#!bFckDgdu4 zDzOmrLLKq_3KS!I;xY@vzGk!o4JwE-xE;hXl>t;V83H!9sv>3WjHfzO4UGX*F|iId z1mIE>(2r?d2x(L{m{B2dvyUheJ;X-m&DXNm7#b4I?m*L#fmAAVlv*Mz2B#TAfP`tB ziCpvgh%5jIe5gBU(6u;n^MRPbh@e_iqm*c>R4p7Y3ndt&JeMUlL>pcHB)>|a4ucs$lG3@ulPNE1@BXy#w+=g z&%HGh>bR@`vHY&O>~* zIQ52(KeeX66=g2YR^D3jY&bCQe>8me$%!E?+f(2?ySG@oVB2L~v@IkS-pGsyV*?Kcce{q!`rdz)M R88w6Bye&TWor8U+{sI?(Ab literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/cten0g04.png b/images/pngsuite/chunk/cten0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a56faf2b3e8655f88c028070ac174823ccefd1 GIT binary patch literal 742 zcmZXRO=uHA6vrnJKT;a(wL;~!h$N6MrYd;wkTqLtKw~wL_E6C2W|AE`J2UJ|4DsMW zRM3MWg?cGs!J~Lk1VIoBT0AKzdTK$zg5c4M2SMLvLo0aLnfLj7^Zt8tx;m8|*gHT7 z$yQE!=kSL3OXEQnzrM}mm2SDGU6Q)-p!j|10{X+eK5OgT3Wg4oBr&IDtJdb0eR}j} zAI6WyMQ+;$DoU#Q_6!$-g>Z>VsQCfq3y|ydLM7949bbj{$r*TvU2e=ME8UHFE3gS> z+ugF@KV|{SRMG~8iG#)BhaZPl2}upcFpn8O;@Wa06WqT67jU-bg2ri3O`u?yjSU{s z7Bk>Sj9S(JtH3g2!3GQ$iMVQGP6-u_+pfks?1)n+Ei_dWQtLoP`l8*yUK%l&7t~)k z&zCi*cOQE4;+q~Gm>jRUR_FwgCHgJ~NWY!s>! z&+&Z~HMnf`UW>0Wn)$uyI%0-N>s&dK^-zSVSeKe=+76NvQMSBte_@n^LY2+djZMVq zZ3}G^^T)Idtu?rFVds1`b3(7;*|Nq{$ee}L~xhLtN m^^F(rmq*W#)$5mU+Z5S&`t$7h&xh|JmsBRJ-s9sJul@x+i~KYI literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ctfn0g04.png b/images/pngsuite/chunk/ctfn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..353873ebbd0ca66c57ec7f6488e8f18a1c3517ac GIT binary patch literal 716 zcmZXRL1+^}6ow}dghq?tNtEi?QzFS~JO~9rW1}X-)@p**gXox@CNDF)v+m4n$W41t z#Dj>S9;8}`R}Y>7A|4{OAV@F0t5^`c)r&$!-zHWNVP}W8^WOLG|Ih82=~JVrT`5Ay zXt`88hdYf|5?|#0$K?!e$wpzSKoU2f=D$3+jP-7)&6*k*$+4INa>i&7LXjE2QMF+B zx4p|{Jei2w3f44LIP9x&0j++QTmUJ#M6jjrPF;DKsTYq{ajXKnB>NAH%plenk*N$M+~b-foIWHJh@4$U`PV!RWLc-i8>vZ zYmJf~ieQMENeRYSMs>jJvF4}ickq$@uJ-#~=k4KZ7t!O<*mhOTnKlbIZ?4%wub_=G zpi=KsN5hy&~?ec@1Ie>$uaZM$zGZ32aTXT=*4DPUBk9b(-q_gZk&Rz>KfHfjULdK5 zH;yEd?bZG3$(5cvLVGXUPbMZ8$oxB!=x!zCN4Q?tvGV2>GD-Qwbn*G|EAzhrgC78w literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ctgn0g04.png b/images/pngsuite/chunk/ctgn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..453f2b0a49ee544fcc6b297a59dd685a06285005 GIT binary patch literal 1182 zcma)5T}V@57(R*-XciSoc=e?OF6PLfpo_retRxc2LEc1;b=(f_kL{>MM01;(Fe5Xf zEW;>*KsS#z?6{55l|t}-Nl;fsffq#=K@ibZJ>R!Yx(T}2`Tn23_uY6`=gHdY`f5c{ zYCBFj&SGTZSA~x<^=Zw5p~_=FV^=ChXInnsxgZWTXOHgGbf1ca>Qm?mrFnv~RNyhC zE8yuK&~%lJwVF6SA@14-bZ;Su$l0PA*pU0OeD z8j@SB5xKOvgMQ1~14sIRF)k3>f}zV{&EwTeptF>x41jZhOOQz`G{@+It7 zq5r*E79uniV^~U#1TBk;1#FwRoMJp7F=Q|ZpC|cn5p+yWa&RSYG-H^6B1xDi66P=rqhKk9 zjX zV6q@FSka1Dl36}0OPELY;915{wj$|8Qs^d#OUh)SAWLbaQD~L|kr3iUf+qY8(>!LG zl3p2k4w1mJU>90&RA7;i>J~Lfi+y;)8$&u0PT|J(^txqlxhuPaefp3qT>e|!m(?|S z9B{IR3f=xk*}xVT_Dc=084&AKdz=y7C3;Hc2G?;}%>tAlWaKC_M-~mCfL{-W0-gq2 z+oe}uA*xMwr517fT$*1k{{bh(OZhr2(Uu{LkBj1n6h&sDDgTmfvp!7w0C&E_VRtr7 z&X9elvTs}4y7y&e-9mJWwf9loLRU>sYfatao0<1tj;;RQeotYipJg&1R`2evblkc& zt=)|G^=q%|e_c&vDuCong?_VK6m>q(xv*Kj1}5zZ0E5m^qKHu!ynhmu$Vm7IxEZTxmWRJtOe)8nzKoFYPwIw!K*RB7e%yF z@Pvro5`0PUQPvpnINCH_b^NYfLeNRNVQtgB!EokEQbcBf)_^0b>7mDF0+E zS1ONHR48xVEehSw6nHuI1 zi1Qsu5>)3!^d{h7A_y#l*kM_gy_ooqopK`X8Q03EeQC7humk5Lwq3+zxN zH!h@?2)YxXDI?9PD2VK17?dF4c6$^4GEKO z3p|9D^*}JNT7@ZQc;-ZOK=8YA0%9oy zs*K(bI-FqXKGv&E&WP@!2~|o$0lyv$1w6`;Y_sJHNzVYy6H1~P${jFi_z33btHz1 zF3grRu&4GtmL4{+t8(L6@usQu?YouYqOb1{)iP$O`Sxb_^IwmVi`h@t+vciUyZ!(g CG05To literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ctjn0g04.png b/images/pngsuite/chunk/ctjn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..a77b8d2fee4c377c20b8e751317d094cc2be3cf4 GIT binary patch literal 941 zcmZWn$xB;77$27w5yewMq=%qTvTX0TTOEITtVlMs?! zQ(g4}zdG@xg~SC8ec3O_n1t!KbW{qL<7NeP=JUpscJ>oaWV0xVW3II$>gcJ z_fgZ}RzA!so>ibTT7l3RJ(vP#dLKsmEMuq_C|DnIPUEw8uhw1t1EWw?)+7$Vz;TLs-nJd z+}PZFnUj8UQe5owNs^*uwPa*u-Yxo*$bn9ItiZd}V*Z_YZ^iJn%Q4lWAD-c literal 0 HcmV?d00001 diff --git a/images/pngsuite/chunk/ctzn0g04.png b/images/pngsuite/chunk/ctzn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..b4401c9cfca842537838cec131e416ce9d7b0c26 GIT binary patch literal 753 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk^Bp4&$Z`J6 zNzb#P8s2AuIsDFfoH=tXkmKALZ-1Q=`d*<1Teg^7-D<+j(4EM?Bq(Z%5YVvQAj4cz zi<65o3raHc^FYSw_HE=lWWeL{z3!;5&(i+~S|SAYC&V}_-LdfE3H>h@z9Dj7b$L0{ z?V!z*(zQ3RbHvuze{%AF`9ST7(P3V_yAM6v__yY~zu>c0ws!SHZY7mF>(Xu3=spqF zYyE1=?(N&QTWCLD_9?x`{4#-_N0n=i%(89VqQ<1I<@)8j^q#<%rc7M<{~y>rT+&tj z?Xk|)VE%yIyVWz+p51BFUYon-WoSjdd+w#BKfbWae+pyylvLFL^o9e-8^QT$CFO}l zso)^d^YYd4^bI_5KG-AVgLf~7rkwsp-f`cTpI5{UVGdHyeY?`*0udct2*HvZ)!BFOeE9Eakt zF(>xoL0({Ru?EO%IdFX7kX@*}flE2$(Fs;VMri}4oB+23<{Jy#Y^O5KKjInqNJi`V z(bBh562w#svm1Fm=6#&ivGU`VhFqra^=CQ$Y<+NlKIg?=TOE-dX>a_!xt_BxxKPq} zK;y)F)+dv$%Po8B#%=u~U{}NXebp5O&tsV_+x6KC`n6Ov-e|q7d~>yV!S#P~w_ZMf z;qcvgkAe_q@|8lddEI`uLzP=J4Gp*J^)`wY2|W3b#w`BCU_;}R^bC!qjU|5>{N literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xc9n2c08.png b/images/pngsuite/corrupted/xc9n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..b11c2a7b4049475d967a8cc76b93ef1039684a3a GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE2_&^8vlamc;6;z7cmE{-7; zb9B#amdK II;Vst0B-g)L;wH) literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xd0n2c08.png b/images/pngsuite/corrupted/xd0n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..2f001610a85a662d8baa0c1f02c06adc02cfa20f GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3Si6xB+q0lO9E0X>5jgR42*3H3|~x(2l72UT^vIy z=DfXnkdwiHhsmM!&BVXki-fIRw7)F;aqgk^7G4(X1}>2wG7H{5sr9LFXk_B|YL`FM q!Y-omVL^$7@=Axs-38@~4=^@u{29mZaNZkeCWEJ|pUXO@geCyFeJ}z5 literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xd3n2c08.png b/images/pngsuite/corrupted/xd3n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4a3ff7accf4453ddcd58318f7048b326b44ad2 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnP1SGpp+}Q-ASkfJR9T^zg78t&m77yfmc)B=- zRLpsM^&lsM0S}Wy>zj#xw-*UpyJ&w|_~YC|?Jc}4)(u=DKV%lXeNyXF;n2v$@6|4U rsD)ibzj#xw-*UpyJ&w|_~YC|?Jc}4)(u=DKV%lXeNyXF;n2v$@6|4U rsD)ibc;6;z8n`u6{1- HoD!M<9fb>g literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xhdn0g08.png b/images/pngsuite/corrupted/xhdn0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb8737fa2505b43955e995d95c3d6972b85fe32 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@Bp957Lw$i1OS+@4BLidG0>c;6;(>fePZ!6K ziaE(C2`UUC949vOu(I~>b7=nfE^nVuX&@tFa7u7Oddi~87#=p(p8gM~{{27yqy1T- hp#)Io!PL|g7KVVQ{|ZeX-G~HP;_2$=vd$@?2>>eWDsTV* literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xlfn0g04.png b/images/pngsuite/corrupted/xlfn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ec53ed94b34f50eeabf3029465e1106725ea2a GIT binary patch literal 145 zcmeAS@N?(llHy`uVBqrfa0vp^3Lwk^Bp4c;6;z7cmE{-7; zb9B#azopr048WOXaE2J literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xs2n0g01.png b/images/pngsuite/corrupted/xs2n0g01.png new file mode 100644 index 0000000000000000000000000000000000000000..b8147f2a84b861b559fd52fc0ded6971debdc6f1 GIT binary patch literal 164 zcmeAS^mFIslHy`uVBq!ia0vp^3Lwk~Bp9L@-6Me%OS+@4BLidG0>c;6;z7cmE{-7; zb9B#azopr0C@{E=>Px# literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xs4n0g01.png b/images/pngsuite/corrupted/xs4n0g01.png new file mode 100644 index 0000000000000000000000000000000000000000..45237a1d294f7432c06ae45769727d9745250221 GIT binary patch literal 164 zcmeAS@Jr|AlHy`uVBq!ia0vp^3Lwk~Bp9L@-6Me%OS+@4BLidG0>c;6;z7cmE{-7; zb9B#azopr0E~z=2mk;8 literal 0 HcmV?d00001 diff --git a/images/pngsuite/corrupted/xs7n0g01.png b/images/pngsuite/corrupted/xs7n0g01.png new file mode 100644 index 0000000000000000000000000000000000000000..3f307f14ea5ed37b9f74b896a98ee4a5d2c9e111 GIT binary patch literal 164 zcmeAS@N?(oQs81>VBq!ia0vp^3Lwk~Bp9L@-6Me%OS+@4BLidG0>c;6;z7cmE{-7; zb9B#azopr0DK%Y?f?J) literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f00n0g08.png b/images/pngsuite/filter/f00n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..45a007596753f6627224931755c073a3362be88c GIT binary patch literal 319 zcmV-F0l@x=P)N8=ISR z4CLwk<95#Vg>&ou?4IBK-OKf4I=h+Q-Yu4^`-jJ;=a<*F_w~o;*Jiu>-k0SMV?!`9 z1Vck`We6?}!N3q)7=l6z!b$|W5>ORnBHWgrk_!4FAm#v-gL4rOlDZRAQhFl5C-ouJ zT{shgf4PuS-IlHh@Hud2s6Ob305=7HTh$nC5#jVOMRm%l2)`fuP_1(!!tE!01i`Tg zNcxC^mI$IC_VFh;N<~=u^=Vc`@;_)KBFl?^KZrv^P&WiMLvUaSEP*Ak#4p5s%2-gQ R&b9ym002ovPDHLkV1h+qhR^^2 literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f00n2c08.png b/images/pngsuite/filter/f00n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a1ffff62eb0f1f1dcdb4ba2b1d30473d3adacd GIT binary patch literal 2475 zcmV;c2~_rpP)?U-rY?$u*rt72`ovo0oe?&{1KL>xM~Y#u90Sg9~r!Sz+#Sj{c9e50PfZRGEo*w)Pbtvs@yM>}|;lb>|){8?VU$X<&d+5@K1;`QX#oR;Tvfz1^SHi*8x(G?U}F{Es^*Sb z?yhHBBioyJsG0AzQr*w44t96)d>1dBWzR+SX}o!zcWxm*$D}Px(ibIBN#@ctuE=6# zE?4Js?ReG{a6=(C74fxse4~U-3U^j;cNJT!xv!Q7>UpG*e`%uH%#*GBct7JEywJ(Z zUFbpT#Y?Y|Q7jacnB!jzYdu#65G_R>FM> z|5(98mHbmR->;=w&l3$i)x_>*o@?QSc3$e>=bh|5$-XnZagn-)Sd~FtYmEQKsBJOn zZ<^Sg#NBC(X0a`o@8+|891j%mP$4^t_}*L|EupILcm=yEdAge2wT##Ed;>pi;-zMO z*2124UhQCCC%-<)n`e0IBBJXJu{wkLx-q`PsI{8(gC=$+QBC8qES|_^S3XaT}}w+CiXS+s}|m9=gki4oxFXLcg`U4sv)}7 z5Zh@`_Zs7ejoLAj9yd`-Vow^cWU)7wSMzyo9KS4JUm>p-@vFJ~x`a0repA7lmHcNl z^;+Jl=j{gmtBH4-`E3ioYv;c^_i1FQ%wwfMBW;e-;Npfs)i$R!*R`c zPB-?@bcLzC%={_6KfdAfH@WO4D|N29#g}ih?lv3laQnC1^(|YzWBd0!f<-~8EF`Z8 z%c~>u`lwtVGi+52JL85n%^1^-AJX&y_Ys|^Iqnnw{0yIXko=U-|DDS&v+^^p`GPO^ zu&$R4*SNipyS`$}4YuQ{fb>jIdNw323QI~vS{{{G#pIV%`IWdKtQp?Y4gH`N+V(PM zA4l%z*n^yWn2-18KcHV_>2a2Kaph?SyIFINb$?^SMQ*>$U7xcB6BIEyAUzh8riG*# zVaXSf7Dna8G5G~mULH5B((Vgvq-7IrVdlKfk#BPBgAVp^P8!|B{dYnon1AP7VDVSh|_zuXE*g26wV%H|yHifMl;Q`$URg z3{-?AAX0nLlXGT zaOFk@x3Fd#Urp2o;f3%)_#qUC07MW{2vQhQ1XA=qQI0>XdLWYr)7pP_ag>{nPUV#8 zeA35R#avLz#pQf)B?CdOuHibsZGtCBc$0#zYMR;2sE1D!f+s1_{4SC|M$4 z7r|^1$`#?^Kcq|XNs?9|=^mMd{h48$KY}G=SUQPIJq%3eDj(MrbNv!-Sjx@6Vk6*8 zh06+e20WSY4uvmU_#HwSAp-d#I7WoVKcvT=lGK?}e2%0ol=MaY$qcR-#>x>~J%(#1 zvBtv<)49pV*NXYZ5;iU6PQZ}{X9irEa1Vti2i`pRoWeg^DC0%IErO5rgG9t9q6?(h zbCOyn#VaJOsy{z~8!}iwj9W&qaSXRjVv~nErt=*i_Y|{j3HJeZD;$I2%z|qe+zxm~ z!aEwi@xnh@C>{}b>Olu0qKIgP6swZdwGT(a<^kND!RRoyjo`au*glB|JUld=9X`HS z%%gzK3VQ||L*UGYD-UibJT7=A!Z!u}X;6v~n1}xpLTeTJL5ZCyR0r{xohOE~Ycx+y z!Jr*7}ydLECgRbrs@xwwpCiJ*O zErmUUc*V}%;k-JU*Cz5y5Bt2l4p=O(T4A%nZimAGrxPw0+-`V0@Ot6%!S9EnAP_(> zC_*6-4vR=cM57`W6RIlWaiM8K*CjHA97Nj5;pAv?BI!x|i;!%_01HyB7-U119oY`# zIg#(eSU21rc)alXFx!t}1*HKj3nmN%>%ypuU~3d_$FNt$kvNWPIH!vqny)aumqV{I z?;1y4eV zt0Pz+MSTogRqTwTE%AZS#fLQimFdSh^d$2>;;7RJ0m*Pr!)Qjb1u0foY_Qrf*nuo3 zvR!bvG17z4UQF;|vL92Ggn{6hAf63jQ5Z@D%cEEo!%He&i6gAxEnU1r^Y5A7!l8Sa zw=W?eq1osBp*e3oT(F zn8xH8e7M&4G?4Hw6NDMU0?7)=2H6gS0|qCIE|}a%@+1rdW*<`g7^uJ!Kxz=y5YofQ ph+uFOnK2AeVUH&a1UWh!{10y?{8}W9lf?i4002ovPDHLkV1fmblkETi literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f01n0g08.png b/images/pngsuite/filter/f01n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1107b4637642335b8ec7b8e1856dc0ba7dab70 GIT binary patch literal 321 zcmV-H0lxl;P)}T4b;N0E z3!a!0=lJ%5$Eg%oz?c7nM_Pz6fDfO-!!(E~0KEA*c%UmW2WDfu_({31E3v>N-{Hyc z!o4_%Y@;b2{kGgyCmt~K_ux)+Vvc)%F>XgE7N{D;Epg%*RfD)GPQ0RO5I3R|@2DEY z_29%Oss?dQ2JwUcSEewBLHsU3nZgtbQQmYZ7(-i7*cJ?I3zBU?bOg~6L`VDql~F8% T6Mw4;00000NkvXXu0mjfmy?8r literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f01n2c08.png b/images/pngsuite/filter/f01n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..26fee958ce7e62a59843205ad34f86a525718595 GIT binary patch literal 1180 zcmV;N1Y`S&P)Qj4`pI zFjkU)u{F?Akfo*B!a}174J9nsV(#3X+5PQ?pp&O~&o{|^n{V!Obi%NV*_mQj=dbpv zm_B(tFHYo4wlii|=dbiix4xT4UZ{eGTtw$J**>tSy6N}n|vqif78L&$byRK9f1$SzrLzUf{!*^r3k$774rXm_7!8f1Q2+ z=C=8j8BA;b>93ttmB!R4Gqr2#)Il4ngL#p|9QHl^o9+4V^!;`CWzciKaJiBz*2s-A z%Q~e~hNeLo)I~S+8N27*(|0^}KLTZc)b*DYt70WpQX@6;tlY_+JY<94KKc3jyKkHx zc~$=bes_90V0+^67$}#lCtg&T@Kv!ADxnb@aaQcaP8xdm`scunQ;gUj^(pYH(^C;! zNn5y!L|KC#`k`FGPq->y@fF|j4L>V%d?yTrfgi+0@98t($EU{=wvxAS)ubd$_PkV3 z!A+>5imOt?H8kTouFDPFK!bmL?KbeO)596d+rNC?VU*+1#52gCK!FJ=R8*lsgBd#N zFko=|Nq}~GkP6E2D88M@l8GXUm_!xTsfy-kVs>rq&*Z3{>ZqRPX`b1u2fF{_*^dDC$unBQ(Ew)&lzW^YzR^hz^JI^CidP9to*K@y zNDItSJ$~`R-vM{)Cyb~i-{XO3q;i~yCk82yJm$&k5=WK56seJ#sF9XvnK_+adK+*z zf5tFI)>7;!5IcJyUb1-f+PNSFERrJ@DN!XcC2FQ7s?jpdPCtJOaPPm$D2$0wv{X9^ zWaZ)t@yIozCq+^qMJ$rnCC-%0l&Qw=-{Go9xBkqiT4p;6#CFmU*E%r}BWWdJiJY-a zF^Vx6Z~f)!f}4M1bjGY@*ij%CA&7a#dtxL;QaWQsUcZ|{DNGZ!QmbmEH8z2;34}4U zEce==fUtrOcu$DLNKC}F#?F@|D_EgSluD^gm7PG?1j0Nt7TXI1ibI5i_qeUYM`9wZ zHAc+m{muoO$dyvD%1$6`0-+Ag%UwbcF5n#U_<-~Hh>wJXPsDV-gPixfkS9{*C=fP* zFb&F3UG{zuavL5Oa2^-&5ueTk!)M~U--S34D@TE_2?QJDp|V`eAXY9N+By{R372qb zf6pNl!i29J1;Qo}(jX4E_qp%Fz4^!GobzySIy|o?)B5V>_Wt4V>G|dL?fv8P>$@@5`4A$18fipC zj4{?)>#TR)dmloGF-Am6L9i(ZNIDP1wql`V1IXeb3GF@N^}7L$OLT?eW035 z>s-(z0SrY%YCz?nO#+xF1yoYnBznj5E`aJnr^KQQpxV+di7ue_plgdhP^rb}TH<8U z-_)#002ovPDHLkV1l$} BmFfTh literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f02n2c08.png b/images/pngsuite/filter/f02n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..e590f1234816946731c677d0b353e2db5a08d71b GIT binary patch literal 1729 zcmV;y20r-x*}n2M`}#}vjc?j3 z-?s05&wlVj`|(fh7r(S$|JMHaC;Q7^?O*?~d&{=IVSD>_5?Nc!ER3!g3n}x;oHDCS zE7M9tnNlW|No7L0po}Y{%BV7;)RZA*NEuWHlu$uIF{MyCN=M0+Oi>NpMWV~bQp%#T zpv)_?%8W9jOe<4Ly-ylf#ww|%3|Gvc5-LF-)9o>#n>V*ev}9aNS<tNOUgyIH` zG-q7aJ|<;Bs%p}n(NLyR>cV6>o0KtOR2fOBDK%kO8B8li!+3&t(p()kWp0LO#<-$= zOvf4WkAB#DDgP)1#^?QNplUNhH+K4K#)MH}M8lng?S#!1>#?oI+;=QHd&_Y* zvQ2ag-A04p0Z)8E@cI#Yj2@#AdWt&Kp)E8)6V#)Eh6mnu6Sfn!T5QC&9<$>3pR;Ah zn~`mxSA%AGv*B#jvEq6SSw}a}hv?(JmFIitK6;2Y(MP>%q^zct!qYa9w`0$dr1uwhW0Zhu#4`YC3A2lof%qhmB?1mex?MvA0uiC*F<|9wjtewjbMGY&*`j zoNYQ=i;4%x3bKm)ELbUlhe-cy&Q~LkkWkfBOvHTK5^pVU&KE8zqNF%!6-RN=jJt=f zyYIStuDcy|)=2IKN9FDBuxB>$Tlj7K4t|&RE`A?>fIq}HX*X$yq{F5)WCR(dJ%%60 zUobyOQYUH9nkJsLcn-IKTf$xH1ii7(+IyZFAaXuHLUf39$aL7GW-`)eOjt5$$&|Gk z7SC8bXKudx>~4AcfL#|Bg#}?=m=$J(8L0w9n3UeL9uLU|&_U86bQr0b)M$_5M@xoe zf}~Ds%Hl?G{lDey;l^hyT6)`NFITQS5g;L1KsJC5kPe`O$dJh}?HYch$0Xw<6ZZU{ zd$-?t0XK_VuxLS_2oUXUsK?Ay2?S&T8dk=j$q?;fe2=lO{-L*jZof!e$2D-%xH*gF z^n8Gvsp5t2h@l@X8zXow7$3|f20{E)r!yT=R8p8tOF$?p``zg4{drQ+FJ#q^ho zXy)BBQMAcvVzRW z3^h_v5Ric9p5w+1ZrERCgI8Y-UVAOLeLHyLjo{85+yt&}QC+$AHbz)d7DMt5 zd6zUtb0njk;WJuFoZ^&7I1!H8G(892_Pp&Rww>5!%hqFCjqSd(WoK`>;%;>AP46PR z$UY&RE}af}mn)!IyrepUKyIwR{8>j(~{{02>UU6F*}Ye$EIT~(g*w> XLp~IzS7kjt00000NkvXXu0mjfY;#J> literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f03n0g08.png b/images/pngsuite/filter/f03n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..ed01e2923c92fd8b8786524c6d6841365a44b9de GIT binary patch literal 389 zcmV;00eb$4P)4Zd45D^U_MS@TiGz2aVLCXUNp&Fi;&<&!6t`aRYNwm-e(L$HR7llUs_2v2Lp?04i2#w>5 zCjFHgoS}>OqWhKs;-;4%0XoyCYd;H{ChLTAkL z`Nnmc1cXl84@#vy84@~$6^JKJlZ=Ubk`d9uF>y~YB0kwMamU0Lt#&uLFSbqGG0ztr z+6kZrX%qLj_#)n+{rCF=MU%cN0ReDq=R?P^VtFOGwjP)u6|4v*CxG_LFwq4OLVH6N jD*7N)_#jLSK#2GUV`p4Ky#5P000000NkvXXu0mjfx;dtp literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f03n2c08.png b/images/pngsuite/filter/f03n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..758115059d78260f7485521b83a864d4a930be84 GIT binary patch literal 1291 zcmV+m1@!ufP)=&S9{TIAi*MDSax9$V&z4Gt?ul6?wozPIOm-?GqbzHVVL0@-rxKGKhOL8k5O_q zSFpv3t*o}I*V_9Zvg_8{M;@~qp0pb`*{3(#=eF8yFWQ%0wy%ua*LT{9H|_38yXP&t z_Z_?MUHjhq_P_`B;30eDsQu(qd+fM9al)Sb+AZ}0v>o^z(58vARqwd=u@6n@Pmke1XD_3x{N{!lS^S@Mz)_} zdJOa7^M*h)z+aJKlpUap>FUU*babUGt;6i!o}sK%&_Ml_0}Q1o&Mu`O$?Cq66Q@JT z3RxIYM!*w1@Du|XA%l7Q)eI$}3>DD;e|4H6l$4TCgo02|@B=KrQ z@Wkm5Gr226kv_(nB^X7=$b&B_9m1$G>KKWRgkdJ$$Rs9|g_2{8Ez5|#T1H2TVa9h$ z(j;+7%SwO->aXp@3<>@U&;J{qzZIUl8J_zyJbOJn`+IoiYIx>K`1Q0sy`|S$qy4Ql z0v=}L_DlonP=h(73bQba+*O)>Gz;H^EtdX#W}j_9D|OAoJhWjRA~5T>Ndu`v9p<2x zV$3LYKl;cP4%*<5UG=dYJ8U03Vjuo4ycMs0P50HI0S#zE(=pl(GY{sz&C+xa)e;>z z1~aNPzjM$1t-?9LR-*64P#mG-1*D8@fZ(*yqnYop#)_J&`RW&@^-8p-T}(?iQxc|RDc*( z<`4s3eE1|ejyabvT}B)cWe8L&9Y4_UCg9tx=>U_B7``SQ&NPmDBN;&XQlhP3n_*jascABYwWa1geh;>x-+i4(U_Y8$pQBrmp@_v#) zgF2F8aQOzn)E_eOLYJ|y`CQzx3-$nmLD=V&A(sP5g05dja_!i}_ zgIDirr|I{mZhX~}7YtBA6@@6ph=h6QI6&Kt{O(YUr$lPFM|Gd{aIa#L7cd2c1x1(E z(Q=Gs10<^TF-)&&>U0cv)zz`6SBo;LJ%(}H?`NdF>L`))0fxOAVsvH`hUsg)nABw~ zucMi=tL~(v8Fzi|4FCoh!(J`gSItz-2XxH%{{y9tm%W$Hmi_<$002ovPDHLkV1gMt BbC>`C literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f04n0g08.png b/images/pngsuite/filter/f04n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..663fdae3e7d906df7379d92621a7a951313705cc GIT binary patch literal 269 zcmV+o0rLKdP){e2x4DAd1)!+NJ)f5B{T9psOdMM) z%F+|8FY)0+3~^>3vs1_&)hG|SqQp{zQhWvt^p*^yfsjOBNTM$!(HFu%2m|o|7A8yw TA(>!-00000NkvXXu0mjf-K%M) literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f04n2c08.png b/images/pngsuite/filter/f04n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8b5116e72a63a3de8e0c1892c147071d0269e7 GIT binary patch literal 985 zcmV;~119{5P)hvyJ!8utT1VEc>UN*1Tj!qJPN}IY>N=sRACLdrt)_N=Jy&nmRP0foi1T3q z1vs!^NS8tnTiC(|3Cm|k`D(`N4+4W;;{3xH5HR3=UuuoS4K!$rOa`(R z?R*&X`GvfR1n&u#ACUWVNrjF@+CUA>kh2DD{mP;k>FRtL8*-Oa0-8az@Zi?_D?6u0xgjeiedR*>(yJr`MN%ucekr3 zWi?2)HMNKXi#p_|&$f}^7s7eRdN|{jt0Vw}4uOnAlX>OyYx{;(h32S_hezhCE(Fab znDm|v`WGp9zt{od@3wLWe5y}twl%v9eNEpS4jt=K5jm_s#Yobzz%^iBf5O6mQ4IVB z1gSS#SEq}Q@Y^iry7D|7u$1$9vV7%>V~{k^6C{`$4zP=FjwZm`$rGS zvDv1V?}l%U4QyZyYY4D{53qy=jUGER5T*mg4DDFWy$X8(2FG?szK8L%=^pMOKo~6M z$j~Pc+wCNgX-nw*aZjf2VMtF87IxrAsgQ{`|D+q<6)@}&$53fBJv+1hHpj`E}Y00000NkvXX Hu0mjft5eU! literal 0 HcmV?d00001 diff --git a/images/pngsuite/filter/f99n0g04.png b/images/pngsuite/filter/f99n0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..0b521c1d56ac6ba14d82547eea5c87dae391cfba GIT binary patch literal 426 zcmV;b0agBqP)R*H$WiHScT#vd?>UqJiKVd^cv0p+pyQ zGH|gKM+__s5&6}tHkZ;`DS5Y9+rZhQ zwP@N_D-FoTR{3vHO$x#=5Cz~@tXf4-D8*gDQ#65;*9uNSx9chJUE%)%R{#^#^^XN{toLo}DWI?N<>C;~ z04ksXP5}*|#RS)@U%=Ob*$h}N)l>-ed1V5+W2XZEdA?ey6A(g5buxi@h4uQqlhPtM zpG^V)m`*nvwSYxHS5VI&O?NvOiV039lVCCd(iGV5g^==n1tvHiO#xM<`sZb@9~=`L r4yJ(5#RO&P7r+GDZJ=PW2opR2brp<;D@5J500000NkvXXu0mjfFu#U? literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g03n2c08.png b/images/pngsuite/gamma/g03n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..a9354dbee6f36cf88f7b6277d3fd43b6cabfd84a GIT binary patch literal 370 zcmV-&0ge8NP)yO^U)m5Jsyp{zL>36n8GX#CQmg>mm9SE(8}cf*52*XGY_~ zh{+_6px=OtfYFFnf&gIz^!p-! z4E~_M*AoG%LANUc)ER`K2v7|=9TA|;pxqV$s(}np4O%S`KnAq|RD)(y1iYU?5QqRW z_=SEnxIkSs2+80F>Z$=A5dp}6`d>Z+8Ssq3bn47(xy-IHGcz-PeHq)$ literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g03n3p04.png b/images/pngsuite/gamma/g03n3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..60396c95af19fc5f14aff9f83d391331a32b3dab GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzD9ea;@ZUFM-0(?ST zfi%Pa|Nj~OGn_cFb}hr*yC5EjfA|0Ywf_xwDRcl8Bzw9zhE&W+)?jB+RWM*uY zOI4Q~40T|+ae#?Kl#?gtjDxO+)}>1i-Z_XV1hX;(T`t)BOm^#Pkb^v3{an^LB{Ts5 DR8dIo literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g04n0g16.png b/images/pngsuite/gamma/g04n0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..32395b76c9c0e1cb962743e8a9c8c41f319a26bd GIT binary patch literal 363 zcmV-x0hIoUP)k zMP!AUF&SCLg{ApYo}a%I2W<;z1p%J5#`A86=diAEu-(Goq6aWQ91jDiarl1YV72lz zSS}q6C}6R0GJYI*6ZWZ>;Ot> zZFbS1yTa-8J$*mz%z(DscaWy%bDwwTTMVko4oH&Ag@0}_C`%l49mFv}k^p3xQd%q3 z*T@Wt!e(&2nptb1gFLri;n!jYw;K*dqhSCu$TClZ{oV~g4L&I}i72HGV}Jkv002ov JPDHLkV1oB;ijV*R literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g04n2c08.png b/images/pngsuite/gamma/g04n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..a652b0ce87ed2824e2320154aeeb92915dab7be4 GIT binary patch literal 377 zcmV-<0fzpGP)=$qmFdR}P2oOfV zU|<4VgMQxxxCU`-0$hV$&jh#zHh>I1V1Ku30$c+d;Lf1aF#%*iSJZBs0Cxue-@pdA z2CbF}AcGU^M}sfOy9O~C5WqFSD>^`)3~T@e862Ae{Ka543z8O#a*afilwMz5gDA=u z(`i^Pv*IGJo|YG6Kr_1mR;%nWd2jp{WI%v#Gnh=mdi~I3QXrAR9su`drSUjyHa}Ju z8`J_uqi|tJ+HSMFZgOR)ZU*mlfZeWqG%Y-fK?ZMifZqlgyfy_OgO{cNWI%t*O&Od4 Xkxf^INQ0u+00000NkvXXu0mjffu*e-u`Y1b?z zzWXd(t64Wrb6MRl-MPm3%bnSi&5lTH;%2!xfw$vO?LWcx>5tgDx7P8NE*G2%a+Rm6 KpUXO@geCxuo>m_K literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g05n0g16.png b/images/pngsuite/gamma/g05n0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..70b37f01e2b9e13a30a6e9d3c51a114a2f0953ca GIT binary patch literal 339 zcmV-Z0j&OsP)?t@NnF8DcSAbJ+I4}jD4==ze*zcJFZU7PBBkXpb0$0HQ1>69qAc{N%IA9o<0{k+y ztwZpB+XXm)2wVYpI0a#74`2wgEYEeVl>WRDLD#JdZnwEs3P4|pU@M>~u2)?HSOmDs z%O>jDD!>8DCayJ<2$}{h$mxDQ3z4SJr&0jRBM<=&(7Tr9be|rZe{e)l*V{)}8$|GW l@dAjTs?dUD3LXzX!4K_Ugk}Okv)}*#002ovPDHLkV1mh&gfRdB literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g05n2c08.png b/images/pngsuite/gamma/g05n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..932c1365364fead1166e4772f29dcb7657f73f39 GIT binary patch literal 350 zcmV-k0iphhP)yIS#@w5JksQ*g`}>M?;BdsB#iGXl_D}xBv~JKVfNIcci2&6=2B-$jrU)Q|6XY8W5%7NoGC(z`*F^vs1lyuu23P2l z!4dKa0rt=jWC9bvghS52BVSt=-A}B^lR{o z!EBZfhpyn1c^lB7D8J-F$KT*fK)J|Z=K<*ToSF6eZn4N8k6hj>3?mmdm%hv(n&R wWU%o7coi9}As&7nsP&a50$ri)KG u9IC*rureVboiWQXC@_w%oP86+Of7~h92M4HZx@7u9OCKf=d#Wzp$PyhYDC`v literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g07n0g16.png b/images/pngsuite/gamma/g07n0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a47c2d5746fc93d252900c0b2286878b14a71b GIT binary patch literal 321 zcmV-H0lxl;P)ic&7(nC-rHzraP|afnxc^RYsd`d`5u7poSz$l82kp{Tq3Z6JE6!C z<~cx~GsZc95JJcub)b0oLy=wE_B`cklP8(MI6l9^UC0cE!3;nQ`rgu@>+B3Z0>z=! T&@6K-00000NkvXXu0mjfZ=Zkq literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g07n2c08.png b/images/pngsuite/gamma/g07n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..597346460f1999fb225a46c941751a063ce744f4 GIT binary patch literal 340 zcmV-a0jvIrP)Ec1Z7JAAD^)rl zGc;g3%p!~-&*xWAO~jWXaK$Npe&EOP4FJlLpC7?~0$d0v3LyXpLqMLRlR!xgvP=k& z8i)Z>gESQaqy}ODGPs5U>}G%fNg@Ow1N4Z*fS)rkMhK9;MgMOA0e3K$8Wd6hG8n;r zXmA1Z-7-K1S_=WdAR39-HfGgLqn?XbwVVOhUIuloww+K0g9o7Nrm9jK0F(g&e1^=# z-V(Wa{fz-XY1a&35Di3ZYyEC(6%kphw4Tp(^SMg{u4DAwEbq7P7ygd;HOjyT;8iGt mb0`2ZIE4Zr1N1W+%HRPOfLawl;h_ou0000jY(XgVYP$Ug2i0{3Ntua3PevZO<6g^Ah?s$m6bVyVK1BpBEle`W(ImUKs7M+U~W1%@xC#RK_!JzX3_ zD(1YMYRK23AmC~*&8=hG7IXO0C1yqTPaJWFFL_6JBpnoMIXcsY>1ImurhiOn%Vt#m z5fC`n=)o~7+xK(flFC$FU60NsKN=pf&Dn9QJZi=3cwrm4I|rNBb9(vyap&(_JYhlR zCEhOE8{3?ktnW4_&R8ZOEj;gf4*xH^W5+UNujMpVzT34~{@9PX!h3Wk|Ka$Mox;Fy ze2R(Tv5(acSr+AHDoQLDVbJLg`uAs{=eP4));+&@o#p&$o;{4OIA-jB`e#}P$b+7) KelF{r5}E)9`D>*B literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g10n2c08.png b/images/pngsuite/gamma/g10n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..b3039970c10e786659f9752913c41b8a26b1179a GIT binary patch literal 285 zcmV+&0pk9NP)@();|)eY}Flu=NxRyTwAba19zW zNcaI2oGKYjCc{&aErrDdt_X+yXV}i(ARy1f{s-JoAU8t`q60wT=m4lx4WLj1#Goi5 z0}g9&GjO^Y?CP)v$sk{c!58?k4IU`q1^i?TP{4Hwg$wQL5H j&i)?k>vRoL{Z;$`)U8ca-rtX&00000NkvXXu0mjffk|^a literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g10n3p04.png b/images/pngsuite/gamma/g10n3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6a6be2ca571956ce45bae5470c03cd2266fd89 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+U~W1%@xC#RK_r0X`wF zKzij$28RFt|F8NV62kBw2K)ELwKW(gS)7nLjn&=f#?aQDJu;O{JayK!wx3QIX10fSyM0LA|{qo zr@2pEmRO+mfXPAELrdbu&4xCml^Xi(yO|>!d_)=C9<`pFX(h-9w2r~k)z4*}Q$iB} Dmq$l3 literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g25n0g16.png b/images/pngsuite/gamma/g25n0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f6787c7ab50968e37514529f53a6249762ca17 GIT binary patch literal 383 zcmV-_0f7FAP)$PJx&n)kH3|svhZZ(r0ivJ>sO?q;pvG#q^Pdnj*zaWkW*`MH zgTvuZ0}6;^p~3Np8;yq0Knh?6r_-MX=QC+2p~2;X8_lNB;Cht-m;nW}T0(={4L90t zp~3y`2b5*NfC2^sT+`Rg3?2{M=yd!5X7GIa0W_Ea1$4W905hON>h)}1tpH{-dv8qr zYh?yig&X}o0Kj6ArtTUrpa891&a%3ygBrvY39Yr(8X(K&^KXDL&H#scy)e;z2g~Jm zWsI8yn*n_$yCu)3Q-D0T+mfUnB%1+k42L$a*EYNPyBsudfL{?b7>)b@WOU@^z{4wh)7YG#lngB zpO4to4PwXAUtl<^EZyItpI$A4c0ho^z$dGfn@-I=c}&df(}j0HTdM#fvR(&W;o}K& zG9bWk2p1G&K>eeU5^p%h%I3sGP!q+00000NkvXXu0mjf+0UW; literal 0 HcmV?d00001 diff --git a/images/pngsuite/gamma/g25n3p04.png b/images/pngsuite/gamma/g25n3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..4f943c6175f31c3609bf4458fff9d3c591f112f7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+W8#6Mlqr_yhTJ0X`wF zK$<~Um*M|^0Re{pF+l47e;^$L6aWH-pup=-feKPQT^vIy=IlMUk+;Es$0ab@YvMKS z4NTlSPH?R`z_n#cTw`u=ph~f+$IqufMW?aPJ#nF}g0plJ;|yaa?KmnAMk`(G6*LxZMYGklX_CXw8pz)!~XsE z{R_l;B%iO@S+Mxi#d|k1W1jAhOum0pYrW6>o9eGz=B2dXkDg=peCAH+`yAT7-d7m? zpD=neuC5Ya_iW0gUZXDEgTe~DWM4fgQ!vM literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi0g02.png b/images/pngsuite/interlacing/basi0g02.png new file mode 100644 index 0000000000000000000000000000000000000000..ce09821ef101b65b2aa653931416c72923ccab09 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk`Bp9=o@yY{fmUKs7M+U~W1%@xC#RK_)o-U3d z6?2jUl3pY*JS=M4oiJze;et03Q>IK~Gc?O{N#DFKJ@&l7SH)M%%o7ftVn}g$DCX>; zkRs^i5p-N&*DHI8!;%tAJO+*|%*(hAE|_G=Fej+Nw{_diTA<+!p00i_>zopr0NF1v AeE`KLv!pxvIx;Y}EiimBEgr~U=jq}Y zQZXmBFHrE1fq;v+j0h02$h25#lnT63xZ-%g@gNW$aGWTh62d&wbH=%|b$8yp-97vE z;Z29Oxt6;AKCTefnOkLOe zceV31xk&buuP3aOvK_8v?mNu>)5yI*ti8x;zv2JpMH=2qx2(%fUX!Y@wwPzh+iJE; se9X+5d(#!(S{O|*V`01GC)_Bn-uQauWnXqNpvxINUHx3vIVCg!0H8fu|I&j2dyvG3;`TGSdQ=U^x!+b$IgQ- z%948O0A52IVpokMw|y20kXn4P1fk&um!5HR4i(o|AwZ6~LzrfePT$2C@a*GO>pzD`W+JMY+o{~OMQc&lm=3iqj(vZoAg56v)&@pF xpiv;U26q|-VrxJe1@ZNXf_(7)M8WX7;00Eg?uiut|NZ~~002ovPDHLkV1i{YdSU?-TFZBK`N@L-n zZIKuYb8U;nSX9Mrl^A36r{K12&k3mj^Z%lhjX;s*Jg960iexztW-CxinU-MA*#;OZ zngOW30HtIErtRT^u_8M_CF3kj<3j{vMRtJ6I<2P3n{$R*t1rNmk`0g=AU|E-;g=04 zMQ4L1&-<_M{L=v}5QRU_7&y#fp@D&gr9M`8f1y92FoiBVSa`IsurPtS ze{e7d3sdH>SD>hoE4z_nx$z0??7UgMea|aJNhAr@Zvg8Z*gUmKePu;z>y8jWkvlsq z1W-(qZPlsA;>PQ-xbb>e=+HyjR`72RpJL@9duyYiw{L8ondoV1Dstk)`yNe2E|Tn) zQn&|5Z4$O-o8S$zjgb_v!ImC3RAHrGc4#Vv!)L8;XfO3ToGLXjk#F*79m4!RxgIe_tfnTuJcqEWy)4g2yKb%DDu0za_YxN$~Sgf+CmT>X!ubOoF_W z03=B5#`sg62L3e6{2RJyFI>13c>MtF{pl)#xkJ@t(o7&`wRIOmYhI*_#{U5rtXn@HNfb7oz6Bu5!i$}Tx-z(a!?=gYPiFWah6BvhR7Y~@g_(Z#S%LK+P h+Qpp-{6C^y{2ine-m~8mME3vy002ovPDHLkV1lO|5~BbB literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi3p01.png b/images/pngsuite/interlacing/basi3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..00a7cea6c2d3c36627718a502eb14c812b0b7c46 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL%)r2CxA}%5ki(Mh=>-dBi{f3 literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi3p02.png b/images/pngsuite/interlacing/basi3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..bb16b44b30907b832b678a3b441278df340edb9f GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH%)r1{DZJ<-ki(Mh=EaktF(C3l8oA>Me*wxTz-(}y$c;d$?hLjJF#hg79QUtv`g1+0Ah)O6+%y3%0 kK!=4{>!bX^1(PfpwnWvwlrMbmdKI;Vst08#Hgh5!Hn literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi3p04.png b/images/pngsuite/interlacing/basi3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e888e2477d4fbaa3c8ed16a8007d40e58cd52c GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF%)r3-EjT<7$YDu$^mSxlY+GRXVp=?q&s^-} z8N$NCQvPG>Vjx#Hz$e62iQzxP|Nk8f|CRnTFwFe_KaJro!~b%i7*N6gnRh{q-T!wp zFt`9&E|)fV?gff(^K@|xshE@eVr8<$zX=QdragS9+NR;%b~IQ*M^<9l2E!vd+h?C( zII@q&;mi?+BR6^0F7JwWQfc53?9iD|$he5*L_qV3*BrK+SKaw>*N06*_XNYzScwH+ zV%a3lGAx}cv7khXdCI+B1NO@fK9ddC9@xTtImqX>;oQaofA@?RGmTe=O`R?+y}#PL zSZx`DR(OCwFvHZ>kD4?aPVKE04`%2+-2h~U1|1S{c)Dz9BG-bV^7qFC7#KE}y~^Mz Rxc~|Y22WQ%mvv4FO#pr5f6M>? literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi3p08.png b/images/pngsuite/interlacing/basi3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..50a6d1cac7a111d53cd3aec0d35dc4d09311baab GIT binary patch literal 1527 zcmWkt4Nw$y6n}dd;vwQ8DFIG$3@GI2c^hLQV*{=V2t>jrDk_FvDg&7$%b-@G;h|=k zpdN>Gek8Jdh#y$4REHQNu9O-n$@*~yld0Q~CgKPCdUtQ`_P_uC|GnSGdsmv8GRH?B zs0RR_gm`WqJ;%AfULF7pdq_&9mmwd-CdUF(;+S%8&r$#nNKHzgW#r%qssai!qCpSQ z0vL_7LIcnOu#UGNg#{Tj`hkLY32hvQ!1G1`Sw@Zn9(h>?HW2Wkq9XR7jEce`M@cLI zX9QKH0)U4(L{U}UX&T}n(htKT%SQskpw)^XiVOoBfYl1vBTI|Gh(?PU5N)D}JkUAF z*+A4fQ52$qu$3IJkUnIraqtk890gF3fMr1iHJ=i#wnVy*0swAiP?EIuK(HVK+H9oK zO8az3*a`*`R}fi5uu;&5F%xGAi8P7`R6^54fJ7UmSdgp%+jcbYbn0eLh5#4{O2a|z zFlncK3j#}*c@!wwN`=4x0@Wv9Pz46?iR#Xv1EQkRnl2%Lup5n_C@hN_Xp)3BL=u!O zgCs#6RU@v*uGicWd7h||*~k+*SQG^)HX|blsFAzW2%aZ!O(VrJ31D;t3x3pAg5Wqi zve-$Qc$9#ED~5p_E`A&DTySs_gXBPgvEi4GHiIsCXqG@a(*{? zqG+gzY2=omW89DcEUHMQNrOtO^VViET%@j9XuK5ipN55EJB^!6bHJ02)DH{^ z28HH;T8~zS28YEnJAZp0KzA^Ki%l=ATyc3-rZ)t5_Dwa^e3e*sHMuT3A|j#p=*X*F z#y0Vd=-McX6_VY&k>*>Z%e|vX1^&KXtnjHm_kp z{Oz$(O(8S=UuD^|XKQO8JeWScy}iAy&FQ@UT~n0V9QLiaO{Ytot3K50Bj4!g*tp@* zcGj*hPH>pOmLs;xabA)>UnI5F|W2|vHO`X8G8{qNq5UvQ>+yva2AorH*qN%N=1 zRO-F+*Y4O692_0}_3qrW zV_8*GU40<7^H$aV#hJ=gqrL3swI3}rKihD;tJ~gc@LGOoZ}}hHIjh6Ni;61tbzVDC zEf)+M(cfo^N={x^khe0+l%Bp^o)#S#*w$83a{u1Ivl?+Wcj0ty-sn>0W|&`1nH z58GA$jXh^Y`JN;7H@hZGKGv`#E%e2gv6o*jI5)Y=Gw4px%OQatp)Q!Xsl()5;fH&w40HKUbx zj4}D7oEu&UXI&wcy60YxT`|F*cQ@)MIhQzY_v!Om7VgvKXAK=bq{#ES%PVuszm5L= z&bJ*WO#!E!Apy*TI{`1@hW^84hM29NG>%Pa9pm_Xjc<61X<)<)m$})aVkqnKe7Wgq z-l@|1T-)pTTjSfo?;6Ga8{R(IDkmelNXRj)ZH9oA|PM{kg$m&gMT07S3iqx$gt>#1~b*D~%?ISJ;?`E{!%Qxx!#mpQpGpa(A8H z_iZ|MVh@5=q!mUuvSsYMxvKp95>weV2Kff8ej5&Q`t30L(azh))$_*RmQyw|G#2PE N22WQ%mvv4FO#oeUP~QLm literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi4a16.png b/images/pngsuite/interlacing/basi4a16.png new file mode 100644 index 0000000000000000000000000000000000000000..51192e731106e77cec52a3acda3d0c3cd54a16d5 GIT binary patch literal 2855 zcmV+?3)u9DP)g!L)UG2f4l6J=4p4#(2+)EA zvXHcTS1ax6t#q~OA5Tm&Z9J1dzH`ppKkj_bx#xV(x!C~bO!&>~VAnvFITMTviN3hTRvvh5o9_Li#WZ{Cau%@5fj4SqfkHXeXW_kl8PG~_?ADWrA$ zH!S0goyyC9fY0`aGL_B#ZB3zaMcUqyN1D1DLhN@e}=^4=3 z34M)_RrMTn4OBh9u@5%(!^-c#e@=DqtErHss}R!u2+M$o_#+hMmhS%WC0(uX!iWbF z{{dH%(3XVCx6jrq541zuHeEfwO;^`G1Dyr%>+i$8*=Os&bQqyL&<;y_pydy`dg>`% zediiHlykOz>5mY_`#`zB3#1Fy9)S}=SASGt88e?ogreD)z#MoT#Z_WQ5&;M zzG>OMZg4k3ZXYOzL9q-N?F2gl!|Pz618#l~B2UAP$1J0w0uH_m-a1&+1k)Bk!C`Q} z4|y6W5dmT@^t}T&zYG_?205!OBkZzRzZWrcI~@8~XwJa?-B7&(X77RNQz5t&vNj%o z?y&Ce*ruzla?PxY!jdRdoq(z+6mN&~E8*Oq;Cv0tOUCT7S7Wvk5s=kp8MEHDsN8^< zwF_pAL-9WFghAN~+Ic8zhOuT)zXe52aQzW@uNks56Lj_SAq^Jk` zFeMKDI3)X>#7@LP{w<6IArXXl5PE{p6@*wJ=xS`lH7g7*Q!_iZ>FO<8SNndVtAq1( z)jpxCnMZVWEMHfX-_zBB>$=)gtE)F(*VU_qx;nexVW?DY0QUm8TCSOw7x+!zvoP(p z^Q4($koJM~5_FfswRX684=ieo+2wI4RzaB+2H$y@5`|9|YUTySZx+=;Wi7~WL9zor zYk@02gEOtL>{iUKoCC$HA$a$K!c!28g8vEly<0O+&+(hH(=hrm4AjFXcc7&gYS+Z< zxwoNYF9hP?Q^8fa0p_QicdxF7a2t3wYi8tWT^;(hu3j$H)g!&Sy0r*uYvI1z@P$UF zQ}w$HWE4iDF!C5Iei)WUpk=jYo?GcRzkL8+SQoSB-G)FdcuzxKBjm(EQ9%hDgUpMN z$%pYWkdH$7DyY~2OP6WpYp)8UDhm0#Ah!aP_rSFoT)%)U6O?OjLR!GcN*Fu_cdFsy z{jh%-e0(NmA3TV0_&7%BJ}7U2Kq*XV0JR2kZOC3*uCBSg(67WU`;|{d{YqP{UwLJP zU)gm^$iF%%WbP6nk3VJC{Qg5bGI~bHwMO;!TXyD==(>a=jU@Z+H4zPr>vu@P8fLNpKB8ZaesH zL(y9>V>JwW;nH%9_8>;uhHUGKx@J~bNL>n9HebklHVIjrE#%ZCLI$@Anf@Cghd&ZB zbx6qcppddn$jpmE4m8^}R-YZo(o7JB*62S9fn#vj{-r*^z-9;5mcQJ$wt!}e21QpP z5e6&lH?MEe%t8}}8(`!Dq%$yn9wv@}Yd7RHfO--j~&R3_VTIa~wXq1U-Y$#pKz9>&NOt^KuJOvOX@5mkP8JV$d7|J44z+25=d`=k$;Ai2FXT9EC*{U^sj*K zZok=fQZwhyh2aMwvmNsO4z%TtZh#Z{op<5JA-LQGSDN6;NvP0;QN6-43U7ly3cl0e z{WtK$!TnE=_Yac<#=3&y%2KjMfM zKz9T#u7nRBfzvZ!@jhX!Z?lZzS0E5@+Gt7?+|PoVg1mmn4MWb|8W<15_-{cbK|T*- zQAlqFyBbm{7&-|9)1mtmTwd)r_g~Y@kQIfj0?4`rS#ikP0Q?jbVL)ax zWIT{*gz<-9`~t|iFxCm9qhL2dD&*`4J->yElM%o6sxSZ^-UK@ygGF6Xyb`o}@I*lE zfZSZj@qy9=*^43jb#SenoGAt#sAlU|q1PmO8&jeik3Y^~L zr22(*f~u(V1TU# zJ_oi3QVlR%1Bp(sehIz3&{geJ_Tpp0*jgl5{6mj#6p#Oci(*~VgPCM1E5mdB8 z#V#n%gFurrqQUXYJ79blxZ9y<4RjpGXo*4D44AghnMhhUR3W`33X(1<~qBSrz1pX~BWewzo zoI(P~YlSKAg1;3;TVWysN-MZq9lZ!NLT@X^#lujz2mC=OcoTdjlfOlASZlPl_{~7d z`4t66KF9uQ69q@qvsAXt%q9I#IP^;|7^ix6>=L_yx>`2dh@V`j`6FF=a$IAc!002ovPDHLk FV1na*GhqM# literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi6a08.png b/images/pngsuite/interlacing/basi6a08.png new file mode 100644 index 0000000000000000000000000000000000000000..aecb32e0d9e347ccdcab5d7fdad2dde7aef9da8a GIT binary patch literal 361 zcmV-v0ha!WP)!N7@Xl>n0JWRT0P1ZZ0~F7IAF8qd>UAgssMo0sP&xyjf=W~LX-;!O00000NkvXX Hu0mjfr8|%> literal 0 HcmV?d00001 diff --git a/images/pngsuite/interlacing/basi6a16.png b/images/pngsuite/interlacing/basi6a16.png new file mode 100644 index 0000000000000000000000000000000000000000..4181533ad81b739fb7b4f3b024f632cd7baa85c5 GIT binary patch literal 4180 zcmV-a5UcNrP)P%($Fcoe#6-!(G3%A7}6XWAFce?|mJ%ZQB5?CIGZrLy2v-^hw$_L?b`_ zi6mH7N%6|fuAlvE%#UQ(y-z}|Hn(nWoo%mt1+byj!nUU$1+XkADPFnxv7f>d>sD@- zqpsZSXiq8`tgn>e_!_9y_U)B(*Gw(Q@ZpCwQ>Q%bh8+oj@6L_A1GV9{I(K-(G*btE zMXK}l&)u*i3Gkb@ja$EW>+28QI0LR*gZ2KQ35nr#;IQrXq?|0`hg$8#T3I^YAo-ul zipDF+1A&>Q?!F{$AP-QzZp2}z4OjEsxlkKkakFfFtGr`FYW5IOF~I0Y>b;umBvkJ?bz(@<7)OftgdD z{zDM1O~4-laBXrBFRT9~2osXvFxN^y7((gxKcqX{*yo3ce{@S}3L-vJ8O^PXl~(Lk z^=DLB7@g6IhNG+8@W(QMk#nvHLBx0Ej*1vWe5dxwj{OrP|M;L}!aB8l+;c})!MP*f zn1oEE^=jnVV9LSG;?4Rc8nS>8arZ5b;gomhlkrEmB|a`&L_9%~Vr|_Rp%S z3<0qlL+_gc(g(da0%T{p4+7)@t|UNyk8`L1IVC_=ZPtt9l(*iKw5CfM`vKb8PF-Cy z)zmc&?!RBQ-2WqhX=jgA0*oAez7wG6`S^nX-kIrx0G`h?V*y;da|?zDAd~=!dnEf0 zDPwL2=$&WoD%)e~pESXQr6wm^;F>vD;r(EJ8|J+azn%dnn~sdR=I3y-38wu3;EFM4 z&H$7?(Dx!h=t67+fPYVFs0CtUCCvta__2ghG}+XKeh#I71MwM9bQm(5z_T2jZ$SPI@ckIXi%_y3`e#G#6u8EL z`+3MNgJ2&dN};d5XI<%WFc5dX`c8lr{Zj+X*Od!#0<4B`)JVCZ zuO7g!hYvtFsx!m;7A-`wFD{F0Us-=yxwE)1@%fgKwT6KHMI}28 z0rC5awi+onn2TkH^ox=gn*c&p;5 zR<%JmI%;Q44QSDK?kbr2olkEWX9(z7J$yYtYPWwrK&IF;0FZ5Q&jH8>oH7^aPANda z0`~V5Rid?@mCU~>nb|7&-b(-r7rp#T2uHbV;hj7G!O~&WQt3SJtLeJ|Tot)50Gy$G z48YN1&jE1w?GykyLj}k^rY5>lGJQreu3U0{jO3AD0=)bZ-2YdGsG0iOuBxlh+m4Q# zHDw$+L{=N?0m6@4I)J}8H2^TI^-tkOq?xfq$p|ZE53?N)>od5{5Buf=cE5;b&!Zk4BB*Y(tqURz11~_jAZw%5!5dJf;jzC2N zbT&e^*tD*2qW2GEi$@QjL%P*l3s4*wNCE^NPCg6HOD-512fCVI)DlDV-2;|1u=%NHH7sLgf|%?b_aysFoc*6z7GtM84I4z4Pkr1kv4>@7jk8W@ScG5L_-Ak zLZZ$PC0n8YK0}l~34MD`pilDzg?6og*z-$UB8Q$(LzB zyu8;0!=XNhkzbw4_ASARO(Tr@or66jjVA3PtA~ z%0Q}rTGhw@Lef&@p3B%fzo4*bYGF%rDXqol7%ByO!YgjE~g#$Dn6t1ZR*}zKG)L0IvXBi>JXnSXH2D}1nH1B z25_-y*iwM(3@LGTpL;Gq_67F?0J(ZsGeG`f=d(jrfKw%8$2L_~25{b>R8R+X*LBJu zN+pkamhq}1j6WtB>I0~JbolL{MJpd2w-LfoPn&Etl>riJ)OHnl+SHK`PAwnzoTWq0 zo5OE6b%>S95mO;KL;A11&jMsJQi5!;djKG}#kB+=*W!}L-^0%70QrD31z<0B>;TAb zbS@vV0#FA6)E028Q{_ihSt-aIRaP;>;TYQP{H-$73(8QZl!0CXsHxF3(4sXp3l~8+ zTKF1X+qv*gO9#``G*gH4DepLd>=^f1fZT&}#QgPg2K!CN0sz~VW7yX_o!yxIb}oMd*hWad|rLWQ|P zTt5G@WZO}xE_W@w)6y5-2@4m(YrA0KB7mByZEXM}2hJA*6it>9-nU9T1>pHhIfL8E zmH@b1QUd3kd@F!+OMVG}^Y8Kx05}@$2Do$&an#$*0FD~FZO979tG%B4M^#n^$SFm$ zDq&?FS5);gEo9L7Co>7TBE@y}UwZGllsVblufdJb;+2;P|j zpRQ;-I({qqsTEMO5uoz6j<*0xSNE+42t6rh@J~)11MqsK1fJr|0DxzGW)*cz&JCxsJh~Ak{cF+*k2?$pkBEB4oHW?!20e{vIna$w&p&|0uf%8K{ zI6s8^b%yZ#5Hgz$;m<umaL6m8aDT5NZX;({!R8f)Ptk z7!ZtDBt}5+0wk70a3drRL2w2nDk0bb$<=Zhrws5%;9@%rtAea9-~R0r;HZ{A`-H5^ z>M+cJixKeGK&lOL2Dl<%8{mk5a|YxOfqNrlmxK2Lq(^|i7E&#cFybEtBj^bu&d4bM zfsFkB#P?6)CIDZ(Xa?}=>FAIZP`DS%=hIX)dC=cr>3x1EO&Y@74cY=j^e=*vorW05 zLb2Nr@oi9auOSjQL-1Wgq)hN@h7g;;x6BZk8^Cke5ZTk<9&3pF6X0B92zw$pjvK;p z9PEjPaIS&;6NYe)h3siVcn(A621EFkf!JgSzXmDO5W#mLakC+c?uGa^LlnDVAZv({ zozTC?5ZVGTcN?NK34MM;_#2W39S1BO`U0gXsb^{Pr4`^PJXVVq@YRB79m-UzwC?5g e|1a9-z<&T43-3ulno0000I4&-uqx;TbZ%t=lFvY8kdJ=QNN1hN=BUHx3vIVCg! E01FBk(f|Me literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s01n3p01.png b/images/pngsuite/odd/s01n3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2c8c78261e509e7ef2c352306618963954a84a GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)gaEa{HEjtq=#3k+XOiwE+Vi=8|} zSXfxfe{5Y0;s*GHxH2&O@2a>I4&-uqx;TbZ%t=lFvY8kdJ=QNN1hN=BUHx3vIVCg! E02xdg0RR91 literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s02i3p01.png b/images/pngsuite/odd/s02i3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..2defaed911a29507f745bd7183a9819b29cc53de GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^Od!n2%)r2CU%&n%ki(Mh=)Kx2KC^NX4Aw1O`S11~vx9e?93ZfWi!(u6{1- HoD!M4t literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s02n3p01.png b/images/pngsuite/odd/s02n3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1b669643540f182c425fb67869b7f97fe75f10 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^Od!n23?w}&=BEQGmUKs7M+U~W1%@xC#RK`w#ZI0f zEG#VLKejFgaRYopTp9lVmyFR@1#)>jT^vIy<|HR1Bmj9V42<8zEkc1T22WQ%mvv4F FO#mnG8JGY7 literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s03i3p01.png b/images/pngsuite/odd/s03i3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..c23fdc463170faf97e53fccb4799386700b21a15 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^%plANBpIb2ie~{iEa{HEjtq=#3k+XOiw8*-J9&n% zu&|W>*t!_VWee~Lab@_=@V}g49;WoqQ$(6ld^s L^>bP0l+XkKxV;@Z literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s03n3p01.png b/images/pngsuite/odd/s03n3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..6d96ee4f873baf1df3652a8d70994eeea799c30b GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^%plANB6FUp{{d1g>5jgR42*3H3|~x(2T2w?d4{mC zu$2GUx){i13-AeXW%$qVzno#?)1~u)B7B}Mjv*Cuk`odN5)y#?V+@X#hCJRt7K5j& KpUXO@geCw&86D36 literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s04i3p01.png b/images/pngsuite/odd/s04i3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..0e710c2c397e371e4feab66add6a9f9763ce0c27 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFt%)r3-#KLAZh?DN<>&U>^w!rYkw0Iz&x!B1w zgoTBr{KwYCKrUN=Pl)S(hVuXa8D@QV-U$>D@pN$vshE?Tk-%_}nTL-@Si+8hL2?}n Uzopr0P-Lp3;+NC literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s04n3p01.png b/images/pngsuite/odd/s04n3p01.png new file mode 100644 index 0000000000000000000000000000000000000000..956396c45b5103d3c38dd8906be14002e5bee48f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFt3?wJp^Voto>5jgR42*3H3|~x(2lAPVojgNW zSXjz`Y+VfGvIY2rxc+A-|Noz1)_3QfKoNdV7srr_Imtf`7%+0!GcfRQFf%r7-v+XT N!PC{xWt~$(695jV9kT!c literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s05i3p02.png b/images/pngsuite/odd/s05i3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..d14cbd351ac11022eefcfa3bb2af528c3aadae41 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$9%)r3d&i3yCki(Mh=b^8f!C{x5dr%K!>0dAc};RLn`vNXST-!El6+N0&!i n!bU<#VwswOk4HkpRtAR1>$j<%)r2S&bt2^ki(Mh==jv*Cuk}VDtG(2QH%-+V! svtII_@t;Hw#zXcz;mHztXBa0j9DK~v7~1r+6R3f~)78&qol`;+01$C3h5!Hn literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s07n3p02.png b/images/pngsuite/odd/s07n3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..6a582593d654c8d43aa8c8dfa8f6516e4f24c8c4 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j<3?z5j>~{cCEa{HEjtq=#3k+XOiwE+Vi=8|} zSXfxfe{5Y08<>}%WQZXm_$N%<+Sv-f=TJo4b eYw%F`{a>D;u##)1Tx>4LCI(MeKbLh*2~7YjwJ1CQ literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s08i3p02.png b/images/pngsuite/odd/s08i3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..acf74f3fc4132609443b0555d56e5b314644bf23 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ%)r2SE-kGO$YDu$^mSxlY+GRXVp=?q&s^-} z8N$NCQvPG>Vj!0%z$e6&;s5_~hX3XN8U8actlAYR0~A;Fba4!+n3J5qz{IFfcOc>T u0@fwp4bCJ+99*!q$#Hv=FS$q5Mw7orX>_}}cf hovEdPM`3y+BZF-itL;x80b!sr22WQ%mvv4FO#lIoCTIWv literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s09i3p02.png b/images/pngsuite/odd/s09i3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfae8e45678282b23bed2760c0dbbd736be9df8 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4^%)r3->c>4%AcrO0(btiIv2B6ji)rydK69~? zX9x=mOZktji-BC80G|+7hW`u<<^TUP{QqCh@IQEaktF()~}fr+~zg1bjT rBF;F5J&BF&_kSLqX%_`}QkWS^|FgS^^-Kp^#=zj|>gTe~DWM4fSkxz) literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s09n3p02.png b/images/pngsuite/odd/s09n3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..711ab8245189b4d5118b4dcd49ef9771bf924fb8 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4^3?%3Nf7cA8SkfJR9T^zg78t&m77yez7dv@| zu&}U{|Jb@1$mI#}32|lk&%jXr|3Ab3|K$w-!x&P4;_{v@jv*Cuk`ox1e*fp;30o~G lp|iL#LdvQ6heDwO14Cvi>)|ZtdS#$e22WQ%mvv4FO#lN*C*c49 literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s32i3p04.png b/images/pngsuite/odd/s32i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..0841910b72779aa7571cce45e56447eeb3de4520 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF%)r3-EjT<7$YDu$^mSxlY+GRXVp=?q&s^-} z8N$NCQvPG>Vjx#Nz$e5NNdIRjXZZggLNS#8F9$J!e4s=*NVput`nsRZ8c5&pba4!+ zm{U7pFJF^^h?~7@-J{?g64%>Ss_=bq+ht{1xSCJrO-tjMmhSi` nkfZu#wXNcYdz+%H|96_V1YK&G^7e=_(2oqBu6{1-oD!M>$PW;WtqGsLq6}$jpDV7@>y0l)ibBXvN}dz6L`X{!W|QK qt4`9uP~=9WliB7OneY3z7cem=9`<-$rKSgT2ZN`ppUXO@geCyfYFs4% literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s33i3p04.png b/images/pngsuite/odd/s33i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0dc14aba444d3f59f0bf77808ee7ee78ab5a48 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^iXhCw%)r2S>FoPcKn_c~qpu?aW7`757t`W_eCA>& z&kz9yJIm7?|5Q?Gve>sQ=2z#A&*U>UfA#bB(&kXT4uKE5vkQo zUQ-!gbN(`3qRGqhce6z7%EakmS0Y8FPq}6+_@ir6xO2`=y*VFuJPs^Aejwdi=Zl4) zY)`yQC*Lu~AJ4vKi$Bd@7qys2yXwnUHmtVq{n7=4!I#bZtC8xk9FB%)(-P6#}_whaYKv zG;#N1*N-P`3zt?rkunQiXB;>sd*S~OJ*$Vjx#Nz$e5NNdIRjXZZggLNS#8F9$J!e4s=*NVput`nsRZ8c1LAba4!+ zm{Z%gm#f)8#BG1p-0Bz*xXo g-$=Io|APMvAEo}ki@M*T3G^LmdKI;Vst0JTexR{#J2 literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s34n3p04.png b/images/pngsuite/odd/s34n3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbc68b3b9d5f263eb64bca9ad8bdfeae8205f63 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U_3?xrvihTr9Ea{HEjtq=#3k+XOiwE+Vi=8|} zSXfxfe{5Y00D12$B>FS zQ_pYYZBP(ky%4X^8GYlzZKG+@7dEqqPBxHOE~fV1{h+qq6V*Svna^1j^)9?Ct99+6 zN12I`jtXnzk)}u!%RD37KjJGY{QS1{OXvRBqt2SFsin;wQV|yPQK!t*<5f${SKY|E by&mjqj=t@%(q8BXw3xxu)z4*}Q$iB}CDT{I literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s35i3p04.png b/images/pngsuite/odd/s35i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a5e0a6595f100edc1f79a3e0864ad6ea0d0121 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^${@_b%)r1n`@_6HKn_c~qpu?aW7`757t`W_eCA>& z&kz9yJIm7?|5Q?Gve>sQ= z+doX6Y5h};;jD1&3&kR*!|w$e_FSCK!TZ;uv#nAtd0y%gzGN#yUNMtr9o7cw{d`v} znPPXp_t6M&TexoXtroF))1FRQrM1j3tI<%mZHpV5tekks+WAwqdfa)ug=wLE+m7oy zMQ7hT>LK{?oy%sWdO^0lW9vk3*7N!L?zPr!EpIN@4l($9_RGP?h0kp-%f1)C*BQ6t zSkfJR9T^zg78t&m77yez7dv@| zu&}U{|Jb@1$W;&U32_C|{~5{|{{M$i4CVjJK};YYC{Yd)E(fu`?q{2n^e{*@3Z79)POXW#oDtF1yr`=+itVv=OktFdG6g{K)mRoAX+EY7>z zmhXBt<&Eu!6r*o!cV_nNo&Ccp*=?%nxjo?-PXbeTw3r{SnJ?StNM`T3!o6nKZi}v&Xt(4rKl7t^ V?&lUg^#FQ_!PC{xWt~$(696v@lAZtn literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s36i3p04.png b/images/pngsuite/odd/s36i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..eb61b6f9a325db7d967bd796d3a65494bf6b7754 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l%)r2yqPf);$YDu$^mSxlY+GRXVp=?q&s^-} z8N$NCQvPG>Vjx#Nz$e5NNdIRjXZZggLNS#8F9$J!e4s=*NVput`nsRZ8c5&tba4!+ znA1CPFITgHh@1WGUzfMPP>Mb3d2r#rz};nBJ2KhD%L@z2iugh<9M4MfUF6B#_T+KJ zyS#u&i*AX_`$J4FwOGR3+lYu(xyz9^Us?I$Nzg8@_uT%B&fwPAv<_h$1 zKV4X~uHW!2nO zw^mgdcYZzlI&jNId!5cjyapMo+SY3yv3S|MG5=1ghQ&wM_et*;#P6@Vu`=r)^ENJ> nM6Fzb-Rz~M-&QV*`e$h`)grF|l3?zm1T2})pmUKs7M+U~W1%@xC#RK`w#ZI0f zEG#VLKejFga@7NTLR^9Le}-~~|NkKrL;3%55EIA;N|b|y%R#KK``N64bh)RCV@SoE zeX02TU7fN^(b&f@AC0IF4)lp>A zamtZ6X3lW8^&N+fpX;N5a1N0dE1b9+oO)I`@yuDpE^(oyK}Bq#(;+7|2{WUFjT0Lq lq)!ST`XV5f-^|R;z~ISp;_}2b`+!bh@O1TaS?83{1OP(LROkQz literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s37i3p04.png b/images/pngsuite/odd/s37i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2b1e9b79ba8ded32f713506b543f95c8720615 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^svyk5%)r3tu$^}qki(Mh=sg+HIV-2>Eakt zF(-9`wNR6RK-+&o*^hxQcxC(!_~<1(WXyQ8cE!t#;Gj#lmM+`0{Ul?NhPm`7gP#(U z&TKlpT{>aX1vlpoG2ywrj9K?;d1~@l8+XmqNYD|GnW?j3_LDi&_Gk5ZpVL(C5Y*hb z;_)GkI~OeSB#!?*!4ts2={s4)Kw+AwsIZx0;sW~{6Jr*4M-?k-J?sdRs5Q&mv0%AZ zytIqJyc-jCPuY6yD{r}_O<9KFm9UNB@vD7vZe722&ATSp?!|BMy_))a()awI`Eg15 zcb}IZ6e>9H6slHm#xw|b7U^#ds^C5mec`FsvsuL_-L{JOW$W&>5V^;FS zsTXzmnjHk%9_laj{iXhZjaU6f3%5cQ1CLzmy47pf9C;MBe%0{;2EMB|HJ5HS=D#U8 zTcE<&;mf3XHLadi$}J7S6KsC%TdZ8VLMtWoP@;^%GPWsSI*kflz0dEPDy4JU==ewT z$8HrlSvDN~XJuI*Zalg3>X&(%0bi?r*mu~p# z*kbkGd%RM6vU;~}yPmpD-2FE9?b`>wofE(7z53qT-=ZIGukYz~KPva4hT&JMP+%DE SUKyZ=7(8A5T-G@yGywpP!HFRN literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s38i3p04.png b/images/pngsuite/odd/s38i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a8a140ad7ec7f78f5b8cb398f54233e790fe7c GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$Q%)r2?D{_Pz$YDu$^mSxlY+GRXVp=?q&s^-} z8N$NCQvPG>Vjx#Nz$e5NNdIRjXZZggLNS#8F9$J!e4s=*NVput`nsRZ8c5&rba4!+ zn6q@EJ$I9XOxyf_5svYTT%(q*Y;ODGw$)5_M`m;PZW9x8Q*O>*8?9X5^PP9_c=!F& zj}P}&avWz``7H13GiA$f!58}0_y?X%x||YHuGu}U@%Fz$#r)47t&6p-nF}}c@lTBs z^1PZ{v*FFH8(9sEQqM(?B}LEJyE$O3_FS z$q5XNhu)=5Tjidh!fa-!aP~lxV%mWM7U!NuQRf`SX00}f3tT>iIb{)A35DHSJCk^B z9JyieHiKao|6$!5cY4l9TNo}lec>oiL(-j$qysxN6CA{uC#7^J8uHKH+k8^@!3HLV YPnp`y=hnD91lr2r>FVdQ&MBb@0IdL5LI3~& literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s39i3p04.png b/images/pngsuite/odd/s39i3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..04fee93eae400e745534756b48f5420cbe4a1d91 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^>LAR*%)r3N*;O+E$YDu$^mSxlY+GRXVp=?q&s^-} z8N$NCQvPG>VvyPZpAc6d{hy(n;s1XK#Zdmg9K;0jffD5);c^h`>wY$Cpuv)!E{-7; zb8;sb7Bw3PxXwR5nPsxbIbI3B13h{Zl-LU%&pWl%I?8Km-rd09oy#9GScQZM32{6% zJn&)b?*IA=s?&@YhcsVH;1O9g(`9z%6oU2EhY-&tz!*HGHjC7g8ZRKA?r5euu=`tFBX7AyHo&^hw&tWyi;3*RQj<5NC7 zD$9QAmr-d~@vfp^>g%_&3Lb_R^iP%F$ND|O^6>H9g zXp(yF?QYZiJMI0h)x3XK|Fr(u@2&iL4zKdoR{mw=nP&Qp=ij3Tz`$bgboFyt=akR{ E0PqU5-v9sr literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s39n3p04.png b/images/pngsuite/odd/s39n3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..c750100d55fbd07d216bcc5af538a83b9f7772a3 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^>LAR*3?%D%eb|5$OS+@4BLidG0>c;6;(>hTVkgfK z78aKBA6plL)CTy3xB}__4CM^}|3fH-^8e)^CXf%5Crf5MCykT z!yOH&Kayq_xt_}isYhMd#%sHX&9!mIgr_sq&#dB<+^ar$Z{X$9)vls_k8f1|*}8bi zpB=vzEdR6P)rUoYc6jZ*eQSQo)o-o)F5h}-kYN6lt?pKC%J$H%zv=qU-|SMRztaeP zGf~`5;@h^18+60tYao5g)5S5Q zV$RyWja;A|lo{eZ(@L`p} zS{LWU6$LrdObg}*USsKY346=g=`j6{lFBTGU2~>go4o6%r;zgB(0Rug*KVDo#;EA% pAydNHT#*-Kd$uF{lI;G>I4-d)zk<)z6+mAyc)I$ztaD0e0ssYck!}D0 literal 0 HcmV?d00001 diff --git a/images/pngsuite/odd/s40n3p04.png b/images/pngsuite/odd/s40n3p04.png new file mode 100644 index 0000000000000000000000000000000000000000..864b6b9673b3b331f2956ad2299b7854210cdb41 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NV3?%C=ER6$FEa{HEjtq=#3k+XOiwE+Vi=8|} zSXfxfe{5Y0FS zXD@8zZ7|?*x#--bqd09rVn>dvna6z96-Ml=&4Mcg{<*&Jc=+gKnBVfCtuiaG{Fsq+ zN5I`d(XC(dB13ART()`KdT#Ey^-ixof4?!Sz`}fsxz-Y$_FSPy%NW9)eC5gyx=V3r k20fUw1BpBEle`W(ImUKs7M+U~W1%@xC#RK_qo-U3d z6?3j$GUPg7z~dZf8U4Qg*qsHF4`@^yUDaY)e6!!)qG9=taAD!(1y)T7vK%uR?lygM zIK}cp><*ign#1-5wiApPcd>47oWOZOH-mqPPlA0u`y2l+k{0Ld8N_aQ--utQJ^wn$ N1)i>cF6*2UngAzTID!BG literal 0 HcmV?d00001 diff --git a/images/pngsuite/order/oi1n2c16.png b/images/pngsuite/order/oi1n2c16.png new file mode 100644 index 0000000000000000000000000000000000000000..50c1cb91a0171e9f34991b079fe932f5f0bb16d6 GIT binary patch literal 302 zcmV+}0nz@6P)NTxus~-YE?|ew94KIo9tHTv?hhRR zwrA%J^h9UxCeRmyPjW#d?oxNFL9(uFDZ1gBle+D$rIj`J+5;}Xa zfF63WfGT3xy1iYa$zve>zUI)9x>;M1&07*qoM6N<$g8PGj A5dZ)H literal 0 HcmV?d00001 diff --git a/images/pngsuite/order/oi2n0g16.png b/images/pngsuite/order/oi2n0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..14d64c583db347908d4e107b49bdaf88e3857b8d GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3Lq>1BpBEle`W(ImUKs7M+U~W1%@xC#RK^co-U3d z6?3j$GUPg7z~dZf8U4Qg*qsHF4`@^yUDaY)e6!!)qG9=taAD!(1y)T7vK%uR?lygM zIK}cp><*ign#1-5wiAr3HXJYpnk5G^i*Xn0_QnaE7j!fDm-r;u=d-`@{~~E|zMets XhWCy5O;z!=K$Q%hu6{1-oD!MJY5_^ zD&}0Bc95&tK)_}B1IPN)b=&{0{WeXGjd@a=TH53@RT6EkPi(I(=ofHeu+x7q>wQX5 zah-&%x^euuN1vn0w==yySE5m{$awnax1S1PFES>4-qaZX;>{9*dzc{lpeF5*>&z{m79Ma`yb}T3cx+N9l7QKY_b21tUy>hHS zj=$rVW!RSfocD`M`g^qt@_T0=(DrKPRwV_Ejec_{h{I9JdPiZ{w#YI8t;GR^e@i0d|ndJLIzJ) KKbLh*2~7a%CxW>E literal 0 HcmV?d00001 diff --git a/images/pngsuite/order/oi4n0g16.png b/images/pngsuite/order/oi4n0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..69e73ede311c4a846a8f818330708658a1e0fe77 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3Lq>1BpBEle`W(ImUKs7M+U~W1%@xC#RK{Bo-U3d z6?3j$GUPg7z~dZf8U4Qg*qsHF4`@^yUDaY)e6!!)qCI!=eVEdQwQX5 zah-&%x^euuN1vn0w==yySE5m{$awnax1S1PFES>4-qaZX;>{Y_l!4PL3!@ULbQoiNtWY z=b;I!`Z?mk+pi~%T4uHFkQ%qs0PKuo=U#gjgXq@dQ#YX;uR zyDEzTqN3i8Ri+t9;=Io`4iKjuJ*jdoASoRATB86`e`o#L4-kt!*XOIIkPy|$Z!G18 zk=$_R1cm^jDHwGE*;OPH+pecw0=8F|cWD7)9r{V(>YZh7s}#xX@Y-V@a8$R# zz7Nzll=T^a-D91a7GNOU#!3RDRppIxfH+g4`7VUA7;JpD{z%Gl^hz`rR!C-7WjBz2w=IKp0oL zbO>k?lt*0#RAuh<9{?e*sV()uX|32M9JssnY{osHpuWUu5cv8Oo7WFKnf5e90$&!U zD|&#%lN#4PfLz=wKl=n%AbF;bH~a_iR2$1}rLn7htMc}f7XqbjYTgrI+dp1QF98{q zx~>x7qmaPfO~8-eOc`>46CZ0QegN!tCr*3|kka8h&MF@x8JDN?qySsUVf_vKy0476 z9%wM?M@--UJ8OATkeUmSDcRFHm6nLa%*FSV76{aF1);#sVqI_>Kql)G-?4S=NapNh zVg_*djmhC=Ag9J7dkM%L^-MbokZB}6AQ$H>b5|DQ7>`=5gAqs{oMFj;fyD8u{}=gK zMu71K5`$&sNDOfBa_Q}rTV!=k^EBM^c>q~R=6AduZXuc8qS|W*kl#6Wnxp&)iHoCb zXd@uZXIuUPD6CbzZUDK2+Pw*)4M@m|&Mp?KwVGjB$JzxnI1su>k|SW z;K-2xP8~qD0I!0IuDeLqZiu^T&h0G>BMn)Ym=lSRkOKQt;)MxF$jp%`={{CrJA+}Q z0NGudCGHuG7?!!Lm%ady&A}>J%1A4M0{%q_gjthe+%dX`L1TnYm#8ctAc9 z@}pa>>=HU6*)gvdIs;@`N_gX0SxCrj<`CfL)P#i0DJdZ9W{Ka!FtV*beIQ<%iDapc zzwQpuzunh$8PLB|-d+oAxGoVK2OOgUZCC)=Ex%&=XT>2Qmra%!>Ggb-Hfk2fkY^() zKsHtKl(~0px+MSwNPBxOXxkqksf(TP*$R+5i!_m(4oOIRA3ry`IR({7L&)Y`5g+dy zjA3LNm(5d>Pa+|cbrc|HP1XT<>~@^s)UP}#S04qW zJ7f!3yE~lF1UCm1Ag?RrHNta!r8Eu0$jtfWu@_WGT8_ru{1AB9l%}=?3U3!0mB7Z| zi!2)ef4yhpK|nM&HhOB*ztD(3v5YRNcL0EJE literal 0 HcmV?d00001 diff --git a/images/pngsuite/palette/pp0n2c16.png b/images/pngsuite/palette/pp0n2c16.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2aad7335206d0563ec5e8546bae83e16565080 GIT binary patch literal 962 zcmW-gPe_ze6vgk1W+4now6M&vl?^RQyA>2zjg8cRnT4C8a-ev#F_0RlCh$*z86iP| zaVyJO7(suuAQvVX1O;6NThywBgyle%p;kiF?Y!^7%*UPg-nqYX?l%`38+JvCR~8dd zB)L1WAJ5hPQxeAagYN1HJPOnCJ#h+k^;hS6n~B2RjrC1+_??J}9FY(yk@yB>bT*DpgTKuCNOVY>KHEazxSy09-hZpy3u#A`f8V zHsSyi48tL)AqHsN1Qs~Z7}}6FKO%n`+o-V&6GM>jhqkEH%nvXazo!T$>gO2@$wLLX z`|$=*dd46fKkdM#M|Gt4gY=kt2bIyaHXr#UDa%9SKVaIhyKeYwX|*h#PykDCr-AN)~w;?+^4yN zr-s8{bD3D{UA{K=ZMOCByHINGNoR9@dNzC}GcY)|Ju@)5BDQntP)ot4{Pc$K&wPET zb0n|#)BTaYxn$Ykj&#Mk)P>xtSgI$wXyNturRDT2Jr$Wxq-QF}D@JdO#pYwF-{qy3 za({X@R~7V)9!N#APsdv3V~y=a8^^ai{@Af>>)D}>Xm+S$ZFc#a+o9u`9GCs*$lY49 f5Z_z){0_hPQv2`7;*nR={=b*3Ye+n*O`ZD>%pJzM literal 0 HcmV?d00001 diff --git a/images/pngsuite/palette/pp0n6a08.png b/images/pngsuite/palette/pp0n6a08.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed7a30e4d16e0527c2695bf0493ec1ba156d8c4 GIT binary patch literal 818 zcmW-fy=zoa5XDDVMV1W~5)ehSNEfm%xBU z2&4*#Vrk)5qd16#e?&m+j8-!K=3aRF?(EE*Ip@rKwzzO@s(ZRCB2&ZbgJs_5>p6am z-v^V)Z(c|4^l$d%(39=C{jFOfho3IqSefU45fw2J7YUK9NLAECT{J|qlBQxN=3*h1 zRqHBl;w~QIS*@WGCgBnxkswK`q)EDDND_bzG*~oKoi(S9sk&;YW{o8>Q**UY%VI&& zP2JT)J&P2zVH&Ox8VN^QHBHksLzAhn1`N`$gcdmlgAFuTG-nB_nB!()mZgueMDFHc zo+TF+B*QJjB2f=1YAxL|ERlyF(4-qX&<_a|!WuA0!;(^XFc@s0!OC*3(!`u_&oUBy zj3tWjNPI;uEJ%8WCqCjd2EdDQj7BY1;s-S8#tt|k7=^F~4AOK$3myyx8|bVRRW)g1 zPO>qKL?2^`BC{6Q)?X~zMr)sKNkyvpUh8dE7RTmJZMz9B%1uKpztJiMZ4%IY4r~eY z(8Q?Quih^4C60%K{>u7`U*G4t?=SSOE=^ya`TK7B-cIk^kKIxK>$!`kdXxRvvtNF0 z{=1(CZ$@{A&yUj9`FybVvBPCeK0F$)bCK1Jv!jQXxa@3n&V2eaJ~@4&3S>CHFnD=o G?eTv$Q+DJ4 literal 0 HcmV?d00001 diff --git a/images/pngsuite/palette/ps1n0g08.png b/images/pngsuite/palette/ps1n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..99625fa4ba1c6964446797075c47ee05dcae22f5 GIT binary patch literal 1456 zcmXxkK}(cj5Ww*#aAOfA1P>uWA_;XUl%aEMY}7)@A`%EeORi%bMFPEcC<37_1p^(# z58$OQAu`alqXdS>Zh3N=`9rY#yvw`)eV+Lp_Wd|qc|1KiH`!X79z5x<=5@Z_-CWx9 znZ?_Anb_(*>$NNI50=lrzHF^Cw=;aYw)1B9?#A0!o2|;IT3D6USe-R$6&j%t8le#y zp-~#8Q5vOD8l^EBqcIwzF&d+B8mDm@r*Rsm37Vh@nxF}qs77!JE@{yjc z!KJtqm*P@fc~mxr%WxSk!)3T~kZN!lF2iNG3|Ed>4KBlFxD1!!N<=ld442_DT!t$@ zR)foM87{+RxH7B;m*Fy8hRbl}HrY5X$K|*jm*dJqs=?*B9GByATscBDxEz<`a$Jrp z2doB{<8oY%%W>uS)!=emj>~a5u3W0Y<+vP|<8oY?Wb^-3|G~f&xB^#hQ1@{KuD}(z z0#|Nd4X(fyxB^$;%EPO{6}SRd;0jzhS~a)=SKtaFjV?4UmX1mAVr#hYeYu!5+e{Vh*?JeDyT{@Zhyfr@Ddogvjv;XPO$z}Yw k`0#ss`FehH`ek!G(S~Q2+xLI{T(5`g;L%F|=;7$yKLBk?PXGV_ literal 0 HcmV?d00001 diff --git a/images/pngsuite/palette/ps1n2c16.png b/images/pngsuite/palette/ps1n2c16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c7a6b380e9a2e60c887a260d43a41553260fc74 GIT binary patch literal 1620 zcmXxlUue~37{Kx0Hvcggjqqa5wnZ0q2=d=kL4nm-M{-~`!ka?f!Rk2%2GSHdS8n`@?ayH~ad{hwEnjwy0Kqsa!OTO|EN93>3xU&cXi8TL<6T z_xS63cfMIH^CJ6I2&=LtR%6Yv3XRYRjnD{<&?t@4D2>u6jnX8VM3ZO|O`=IOMq@Na zV>Cu%G?^yTWSUHqX>v4zOK?dMjTF&H5sial#U;1|m*5gy{x}+3f=h4-F2Us=iUyb9 z5?q2yaQT+e;1XPdOK=G;KQJ0xf=h4-F2UvFc%!%!m*P@fipz(M2AASeT#8F^IVBog zic4`RF2&^!qQRxO6qn*sT%JdROK~YK#ih7>vuJQBF2$v|6qg_6O~RFMC0q$t!sUZR zgDc@mxDu{}%g2lcSHhKWC0q%YBcj2Ta3x#`SHk6QqrsJMC0q$t!sTH!xDu{}E8$AG zd>d~Jm*Fy8hRbmIA<^J6T!zbV87?0o8eE3Ua2YPc%WxSkPrUj672m;(E91(ze1mw7E91(zGOmovw~q!_#+7kpTp5=i9u2OH zE91(zGAr)-96iXX{yejIXKXmyW6~f=;W#C=Y~#RUr~DD=C<7}Pd4V( zH~-n#+;niNVPDrK+m6lmtvvO7t!H)hgZe|I>Uj6!dzWuN&{h0UyVC!@}`gd2y$Mt{4pIX~;?82+n?%}i3yBA9R2bMfB^Yr&uM<0CVz0;%J!>30d8(#j? tiKe%Q>ay~W(faXa_sTCXI{$_Ic%%2f9ZRP!&BY%;-^MMK?|Q3;?gI^1pmYEL literal 0 HcmV?d00001 diff --git a/images/pngsuite/palette/ps2n0g08.png b/images/pngsuite/palette/ps2n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..90b2979685772423e875e3504fcfee1d406d6a37 GIT binary patch literal 2320 zcmYk4K}%Fo7=}-vF^E!vi-@2W1+@s2p><45)If=Z1VNCbj)cC8aMZEGd0S>5Cs( zJyVm_Gd0qcmznjVR@Ql^~~0? zdZrdvOdOUJmK0Z{u%x&m$?BPHW%W!=R?o4*q*$@9zh`Rp)iX8wW@^~XkYryy^VYt4 zP9=Ty%sW{>) zq|8hTOUle7Sv}KLR?pOA^_=N)gPxgFR?pOA^_+de>Y2@C^-N7x&oK~I&$y7)Gc{Q~ z$Jzf|XMb5e<3v`^vD~r;U-oueZ@odkx4iv!b#3Khnd^M|I6XPJf2wok=+F7zj<`#D literal 0 HcmV?d00001 diff --git a/images/pngsuite/palette/ps2n2c16.png b/images/pngsuite/palette/ps2n2c16.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a181e4ecfc378abcba1a2af79c0aa96eae57e1 GIT binary patch literal 2484 zcmYk4Z)ntY9LInAqm9Avh#oBGwjSvrRL)-t1*>k|sDbH-Jt?dmsdoql;x5t)bSqee zNKkNb>TLSJ5KOlMePH5(prGSe59(15hG-tNTI`k%!mfMs?)AmNe&6?fe)sx*KA#u& z(eTa}JKEQ`M^V%<^iukj#`&236U~k1#Si-y8b@m`^>Qj|nw;*d7DuC~tuQvcV`Oaq z;m7y9{pP+X(fEe`>OP`4q-;o~kjf#||4(sXlMo>hazvubuF(laZWRr1VAW|cg%5-gt86&BB` z!Q$D|`35{|PFOsv28(C!V;0Za3>MF-!Q$Bl%;H%tVDYRPES~M`!L7YNES}{A7SFca zV2ks|CmY^w52aHhhfn`p{I>o5Es69O3#ns29=&@1%e%#%wJo1aZp?mKE_6-~-s=Bl z`s2hv^z4%hCztjf8avwAzbPKA+^oI!&ei7MEBWNXbMa@jKb8-^{!>$?_SM8_b#b}* zNdElH+;jQ!w;oNtaA)^{mTlF=t<8T|cQj30tClb1raPu;LtQh^=X#&Wd{Eht%$(?1 zv-$;;WxjP*z>Dy^=4^c9w}F4(c<9=9i;ab& Np~0Q$O9Pqr{sYFSp`QQ% literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tbbn0g04.png b/images/pngsuite/transparency/tbbn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..39a7050d27af28f3bcb7bfc6b071cae91f8c091b GIT binary patch literal 429 zcmV;e0aE^nP)eGf1AoYPn=%bN?oV&q3&xZP#{- zd#wGeV8okcyH@o)cboHb1rrf^jB^?sG2T2?@G1n)CJc@hyhCf)&E8%^0~1oF;v>7S z;6sBJiji@r0Yq=mmR;)Ojr>$W46R-Sau7HO7xZFtI1{|4z%-nLbW=B z3o0EAC)h$;8WIR1rohQ#w444G0#1m$Dj66xet|L#R>4C36e7xMM0T)(aSAa2XfV)D zcEU#my$(kCaRx~QL^LgQ_;=)3gHxFOXBZJd{maEJLqY3H<>rDuET^1Yth7z0>+1gi X{l69U>r1pj4E?y3$fw z3LPC~5Eu?Ow>bx*PBc1kWIARHF=os}<8u$TxvBB}f1oy5P`W{kzl6)>j^6kGfA2f- z`~RHyuLHPP3zER+gr^$apTp%;SiD#R;vJ2Rd{S@z+-2p1bTZD!RV+NOifLIU&uTs zaE81?yrhgg@q`IfRXqTjnr;GKFNW3KjX}4zVxZ4FgXd*s(ZFE9a5b7MKz26X)$9LG z&+U!?)zyVy3pqr7Bq1d50~sfsq>_}A+FGpRrY7tX9#13)1Tctg+c1b-yYP7603Ht= z!sEyY-tFzh#G0G016J#8z+$-u)Ys$P_ICWwmKHpkOd3!^xI`}9Pq-4f{bx0*+^SE_VlClnoi%|Y#7Z`h22w+;)xK8=@ykF38Wv&SbTQ0gnee+4}W(MW;&#YW1^ZP6=>`(a|rw5FIVVzI~X$*|S2# z#!gMe#Z=9B;j7ZcOd6B9%84Llg;62WOyR`&K*R&qyjI668Uj`Z|E0BdPrAU)mb3U z=~5vE2k|lQz4vDV3dQ)iLcy)1R&U>~RtxF%*YPf{2T4htok>Yuq?_=<#C@GZ=iYo5 z=;^^{Ll6SH>ZM@SDqJsaz8SmF;>CE>Y861E`I*cqfgzHR(9)8SfC~}N^;pQUV?snm zo;VR1X|s8~Hd|WSz(87>ka+ppv`GlL-0PLgx$e0gIE@Ozq2ur@DhdbZ&T-vi=%uA{ zke>b^i2=#U2|%mmwg3D$XH8&?$YhO;GMNy&cVi*2uK^!^h{x}~6Cx|i@6XCoC;|b6 zLP%p{c-`j{LaA(PQ!05pa651syuNY*7#3BC#C5-QYdp~Fal5x-1%_T%hj+WXu_HO1 zSQ$M%AtdlINl7uAQ&Rp+pr!_kf>jutJ}tzOC3gFgB?`sn&6ohpRG^~+6YzMHN?tF6 z)8Gvs_ItfP3Y9OUJ3g@%v-FJ~DU6%`p7 z)Olt$T~Sd!UsRM3M~+}20|P?D#rb@3aYB0gZM=f}n$%RcJ2lluI1TPj268{JSpMqw z(#Xj5ATJMVU8TZja7CF+c-LgQ0jykkmV}T1Z)>x&AAcP8jW9H!K(AMb#Kfwq#6%(9 zdJ7BLzaPqwJRVppB))>Rmzmkxnwc3qy>c2ne6jQN_2Kir{~kkZY{cD_MuP+Q&O34b zF&gnn<>h$S?_Ul|OJ@sx)&y8_ad~-hu@GD!97Re>K|xB&qDB4vixvs-(MMR6-Hvxh zNAcY06hf_bxzy_5Wv-p@`ik|vcQ5|p=ur%@xHuJLW+o7vbJnfHC+*q8Ezk(u?h8zy znS_T20^#98!p*WwR#+&LEn8-_E?XwV`1nk}hj4frZEhAqrE)q|DqbZx4c>IDBv*pr zVf@9&2+ll(g&73fVa*!eeB+b4x^SH6boqXx;$c0=OV$;L(@ za&nrQa&mYx$7%2ytRYH*og^*}=lHZV906rzC&2V{sF7S?0>KU+o}4^*waT#qxC!3? zz50+^bb0-!+_LIFVlkOn3uCR$oXN=hfy)oYZM=LTO5_V)JX0F)aUb#`{Px3~8K z45Cm8G#cZ?2?d2q03|3C!N$f8gK>%=kzAFOs;a7HXJsOhsJOUTC=>!T78DfJ0p#W7 zO#|fS<`x6+csvb_-PzgMH*VaxejVY*&B(||Pfw37i%v;TNli^nPEKZQ-I|z~7@ruA z92Sce8ykD3^-OehbYx^?czAeNSXdrFNJvO(?(>_pT_EMw{BQ#m>$Sn!qg3OkVyw9#4k*05u5X^#Wxw8I%DBhvS=>0kTjoKsJnz zkHa;PN~LfWvNvv&lMD4H5CQz1ooNFD1Ml8_0AO}^ckkGN(bYw&Ct|UTmX?<3ckj?> zcNB^Yu-39J8}w6t>_9>;(#;tUCqEAdt`EKrw%G5dUucga(q-6VG498*{K%rij4wv2 zoEfW%jzHYO{1#TLQQ`9W=k@mzoI;b9QinWz_A0mp3_C3m`>c%tC$KR#Xus#^maPqG>$Ip&r<7PP}+lo3xrqrK0bX_;b9>)$CG zYiDOPWRFqn6UcGDpA~Oj9{Dz;6-NwxejzAm$n^KEA< zw~yjS7UP676`?(gNA_%Ti&?JTRiQ)ukN>niNvk-4K4Y-(eYokz+n%p00U^e=@{X9+ z)rI4_;#GQ*EM)A{+^B9WciOLZ)vuJAK75`z`)0L0X_*pJxWq7Myp(uq&jr<7|o zLnIyhWR@l$6GSYpXJsSmv@J23K`FjDRPrN<`4!1UJg1FhP}`#*W-iAZNy`g6qae{l69U>r1pj4E?y3$fw z3LPC~5Eu?Ow>bx*PBc1kWIARHF=os}<8u$TxvBB}f1oy5P`W{kzl6)>j^6kGfA2f- z`~RHyuLHPP3zER+gr^$apTp%;SiD#R;vJ2Rd{S@z+-2p1bTZD!RV+NOifLIU&uTs zaE81?yrhgg@q`IfRXqTjnr;GKFNW3KjX}4zVxZ4FgXd*s(ZFE9a5b7MKz26X)$9LG z&+U!?)zyVy3pqr7Bq1d50~sfsq>_}A+FGpRrY7tX9#13)1Tctg+c1b-yYP7603Ht= z!sEyY-tFzh#G0G016J#8z+$-u)Ys$P_ICWwmKHpkOd3!^xI`}9Pq-4f{bx0*+^SE_VlClnoi%|Y#7Z`h22w+;)xK8=@ykF38Wv&SbTQ0gnee+4}W(MW;&#YW1^ZP6=>`(a|rw5FIVVzI~X$*|S2# z#!gMe#Z=9B;j7ZcOd6B9%84Llg;62WOyR`&K*R&qyjI668Uj`Z|E0BdPrAU)mb3U z=~5vE2k|lQz4vDV3dQ)iLcy)1R&U>~RtxF%*YPf{2T4htok>Yuq?_=<#C@GZ=iYo5 z=;^^{Ll6SH>ZM@SDqJsaz8SmF;>CE>Y861E`I*cqfgzHR(9)8SfC~}N^;pQUV?snm zo;VR1X|s8~Hd|WSz(87>ka+ppv`GlL-0PLgx$e0gIE@Ozq2ur@DhdbZ&T-vi=%uA{ zke>b^i2=#U2|%mmwg3D$XH8&?$YhO;GMNy&cVi*2uK^!^h{x}~6Cx|i@6XCoC;|b6 zLP%p{c-`j{LaA(PQ!05pa651syuNY*7#3BC#C5-QYdp~Fal5x-1%_T%hj+WXu_HO1 zSQ$M%AtdlINl7uAQ&Rp+pr!_kf>jutJ}tzOC3gFgB?`sn&6ohpRG^~+6YzMHN?tF6 z)8Gvs_ItfP3Y9OUJ3g@%v-FJ~DU6%`p7 z)Olt$T~Sd!UsRM3M~+}20|P?D#rb@3aYB0gZM=f}n$%RcJ2lluI1TPj268{JSpMqw z(#Xj5ATJMVU8TZja7CF+c-LgQ0jykkmV}T1Z)>x&AAcP8jW9H!K(AMb#Kfwq#6%(9 zdJ7BLzaPqwJRVppB))>Rmzmkxnwc3qy>c2ne6jQN_2Kir{~kkZY{cD_MuP+Q&O34b zF&gnn<>h$S?_Ul|OJ@sx)&y8_ad~-hu@GD!97Re>K|xB&qDB4vixvs-(MMR6-Hvxh zNAcY06hf_bxzy_5Wv-p@`ik|vcQ5|p=ur%@xHuJLW+o7vbJnfHC+*q8Ezk(u?h8zy znS_T20^#98!p*WwR#+&LEn8-_E?XwV`1nk}hj4frZEhAqrE)q|DqbZx4c>IDBv*pr zVf@9&2+ll(g&73fVa*!eeB+b4x^SH6boqXx;$c0=OV$;L(@ za&nrQa&mYx$7%2ytRYH*og^*}=lHZV906rzC&2V{sF7S?0>KU+o}4^J622^AeZriDs|F)fz44lCrgvCaK9(i)p7!%%LO z6LCs$SZ>MfJV}wPPOIFlR1QvYe%|MK-}ia{df)f+{c@b0>@`sOC;-qn<$!ZVI(j`f zDj^kjGph?}%2e!GEGVRlO(*lc0TkamJGz}*TU$#c5*r&IR@vH?l$6w=(b>AXMMXv1 zx04DB3jtEEU%$?+^=WBow*aI7Nl8fw2?+qjY&IL9hsk8d#>O5wLZs8_(b3V7k&zD74p)(r z6#W5wi5%j-eJnyYfy3casnmdg0P-cW&PSbeL&Go(2FJts`1l+vI)>xmtn;h^Zo*f9 zFF+!ZJUl$y-Q5WUf_a*`i;K%{;ch%0Z)Jtm(t1?CX%ln~ww zvI4CLn;>X`*DqdZX)#srsxB=p0rJcP5Q$0`7Z=q_)!{xs9cb~i;5IBQEI>6tCCtyy z&(6+*5T>W60ceneP(Tm>WPquush*y(ii(Z4cCD)F{LssxzP`RZfO2EwuCA_*j*dQn zArvZ!Mq?a5uB3Dcpag{?+Sxf^v1cR6WET~cs;a8FIk{LYE-o$>i9`TRH*Vah2Ph~g zm;uPo&o2hx^Z7bDJ92Y#uU)%#^(w-Tmz9;3nVA_=7L%5lmY$xTnwrYkv?)0`IX*ca z2^NbL7Z-QB?Q~2`OjJ}7l7z-JS_iG7g0sVN0Uz}3~&+1VKez@Wfj%a%*<6dWBL zfByUl>%J=rqtT`{H60urpc%{q%@q~D69^Qz2T+SJUKdaPBUi= zZ?YsBS+ans&A`7&dFaENu<+a*|IhOD!Fy5FU2($py#tmf$d>!3__F$7Rx`n0Xd`(x zXNPrB#Hf{`Do)y8Y}67x>Fw{qlr}T!YF_4_IUZux-oC*~jH=jeIQPaX!`r{y1WzBl z(m6wK7D&e$Zg(V>@2C;Wf~LRR?X8$9#=q?zc-|P5aetE9NbV#QTKGtM8suGqBBx#3 zxo@Q}hx+TEERS}!iYl~OZDE->d_uXdy?`@|M5G4?j`=QYAGR)#`a zvNJkHwy@!`Y;;2I`Sq)+{L9pEnB}|hM@{;rXnr^QKIxlagyn~gH+uDas6JD-A_hPD*sh|5-pZZezZNI zTBjQ-?c5``GX0PwW_dm>8`Y+1#_9&A`Q}k652Y3f(u)LcJ9%$iuabnh9D6vUApEqF nBzr1Qcj<%PHtn77gx$)ZQM<+~5{$JW7KKwMop80bl;r;b+-;m} literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tbrn2c08.png b/images/pngsuite/transparency/tbrn2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..5cca0d621047cacf1637cf7d77e997d51cc6b15a GIT binary patch literal 1633 zcmV-n2A=teP))6_}Akuqmh*5X4X^rIbM;BH-v?$kU01p_ErCl=u4~ zL7fbz&H-~9!(}3aFu`RZW&unzb50QkgK2!RYsr=o3t~2tT^d3tzx&+X@9uj)%)Vj6 z{|IpB&Yj-g-pR?y{}^!Z-o3WAwzRagh=_<-fB!T`$I~7jJzDL9k&%A|7#|<+>gvkP z&5eqRQiO&cb#=`%Gt&SnAO*+-su`xq!J$j392p#Z_UzeG0aH^`SFc_zD=UkSkAGjG zNZGY3d;R({hG_tbfDeIqE;r1MUWVZftDkNW!h zs;jG$lamt?5{`w2W;;5Ta5(kAS>OWD3k(34fhLB@x3Eyz+ozkGX8`3uA)t^*Vq;_J zARVu%si6?50P_I-{r&0b>GXAy-pZYvJ_kMn+JSRiZt1pd#bWVg8=D~(>oza}`~v)> zM}7e)8HRFA`iDhFM^mix0K>z>DwQfHCnqyAGc`3;6%f#2ZhqFvO5^8uBq=H7FUwFU zT6XLhvbG*uwdz+cchJo2l$~8_P|)B15EmC05)$I?@88+kIS+9E{(W+tk&&UwQ56&v z(A`o(AH0rH_Tk~-0RaJGvDnww_wL=h^8j=?>6z)a6}IeCY}aO2b*Z|fq@=L0@WhD| zsSDdty^(jSiA*M&bM5WzEtks;bWvVj9&?GoHDC(zc6o7eG4)bKMMY_8X?Aw@u?6h# z;lshf`|a#hY<3Bkd&JHz$kWs3`0?Wg0OXPTF&CY{G^|Igi;9ZKH36!ss;DvOr&_J1 zx~1t&sZ>(M4;(lkk?c1!`x@w{b_L!AqU`OZt*xyF0OXE$lBa8(+d4*aQ!-UaQ=##! z_w+pDSx{e4UteEaTT3@Y0IErFaIj1kyl&n1z;8e!i?yF&L_nC8m3(Mu$N-?Zxp_n7 z2DAX*=>Wn$A?4)L>VvOzv*1+iR99Em(9l2wMRh0dROro{PXe>RH6x>UEG*vQa@TOV zQlU`t^yyOrfcExwL7@Om)cL>za2|4U%W^%=c<5%V3NB?X6h0+EjKsu5@-7xf85_?~ z_(n!?E-s$Cckkx$Tm=FtNq~V#ChO_xan5qaMSv9N2jF-3*7yqRh3Ek)Au1KoO;8fV zprIvzKyXeU{%KoVxrc`zkCz5CFib&h?McIcn>TN|Dcy8{RDkAq5^L3Kg|$LmUsXU< zBBJ4(W03sGWO5UeaSET!R&3c4%;9JOl9gkorlAz5VF1mVSE84$J}Q`0nqU|>1Di@4 ze5+F&_hR?T%1UBTp~Aw#cJ55qhku#R59RT^^+74-!fSSE~<7VgEJh?uUa0qm; z8Ez47t52=QkANEJ0t(=x^_iQy^73*TT0XxG7zGZwyYCSQ1YB+maEUU=$|_zAke{D# zTyIS3>>TO5U9}y3y6WrNG#}mt-ZU1(ApHmo3|zUggX&{s6zS#V<>Yh_y5_4hF$wDK z?p_S=`P`~WeyGw#>B+X26iZPz^D41kPE3=O0g4z6qf*N)=*PsGE4-+(Dp2{ zw2Zxeeeh*hh5=+_V`EuaSwV3@IIpj54kWn}jYdNZ8e`JrO`E(~ENUAnPWZ-+iMMY3 zY|zhwfLVQ0wY0S8#Df-Q7G&8n5<6nh7)vA)kx0bn+nAbqczMM?d^oX?lf?jYc4O#< zON|S4tujMN`;Hh?Jz7|PetuiGZY4pbYg^pItKUTv6B8tGw0Wp##Go?l literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tbwn0g16.png b/images/pngsuite/transparency/tbwn0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..99bdeed2b3b8564302d449e6578c4aca0f6261f5 GIT binary patch literal 1313 zcmV++1>X9JP)QBlsk;7PU%bhGrgYd5Q9YAv@pu5?I(QEIFDO9PIa zv;_;!pa1a#&4BOUPo0`ItE{ZJIBk{3V?$2;ETe5E7iFAugap!!JvpW;c(dAAQ8V< zZ&BY>NjD*)1qCrNK|y=>!VP%!s->l|vE8$;ud}nhz7j7eD@#re2?+@B@p<+PZorQp zO@$fmNmnXtCft}jxxc@;xf%mh0YPPDR#td8NVBJBWF$%~baiE3DVf#RJVAESq^VP< zPoFZSy}bqv6c$Ev8{HHsktow$V{lB`di z{%hX6Idl5@>guwxqN2jr>pYX5E|kJ^f&DqRx(f5PYbXXRS(0v=B3pVK=!U{clUf+^ zwk5aa8O@zLfBu36RaH?@k&$+SvH@a;con5$c|}DEZ2$iLjbgyIZE5`R>8TI9Qu-<< z%&Jo_i;I%V`!i?Gym|BImy|?C27OhSEj^vT%kqkchm?%||Dqzaq5gD9C*CIj-6lTnrHEYhC#6(Y5*#J=&#dFf1`ILEld3=?QfBAxDz@I+}XOr8) z_eUHoTv5Ut_PcOJ$k~z>P;}0k6%}PEBIC}VVH_mAk5_}&Lhw>xFqZ6`_b6dX!jw?c z%!-;Dfwv2)g69`EgOb#=Y2o48uO(Z#zd9_?))qGsnatzc{v3+|Jw5UA=}QBbWjreT z8u2D?TToHq>&cU+PVMgx3sZ_0b>T~KcQE76X3$TAY#mJXtlpDYGZ7 zBIi@!?b7Or6DLpZ>}crfArf4l~O;$zjSbkp>uelLq>cX#*pmXrhs+uBMi3p@E(ywgBe zjiXq(d99%ke6YZ7R$UYR><4NHs#$&Yi#Ca7>ZQf zh+9gRl` zNh~TV0!S$+DBx6a1Ofq{&(F=xH8LV_xmFEIVsi~0f+%jL$9u` zLJPv?JUoFnFJG#wGn8wTmzS3TdFBBKg=I@iODbh5a37!!)Vb<#2No9>p&FnH=I7^U zXJ%cRLDjsAP4}`!PL}LTibZ!Mq3SyT4m+=!B>O5y}h{r6~@M$ot^FN?Y#hl zC{!YqO1H65P`C(Cib4@io^-%qT%t%M_l+BG-MTe5CliT8B_$<7p%9>{u&}TmAU{8U z1|TmluLOX{<7sN{%E`&Oe*OBjYY0DXW@ctaMn-ITY-&boT3T94N(x;~Eh#A}At?a~ zCX*Q-AAhR#RBUW)baZrNWMo7{L_R=RSXgL8Xnb&RXlQ5(VwZBPQ=XGwpr60LKYWFw z`A2N+eLT=&d$z1 ze*A!+zAFx=Qm40Uad2>eW-t#nmzV#B$CKe6KrO=fr+_k<49bCn!|~0{0XZlSAO|KU zCg3VarBb*8IU6>}$%O|Jhya1EuGE2nfw8f70F3VL?(N$#dU}ZTL@bux($X?BHikx@ zMxn?6>n$vn+TI5>$O^e=4_7?cei{z`Irux-V7&^JWYHn|XJb{) ztaW8aFz!G>3$xX@Xyx4VhMGi|@Z{yRAy3~u3T{Dzq05Alkb8H9K1P4F-hT3g)m9Nh z8VDfQoBpwyH`740DZKl)ulN4y*5D>vW}_t6!m7uTdPs~i<_W0O@toO~X~vAfo$~kX z?99fT_mqZ2GV8Z9;>{}~Uxu_<#PH|mLqdkkUKd+?dv$CItbLO(X?+IM&%D`Wc7tc( zCSF9>rsLiwKlI~HSa@$u_-AGM;JxVT&UitaVZY^ZlI8v>p0qxM*^Cbq*ovReoy54y zqc@kKDo@y7XjB(I?dj`Amo?MtZokTNvI#Y7Yg4ikp(^za=H6PR`vz8+;AjI^J7#Fj ze936To%SmgyKal5=cgBHdMc+%aN}M5FB+rM?@v-1Ngeni3qNspgRGNZ?7C+sXI%1X zu&@5<%1FnPY{|sA&399jf*Ki-lC51XeTCyzc{m1!Hy?E|SK;2qE86{)*9AoayT6^+}UtG~L-LQ!_uNscFG7wOc+;n55 zi%O5BBNH<3FJF{p3sXbkmhU1SHR+V;^14{}iC_7{%m7S+(d!q3rCSucFC8q?ub!ax zF755m+JV|^+;sBNR8-&ZOS{mH!F^^e!qemf2F)+O1xWD<6~CxV>WZY3AMK7S*J*`G zI`+z}Og|)wnBLFIM>MEg;`+lGIzxVxozicm0XHC>L6aZ+tx?p_}HCXEn zD#*m%$mv8xm4flWfKsN!VyxgCfbvH#cVDN~)zxGIp`qbnm7`-xNlC4N0Y^`-xVU)x zc4ARc5kUI2YuC7yT%k}X5D4<~^G!_&JRT3Ah|A@21RQho%G})CWB?9_(+I$3vo$mZ z=y7pbSy=#e85tQj0b~FvDJhpOT>=oZSS)~U27{51kZ|Y_fkvan#l^+M#JE(uTtQA! z4gv@uunBwiF!3Bbo6V(AD8a$Oqzfe7&$^k$#*t_=mWTEC_dim61k1+S<=X+=fH{C~ zKqL}Ro;-Qt#0fkeZLZKPnzIvst%}~3mwzRYa$TJT>Br088T+}GlfcpTopv}{U+b}yj3)KLXFf%hV zH8ll7n3$LVph7M}0YLze1r`<-`ub+;*E{Iw)TpV=^uO-!?d{D6C^s|f?CflBZ|?=@ zN1;-vRJy&ripm9m5)_JX?3fD%;}Jt5d9PnzRaG@Tt&m70VzF2x5&<+`zkaOg!FtJU%`?Ha0doIyx#Ust_O|A|gC0JTW9BJUl!diAx#Qt-#Gc$Uh(;0OsLv z;o&o9&YV7d8onR~ksRrc1Ofrzt2y7?In>$0f((P;Ljpax;QW}rf$fHL6XZ~`kUKn^MZ$b-?* zQMe3pxg3%q@0VYclp=!&M1UYqPikLZ-^j=Z07iFr_m(XfLqo)RA{I+;X=#}p89}3c zQ7AINY72|Cx(f1<1BfS}6zk)O2Zt|%A!|#3n=^L7>E-reBy>5hSd8!C+(5GA0R5|( zCU?rNq9X*i?^+A9)vRdw?6dm2DISq&OPK>F&h1k13hobIB8bE8-4UHJ{j2p>b2F>0 zJdV^CNUpQ^W2IoSo@jsl&fn+!_ExusG&(RFWck*%JvP(>Qj{5ANTt5dn`)V0Od8)V z``FITX~_FXsZSxZemf;qUmltp&}R`NpM{2n4OqS@w(~pLu_37DZPJ+CDa;Gz%|^=` zd}}Z1EV?EO_b%I<>>cOJ>%y2#_#mN!^x5<= zjJGmcy%bg9Z>un%{403Uo~AEOp-q|0FAO&Q_payLN^pd^v$8v; z_2>K%L+MXinj+%k=b2%{MBZdz?a#ncO7`Gc#`N2t?P<&Y2}MhElSclGW+d9ySV&Fv zGKiPYu6ryW8ddns&8aEAjSocHe299~xUJNH-^IF5oEHo-12IXaZ(jD7Y*g*OxWCk> zdX(C`xVuAdD@xt0@z}-jnCHJQ?m)YSJhyBS`I7e;H@#X2l;c&(f7KW>kjTeAJ04Z5 z)r*jI>{i%Xd`gip{hpQ$=}bQ!O lGajP1^htlK&dv|QE>+O1S>+WAhFg({f~%7!w#Jd1`acy)otOXs literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tm3n3p02.png b/images/pngsuite/transparency/tm3n3p02.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3ef1d0c5aa4658cf1c1383dc6e74fcf09116d3 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^R|bavaI|&4^Ese6b4ie2 zFhl4n?w#tEK(2_Vi(^PdTyhFSQ-Fe;PETlaHzR|#xM-r7v7RGPp25@A&t;ucLK6T+ CZ5hr0 literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tp0n0g08.png b/images/pngsuite/transparency/tp0n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..333465fcdc9f10f7f25b2d999b558f5421983ecc GIT binary patch literal 719 zcmV;=0xe{x-64Dw5ISbDJfGPNXYF1fsnx~?7~M3eMD*m6rOMo0;2$rUW>-c(^**S*Ycd0zuX+u!1|S9WB+#F78QX<>lo? ziQz$h-hRnIWoQ!H=elq>2fX`s$g4Md}>$Ugu1e*ygBpcmqZ3DNb_5HNEsBtg8Fz$MsRgsRcUEt!R)#7 z@*=Hdg|%Ijgaqfp6x>M8@W|(*DezA>78ATBV zGiJ?6^pq7`pj8TmNNXtGQ7M(fr#kNOGpUKtO+a# zE}lAlTDXoRkAt?j2v0jgK~H>oU`AO)UQprWsr_L}qI~YALPA1E5ej}SPEJnGOv?!@ zojAEOR7Ob9QdC4?8%mP9keiy8ksVOlKd~`Xk)KCEK=mA2ntaoimYx|<+}mFjqR+?8 zZTJ8q(f(PLp6*}V-CGiDD=qBv7F)8vQWR0&(VZLQZ(jZjd%k$Tpt-FhJuqOwUu^jT z1pXapZA%Q=jx2U BP!RwC literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tp0n2c08.png b/images/pngsuite/transparency/tp0n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6e42cb420fd08ecd78340256157fa5f8a22934 GIT binary patch literal 1594 zcmV-A2F3Y_P)u542F>)wJ;-zU<0Ta5X4X^rIbM; zBH-v?$kU01p_ErCl=u4~L7fbz&H-~9!(}3aFu`RZW&unzb50QkgK2zirzKlPEQpyV zJ88Z&UwhB*+;h+QpNot)Z1^7mZr{G$*Vi{SHT9YSckkY9Z*NaePmhd@j0*@zcXT}E z>DjB%+#enNPk@PuiSF+1yu7^V=xBLZ*b!IPd^0mOpafEZETD#AngxPxg<^DQ=;_m^ zO9f0%PhYumrM$d6AtB*?xjc2}&YX4Y${D5+CG4W_vSdOD(DVN&-oB_@QeZU}a320`R0!vG! zgF}Y7c_vT+6ajLvI4&-Z7Si(C+FA;c5-<-iFfc$*`Z-x=6;4i{1D^pMz*&|p+q$(x zB)Vj4J8WQZ3z!6c0e;dUzW@{rLwimBm&L@yP^|L+BO@b9r7|}+H!CYEEiFwM7}#lU ze#Y8b?eBj$IXU%j%aqGow{IV|u^C^v@>iA}GBZ1AZ=V(%{LdfavLmWItxn1d>CixU>w z(z&H&q%@~cmeiGMuLdu#(_V!Qg$)f2b#--gLIj|kgoK1hr6FtAeh>TxG#MD|V;DCe z+}c_;JUpxi(9+VfzG^*Mf$y{cVZV^}t ze*#wx4d1b}e2ZmQv#dlY6hC?LL=T{&qk~_>M>ADEa39m2fL{qvo7rko-xdG82;t3ZKJ~Z{8fjKg!o$ON?8wlCe~HHnv#{{d1tq7Cl~vHp z%#3~jNv`NUkyhKvAxIVA8=wbFDWm}$)k06v92)E2}b{Rj#QTCt*&@?&Ti zD zl4Z+2B9B~dgtK!fhf@n&;PLjfw||-Og6SEVLqkKcv9UCP1w{gUs+$RUkfbMoF`VR)x@ASCQaVB z(Z|4m%7&5?v0+2f&6_{#^|K%#LswL-t*u(|pn;hUX^xb{ju_O&VzJoG&5g&iH8u70 z_D*>4U~(ZRivi~B`tWs^S{JHXMW%x09Wf|-G_d^r{kLq{LV`-iwz!9v--{+ECrRLF z@=(%OV07*qoM6N<$f`h#14gdfE literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tp0n3p08.png b/images/pngsuite/transparency/tp0n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..69a69e5872234d96cab4cbb017a0933fbfedba81 GIT binary patch literal 1476 zcmWlXc~H^`6vv-Om}J3dn5OOMOgg5aIm=3#R_~R8*9gm+#ueDlIJqsFg@0;tH{|b8}HqQ5Jw$Ebasl zi9{wQqx{s={QP`?_T1du%K+m5+1c6W&Yc6O&&;#KYi za0xyG{0*U@p&=n5OeT{~rxS7s!NI{ht9Awk26}jqu-LA432IQH$P*->1%a<=E7fhf7KmpiNEL?|$g$1|@ z&=;ZU0fm$KWEP7BFz+mN_CD$D>KXyBfJUPQ1qHz$U@Noz`t>V3 z0Y5*#_4Rf5=AAr|%l))v3zbTRZXmD;`udA>dIa18XhRr(3s9%iK@&&<11kswKn|(| zCKfuzi4TRu*jp4GWDgcp#{666_U|?<$;@lL6fyrT=v@~MF43;U zZ$6b_)kkb?TQRlFx@L1DFHuvCdiGRV@qSb5o3SyX=dqWIo~SD}lgtU8-0hinIc|l^ zwZpyIy{+Kp3qku~jyuQS{wOJTffqk}ylg!rGf@@8WYp~qRTEe@i_6M#f}U2WR@4MfM)1HJRjPCMx~ z7uM(-p3*y>&A)fhi1A3;cS(L+J1;&pqWL&it>CX0-+eBqO{=g-lKzNGvG(`sNqtRF zeg3%mDzvL|F3Eho_0DyETn8H%dc!?dA!#0>Q=Vr9#{-Ga&|1#6CAW+Q0sfY$`N-&; z^0c=#@%4)8jy6X3lL6u3JAW=?c#tm>K2a$#(Q?|Uz}T^+pWADD@MB|q8>&Xr948aj zsY1|Z7&ad@u4wr4W%TE{WS7U&Rh^yI#(OsCtq$vQ3|A*M_uLm%-A~M)I@BiVUyS#YR$&g!`CNx58tIE z|3D@=NLJY$Q%;J12ZU?1w#&^2c5EzDN05DZLoa2szJ*SEwwg0|Mem<$Yn1cWcz^cq z-}lxrB6iz%k1R&3=>`|KS%};k)l(YskH!jI!g#-(&O>3hx)5(GX8X3fe_&q16?&Zr z)72bEymR&OySDOI3mZ0C3tSEiO=8X3u^BG}uBukDWrMyZ$LQ%Y4sr7@il=hRi%!IK N0G~qvls0mN@PBi2fm#3n literal 0 HcmV?d00001 diff --git a/images/pngsuite/transparency/tp1n3p08.png b/images/pngsuite/transparency/tp1n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c9f35a86271c056e955f637a8769381eb03827 GIT binary patch literal 1483 zcmWlXdpOez7{_0ijw~Xj6ZLfH5mEEBP|@KrEtkTuS}m>SI;>1?8{6D(v$V!$$}kk^ z;zXQM92O%H=ShmnbXw(ZQ8_r3^Xq+{_x=9)zVGMz<@$KL>7tBL0HEvPj`Ks*k)Uu?Q@xn6z>Z3lMM-Q#6tfUZ$jg9xOySS8oYSdsZ?58S}Ku90Gh5`xl#{MR8%wt zP*_-43Lq2;*RS7_pPzr}(xrd%E)}>Vg+~H{0|EmB;S209 z+JEZQsgoy9!bij)vJ2CNNF)M$vKCsqg}Grc6c_?OKR+KIALs+qBGU~U&cS2w^z{7x z{X6{3T?w5=n_Ror-Q69U!8X)ZUHvP8K!G~|wFu*%2C7slr~p15FS4}-9)W zgA1TkDj@~(fB8jCjUG%S0R(${)B5}SM@HTPu)4duH*Un5nj+Sda5!dbYwOg=2pWA9 zg`xngv~oCl+wa{*R;b1Lc@x0-<4`CPvRn@w_UQh+Ac}Mk^OKb>f7-E19*W;}xs}~! zRlIciNyF__FM9f7*5I)-+cbPa1|k-TrQvsONlsb*)pnz$h0|UcNA3@z)MNfwE}Uv0 zIbFH+_Zk14HEp3y&g@1-ft^E-J#CK+WhE5TXruYlt&^-N^P3g#I=H!w`R}L=sT9s{ zCuD1uhCdG)aY*zhVd3F}HZMyY{g2C62iLwz8h1Q_?PFhSvbid>^O4P?YqRlh((eZd z#_aspCH=EBx%*CRO=qIG-J;L_AlZKBgiu)@&Tb|Ii=AapW?Zqp>gYA)sH#J5XB+h; zk9wYVqsyC_bvIrV9&w7WX>VWUAVpP~na{j&$UYNXX^m&}Uyx5RnnjA&4L3VdD!1H_ zD#Iq{ZueA8l;TIb`kpn$X5SsBHj?FpV!HrYcY~@^RN}pDGk;X^V&G~0qorYaOP*rv z^qN~4t3n!C(Ta6lUVkRto3S5$_!4xZm;=Uxwl-UlXk<^TD! zwrXx-kZ%7r>OqrnxrwlgbC>i*G{g?VCRx6GHc+-!v-|w+aMq(Z)3<$!sgDrNgW zt{66;txYft&kQV}Qtm74k`-qO{C2WMU5|#0wUn?oyC~|ghKx56YPk5`Xp_O#x8g2M X(5+n&l!#upArS?SL*BSr7fRay;V71Q literal 0 HcmV?d00001 diff --git a/images/pngsuite/zlib/z00n2c08.png b/images/pngsuite/zlib/z00n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..7669eb8385172325c399f3229cfe834f886fecb2 GIT binary patch literal 3172 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj{$|z@zQy;uunKi&25+{%6Mj{~3NT zfY5g^iOI$zg{%daG8T~8Gz1(pwSa?x0cZixpELm=(-{~zY2*W_>0lpFKMoM4)4~E2 z)2SW@=%!OQ4zQR`#UR3NI<+joX*yLbz-Kz;kxamJ3L}}Y>68Q!QKpk^0kNi&7Y8Jm zPDUJ%W;&@sM6&55SwN2I#K!@drV|+lP)Gd0N=r*M+Cfdcn4n{+d)GIuBfe}0=haRfYbdY4|HeAW8JeNk!}u< z>b4FPx}gJ|u3eE@R|Qyfc?U*a*nwS_tjMJg1H3vP0MMC|F?z3LnBH6wQvU~l^-l+Q iz3w1HzgHBc=YRuMlTL2m+d~-u0000811+tMcYXzcm?aHZ#?gdL8ij-oNLTu@go{<42!=C2J(%l`2yyuQm;^LM9XM_s7MQs$ow Yp_Bdc41*5p0G-U>>FVdQ&MBb@0O=}Ly8r+H literal 0 HcmV?d00001 diff --git a/images/pngsuite/zlib/z09n2c08.png b/images/pngsuite/zlib/z09n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..5f191a78ee5601a45f1add2a3ad7a77b7b1ae0f1 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WmV3H5hE&|zdeNJ&K|z4|!mJGk ze#?uM?J%qpNVJm;SDAGELf+biOrjbV{C6uqc^By}RQhy!A*198PSpVRZwtidR0X(h zmlOPO>811+tMcYXzcm?aHZ#?gdL8ij-oNLTu@go{<42!=C2J(%l`2yyuQm;^LM9XM_s7MQs$ow Yp_Bdct_kk@3Uo4qr>mdKI;Vst043R2BLDyZ literal 0 HcmV?d00001 From 655193ff137e742c01dd8fecdf6887cb05411dd4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 19:42:56 +0900 Subject: [PATCH 094/451] Check whether given filename is a directory --- config.h.in | 3 +++ configure | 1 + configure.ac | 1 + src/loader.c | 22 ++++++++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/config.h.in b/config.h.in index 594c6787..79f80cb4 100644 --- a/config.h.in +++ b/config.h.in @@ -149,6 +149,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H +/* Define to 1 if you have the `stat' function. */ +#undef HAVE_STAT + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H diff --git a/configure b/configure index 8075bf69..8f2367b6 100755 --- a/configure +++ b/configure @@ -13435,6 +13435,7 @@ for ac_func in memcpy \ calloc \ clock \ clearerr \ + stat \ setjmp do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/configure.ac b/configure.ac index d96424db..2d959172 100644 --- a/configure.ac +++ b/configure.ac @@ -195,6 +195,7 @@ AC_CHECK_FUNCS([memcpy \ calloc \ clock \ clearerr \ + stat \ setjmp]) # for HDR diff --git a/src/loader.c b/src/loader.c index fbb730c7..bce95620 100644 --- a/src/loader.c +++ b/src/loader.c @@ -37,6 +37,10 @@ # include #endif +#if HAVE_UNISTD_H +# include +#endif + #if HAVE_FCNTL_H # include #endif @@ -135,6 +139,9 @@ static FILE * open_binary_file(char const *filename) { FILE *f; +#if HAVE_STAT + struct stat sb; +#endif /* HAVE_STAT */ if (filename == NULL || strcmp(filename, "-") == 0) { /* for windows */ @@ -147,6 +154,21 @@ open_binary_file(char const *filename) #endif /* defined(O_BINARY) */ return stdin; } + +#if HAVE_STAT + if (stat(filename, &sb) != 0) { +# if HAVE_ERRNO_H + fprintf(stderr, "stat() failed.\n" "reason: %s.\n", + strerror(errno)); +# endif /* HAVE_ERRNO_H */ + return NULL; + } + if ((sb.st_mode & S_IFMT) == S_IFDIR) { + fprintf(stderr, "'%s' is directory.\n", filename); + return NULL; + } +#endif /* HAVE_STAT */ + f = fopen(filename, "rb"); if (!f) { #if HAVE_ERRNO_H From 3869f0eff74cc0da5bd0e49c94310aeb1ebb24f0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 23:52:53 +0900 Subject: [PATCH 095/451] Respect prefix path specified with --with-libcurl configure option --- configure | 18 +++++++++++++++++- configure.ac | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 433aab13..dedeb220 100755 --- a/configure +++ b/configure @@ -14388,6 +14388,20 @@ fi if test x$with_libcurl != xno; then if test x$build = x$host; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_libcurl != xyes; then + LIBCURL_CFLAGS="-I${with_libcurl}/include" + LIBCURL_LIBS="-L${with_libcurl}/lib -lcurl" + elif test x${prefix} != x -a x${prefix} != xNONE; then + LIBCURL_CFLAGS="-I${prefix}/include" + LIBCURL_LIBS="-L${prefix}/lib -lcurl" + else + LIBCURL_CFLAGS="-I/usr/local/include" + LIBCURL_LIBS="-L/usr/local/lib -lcurl" + fi + CFLAGS="${CFLAGS} ${LIBCURL_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBCURL_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" if test "x$ac_cv_header_curl_curl_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curl_easy_cleanup in -lcurl" >&5 @@ -14427,7 +14441,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curl_curl_easy_cleanup" >&5 $as_echo "$ac_cv_lib_curl_curl_easy_cleanup" >&6; } if test "x$ac_cv_lib_curl_curl_easy_cleanup" = xyes; then : - have_curl=yes LIBCURL_LIBS=-lcurl + have_curl=yes else have_curl=no fi @@ -14435,6 +14449,8 @@ fi fi + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP if test x$have_curl != xyes; then if test x${PKG_CONFIG} != x; then diff --git a/configure.ac b/configure.ac index 20202d3f..4c9bffe2 100644 --- a/configure.ac +++ b/configure.ac @@ -324,11 +324,27 @@ AC_SUBST(GD_LIBS) if test x$with_libcurl != xno; then if test x$build = x$host; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_libcurl != xyes; then + LIBCURL_CFLAGS="-I${with_libcurl}/include" + LIBCURL_LIBS="-L${with_libcurl}/lib -lcurl" + elif test x${prefix} != x -a x${prefix} != xNONE; then + LIBCURL_CFLAGS="-I${prefix}/include" + LIBCURL_LIBS="-L${prefix}/lib -lcurl" + else + LIBCURL_CFLAGS="-I/usr/local/include" + LIBCURL_LIBS="-L/usr/local/lib -lcurl" + fi + CFLAGS="${CFLAGS} ${LIBCURL_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBCURL_LIBS}" AC_CHECK_HEADER([curl/curl.h], [AC_CHECK_LIB([curl], [curl_easy_cleanup], - [have_curl=yes LIBCURL_LIBS=-lcurl], + [have_curl=yes], [have_curl=no])]) + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP if test x$have_curl != xyes; then if test x${PKG_CONFIG} != x; then PKG_CHECK_MODULES(LIBCURL, From 04b4d41159b2c595c56103bb7e71617f0f55878b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 23:54:39 +0900 Subject: [PATCH 096/451] Respect prefix path specified with --with-jpeg configure option --- configure | 18 +++++++++++++++++- configure.ac | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/configure b/configure index dedeb220..a216507e 100755 --- a/configure +++ b/configure @@ -14548,6 +14548,20 @@ fi if test x$with_jpeg != xno; then if test x$build = x$host; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_jpeg != xyes; then + LIBJPEG_CFLAGS="-I${with_jpeg}/include" + LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" + elif test x${prefix} != x -a x${prefix} != xNONE; then + LIBJPEG_CFLAGS="-I${prefix}/include" + LIBJPEG_LIBS="-L${prefix}/lib -ljpeg" + else + LIBJPEG_CFLAGS="-I/usr/local/include" + LIBJPEG_LIBS="-L/usr/local/lib -ljpeg" + fi + CFLAGS="${CFLAGS} ${LIBJPEG_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBJPEG_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_header in -ljpeg" >&5 @@ -14587,7 +14601,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_read_header" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_read_header" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_read_header" = xyes; then : - have_jpeg=yes LIBJPEG_LIBS=-ljpeg + have_jpeg=yes else have_jpeg=no fi @@ -14595,6 +14609,8 @@ fi fi + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP fi if test x$have_jpeg = xyes; then diff --git a/configure.ac b/configure.ac index 4c9bffe2..744fc29a 100644 --- a/configure.ac +++ b/configure.ac @@ -370,11 +370,27 @@ AC_SUBST(LIBCURL_LIBS) if test x$with_jpeg != xno; then if test x$build = x$host; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_jpeg != xyes; then + LIBJPEG_CFLAGS="-I${with_jpeg}/include" + LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" + elif test x${prefix} != x -a x${prefix} != xNONE; then + LIBJPEG_CFLAGS="-I${prefix}/include" + LIBJPEG_LIBS="-L${prefix}/lib -ljpeg" + else + LIBJPEG_CFLAGS="-I/usr/local/include" + LIBJPEG_LIBS="-L/usr/local/lib -ljpeg" + fi + CFLAGS="${CFLAGS} ${LIBJPEG_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBJPEG_LIBS}" AC_CHECK_HEADER([jpeglib.h], [AC_CHECK_LIB([jpeg], [jpeg_read_header], - [have_jpeg=yes LIBJPEG_LIBS=-ljpeg], + [have_jpeg=yes], [have_jpeg=no])]) + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP fi if test x$have_jpeg = xyes; then AC_DEFINE(HAVE_JPEG, 1, [whether jpeg codec library is available]) From 83fb9d5626664ed6c1ad819acf0177eb1082ec19 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 23:54:59 +0900 Subject: [PATCH 097/451] Respect prefix path specified with --with-png configure option --- configure | 18 +++++++++++++++++- configure.ac | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/configure b/configure index a216507e..e5cc2222 100755 --- a/configure +++ b/configure @@ -14634,6 +14634,20 @@ fi if test x$with_png != xno; then if test x$build = x$host; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_png != xyes; then + LIBPNG_CFLAGS="-I${with_png}/include" + LIBPNG_LIBS="-L${with_png}/lib -lpng" + elif test x${prefix} != x -a x${prefix} != xNONE; then + LIBPNG_CFLAGS="-I${prefix}/include" + LIBPNG_LIBS="-L${prefix}/lib -lpng" + else + LIBPNG_CFLAGS="-I/usr/local/include" + LIBPNG_LIBS="-L/usr/local/lib -lpng" + fi + CFLAGS="${CFLAGS} ${LIBPNG_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBPNG_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_check_sig in -lpng" >&5 @@ -14673,7 +14687,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_check_sig" >&5 $as_echo "$ac_cv_lib_png_png_check_sig" >&6; } if test "x$ac_cv_lib_png_png_check_sig" = xyes; then : - have_png=yes LIBPNG_LIBS=-lpng + have_png=yes else have_png=no fi @@ -14681,6 +14695,8 @@ fi fi + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP if test x$have_png != xyes; then if test x${PKG_CONFIG} != x; then diff --git a/configure.ac b/configure.ac index 744fc29a..c9943609 100644 --- a/configure.ac +++ b/configure.ac @@ -409,11 +409,27 @@ AC_SUBST(LIBJPEG_LIBS) if test x$with_png != xno; then if test x$build = x$host; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_png != xyes; then + LIBPNG_CFLAGS="-I${with_png}/include" + LIBPNG_LIBS="-L${with_png}/lib -lpng" + elif test x${prefix} != x -a x${prefix} != xNONE; then + LIBPNG_CFLAGS="-I${prefix}/include" + LIBPNG_LIBS="-L${prefix}/lib -lpng" + else + LIBPNG_CFLAGS="-I/usr/local/include" + LIBPNG_LIBS="-L/usr/local/lib -lpng" + fi + CFLAGS="${CFLAGS} ${LIBPNG_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBPNG_LIBS}" AC_CHECK_HEADER([png.h], [AC_CHECK_LIB([png], [png_check_sig], - [have_png=yes LIBPNG_LIBS=-lpng], + [have_png=yes], [have_png=no])]) + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP if test x$have_png != xyes; then if test x${PKG_CONFIG} != x; then PKG_CHECK_MODULES(LIBPNG, From 19417c65ad27b630916dfd39be9d96e68b1e1a9f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 22 Feb 2015 23:56:34 +0900 Subject: [PATCH 098/451] More strict validation for -c option --- converters/img2sixel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index a19cd8da..b888cf5b 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1520,6 +1520,9 @@ main(int argc, char *argv[]) if (settings.clipwidth <= 0 || settings.clipheight <= 0) { goto argerr; } + if (settings.clipx <= 0 || settings.clipy <= 0) { + goto argerr; + } settings.clipfirst = 0; break; case 'w': From 7b65b632f477fb32a990e1c541c25277b1adc833 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 23 Feb 2015 00:03:45 +0900 Subject: [PATCH 099/451] Rebuild --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 8c398d7e..7d6f7844 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ From 3d6ca7d68f4d6876aba1125c9f56bf01f224efe4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 23 Feb 2015 00:04:16 +0900 Subject: [PATCH 100/451] Don't use component depth internally --- src/frompnm.c | 10 ++-- src/frompnm.h | 4 +- src/loader.c | 153 +++++++++++++++++++++++++++++++------------------- 3 files changed, 102 insertions(+), 65 deletions(-) diff --git a/src/frompnm.c b/src/frompnm.c index 2c0cb6b4..1b8534d2 100644 --- a/src/frompnm.c +++ b/src/frompnm.c @@ -24,8 +24,7 @@ #include #include #include -#include - +#include static unsigned char * pnm_get_line(unsigned char *p, unsigned char *end, unsigned char *line) @@ -53,9 +52,9 @@ pnm_get_line(unsigned char *p, unsigned char *end, unsigned char *line) unsigned char * load_pnm(unsigned char *p, int length, - int *psx, int *psy, int *pcomp, + int *psx, int *psy, unsigned char **ppalette, int *pncolors, - int *pixelformat) + int *ppixelformat) { int n, i, b, x, y, component[3]; int ascii, maps; @@ -65,11 +64,9 @@ load_pnm(unsigned char *p, int length, (void) ppalette; (void) pncolors; - (void) pixelformat; width = height = 0; deps = 1; - *pcomp = 3; end = p + length; p = pnm_get_line(p, end, tmp); @@ -213,6 +210,7 @@ load_pnm(unsigned char *p, int length, *psx = width; *psy = height; + *ppixelformat = PIXELFORMAT_RGB888; return result; } diff --git a/src/frompnm.h b/src/frompnm.h index e5ebc7c3..f408e94e 100644 --- a/src/frompnm.h +++ b/src/frompnm.h @@ -32,9 +32,9 @@ extern "C" { unsigned char * load_pnm(unsigned char *p, int len, - int *psx, int *psy, int *pcomp, + int *psx, int *psy, unsigned char **ppalette, int *pncolors, - int pixelformat); + int *ppixelformat); #ifdef __cplusplus } diff --git a/src/loader.c b/src/loader.c index fbb730c7..ed957c44 100644 --- a/src/loader.c +++ b/src/loader.c @@ -246,7 +246,7 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) /* import from @uobikiemukot's sdump loader.h */ static unsigned char * load_jpeg(unsigned char *data, int datasize, - int *pwidth, int *pheight, int *pdepth) + int *pwidth, int *pheight, int *ppixelformat) { int row_stride, size; unsigned char *result; @@ -265,13 +265,22 @@ load_jpeg(unsigned char *data, int datasize, cinfo.out_color_space = JCS_RGB; jpeg_start_decompress(&cinfo); + if (cinfo.output_components == 3) { + fprintf(stderr, "load_jpeg() failed(unknwon format).\n"); + goto end; + } + + *ppixelformat = PIXELFORMAT_RGB888; *pwidth = cinfo.output_width; *pheight = cinfo.output_height; - *pdepth = cinfo.output_components; - size = *pwidth * *pheight * *pdepth; + size = *pwidth * *pheight * cinfo.output_components; result = (unsigned char *)malloc(size); if (result == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "load_jpeg() failed.\n" "reason: %s.\n", + strerror(errno)); +#endif /* HAVE_ERRNO_H */ goto end; } @@ -340,7 +349,7 @@ read_palette(png_structp png_ptr, png_infop info_ptr, static unsigned char * load_png(unsigned char *buffer, int size, - int *psx, int *psy, int *pcomp, + int *psx, int *psy, unsigned char **ppalette, int *pncolors, int reqcolors, int *pixelformat, @@ -357,6 +366,7 @@ load_png(unsigned char *buffer, int size, png_color_16 background; png_color_16p default_background; int i; + int depth; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { @@ -425,7 +435,6 @@ load_png(unsigned char *buffer, int size, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); png_set_strip_alpha(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; } else { switch (bitdepth) { @@ -436,7 +445,6 @@ load_png(unsigned char *buffer, int size, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background); - *pcomp = 1; *pixelformat = PIXELFORMAT_PAL1; break; case 2: @@ -446,7 +454,6 @@ load_png(unsigned char *buffer, int size, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background); - *pcomp = 1; *pixelformat = PIXELFORMAT_PAL2; break; case 4: @@ -456,7 +463,6 @@ load_png(unsigned char *buffer, int size, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background); - *pcomp = 1; *pixelformat = PIXELFORMAT_PAL4; break; case 8: @@ -466,14 +472,12 @@ load_png(unsigned char *buffer, int size, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background); - *pcomp = 1; *pixelformat = PIXELFORMAT_PAL8; break; default: png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; } @@ -493,7 +497,6 @@ load_png(unsigned char *buffer, int size, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; } else { switch (bitdepth) { @@ -506,7 +509,6 @@ load_png(unsigned char *buffer, int size, (unsigned int)bitdepth); # endif png_set_expand_gray_1_2_4_to_8(png_ptr); - *pcomp = 1; *pixelformat = PIXELFORMAT_G8; # elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 # if HAVE_DEBUG @@ -514,7 +516,6 @@ load_png(unsigned char *buffer, int size, (unsigned int)bitdepth); # endif png_set_gray_1_2_4_to_8(png_ptr); - *pcomp = 1; *pixelformat = PIXELFORMAT_G8; # else # if HAVE_DEBUG @@ -523,13 +524,11 @@ load_png(unsigned char *buffer, int size, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; # endif break; case 8: if (ppalette) { - *pcomp = 1; *pixelformat = PIXELFORMAT_G8; } else { # if HAVE_DEBUG @@ -538,7 +537,6 @@ load_png(unsigned char *buffer, int size, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; } break; @@ -549,7 +547,6 @@ load_png(unsigned char *buffer, int size, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; } @@ -564,7 +561,6 @@ load_png(unsigned char *buffer, int size, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB_ALPHA: @@ -575,7 +571,6 @@ load_png(unsigned char *buffer, int size, # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB: @@ -585,14 +580,14 @@ load_png(unsigned char *buffer, int size, # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - *pcomp = 3; *pixelformat = PIXELFORMAT_RGB888; break; default: /* unknown format */ goto cleanup; } - result = malloc(*pcomp * *psx * *psy); + depth = sixel_helper_compute_depth(*pixelformat); + result = malloc(*psx * *psy * depth); if (result == NULL) { goto cleanup; } @@ -605,12 +600,12 @@ load_png(unsigned char *buffer, int size, case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: for (i = 0; i < *psy; ++i) { - rows[i] = result + (*pcomp * *psx * bitdepth + 7) / 8 * i; + rows[i] = result + (depth * *psx * bitdepth + 7) / 8 * i; } break; default: for (i = 0; i < *psy; ++i) { - rows[i] = result + *pcomp * *psx * i; + rows[i] = result + depth * *psx * i; } break; } @@ -633,7 +628,7 @@ load_png(unsigned char *buffer, int size, static unsigned char * load_sixel(unsigned char *buffer, int size, - int *psx, int *psy, int *pcomp, + int *psx, int *psy, unsigned char **ppalette, int *pncolors, int reqcolors, int *ppixelformat) @@ -658,8 +653,7 @@ load_sixel(unsigned char *buffer, int size, } if (ppalette == NULL || colors > reqcolors) { *ppixelformat = PIXELFORMAT_RGB888; - *pcomp = 3; - pixels = malloc(*psx * *psy * *pcomp); + pixels = malloc(*psx * *psy * 3); if (pixels == NULL) { goto cleanup; } @@ -670,7 +664,6 @@ load_sixel(unsigned char *buffer, int size, } } else { *ppixelformat = PIXELFORMAT_PAL8; - *pcomp = 1; pixels = p; *ppalette = palette; *pncolors = colors; @@ -804,7 +797,7 @@ chunk_is_jpeg(chunk_t const *chunk) static unsigned char * load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, - int *pcomp, int *pstride, + int *pstride, unsigned char **ppalette, int *pncolors, int *ppixelformat, int *pframe_count, int *ploop_count, int **ppdelay, @@ -816,7 +809,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, static stbi__gif g; chunk_t frames; chunk_t delays; - int pixelformat = PIXELFORMAT_RGB888; + int depth; #if !defined(HAVE_LIBPNG) (void) bgcolor; @@ -824,7 +817,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, if (chunk_is_sixel(pchunk)) { pixels = load_sixel(pchunk->buffer, pchunk->size, - psx, psy, pcomp, + psx, psy, ppalette, pncolors, reqcolors, ppixelformat); if (pixels == NULL) { @@ -832,10 +825,11 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, } *pframe_count = 1; *ploop_count = 1; + *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); } else if (chunk_is_pnm(pchunk)) { /* pnm */ pixels = load_pnm(pchunk->buffer, pchunk->size, - psx, psy, pcomp, ppalette, pncolors, pixelformat); + psx, psy, ppalette, pncolors, ppixelformat); if (!pixels) { #if HAVE_ERRNO_H fprintf(stderr, "load_pnm failed.\n" "reason: %s.\n", @@ -845,23 +839,26 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, } *pframe_count = 1; *ploop_count = 1; + *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); } #if HAVE_JPEG else if (chunk_is_jpeg(pchunk)) { pixels = load_jpeg(pchunk->buffer, pchunk->size, - psx, psy, pcomp); + psx, psy, ppixelformat); *pframe_count = 1; *ploop_count = 1; + *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); } #endif /* HAVE_JPEG */ #if HAVE_LIBPNG else if (chunk_is_png(pchunk)) { pixels = load_png(pchunk->buffer, pchunk->size, - psx, psy, pcomp, + psx, psy, ppalette, pncolors, reqcolors, ppixelformat, bgcolor); *pframe_count = 1; *ploop_count = 1; + *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { @@ -887,7 +884,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, memset(&g, 0, sizeof(g)); for (;;) { - p = stbi__gif_load_next(&s, &g, pcomp, 4, bgcolor); + p = stbi__gif_load_next(&s, &g, &depth, 4, bgcolor); if (p == (void *) &s) { /* end of animated gif marker */ break; @@ -899,7 +896,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, } *psx = g.w; *psy = g.h; - memory_write((void *)p, 1, *psx * *psy * 4, (void *)&frames); + memory_write((void *)p, 1, *psx * *psy * depth, (void *)&frames); memory_write((void *)&g.delay, sizeof(g.delay), 1, (void *)&delays); ++*pframe_count; pixels = frames.buffer; @@ -909,6 +906,23 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, } *ploop_count = g.loop_count; *ppdelay = (int *)delays.buffer; + *pstride = *psx * depth; + + switch (depth) { + case 3: + *ppixelformat = PIXELFORMAT_RGB888; + break; + case 4: + *ppixelformat = PIXELFORMAT_RGBA8888; + break; + default: + stbi_image_free(pixels); + free(delays.buffer); + free(frames.buffer); + fprintf(stderr, "load_with_builtin() failed.\n" + "reason: unknwon pixel-format.\n"); + return NULL; + } if (!pixels) { free(delays.buffer); @@ -919,7 +933,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, } } else { stbi__start_mem(&s, pchunk->buffer, pchunk->size); - pixels = stbi_load_main(&s, psx, psy, pcomp, 3); + pixels = stbi_load_main(&s, psx, psy, &depth, 3); if (!pixels) { fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", stbi_failure_reason()); @@ -927,10 +941,20 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, } *pframe_count = 1; *ploop_count = 1; - *pcomp = 3; /* reset component to 3 */ + *pstride = *psx * depth; + + switch (depth) { + case 3: + *ppixelformat = PIXELFORMAT_RGB888; + break; + default: + stbi_image_free(pixels); + fprintf(stderr, "load_with_builtin() failed.\n" + "reason: unknwon pixel-format.\n"); + return NULL; + } } - *pstride = *pcomp * *psx; return pixels; } @@ -938,7 +962,7 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, #ifdef HAVE_GDK_PIXBUF2 static unsigned char * load_with_gdkpixbuf(chunk_t const *pchunk, int *psx, int *psy, - int *pcomp, int *pstride, int *pframe_count, + int *ppixelformat, int *pstride, int *pframe_count, int *ploop_count, int **ppdelay, int fstatic) { GdkPixbuf *pixbuf; @@ -948,6 +972,7 @@ load_with_gdkpixbuf(chunk_t const *pchunk, int *psx, int *psy, GdkPixbufLoader *loader; chunk_t frames; chunk_t delays; + int depth; #if 1 GdkPixbufAnimationIter *it; GTimeVal time; @@ -971,10 +996,16 @@ load_with_gdkpixbuf(chunk_t const *pchunk, int *psx, int *psy, p = gdk_pixbuf_get_pixels(pixbuf); *psx = gdk_pixbuf_get_width(pixbuf); *psy = gdk_pixbuf_get_height(pixbuf); - *pcomp = gdk_pixbuf_get_has_alpha(pixbuf) ? 4: 3; + if (gdk_pixbuf_get_has_alpha(pixbuf)) { + *ppixelformat = PIXELFORMAT_RGBA8888; + depth = 4; + } else { + *ppixelformat = PIXELFORMAT_RGB888; + depth = 3; + } *pstride = gdk_pixbuf_get_rowstride(pixbuf); *pframe_count = 1; - memory_write((void *)p, 1, *psx * *psy * *pcomp, (void *)&frames); + memory_write((void *)p, 1, *psx * *psy * depth, (void *)&frames); pixels = frames.buffer; } else { chunk_init(&delays, 1024); @@ -994,9 +1025,15 @@ load_with_gdkpixbuf(chunk_t const *pchunk, int *psx, int *psy, } *psx = gdk_pixbuf_get_width(pixbuf); *psy = gdk_pixbuf_get_height(pixbuf); - *pcomp = gdk_pixbuf_get_has_alpha(pixbuf) ? 4: 3; + if (gdk_pixbuf_get_has_alpha(pixbuf)) { + *ppixelformat = PIXELFORMAT_RGBA8888; + depth = 4; + } else { + *ppixelformat = PIXELFORMAT_RGB888; + depth = 3; + } *pstride = gdk_pixbuf_get_rowstride(pixbuf); - memory_write((void *)p, 1, *psx * *psy * *pcomp, (void *)&frames); + memory_write((void *)p, 1, *psx * *psy * depth, (void *)&frames); delay /= 10; memory_write((void *)&delay, sizeof(delay), 1, (void *)&delays); ++*pframe_count; @@ -1079,7 +1116,11 @@ detect_file_format(int len, unsigned char *data) static unsigned char * -load_with_gd(chunk_t const *pchunk, int *psx, int *psy, int *pcomp, int *pstride) +load_with_gd(chunk_t const *pchunk, + int *psx, + int *psy, + int *ppixelformat, + int *pstride) { unsigned char *pixels, *p; gdImagePtr im; @@ -1151,8 +1192,8 @@ load_with_gd(chunk_t const *pchunk, int *psx, int *psy, int *pcomp, int *pstride *psx = gdImageSX(im); *psy = gdImageSY(im); - *pcomp = 3; - *pstride = *psx * *pcomp; + *ppixelformat = PIXELFORMAT_RGB888; + *pstride = *psx * 3; p = pixels = malloc(*pstride * *psy); if (p == NULL) { #if HAVE_ERRNO_H @@ -1225,7 +1266,6 @@ sixel_helper_load_image_file( int /* in */ reqcolors, /* requested number of colors */ unsigned char /* in */ *bgcolor) /* background color */ { - int comp; int stride = (-1); int ret = (-1); chunk_t chunk; @@ -1248,32 +1288,31 @@ sixel_helper_load_image_file( #ifdef HAVE_GDK_PIXBUF2 if (!*ppixels) { - *ppixels = load_with_gdkpixbuf(&chunk, psx, psy, &comp, &stride, + *ppixels = load_with_gdkpixbuf(&chunk, psx, psy, ppixelformat, &stride, pframe_count, ploop_count, ppdelay, fstatic); } #endif /* HAVE_GDK_PIXBUF2 */ #if HAVE_GD if (!*ppixels) { - *ppixels = load_with_gd(&chunk, psx, psy, &comp, &stride); + *ppixels = load_with_gd(&chunk, psx, psy, ppixelformat, &stride); *pframe_count = 1; } #endif /* HAVE_GD */ if (!*ppixels) { - *ppixels = load_with_builtin(&chunk, psx, psy, &comp, &stride, + *ppixels = load_with_builtin(&chunk, psx, psy, &stride, ppalette, pncolors, ppixelformat, pframe_count, ploop_count, ppdelay, fstatic, reqcolors, bgcolor); } free(chunk.buffer); - if (*ppixels && stride > 0 && comp == 4) { - if (!ppalette || (ppalette && !*ppalette)) { - /* RGBA to RGB */ - ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count, bgcolor); - if (ret != 0) { - goto end; - } + if (*ppixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { + /* RGBA to RGB */ + ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count, bgcolor); + if (ret != 0) { + goto end; } + *ppixelformat = PIXELFORMAT_RGB888; } if (*ppixels == NULL) { From 644a487872043b86cfb379cc71130639f1359b2d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 23 Feb 2015 00:47:18 +0900 Subject: [PATCH 101/451] Check whether --with-xxx options are directories --- Makefile.in | 2 +- configure | 19 ++++++++++++++----- configure.ac | 19 ++++++++++++++----- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Makefile.in b/Makefile.in index 8c398d7e..7d6f7844 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/configure b/configure index e5cc2222..0dbd866c 100755 --- a/configure +++ b/configure @@ -14390,7 +14390,10 @@ if test x$with_libcurl != xno; then if test x$build = x$host; then CFLAGS_BACKUP=$CFLAGS LDFLAGS_BACKUP=$LDFLAGS - if test x$with_libcurl != xyes; then + if test x$with_libcurl != xyes -a x$with_libcurl != xauto; then + if test ! -d "$with_libcurl"; then + as_fn_error $? "\"${with_libcurl}\" is not directory" "$LINENO" 5 + fi LIBCURL_CFLAGS="-I${with_libcurl}/include" LIBCURL_LIBS="-L${with_libcurl}/lib -lcurl" elif test x${prefix} != x -a x${prefix} != xNONE; then @@ -14451,7 +14454,7 @@ fi CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP - if test x$have_curl != xyes; then + if test x$have_curl != xyes -a ! -d "$with_libcurl"; then if test x${PKG_CONFIG} != x; then pkg_failed=no @@ -14550,7 +14553,10 @@ if test x$with_jpeg != xno; then if test x$build = x$host; then CFLAGS_BACKUP=$CFLAGS LDFLAGS_BACKUP=$LDFLAGS - if test x$with_jpeg != xyes; then + if test x$with_jpeg != xyes -a x$with_jpeg != xauto; then + if test ! -d "$with_jpeg"; then + as_fn_error $? "\"${with_jpeg}\" is not directory" "$LINENO" 5 + fi LIBJPEG_CFLAGS="-I${with_jpeg}/include" LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" elif test x${prefix} != x -a x${prefix} != xNONE; then @@ -14636,7 +14642,10 @@ if test x$with_png != xno; then if test x$build = x$host; then CFLAGS_BACKUP=$CFLAGS LDFLAGS_BACKUP=$LDFLAGS - if test x$with_png != xyes; then + if test x$with_png != xyes -a x$with_png != xauto; then + if test ! -d "$with_png"; then + as_fn_error $? "\"${with_png}\" is not directory" "$LINENO" 5 + fi LIBPNG_CFLAGS="-I${with_png}/include" LIBPNG_LIBS="-L${with_png}/lib -lpng" elif test x${prefix} != x -a x${prefix} != xNONE; then @@ -14697,7 +14706,7 @@ fi CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP - if test x$have_png != xyes; then + if test x$have_png != xyes -a ! -d "$with_png"; then if test x${PKG_CONFIG} != x; then pkg_failed=no diff --git a/configure.ac b/configure.ac index c9943609..a4dfe5c9 100644 --- a/configure.ac +++ b/configure.ac @@ -326,7 +326,10 @@ if test x$with_libcurl != xno; then if test x$build = x$host; then CFLAGS_BACKUP=$CFLAGS LDFLAGS_BACKUP=$LDFLAGS - if test x$with_libcurl != xyes; then + if test x$with_libcurl != xyes -a x$with_libcurl != xauto; then + if test ! -d "$with_libcurl"; then + AC_MSG_ERROR(["${with_libcurl}" is not directory]) + fi LIBCURL_CFLAGS="-I${with_libcurl}/include" LIBCURL_LIBS="-L${with_libcurl}/lib -lcurl" elif test x${prefix} != x -a x${prefix} != xNONE; then @@ -345,7 +348,7 @@ if test x$with_libcurl != xno; then [have_curl=no])]) CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP - if test x$have_curl != xyes; then + if test x$have_curl != xyes -a ! -d "$with_libcurl"; then if test x${PKG_CONFIG} != x; then PKG_CHECK_MODULES(LIBCURL, [libcurl], @@ -372,7 +375,10 @@ if test x$with_jpeg != xno; then if test x$build = x$host; then CFLAGS_BACKUP=$CFLAGS LDFLAGS_BACKUP=$LDFLAGS - if test x$with_jpeg != xyes; then + if test x$with_jpeg != xyes -a x$with_jpeg != xauto; then + if test ! -d "$with_jpeg"; then + AC_MSG_ERROR(["${with_jpeg}" is not directory]) + fi LIBJPEG_CFLAGS="-I${with_jpeg}/include" LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" elif test x${prefix} != x -a x${prefix} != xNONE; then @@ -411,7 +417,10 @@ if test x$with_png != xno; then if test x$build = x$host; then CFLAGS_BACKUP=$CFLAGS LDFLAGS_BACKUP=$LDFLAGS - if test x$with_png != xyes; then + if test x$with_png != xyes -a x$with_png != xauto; then + if test ! -d "$with_png"; then + AC_MSG_ERROR(["${with_png}" is not directory]) + fi LIBPNG_CFLAGS="-I${with_png}/include" LIBPNG_LIBS="-L${with_png}/lib -lpng" elif test x${prefix} != x -a x${prefix} != xNONE; then @@ -430,7 +439,7 @@ if test x$with_png != xno; then [have_png=no])]) CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP - if test x$have_png != xyes; then + if test x$have_png != xyes -a ! -d "$with_png"; then if test x${PKG_CONFIG} != x; then PKG_CHECK_MODULES(LIBPNG, [libpng], From cc6e2d2421bd95e7be950a96c35b5f50bc0e0607 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 23 Feb 2015 00:54:07 +0900 Subject: [PATCH 102/451] Respect prefix path specified with --with-gd configure option --- configure | 28 +++++++++++++++++++++++++--- configure.ac | 28 +++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 0dbd866c..32a7e8a1 100755 --- a/configure +++ b/configure @@ -13631,6 +13631,23 @@ fi if test x$with_gd != xno; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_gd != xyes -a x$with_gd != xauto; then + if test ! -d "$with_gd"; then + as_fn_error $? "\"${with_gd}\" is not directory" "$LINENO" 5 + fi + GD_CFLAGS="-I${with_gd}/include" + GD_LIBS="-L${with_gd}/lib -lgd" + elif test x${prefix} != x -a x${prefix} != xNONE; then + GD_CFLAGS="-I${prefix}/include" + GD_LIBS="-L${prefix}/lib -lgd" + else + GD_CFLAGS="-I/usr/local/include" + GD_LIBS="-L/usr/local/lib -lgd" + fi + CFLAGS="${CFLAGS} ${GD_CFLAGS}" + LDFLAGS="${LDFLAGS} ${GD_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "gd.h" "ac_cv_header_gd_h" "$ac_includes_default" if test "x$ac_cv_header_gd_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImageCreateFromGifPtr in -lgd" >&5 @@ -13670,7 +13687,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gd_gdImageCreateFromGifPtr" >&5 $as_echo "$ac_cv_lib_gd_gdImageCreateFromGifPtr" >&6; } if test "x$ac_cv_lib_gd_gdImageCreateFromGifPtr" = xyes; then : - have_gd="yes" GD_LIBS=-lgd + have_gd="yes" else have_gd="no" fi @@ -13678,8 +13695,10 @@ fi fi + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP if test x${PKG_CONFIG} != x; then - if test x$have_gd != xyes; then + if test x$have_gd != xyes -a ! -d "$with_gd"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GD" >&5 @@ -13755,7 +13774,9 @@ fi fi if test x$have_gd = xyes; then CFLAGS_BACKUP=$CFLAGS - CFLAGS="$CFLAGS $LIBPNG_CFLAGS" + LDFLAGS_BACKUP=$LDFLAGS + CFLAGS="$CFLAGS $GD_CFLAGS" + LDFLAGS="${LDFLAGS} ${GD_LIBS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImageCreateFromGifPtr in -lgd" >&5 $as_echo_n "checking for gdImageCreateFromGifPtr in -lgd... " >&6; } if ${ac_cv_lib_gd_gdImageCreateFromGifPtr+:} false; then : @@ -14267,6 +14288,7 @@ _ACEOF fi CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP $as_echo "#define HAVE_GD 1" >>confdefs.h diff --git a/configure.ac b/configure.ac index a4dfe5c9..e7f40813 100644 --- a/configure.ac +++ b/configure.ac @@ -253,19 +253,40 @@ AC_SUBST(GDK_PIXBUF_LIBS) if test x$with_gd != xno; then + CFLAGS_BACKUP=$CFLAGS + LDFLAGS_BACKUP=$LDFLAGS + if test x$with_gd != xyes -a x$with_gd != xauto; then + if test ! -d "$with_gd"; then + AC_MSG_ERROR(["${with_gd}" is not directory]) + fi + GD_CFLAGS="-I${with_gd}/include" + GD_LIBS="-L${with_gd}/lib -lgd" + elif test x${prefix} != x -a x${prefix} != xNONE; then + GD_CFLAGS="-I${prefix}/include" + GD_LIBS="-L${prefix}/lib -lgd" + else + GD_CFLAGS="-I/usr/local/include" + GD_LIBS="-L/usr/local/lib -lgd" + fi + CFLAGS="${CFLAGS} ${GD_CFLAGS}" + LDFLAGS="${LDFLAGS} ${GD_LIBS}" AC_CHECK_HEADER([gd.h], [AC_CHECK_LIB([gd], [gdImageCreateFromGifPtr], - [have_gd="yes" GD_LIBS=-lgd], + [have_gd="yes"], [have_gd="no"])]) + CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP if test x${PKG_CONFIG} != x; then - if test x$have_gd != xyes; then + if test x$have_gd != xyes -a ! -d "$with_gd"; then PKG_CHECK_MODULES(GD, [gdlib], [have_gd=yes], [have_gd=no]) fi fi if test x$have_gd = xyes; then CFLAGS_BACKUP=$CFLAGS - CFLAGS="$CFLAGS $LIBPNG_CFLAGS" + LDFLAGS_BACKUP=$LDFLAGS + CFLAGS="$CFLAGS $GD_CFLAGS" + LDFLAGS="${LDFLAGS} ${GD_LIBS}" AC_CHECK_LIB([gd], [gdImageCreateFromGifPtr], [AC_CHECK_DECLS([gdImageCreateFromGifPtr], [], [], [ #include ])]) @@ -297,6 +318,7 @@ if test x$with_gd != xno; then [gdImagePaletteToTrueColor], [AC_CHECK_DECLS([gdImagePaletteToTrueColor], [], [], [ #include ])]) CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP AC_DEFINE(HAVE_GD, 1, [whether gd is available]) loaders="${loaders} gd" else From ab5a2a38df5be1b5ce826164eccfbf99424394a5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 23 Feb 2015 01:00:59 +0900 Subject: [PATCH 103/451] Add missing error handler for load_jpeg() and load_png() --- src/loader.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/loader.c b/src/loader.c index 6ba32043..117930d2 100644 --- a/src/loader.c +++ b/src/loader.c @@ -271,7 +271,7 @@ load_jpeg(unsigned char *data, int datasize, int *pwidth, int *pheight, int *ppixelformat) { int row_stride, size; - unsigned char *result; + unsigned char *result = NULL; JSAMPARRAY buffer; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr pub; @@ -867,6 +867,10 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, else if (chunk_is_jpeg(pchunk)) { pixels = load_jpeg(pchunk->buffer, pchunk->size, psx, psy, ppixelformat); + if (pixels == NULL) { + free(frames.buffer); + return NULL; + } *pframe_count = 1; *ploop_count = 1; *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); @@ -878,6 +882,10 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, psx, psy, ppalette, pncolors, reqcolors, ppixelformat, bgcolor); + if (pixels == NULL) { + free(frames.buffer); + return NULL; + } *pframe_count = 1; *ploop_count = 1; *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); From 16472c10a5af729cc9c8e3bfa91317ca408c1117 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 24 Feb 2015 01:43:08 +0900 Subject: [PATCH 104/451] Style fixes --- src/loader.c | 95 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/src/loader.c b/src/loader.c index 117930d2..bf73a0f4 100644 --- a/src/loader.c +++ b/src/loader.c @@ -93,33 +93,37 @@ typedef struct chunk { - unsigned char* buffer; + unsigned char *buffer; size_t size; size_t max_size; } chunk_t; static void -chunk_init(chunk_t * const pchunk, size_t initial_size) +chunk_init(chunk_t * const pchunk, + size_t initial_size) { pchunk->max_size = initial_size; pchunk->size = 0; - pchunk->buffer = malloc(pchunk->max_size); + pchunk->buffer = (unsigned char *)malloc(pchunk->max_size); } static size_t -memory_write(void* ptr, size_t size, size_t len, void* memory) +memory_write(void *ptr, + size_t size, + size_t len, + void *memory) { size_t nbytes; - chunk_t* chunk; + chunk_t *chunk; nbytes = size * len; if (nbytes == 0) { return 0; } - chunk = (chunk_t*)memory; + chunk = (chunk_t *)memory; if (chunk->max_size <= chunk->size + nbytes) { do { @@ -267,8 +271,11 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) # if HAVE_JPEG /* import from @uobikiemukot's sdump loader.h */ static unsigned char * -load_jpeg(unsigned char *data, int datasize, - int *pwidth, int *pheight, int *ppixelformat) +load_jpeg(unsigned char *data, + int datasize, + int *pwidth, + int *pheight, + int *ppixelformat) { int row_stride, size; unsigned char *result = NULL; @@ -325,7 +332,9 @@ load_jpeg(unsigned char *data, int datasize, # if HAVE_LIBPNG static void -read_png(png_structp png_ptr, png_bytep data, png_size_t length) +read_png(png_structp png_ptr, + png_bytep data, + png_size_t length) { chunk_t *pchunk = png_get_io_ptr(png_ptr); if (length > pchunk->size) { @@ -340,9 +349,12 @@ read_png(png_structp png_ptr, png_bytep data, png_size_t length) static void -read_palette(png_structp png_ptr, png_infop info_ptr, - unsigned char *palette, int ncolors, - png_color *png_palette, png_color_16 *pbackground) +read_palette(png_structp png_ptr, + png_infop info_ptr, + unsigned char *palette, + int ncolors, + png_color *png_palette, + png_color_16 *pbackground) { png_bytep trans = NULL; int num_trans = 0; @@ -370,9 +382,12 @@ read_palette(png_structp png_ptr, png_infop info_ptr, static unsigned char * -load_png(unsigned char *buffer, int size, - int *psx, int *psy, - unsigned char **ppalette, int *pncolors, +load_png(unsigned char *buffer, + int size, + int *psx, + int *psy, + unsigned char **ppalette, + int *pncolors, int reqcolors, int *pixelformat, unsigned char *bgcolor) @@ -649,9 +664,12 @@ load_png(unsigned char *buffer, int size, static unsigned char * -load_sixel(unsigned char *buffer, int size, - int *psx, int *psy, - unsigned char **ppalette, int *pncolors, +load_sixel(unsigned char *buffer, + int size, + int *psx, + int *psy, + unsigned char **ppalette, + int *pncolors, int reqcolors, int *ppixelformat) { @@ -818,12 +836,21 @@ chunk_is_jpeg(chunk_t const *chunk) static unsigned char * -load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, - int *pstride, - unsigned char **ppalette, int *pncolors, - int *ppixelformat, - int *pframe_count, int *ploop_count, int **ppdelay, - int fstatic, int reqcolors, unsigned char *bgcolor) +load_with_builtin( + chunk_t const *pchunk, + int *psx, + int *psy, + int *pstride, + unsigned char **ppalette, + int *pncolors, + int *ppixelformat, + int *pframe_count, + int *ploop_count, + int **ppdelay, + int fstatic, + int reqcolors, + unsigned char *bgcolor +) { unsigned char *p; unsigned char *pixels = NULL; @@ -991,9 +1018,15 @@ load_with_builtin(chunk_t const *pchunk, int *psx, int *psy, #ifdef HAVE_GDK_PIXBUF2 static unsigned char * -load_with_gdkpixbuf(chunk_t const *pchunk, int *psx, int *psy, - int *ppixelformat, int *pstride, int *pframe_count, - int *ploop_count, int **ppdelay, int fstatic) +load_with_gdkpixbuf(chunk_t const *pchunk, + int *psx, + int *psy, + int *ppixelformat, + int *pstride, + int *pframe_count, + int *ploop_count, + int **ppdelay, + int fstatic) { GdkPixbuf *pixbuf; GdkPixbufAnimation *animation; @@ -1249,8 +1282,10 @@ load_with_gd(chunk_t const *pchunk, static int -arrange_pixelformat(unsigned char *pixels, int width, int height, - unsigned char *bgcolor) +sixel_strip_alpha(unsigned char *pixels, + int width, + int height, + unsigned char *bgcolor) { int x; int y; @@ -1338,7 +1373,7 @@ sixel_helper_load_image_file( free(chunk.buffer); if (*ppixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { /* RGBA to RGB */ - ret = arrange_pixelformat(*ppixels, *psx, *psy * *pframe_count, bgcolor); + ret = sixel_strip_alpha(*ppixels, *psx, *psy * *pframe_count, bgcolor); if (ret != 0) { goto end; } From d3eebffb1b155bb6655104392ec845c25bd716be Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 24 Feb 2015 16:27:17 +0900 Subject: [PATCH 105/451] Add some lines to Makefile.am, for fix build from tarballs created by 'make dist' --- src/Makefile.am | 3 +++ src/Makefile.in | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index a437ccaa..347cde26 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,10 +7,13 @@ CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = output.c \ + output.h \ fromsixel.c \ tosixel.c \ quant.c \ + quant.h \ dither.c \ + dither.h \ pixelformat.c \ scale.c \ loader.c \ diff --git a/src/Makefile.in b/src/Makefile.in index e2ea47ef..3384c9b2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -344,10 +344,13 @@ zshcompletiondir = @zshcompletiondir@ CLEANFILES = *.gcno *.gcda *.gcov lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = output.c \ + output.h \ fromsixel.c \ tosixel.c \ quant.c \ + quant.h \ dither.c \ + dither.h \ pixelformat.c \ scale.c \ loader.c \ From 2a98bcded85f3d4932c9c1776e74e424bfe5ebd6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 24 Feb 2015 16:38:57 +0900 Subject: [PATCH 106/451] Clear additional CFLAGS/LIBS when ./configure --with-libcurl=auto and libcurl is missing --- Makefile.in | 2 +- configure | 8 ++++++++ configure.ac | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 7d6f7844..8c398d7e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/configure b/configure index 32a7e8a1..d02e9ebd 100755 --- a/configure +++ b/configure @@ -14294,6 +14294,8 @@ $as_echo "#define HAVE_GD 1" >>confdefs.h loaders="${loaders} gd" else + GD_CFLAGS= + GD_LIBS= as_fn_error $? "gd is not available." "$LINENO" 5 fi @@ -14557,6 +14559,8 @@ fi $as_echo "#define HAVE_LIBCURL 1" >>confdefs.h else + LIBCURL_CFLAGS= + LIBCURL_LIBS= if test x$with_libcurl != xauto; then as_fn_error $? "unable to find libcurl" "$LINENO" 5 fi @@ -14650,6 +14654,8 @@ $as_echo "$as_me: jpeg cflags is ${LIBJPEG_CFLAGS}" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: jpeg libs is ${LIBJPEG_LIBS}" >&5 $as_echo "$as_me: jpeg libs is ${LIBJPEG_LIBS}" >&6;} else + LIBJPEG_CFLAGS= + LIBJPEG_LIBS= if test x$with_jpeg != xauto; then as_fn_error $? "unable to find jpeg codec library" "$LINENO" 5 fi @@ -14840,6 +14846,8 @@ $as_echo "$as_me: libpng cflags is ${LIBPNG_CFLAGS}" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: libpng libs is ${LIBPNG_LIBS}" >&5 $as_echo "$as_me: libpng libs is ${LIBPNG_LIBS}" >&6;} else + LIBPNG_CFLAGS= + LIBPNG_LIBS= if test x$with_png != xauto; then as_fn_error $? "unable to find libpng" "$LINENO" 5 fi diff --git a/configure.ac b/configure.ac index e7f40813..9fe17e04 100644 --- a/configure.ac +++ b/configure.ac @@ -322,6 +322,8 @@ if test x$with_gd != xno; then AC_DEFINE(HAVE_GD, 1, [whether gd is available]) loaders="${loaders} gd" else + GD_CFLAGS= + GD_LIBS= AC_MSG_ERROR(gd is not available.) fi @@ -382,6 +384,8 @@ if test x$with_libcurl != xno; then if test x$have_curl = xyes; then AC_DEFINE(HAVE_LIBCURL, 1, [whether libcurl is available]) else + LIBCURL_CFLAGS= + LIBCURL_LIBS= if test x$with_libcurl != xauto; then AC_MSG_ERROR([unable to find libcurl]) fi @@ -426,6 +430,8 @@ if test x$with_jpeg != xno; then AC_MSG_NOTICE([jpeg cflags is ${LIBJPEG_CFLAGS}]) AC_MSG_NOTICE([jpeg libs is ${LIBJPEG_LIBS}]) else + LIBJPEG_CFLAGS= + LIBJPEG_LIBS= if test x$with_jpeg != xauto; then AC_MSG_ERROR([unable to find jpeg codec library]) fi @@ -481,6 +487,8 @@ if test x$with_png != xno; then AC_MSG_NOTICE([libpng cflags is ${LIBPNG_CFLAGS}]) AC_MSG_NOTICE([libpng libs is ${LIBPNG_LIBS}]) else + LIBPNG_CFLAGS= + LIBPNG_LIBS= if test x$with_png != xauto; then AC_MSG_ERROR([unable to find libpng]) fi From bf23ab67f59a660320c806b83f391155fc11d622 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 24 Feb 2015 16:45:11 +0900 Subject: [PATCH 107/451] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 94c3bb91..bc9e2254 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "libsixel", - "version": "1.4.5", + "version": "1.4.8", "repo": "saitoha/libsixel", "description": "A lightweight, fast implementation of DEC SIXEL graphics codec", "keywords": ["terminal", "graphics", "image", "sixel"], From ff4db0b95f8be293f50c6a8b606e1e0d6c97c3a8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 26 Feb 2015 00:17:05 +0900 Subject: [PATCH 108/451] Fix wrong boundary test added by 19417c6 (for Issue #33). --- converters/img2sixel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index b888cf5b..e9ac8213 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1520,7 +1520,7 @@ main(int argc, char *argv[]) if (settings.clipwidth <= 0 || settings.clipheight <= 0) { goto argerr; } - if (settings.clipx <= 0 || settings.clipy <= 0) { + if (settings.clipx < 0 || settings.clipy < 0) { goto argerr; } settings.clipfirst = 0; From d6ca032af6467b7cf15cb1895f5a2386626140e5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 26 Feb 2015 00:28:09 +0900 Subject: [PATCH 109/451] Fix inverted test condition added in 3d6ca7d6 (for Issue #32) --- src/loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loader.c b/src/loader.c index bf73a0f4..15ec197c 100644 --- a/src/loader.c +++ b/src/loader.c @@ -294,7 +294,7 @@ load_jpeg(unsigned char *data, cinfo.out_color_space = JCS_RGB; jpeg_start_decompress(&cinfo); - if (cinfo.output_components == 3) { + if (cinfo.output_components != 3) { fprintf(stderr, "load_jpeg() failed(unknwon format).\n"); goto end; } From 4581296b1365e70e8f19a7bd5cb446f87e89094b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 28 Feb 2015 17:39:15 +0900 Subject: [PATCH 110/451] Fix miss-detection for libcurl/libpng (for Issue #35) --- configure | 4 ++++ configure.ac | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/configure b/configure index b4002b32..567e1598 100755 --- a/configure +++ b/configure @@ -14480,6 +14480,8 @@ fi LDFLAGS=$LDFLAGS_BACKUP if test x$have_curl != xyes -a ! -d "$with_libcurl"; then if test x${PKG_CONFIG} != x; then + LIBCURL_CFLAGS= + LIBCURL_LIBS= pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCURL" >&5 @@ -14736,6 +14738,8 @@ fi LDFLAGS=$LDFLAGS_BACKUP if test x$have_png != xyes -a ! -d "$with_png"; then if test x${PKG_CONFIG} != x; then + LIBPNG_CFLAGS= + LIBPNG_LIBS= pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5 diff --git a/configure.ac b/configure.ac index 204afd99..b3dedcd0 100644 --- a/configure.ac +++ b/configure.ac @@ -374,6 +374,8 @@ if test x$with_libcurl != xno; then LDFLAGS=$LDFLAGS_BACKUP if test x$have_curl != xyes -a ! -d "$with_libcurl"; then if test x${PKG_CONFIG} != x; then + LIBCURL_CFLAGS= + LIBCURL_LIBS= PKG_CHECK_MODULES(LIBCURL, [libcurl], [have_curl=yes], @@ -469,6 +471,8 @@ if test x$with_png != xno; then LDFLAGS=$LDFLAGS_BACKUP if test x$have_png != xyes -a ! -d "$with_png"; then if test x${PKG_CONFIG} != x; then + LIBPNG_CFLAGS= + LIBPNG_LIBS= PKG_CHECK_MODULES(LIBPNG, [libpng], [have_png=yes], From 952f1511ed9f31f018b6ec8b46527f7cd2dca5fc Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 5 Mar 2015 00:27:53 +0900 Subject: [PATCH 111/451] Prevent segmentation fault reported by @msmhrt (Issue #39) --- src/loader.c | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/loader.c b/src/loader.c index 15ec197c..af75489d 100644 --- a/src/loader.c +++ b/src/loader.c @@ -943,11 +943,9 @@ load_with_builtin( for (;;) { p = stbi__gif_load_next(&s, &g, &depth, 4, bgcolor); if (p == (void *) &s) { - /* end of animated gif marker */ break; } - if (p == 0) { - free(frames.buffer); + if (p == NULL) { pixels = NULL; break; } @@ -961,27 +959,27 @@ load_with_builtin( break; } } - *ploop_count = g.loop_count; - *ppdelay = (int *)delays.buffer; - *pstride = *psx * depth; - - switch (depth) { - case 3: - *ppixelformat = PIXELFORMAT_RGB888; - break; - case 4: - *ppixelformat = PIXELFORMAT_RGBA8888; - break; - default: - stbi_image_free(pixels); - free(delays.buffer); - free(frames.buffer); - fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknwon pixel-format.\n"); - return NULL; - } + if (pixels) { + *ploop_count = g.loop_count; + *ppdelay = (int *)delays.buffer; + *pstride = *psx * depth; - if (!pixels) { + switch (depth) { + case 3: + *ppixelformat = PIXELFORMAT_RGB888; + break; + case 4: + *ppixelformat = PIXELFORMAT_RGBA8888; + break; + default: + stbi_image_free(pixels); + free(delays.buffer); + free(frames.buffer); + fprintf(stderr, "load_with_builtin() failed.\n" + "reason: unknwon pixel-format.\n"); + return NULL; + } + } else { free(delays.buffer); free(frames.buffer); fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", From 095174a2f19b57972138ddefb14bbaaa7d0bff47 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 5 Mar 2015 00:46:57 +0900 Subject: [PATCH 112/451] Parse GIF application extension block correctly (Issue #39) --- src/stb_image.h | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/stb_image.h b/src/stb_image.h index 35f5bd56..9d1a085c 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -5551,6 +5551,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i { int i; stbi_uc *old_out = 0; + stbi_uc buffer[256]; if (g->out == 0) { if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header @@ -5648,27 +5649,20 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i break; case 0xFF: // Application Extension len = stbi__get8(s); // block size - if (len != 11) break; - if (stbi__get8(s) != 'N') break; - if (stbi__get8(s) != 'E') break; - if (stbi__get8(s) != 'T') break; - if (stbi__get8(s) != 'S') break; - if (stbi__get8(s) != 'C') break; - if (stbi__get8(s) != 'A') break; - if (stbi__get8(s) != 'P') break; - if (stbi__get8(s) != 'E') break; - if (stbi__get8(s) != '2') break; - if (stbi__get8(s) != '.') break; - if (stbi__get8(s) != '0') break; - if (stbi__get8(s) != 0x03) break; - // loop count - switch (stbi__get8(s)) { - case 0x00: - g->loop_count = 1; - break; - case 0x01: - g->loop_count = stbi__get16le(s); - break; + stbi__getn(s, buffer, len); + buffer[len] = 0; + if (len == 11 && strcmp((char *)buffer, "NETSCAPE2.0") == 0) { + if (stbi__get8(s) == 0x03) { + // loop count + switch (stbi__get8(s)) { + case 0x00: + g->loop_count = 1; + break; + case 0x01: + g->loop_count = stbi__get16le(s); + break; + } + } } break; default: From d1e1e841af422f8611cd53ce50ca6a627fffd3ae Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 13 Mar 2015 22:02:00 +0900 Subject: [PATCH 113/451] Don't override env variable xxx_CFLAGS/xxx_LIBS (Issue #35) --- configure | 83 ++++++++++++++++++++++++------------------------ configure.ac | 89 ++++++++++++++++++++++++++-------------------------- 2 files changed, 85 insertions(+), 87 deletions(-) diff --git a/configure b/configure index 567e1598..f79d8a99 100755 --- a/configure +++ b/configure @@ -13637,14 +13637,14 @@ if test x$with_gd != xno; then if test ! -d "$with_gd"; then as_fn_error $? "\"${with_gd}\" is not directory" "$LINENO" 5 fi - GD_CFLAGS="-I${with_gd}/include" - GD_LIBS="-L${with_gd}/lib -lgd" + ADDED_CFLAGS="-I${with_gd}/include" + ADDED_LIBS="-L${with_gd}/lib -lgd" elif test x${prefix} != x -a x${prefix} != xNONE; then - GD_CFLAGS="-I${prefix}/include" - GD_LIBS="-L${prefix}/lib -lgd" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -lgd" else - GD_CFLAGS="-I/usr/local/include" - GD_LIBS="-L/usr/local/lib -lgd" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -lgd" fi CFLAGS="${CFLAGS} ${GD_CFLAGS}" LDFLAGS="${LDFLAGS} ${GD_LIBS}" @@ -13688,6 +13688,8 @@ fi $as_echo "$ac_cv_lib_gd_gdImageCreateFromGifPtr" >&6; } if test "x$ac_cv_lib_gd_gdImageCreateFromGifPtr" = xyes; then : have_gd="yes" + GD_CFLAGS=$ADDED_CFLAGS + GD_LIBS=$ADDED_LIBS else have_gd="no" fi @@ -14418,17 +14420,17 @@ if test x$with_libcurl != xno; then if test ! -d "$with_libcurl"; then as_fn_error $? "\"${with_libcurl}\" is not directory" "$LINENO" 5 fi - LIBCURL_CFLAGS="-I${with_libcurl}/include" - LIBCURL_LIBS="-L${with_libcurl}/lib -lcurl" + ADDED_CFLAGS="-I${with_libcurl}/include" + ADDED_LIBS="-L${with_libcurl}/lib -lcurl" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBCURL_CFLAGS="-I${prefix}/include" - LIBCURL_LIBS="-L${prefix}/lib -lcurl" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -lcurl" else - LIBCURL_CFLAGS="-I/usr/local/include" - LIBCURL_LIBS="-L/usr/local/lib -lcurl" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -lcurl" fi - CFLAGS="${CFLAGS} ${LIBCURL_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBCURL_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" if test "x$ac_cv_header_curl_curl_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curl_easy_cleanup in -lcurl" >&5 @@ -14469,6 +14471,8 @@ fi $as_echo "$ac_cv_lib_curl_curl_easy_cleanup" >&6; } if test "x$ac_cv_lib_curl_curl_easy_cleanup" = xyes; then : have_curl=yes + LIBCURL_CFLAGS=$ADDED_CFLAGS + LIBCURL_LIBS=$ADDED_LIBS else have_curl=no fi @@ -14480,8 +14484,6 @@ fi LDFLAGS=$LDFLAGS_BACKUP if test x$have_curl != xyes -a ! -d "$with_libcurl"; then if test x${PKG_CONFIG} != x; then - LIBCURL_CFLAGS= - LIBCURL_LIBS= pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCURL" >&5 @@ -14561,8 +14563,6 @@ fi $as_echo "#define HAVE_LIBCURL 1" >>confdefs.h else - LIBCURL_CFLAGS= - LIBCURL_LIBS= if test x$with_libcurl != xauto; then as_fn_error $? "unable to find libcurl" "$LINENO" 5 fi @@ -14585,17 +14585,17 @@ if test x$with_jpeg != xno; then if test ! -d "$with_jpeg"; then as_fn_error $? "\"${with_jpeg}\" is not directory" "$LINENO" 5 fi - LIBJPEG_CFLAGS="-I${with_jpeg}/include" - LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" + ADDED_CFLAGS="-I${with_jpeg}/include" + ADDED_LIBS="-L${with_jpeg}/lib -ljpeg" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBJPEG_CFLAGS="-I${prefix}/include" - LIBJPEG_LIBS="-L${prefix}/lib -ljpeg" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -ljpeg" else - LIBJPEG_CFLAGS="-I/usr/local/include" - LIBJPEG_LIBS="-L/usr/local/lib -ljpeg" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -ljpeg" fi - CFLAGS="${CFLAGS} ${LIBJPEG_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBJPEG_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_header in -ljpeg" >&5 @@ -14647,6 +14647,8 @@ fi LDFLAGS=$LDFLAGS_BACKUP fi if test x$have_jpeg = xyes; then + LIBJPEG_CFLAGS=$ADDED_CFLAGS + LIBJPEG_LIBS=$ADDED_LIBS $as_echo "#define HAVE_JPEG 1" >>confdefs.h @@ -14656,8 +14658,6 @@ $as_echo "$as_me: jpeg cflags is ${LIBJPEG_CFLAGS}" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: jpeg libs is ${LIBJPEG_LIBS}" >&5 $as_echo "$as_me: jpeg libs is ${LIBJPEG_LIBS}" >&6;} else - LIBJPEG_CFLAGS= - LIBJPEG_LIBS= if test x$with_jpeg != xauto; then as_fn_error $? "unable to find jpeg codec library" "$LINENO" 5 fi @@ -14676,17 +14676,17 @@ if test x$with_png != xno; then if test ! -d "$with_png"; then as_fn_error $? "\"${with_png}\" is not directory" "$LINENO" 5 fi - LIBPNG_CFLAGS="-I${with_png}/include" - LIBPNG_LIBS="-L${with_png}/lib -lpng" + ADDED_CFLAGS="-I${with_png}/include" + ADDED_LIBS="-L${with_png}/lib -lpng" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBPNG_CFLAGS="-I${prefix}/include" - LIBPNG_LIBS="-L${prefix}/lib -lpng" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -lpng" else - LIBPNG_CFLAGS="-I/usr/local/include" - LIBPNG_LIBS="-L/usr/local/lib -lpng" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -lpng" fi - CFLAGS="${CFLAGS} ${LIBPNG_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBPNG_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_check_sig in -lpng" >&5 @@ -14727,6 +14727,8 @@ fi $as_echo "$ac_cv_lib_png_png_check_sig" >&6; } if test "x$ac_cv_lib_png_png_check_sig" = xyes; then : have_png=yes + LIBPNG_CFLAGS=$ADDED_CFLAGS + LIBPNG_LIBS=$ADDED_LIBS else have_png=no fi @@ -14738,8 +14740,6 @@ fi LDFLAGS=$LDFLAGS_BACKUP if test x$have_png != xyes -a ! -d "$with_png"; then if test x${PKG_CONFIG} != x; then - LIBPNG_CFLAGS= - LIBPNG_LIBS= pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5 @@ -14815,8 +14815,8 @@ fi fi fi if test x$have_png = xyes; then - CFLAGS_BACKUP=$CFLAGS - CFLAGS="$CFLAGS $LIBPNG_CFLAGS" + CFLAGS="${CFLAGS} ${LIBPNG_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBPNG_LIBS}" ac_fn_c_check_decl "$LINENO" "png_set_gray_1_2_4_to_8" "ac_cv_have_decl_png_set_gray_1_2_4_to_8" " #include " if test "x$ac_cv_have_decl_png_set_gray_1_2_4_to_8" = xyes; then : @@ -14841,6 +14841,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h @@ -14850,8 +14851,6 @@ $as_echo "$as_me: libpng cflags is ${LIBPNG_CFLAGS}" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: libpng libs is ${LIBPNG_LIBS}" >&5 $as_echo "$as_me: libpng libs is ${LIBPNG_LIBS}" >&6;} else - LIBPNG_CFLAGS= - LIBPNG_LIBS= if test x$with_png != xauto; then as_fn_error $? "unable to find libpng" "$LINENO" 5 fi diff --git a/configure.ac b/configure.ac index b3dedcd0..700d1fe2 100644 --- a/configure.ac +++ b/configure.ac @@ -259,21 +259,23 @@ if test x$with_gd != xno; then if test ! -d "$with_gd"; then AC_MSG_ERROR(["${with_gd}" is not directory]) fi - GD_CFLAGS="-I${with_gd}/include" - GD_LIBS="-L${with_gd}/lib -lgd" + ADDED_CFLAGS="-I${with_gd}/include" + ADDED_LIBS="-L${with_gd}/lib -lgd" elif test x${prefix} != x -a x${prefix} != xNONE; then - GD_CFLAGS="-I${prefix}/include" - GD_LIBS="-L${prefix}/lib -lgd" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -lgd" else - GD_CFLAGS="-I/usr/local/include" - GD_LIBS="-L/usr/local/lib -lgd" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -lgd" fi CFLAGS="${CFLAGS} ${GD_CFLAGS}" LDFLAGS="${LDFLAGS} ${GD_LIBS}" AC_CHECK_HEADER([gd.h], [AC_CHECK_LIB([gd], [gdImageCreateFromGifPtr], - [have_gd="yes"], + [have_gd="yes" + GD_CFLAGS=$ADDED_CFLAGS + GD_LIBS=$ADDED_LIBS], [have_gd="no"])]) CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP @@ -354,28 +356,28 @@ if test x$with_libcurl != xno; then if test ! -d "$with_libcurl"; then AC_MSG_ERROR(["${with_libcurl}" is not directory]) fi - LIBCURL_CFLAGS="-I${with_libcurl}/include" - LIBCURL_LIBS="-L${with_libcurl}/lib -lcurl" + ADDED_CFLAGS="-I${with_libcurl}/include" + ADDED_LIBS="-L${with_libcurl}/lib -lcurl" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBCURL_CFLAGS="-I${prefix}/include" - LIBCURL_LIBS="-L${prefix}/lib -lcurl" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -lcurl" else - LIBCURL_CFLAGS="-I/usr/local/include" - LIBCURL_LIBS="-L/usr/local/lib -lcurl" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -lcurl" fi - CFLAGS="${CFLAGS} ${LIBCURL_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBCURL_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" AC_CHECK_HEADER([curl/curl.h], [AC_CHECK_LIB([curl], [curl_easy_cleanup], - [have_curl=yes], + [have_curl=yes + LIBCURL_CFLAGS=$ADDED_CFLAGS + LIBCURL_LIBS=$ADDED_LIBS], [have_curl=no])]) CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP if test x$have_curl != xyes -a ! -d "$with_libcurl"; then if test x${PKG_CONFIG} != x; then - LIBCURL_CFLAGS= - LIBCURL_LIBS= PKG_CHECK_MODULES(LIBCURL, [libcurl], [have_curl=yes], @@ -386,8 +388,6 @@ if test x$with_libcurl != xno; then if test x$have_curl = xyes; then AC_DEFINE(HAVE_LIBCURL, 1, [whether libcurl is available]) else - LIBCURL_CFLAGS= - LIBCURL_LIBS= if test x$with_libcurl != xauto; then AC_MSG_ERROR([unable to find libcurl]) fi @@ -407,17 +407,17 @@ if test x$with_jpeg != xno; then if test ! -d "$with_jpeg"; then AC_MSG_ERROR(["${with_jpeg}" is not directory]) fi - LIBJPEG_CFLAGS="-I${with_jpeg}/include" - LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" + ADDED_CFLAGS="-I${with_jpeg}/include" + ADDED_LIBS="-L${with_jpeg}/lib -ljpeg" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBJPEG_CFLAGS="-I${prefix}/include" - LIBJPEG_LIBS="-L${prefix}/lib -ljpeg" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -ljpeg" else - LIBJPEG_CFLAGS="-I/usr/local/include" - LIBJPEG_LIBS="-L/usr/local/lib -ljpeg" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -ljpeg" fi - CFLAGS="${CFLAGS} ${LIBJPEG_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBJPEG_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" AC_CHECK_HEADER([jpeglib.h], [AC_CHECK_LIB([jpeg], [jpeg_read_header], @@ -427,13 +427,13 @@ if test x$with_jpeg != xno; then LDFLAGS=$LDFLAGS_BACKUP fi if test x$have_jpeg = xyes; then + LIBJPEG_CFLAGS=$ADDED_CFLAGS + LIBJPEG_LIBS=$ADDED_LIBS AC_DEFINE(HAVE_JPEG, 1, [whether jpeg codec library is available]) loaders="${loaders} jpeg" AC_MSG_NOTICE([jpeg cflags is ${LIBJPEG_CFLAGS}]) AC_MSG_NOTICE([jpeg libs is ${LIBJPEG_LIBS}]) else - LIBJPEG_CFLAGS= - LIBJPEG_LIBS= if test x$with_jpeg != xauto; then AC_MSG_ERROR([unable to find jpeg codec library]) fi @@ -451,28 +451,28 @@ if test x$with_png != xno; then if test ! -d "$with_png"; then AC_MSG_ERROR(["${with_png}" is not directory]) fi - LIBPNG_CFLAGS="-I${with_png}/include" - LIBPNG_LIBS="-L${with_png}/lib -lpng" + ADDED_CFLAGS="-I${with_png}/include" + ADDED_LIBS="-L${with_png}/lib -lpng" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBPNG_CFLAGS="-I${prefix}/include" - LIBPNG_LIBS="-L${prefix}/lib -lpng" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -lpng" else - LIBPNG_CFLAGS="-I/usr/local/include" - LIBPNG_LIBS="-L/usr/local/lib -lpng" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -lpng" fi - CFLAGS="${CFLAGS} ${LIBPNG_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBPNG_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" AC_CHECK_HEADER([png.h], [AC_CHECK_LIB([png], [png_check_sig], - [have_png=yes], + [have_png=yes + LIBPNG_CFLAGS=$ADDED_CFLAGS + LIBPNG_LIBS=$ADDED_LIBS], [have_png=no])]) CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP if test x$have_png != xyes -a ! -d "$with_png"; then if test x${PKG_CONFIG} != x; then - LIBPNG_CFLAGS= - LIBPNG_LIBS= PKG_CHECK_MODULES(LIBPNG, [libpng], [have_png=yes], @@ -481,18 +481,17 @@ if test x$with_png != xno; then fi fi if test x$have_png = xyes; then - CFLAGS_BACKUP=$CFLAGS - CFLAGS="$CFLAGS $LIBPNG_CFLAGS" + CFLAGS="${CFLAGS} ${LIBPNG_CFLAGS}" + LDFLAGS="${LDFLAGS} ${LIBPNG_LIBS}" AC_CHECK_DECLS([png_set_gray_1_2_4_to_8, png_set_expand_gray_1_2_4_to_8], [], [], [ #include ]) CFLAGS=$CFLAGS_BACKUP + LDFLAGS=$LDFLAGS_BACKUP AC_DEFINE(HAVE_LIBPNG, 1, [whether libpng is available]) loaders="${loaders} png" AC_MSG_NOTICE([libpng cflags is ${LIBPNG_CFLAGS}]) AC_MSG_NOTICE([libpng libs is ${LIBPNG_LIBS}]) else - LIBPNG_CFLAGS= - LIBPNG_LIBS= if test x$with_png != xauto; then AC_MSG_ERROR([unable to find libpng]) fi From 6e5dbc6107f0747e3f82eb0378e925f6f7b2118e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 13 Mar 2015 22:35:06 +0900 Subject: [PATCH 114/451] Fix typo: unknwon -> unknown --- src/loader.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/loader.c b/src/loader.c index 15ec197c..889d2206 100644 --- a/src/loader.c +++ b/src/loader.c @@ -295,7 +295,7 @@ load_jpeg(unsigned char *data, jpeg_start_decompress(&cinfo); if (cinfo.output_components != 3) { - fprintf(stderr, "load_jpeg() failed(unknwon format).\n"); + fprintf(stderr, "load_jpeg() failed(unknown format).\n"); goto end; } @@ -977,7 +977,7 @@ load_with_builtin( free(delays.buffer); free(frames.buffer); fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknwon pixel-format.\n"); + "reason: unknown pixel-format.\n"); return NULL; } @@ -1007,7 +1007,7 @@ load_with_builtin( default: stbi_image_free(pixels); fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknwon pixel-format.\n"); + "reason: unknown pixel-format.\n"); return NULL; } } From dba3237b998f82113eb10379e8d555e9d192604f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 13 Mar 2015 22:38:08 +0900 Subject: [PATCH 115/451] Handle depth=4 returned by stb_image v2.0 --- src/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/loader.c b/src/loader.c index 889d2206..a562b217 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1002,6 +1002,7 @@ load_with_builtin( switch (depth) { case 3: + case 4: *ppixelformat = PIXELFORMAT_RGB888; break; default: From 8ad1e3e03306a7d0d41aa3a1a3927d7bb7ead6e2 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 13 Mar 2015 22:49:18 +0900 Subject: [PATCH 116/451] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cafa4ad8..4ab04993 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ before_script: script: - "make" - "sudo make install" - - "make test | tee log | grep succeeded || (cat log|tail -n100; exit 1)" + - "make test | tee log | grep succeeded || (cat log|tail -n5; exit 1)" after_success: - "make valgrind || (cat valgrind.log && exit 1)" From 01e608c80079b4c6dad024273eb1552b2daf1ff3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 13 Mar 2015 23:09:58 +0900 Subject: [PATCH 117/451] Add more debug logs --- Makefile.in | 2 +- src/loader.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in index 8c398d7e..7d6f7844 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/src/loader.c b/src/loader.c index a562b217..9e64cb55 100644 --- a/src/loader.c +++ b/src/loader.c @@ -977,7 +977,7 @@ load_with_builtin( free(delays.buffer); free(frames.buffer); fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknown pixel-format.\n"); + "reason: unknown pixel-format.(depth: %d)\n", depth); return NULL; } @@ -1008,7 +1008,7 @@ load_with_builtin( default: stbi_image_free(pixels); fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknown pixel-format.\n"); + "reason: unknown pixel-format.(depth: %d)\n", depth); return NULL; } } From 71ef4d0d415b91d9c3f560e61df343dcc8c1f1eb Mon Sep 17 00:00:00 2001 From: saitoha Date: Fri, 13 Mar 2015 23:41:40 +0900 Subject: [PATCH 118/451] Handle depth=1 returned by stb_image v2.0 --- src/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/loader.c b/src/loader.c index 9e64cb55..f529f51f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1001,6 +1001,7 @@ load_with_builtin( *pstride = *psx * depth; switch (depth) { + case 1: case 3: case 4: *ppixelformat = PIXELFORMAT_RGB888; From 125a7307a9e66cc68d87fa2af5103d3cfb0597a1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 16 Mar 2015 01:25:03 +0900 Subject: [PATCH 119/451] Add libjpeg check with PKG_CHECK_MODULES --- Makefile.in | 2 +- configure | 97 +++++++++++++++++++++++++++++++++++++++++++++++----- configure.ac | 24 ++++++++----- 3 files changed, 106 insertions(+), 17 deletions(-) diff --git a/Makefile.in b/Makefile.in index 7d6f7844..8c398d7e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/configure b/configure index 2217a389..1ddc5236 100755 --- a/configure +++ b/configure @@ -829,6 +829,8 @@ GD_CFLAGS GD_LIBS LIBCURL_CFLAGS LIBCURL_LIBS +LIBJPEG_CFLAGS +LIBJPEG_LIBS LIBPNG_CFLAGS LIBPNG_LIBS' @@ -1511,6 +1513,10 @@ Some influential environment variables: C compiler flags for LIBCURL, overriding pkg-config LIBCURL_LIBS linker flags for LIBCURL, overriding pkg-config + LIBJPEG_CFLAGS + C compiler flags for LIBJPEG, overriding pkg-config + LIBJPEG_LIBS + linker flags for LIBJPEG, overriding pkg-config LIBPNG_CFLAGS C compiler flags for LIBPNG, overriding pkg-config LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config @@ -14583,17 +14589,17 @@ if test x$with_jpeg != xno; then if test ! -d "$with_jpeg"; then as_fn_error $? "\"${with_jpeg}\" is not directory" "$LINENO" 5 fi - LIBJPEG_CFLAGS="-I${with_jpeg}/include" - LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" + ADDED_CFLAGS="-I${with_jpeg}/include" + ADDED_LIBS="-L${with_jpeg}/lib -ljpeg" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBJPEG_CFLAGS="-I${prefix}/include" - LIBJPEG_LIBS="-L${prefix}/lib -ljpeg" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -ljpeg" else - LIBJPEG_CFLAGS="-I/usr/local/include" - LIBJPEG_LIBS="-L/usr/local/lib -ljpeg" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -ljpeg" fi - CFLAGS="${CFLAGS} ${LIBJPEG_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBJPEG_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_header in -ljpeg" >&5 @@ -14643,6 +14649,81 @@ fi CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP + if test x$have_jpeg != xyes -a ! -d "$with_jpeg"; then + if test x${PKG_CONFIG} != x; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBJPEG" >&5 +$as_echo_n "checking for LIBJPEG... " >&6; } + +if test -n "$LIBJPEG_CFLAGS"; then + pkg_cv_LIBJPEG_CFLAGS="$LIBJPEG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libjpeg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libjpeg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBJPEG_CFLAGS=`$PKG_CONFIG --cflags "libjpeg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBJPEG_LIBS"; then + pkg_cv_LIBJPEG_LIBS="$LIBJPEG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libjpeg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libjpeg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBJPEG_LIBS=`$PKG_CONFIG --libs "libjpeg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libjpeg" 2>&1` + else + LIBJPEG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libjpeg" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBJPEG_PKG_ERRORS" >&5 + + have_jpeg=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_jpeg=no +else + LIBJPEG_CFLAGS=$pkg_cv_LIBJPEG_CFLAGS + LIBJPEG_LIBS=$pkg_cv_LIBJPEG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_jpeg=yes +fi + fi + fi fi if test x$have_jpeg = xyes; then diff --git a/configure.ac b/configure.ac index ce8cd787..30e7d694 100644 --- a/configure.ac +++ b/configure.ac @@ -405,17 +405,17 @@ if test x$with_jpeg != xno; then if test ! -d "$with_jpeg"; then AC_MSG_ERROR(["${with_jpeg}" is not directory]) fi - LIBJPEG_CFLAGS="-I${with_jpeg}/include" - LIBJPEG_LIBS="-L${with_jpeg}/lib -ljpeg" + ADDED_CFLAGS="-I${with_jpeg}/include" + ADDED_LIBS="-L${with_jpeg}/lib -ljpeg" elif test x${prefix} != x -a x${prefix} != xNONE; then - LIBJPEG_CFLAGS="-I${prefix}/include" - LIBJPEG_LIBS="-L${prefix}/lib -ljpeg" + ADDED_CFLAGS="-I${prefix}/include" + ADDED_LIBS="-L${prefix}/lib -ljpeg" else - LIBJPEG_CFLAGS="-I/usr/local/include" - LIBJPEG_LIBS="-L/usr/local/lib -ljpeg" + ADDED_CFLAGS="-I/usr/local/include" + ADDED_LIBS="-L/usr/local/lib -ljpeg" fi - CFLAGS="${CFLAGS} ${LIBJPEG_CFLAGS}" - LDFLAGS="${LDFLAGS} ${LIBJPEG_LIBS}" + CFLAGS="${CFLAGS} ${ADDED_CFLAGS}" + LDFLAGS="${LDFLAGS} ${ADDED_LIBS}" AC_CHECK_HEADER([jpeglib.h], [AC_CHECK_LIB([jpeg], [jpeg_read_header], @@ -423,6 +423,14 @@ if test x$with_jpeg != xno; then [have_jpeg=no])]) CFLAGS=$CFLAGS_BACKUP LDFLAGS=$LDFLAGS_BACKUP + if test x$have_jpeg != xyes -a ! -d "$with_jpeg"; then + if test x${PKG_CONFIG} != x; then + PKG_CHECK_MODULES(LIBJPEG, + [libjpeg], + [have_jpeg=yes], + [have_jpeg=no]) + fi + fi fi if test x$have_jpeg = xyes; then AC_DEFINE(HAVE_JPEG, 1, [whether jpeg codec library is available]) From 0f37b49a58f6bd0cd6e7536c2297a2a80d899ee6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 16 Mar 2015 01:32:37 +0900 Subject: [PATCH 120/451] Omit an extra malloc() call --- src/dither.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/dither.c b/src/dither.c index 89ccae59..c18a50f7 100644 --- a/src/dither.c +++ b/src/dither.c @@ -339,13 +339,14 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, unsigned char *input_pixels; int nret = (-1); - /* normalize pixelformat */ - normalized_pixels = malloc(width * height * 3); - if (normalized_pixels == NULL) { - goto end; - } - if (pixelformat != PIXELFORMAT_RGB888) { + + /* normalize pixelformat */ + normalized_pixels = malloc(width * height * 3); + if (normalized_pixels == NULL) { + goto end; + } + nret = sixel_helper_normalize_pixelformat(normalized_pixels, &pixelformat, data, pixelformat, From 649d55e6f31779ab5cf3983da42fdfde864273f9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 17 Mar 2015 00:46:38 +0900 Subject: [PATCH 121/451] Expand pixelformat to RGB888 before resizing (for Issue #34) --- converters/img2sixel.c | 67 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e9ac8213..fd53de42 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -465,13 +465,15 @@ do_resize(unsigned char **ppixels, unsigned char **frames, int frame_count, int /* in,out */ *psx, int /* in,out */ *psy, - int pixelformat, + int /* in */ pixelformat, + int /* out */ *dst_pixelformat, settings_t *psettings) { unsigned char *p; int size; int n; unsigned char *scaled_frame = NULL; + unsigned char *normalized_pixels = NULL; int nret; if (psettings->percentwidth > 0) { @@ -488,9 +490,42 @@ do_resize(unsigned char **ppixels, } if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { + switch (pixelformat) { + case PIXELFORMAT_RGB888: + *dst_pixelformat = pixelformat; + break; + case PIXELFORMAT_PAL8: + case PIXELFORMAT_G8: + case PIXELFORMAT_GA88: + case PIXELFORMAT_AG88: + case PIXELFORMAT_RGB555: + case PIXELFORMAT_RGB565: + case PIXELFORMAT_BGR555: + case PIXELFORMAT_BGR565: + case PIXELFORMAT_RGBA8888: + case PIXELFORMAT_ARGB8888: + /* normalize pixelformat */ + size = *psx * *psy * 3; + normalized_pixels = malloc(size * frame_count); + nret = sixel_helper_normalize_pixelformat(normalized_pixels, + &pixelformat, + *ppixels, pixelformat, + *psx, *psy); + if (nret != 0) { + free(normalized_pixels); + return nret; + } + free(*ppixels); + *ppixels = normalized_pixels; + *dst_pixelformat = pixelformat; - if (pixelformat != PIXELFORMAT_RGB888) { - /* TODO: convert pixelformat to RGB888 */ + for (n = 0; n < frame_count; ++n) { + frames[n] = *ppixels + size * n; + } + break; + default: + *dst_pixelformat = pixelformat; + fprintf(stderr, "do_resize: invalid pixelformat.\n"); return (-1); } @@ -520,6 +555,8 @@ do_resize(unsigned char **ppixels, *ppixels = p; *psx = psettings->pixelwidth; *psy = psettings->pixelheight; + } else { + *dst_pixelformat = pixelformat; } return 0; @@ -879,6 +916,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) unsigned char **ppalette = &palette; int ncolors = 0; int pixelformat = PIXELFORMAT_RGB888; + int dst_pixelformat = PIXELFORMAT_RGB888; if (psettings->reqcolors < 2) { psettings->reqcolors = 2; @@ -964,18 +1002,37 @@ convert_to_sixel(char const *filename, settings_t *psettings) /* scaling */ nret = do_resize(&pixels, frames, frame_count, - &sx, &sy, pixelformat, psettings); + &sx, &sy, pixelformat, + &dst_pixelformat, psettings); if (nret != 0) { goto end; } + if (pixelformat != dst_pixelformat) { + pixelformat = dst_pixelformat; + depth = sixel_helper_compute_depth(pixelformat); + if (depth == (-1)) { + nret = (-1); + goto end; + } + } } else { /* scaling */ nret = do_resize(&pixels, frames, frame_count, - &sx, &sy, pixelformat, psettings); + &sx, &sy, pixelformat, + &dst_pixelformat, psettings); if (nret != 0) { goto end; } + if (pixelformat != dst_pixelformat) { + pixelformat = dst_pixelformat; + depth = sixel_helper_compute_depth(pixelformat); + if (depth == (-1)) { + nret = (-1); + goto end; + } + } + /* clipping */ nret = do_crop(frames, frame_count, &sx, &sy, pixelformat, psettings); From b9fc9d4425231e453ce4ca222a3db0faf26e3e79 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 17 Mar 2015 01:14:50 +0900 Subject: [PATCH 122/451] Support cropping for 1/2/4bpp images (Issue #38) --- converters/img2sixel.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e9ac8213..853793a6 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -529,6 +529,7 @@ do_resize(unsigned char **ppixels, static int clip(unsigned char *pixels, int sx, int sy, + int depth, int cx, int cy, int cw, int ch, int pixelformat) @@ -554,11 +555,11 @@ clip(unsigned char *pixels, break; case PIXELFORMAT_RGB888: dst = pixels; - src = pixels + cy * sx * 3 + cx * 3; + src = pixels + cy * sx * depth + cx * depth; for (y = 0; y < ch; y++) { - memmove(dst, src, cw * 3); - dst += (cw * 3); - src += (sx * 3); + memmove(dst, src, cw * depth); + dst += (cw * depth); + src += (sx * depth); } break; default: @@ -571,11 +572,13 @@ clip(unsigned char *pixels, static int do_crop(unsigned char **frames, int frame_count, - int *psx, int *psy, int pixelformat, + int *psx, int *psy, int pixelformat, int *dst_pixelformat, settings_t *psettings) { int n; int ret; + int depth; + unsigned char *normalized_pixels; /* clipping */ if (psettings->clipwidth + psettings->clipx > *psx) { @@ -585,9 +588,27 @@ do_crop(unsigned char **frames, int frame_count, psettings->clipheight = (psettings->clipy > *psy) ? 0 : *psy - psettings->clipy; } if (psettings->clipwidth > 0 && psettings->clipheight > 0) { + depth = sixel_helper_compute_depth(pixelformat); + switch (pixelformat) { + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + normalized_pixels = malloc(*psx * *psy * frame_count); + ret = sixel_helper_normalize_pixelformat(normalized_pixels, + &pixelformat, + *frames, pixelformat, + *psx, *psy); + *frames = normalized_pixels; + *dst_pixelformat = PIXELFORMAT_PAL8; + break; + default: + *dst_pixelformat = pixelformat; + break; + } + for (n = 0; n < frame_count; ++n) { - ret = clip(frames[n], *psx, *psy, psettings->clipx, psettings->clipy, - psettings->clipwidth, psettings->clipheight, pixelformat); + ret = clip(frames[n], *psx, *psy, depth, psettings->clipx, psettings->clipy, + psettings->clipwidth, psettings->clipheight, *dst_pixelformat); if (ret != 0) { return ret; } @@ -957,7 +978,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) if (psettings->clipfirst) { /* clipping */ nret = do_crop(frames, frame_count, - &sx, &sy, pixelformat, psettings); + &sx, &sy, pixelformat, &pixelformat, psettings); if (nret != 0) { goto end; } @@ -978,7 +999,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) /* clipping */ nret = do_crop(frames, frame_count, - &sx, &sy, pixelformat, psettings); + &sx, &sy, pixelformat, &pixelformat, psettings); if (nret != 0) { goto end; } From d3a9ad202b9acaae3d1857f70e1e5bccfc1c8db4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 20 Mar 2015 00:59:48 +0900 Subject: [PATCH 123/451] Rebuild multi-frame data when expanding 1/2/4bpp image --- converters/img2sixel.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 853793a6..a9b757f2 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -598,7 +598,9 @@ do_crop(unsigned char **frames, int frame_count, &pixelformat, *frames, pixelformat, *psx, *psy); - *frames = normalized_pixels; + for (n = 0; n < frame_count; ++n) { + frames[n] = normalized_pixels + *psx * *psy * n; + } *dst_pixelformat = PIXELFORMAT_PAL8; break; default: From 6c3cd06dd6092c5ce3e64f6a293cbdb7d50cca93 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Apr 2015 00:20:49 +0900 Subject: [PATCH 124/451] Add tests for pngsuite basic images --- Makefile.in | 3 ++- configure | 46 ++++++++++++++++++++++++++++++++++++++++++ configure.ac | 4 ++++ converters/Makefile.am | 40 +++++++++++++++++++++++++++++++++++- converters/Makefile.in | 41 ++++++++++++++++++++++++++++++++++++- include/Makefile.in | 1 + src/Makefile.in | 1 + 7 files changed, 133 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in index 8c398d7e..443934ed 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -279,6 +279,7 @@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ diff --git a/configure b/configure index b6af1418..7214b0fc 100755 --- a/configure +++ b/configure @@ -654,6 +654,7 @@ GDK_PIXBUF_CFLAGS HAVE_GETOPT_LONG_FALSE HAVE_GETOPT_LONG_TRUE LIBOBJS +MD5SUM AM_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH @@ -13222,6 +13223,51 @@ fi # For wic integration #AC_PROG_CXX +# For test +for ac_prog in md5sum md5 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MD5SUM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MD5SUM"; then + ac_cv_prog_MD5SUM="$MD5SUM" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MD5SUM="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MD5SUM=$ac_cv_prog_MD5SUM +if test -n "$MD5SUM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5SUM" >&5 +$as_echo "$MD5SUM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MD5SUM" && break +done + + + # Checks for libraries. # Checks for header files. diff --git a/configure.ac b/configure.ac index 50b3efba..44437c3d 100644 --- a/configure.ac +++ b/configure.ac @@ -144,6 +144,10 @@ AC_SUBST([AM_CFLAGS]) # For wic integration #AC_PROG_CXX +# For test +AC_CHECK_PROGS(MD5SUM, [md5sum md5]) +AC_SUBST(MD5SUM) + # Checks for libraries. # Checks for header files. diff --git a/converters/Makefile.am b/converters/Makefile.am index b19e4bd0..0f165c71 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -129,7 +129,45 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -S -datkinson ../images/seq2gif.gif $(WINE) ./img2sixel ../images/snake-progressive.jpg if HAVE_PNG - $(WINE) ./img2sixel ../images/snake.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g01.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g02.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g04.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g08.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g16.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p01.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p02.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p04.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p08.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn4a08.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn4a16.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn6a08.png + $(WINE) ./img2sixel ../images/pngsuite/basic/basn6a16.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g01.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g02.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g04.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g08.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g16.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p01.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p02.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p04.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p08.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn4a08.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn4a16.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn6a08.png + $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn6a16.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g01.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g02.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g04.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g08.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g16.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p01.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p02.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p04.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p08.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn4a08.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn4a16.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a08.png + $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a16.png endif if HAVE_CURL test ! $$($(WINE) ./img2sixel file:///test) diff --git a/converters/Makefile.in b/converters/Makefile.in index f88cae7b..cc5de42f 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -324,6 +324,7 @@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -1071,7 +1072,45 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -ldisable -dnone -u -g ../images/seq2gif.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -S -datkinson ../images/seq2gif.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake-progressive.jpg -@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g01.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g02.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g04.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn0g16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p01.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p02.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p04.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn3p08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/basic/basn6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g01.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g02.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g04.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn0g16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p01.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p02.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p04.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn3p08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 ../images/pngsuite/basic/basn6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g01.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g02.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g04.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn0g16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p01.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p02.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p04.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn3p08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a16.png @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel file:///test) @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel file:///$$(pwd)/../images/snake.jpg @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png -i unknown.sixel) diff --git a/include/Makefile.in b/include/Makefile.in index 42c4d437..dde14c26 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -215,6 +215,7 @@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ diff --git a/src/Makefile.in b/src/Makefile.in index 3384c9b2..d660db83 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -258,6 +258,7 @@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ From 0e754ce798c0086823274df03fdfd0630963ea22 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Apr 2015 17:31:52 +0900 Subject: [PATCH 125/451] Load image frame with callback function (on progress) --- converters/img2sixel.c | 430 +++++++++++++++++++++++------------------ include/sixel.h.in | 34 ++-- src/loader.c | 336 +++++++++++++++++--------------- 3 files changed, 447 insertions(+), 353 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index a1e21f6a..f5d5aa86 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -265,77 +265,90 @@ prepare_builtin_palette(int builtin_palette) } -static sixel_dither_t * -prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgcolor) +typedef struct sixel_callback_context_for_mapfile { + int reqcolors; + sixel_dither_t *dither; +} sixel_callback_context_for_mapfile_t; + + +static int +load_image_callback_for_palette(sixel_frame_t *frame, void *data) { - unsigned char *mappixels; - sixel_dither_t *dither = NULL; - int map_sx = (-1); - int map_sy = (-1); - int frame_count; - int loop_count; + sixel_callback_context_for_mapfile_t *callback_context; int ret = (-1); - int *delays; - int ncolors = 0; - unsigned char *palette = NULL; - int pixelformat = PIXELFORMAT_RGB888; - - delays = NULL; - ret = sixel_helper_load_image_file( - &mappixels, - &palette, - &map_sx, - &map_sy, - &ncolors, - &pixelformat, - &frame_count, - &loop_count, - &delays, - mapfile, - 1, /* fstatic */ - 256, /* reqcolors */ - bgcolor - ); - if (ret != 0 || mappixels == NULL || map_sx * map_sy == 0) { + if (frame->pixels == NULL || frame->width == 0 || frame->height == 0) { goto end; } - free(delays); - switch (pixelformat) { + callback_context = (sixel_callback_context_for_mapfile_t *)data; + + switch (frame->pixelformat) { case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: case PIXELFORMAT_PAL8: - if (palette == NULL) { + if (frame->palette == NULL) { goto end; } - dither = sixel_dither_create(ncolors); - if (dither == NULL) { + callback_context->dither = sixel_dither_create(frame->ncolors); + if (callback_context->dither == NULL) { goto end; } - sixel_dither_set_palette(dither, palette); + sixel_dither_set_palette(callback_context->dither, frame->palette); + ret = 0; break; default: - dither = sixel_dither_create(reqcolors); - if (dither == NULL) { + callback_context->dither = sixel_dither_create(callback_context->reqcolors); + if (callback_context->dither == NULL) { goto end; } - ret = sixel_dither_initialize(dither, mappixels, map_sx, map_sy, - pixelformat, - LARGE_NORM, REP_CENTER_BOX, QUALITY_HIGH); + ret = sixel_dither_initialize(callback_context->dither, + frame->pixels, + frame->width, + frame->height, + frame->pixelformat, + LARGE_NORM, + REP_CENTER_BOX, + QUALITY_HIGH); if (ret != 0) { - sixel_dither_unref(dither); + sixel_dither_unref(callback_context->dither); goto end; } break; } end: - free(palette); + free(frame->palette); - return dither; + return ret; +} + + +static sixel_dither_t * +prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgcolor) +{ + int loop_count; + int ret = (-1); + sixel_callback_context_for_mapfile_t callback_context; + + callback_context.reqcolors = reqcolors; + callback_context.dither = NULL; + + ret = sixel_helper_load_image_file(mapfile, + 1, /* fstatic */ + 1, /* fuse_palette */ + 256, /* reqcolors */ + bgcolor, + load_image_callback_for_palette, + &callback_context, + &loop_count); + if (ret != 0) { + return NULL; + } + + return callback_context.dither; } @@ -919,120 +932,62 @@ output_sixel_with_macro( } +typedef struct sixel_callback_context { + settings_t *settings; +} sixel_callback_context_t; + + static int -convert_to_sixel(char const *filename, settings_t *psettings) +load_image_callback(sixel_frame_t *frame, void *data) { - unsigned char *pixels; - unsigned char **frames; - unsigned char *p; - unsigned char *frame; - sixel_output_t *context = NULL; - sixel_dither_t *dither = NULL; - int sx, sy; - int frame_count = 1; - int loop_count = 1; - int *delays; - int n; int nret = (-1); int depth; - unsigned char *palette = NULL; - unsigned char **ppalette = &palette; - int ncolors = 0; - int pixelformat = PIXELFORMAT_RGB888; + settings_t *psettings; + sixel_dither_t *dither = NULL; int dst_pixelformat = PIXELFORMAT_RGB888; + sixel_output_t *output = NULL; - if (psettings->reqcolors < 2) { - psettings->reqcolors = 2; - } - - if (psettings->palette_type == PALETTETYPE_AUTO) { - psettings->palette_type = PALETTETYPE_RGB; - } - - if (psettings->mapfile) { - ppalette = NULL; - } - - if (psettings->monochrome > 0) { - ppalette = NULL; - } - - if (psettings->highcolor > 0) { - ppalette = NULL; - } - - if (psettings->builtin_palette > 0) { - ppalette = NULL; - } - - if (psettings->percentwidth > 0 || - psettings->percentheight > 0 || - psettings->pixelwidth > 0 || - psettings->pixelheight > 0) { - ppalette = NULL; - } - -reload: - pixels = NULL; - frames = NULL; - frame = NULL; - delays = NULL; - nret = sixel_helper_load_image_file( - &pixels, - ppalette, - &sx, - &sy, - &ncolors, - &pixelformat, - &frame_count, - &loop_count, - &delays, - filename, - psettings->fstatic, - psettings->reqcolors, - psettings->bgcolor); - - if (nret != 0 || pixels == NULL || sx * sy == 0) { + if (frame->pixels == NULL || frame->width == 0 || frame->height == 0) { goto end; } - depth = sixel_helper_compute_depth(pixelformat); - if (depth == (-1)) { - nret = (-1); - goto end; - } + psettings = ((sixel_callback_context_t *)data)->settings; - frames = malloc(sizeof(unsigned char *) * frame_count); - if (frames == NULL) { + depth = sixel_helper_compute_depth(frame->pixelformat); + if (depth == (-1)) { nret = (-1); goto end; } - p = pixels; - for (n = 0; n < frame_count; ++n) { - frames[n] = p; - p += sx * sy * depth; - } - /* evaluate -w, -h, and -c option: crop/scale input source */ if (psettings->clipfirst) { /* clipping */ - nret = do_crop(frames, frame_count, - &sx, &sy, pixelformat, &pixelformat, psettings); + nret = do_crop(&frame->pixels, + 1, + &frame->width, + &frame->height, + frame->pixelformat, + &frame->pixelformat, + psettings); if (nret != 0) { goto end; } /* scaling */ - nret = do_resize(&pixels, frames, frame_count, - &sx, &sy, pixelformat, - &dst_pixelformat, psettings); + nret = do_resize(&frame->pixels, + &frame->pixels, + 1, + &frame->width, + &frame->height, + frame->pixelformat, + &dst_pixelformat, + psettings); if (nret != 0) { goto end; } - if (pixelformat != dst_pixelformat) { - pixelformat = dst_pixelformat; - depth = sixel_helper_compute_depth(pixelformat); + if (frame->pixelformat != dst_pixelformat) { + frame->pixelformat = dst_pixelformat; + depth = sixel_helper_compute_depth(frame->pixelformat); if (depth == (-1)) { nret = (-1); goto end; @@ -1040,16 +995,21 @@ convert_to_sixel(char const *filename, settings_t *psettings) } } else { /* scaling */ - nret = do_resize(&pixels, frames, frame_count, - &sx, &sy, pixelformat, - &dst_pixelformat, psettings); + nret = do_resize(&frame->pixels, + &frame->pixels, + 1, + &frame->width, + &frame->height, + frame->pixelformat, + &dst_pixelformat, + psettings); if (nret != 0) { goto end; } - if (pixelformat != dst_pixelformat) { - pixelformat = dst_pixelformat; - depth = sixel_helper_compute_depth(pixelformat); + if (frame->pixelformat != dst_pixelformat) { + frame->pixelformat = dst_pixelformat; + depth = sixel_helper_compute_depth(frame->pixelformat); if (depth == (-1)) { nret = (-1); goto end; @@ -1057,16 +1017,27 @@ convert_to_sixel(char const *filename, settings_t *psettings) } /* clipping */ - nret = do_crop(frames, frame_count, - &sx, &sy, pixelformat, &pixelformat, psettings); + nret = do_crop(&frame->pixels, + 1, + &frame->width, + &frame->height, + frame->pixelformat, + &frame->pixelformat, + psettings); if (nret != 0) { goto end; } } /* prepare dither context */ - dither = prepare_palette(dither, pixels, sx, sy * frame_count, - palette, ncolors, pixelformat, psettings); + dither = prepare_palette(dither, + frame->pixels, + frame->width, + frame->height, + frame->palette, + frame->ncolors, + frame->pixelformat, + psettings); if (!dither) { nret = (-1); goto end; @@ -1074,7 +1045,7 @@ convert_to_sixel(char const *filename, settings_t *psettings) /* evaluate -v option: print palette */ if (psettings->verbose) { - if (!(pixelformat & FORMATTYPE_GRAYSCALE)) { + if (!(frame->pixelformat & FORMATTYPE_GRAYSCALE)) { print_palette(dither); } } @@ -1087,29 +1058,29 @@ convert_to_sixel(char const *filename, settings_t *psettings) sixel_dither_set_complexion_score(dither, psettings->complexion); } - /* evaluate -l option: set loop count */ - switch (psettings->loop_mode) { - case LOOP_FORCE: - loop_count = (-1); /* infinite */ - break; - case LOOP_DISABLE: - loop_count = 1; /* do not loop */ - break; - case LOOP_AUTO: - default: - if (frame_count == 1) { - loop_count = 1; - } else if (loop_count == 0) { - loop_count = (-1); - } -#ifdef HAVE_GDK_PIXBUF2 - /* do not trust loop_count report of gdk-pixbuf loader */ - if (loop_count == (-1)) { - loop_count = 1; - } -#endif - break; - } +// /* evaluate -l option: set loop count */ +// switch (psettings->loop_mode) { +// case LOOP_FORCE: +// loop_count = (-1); /* infinite */ +// break; +// case LOOP_DISABLE: +// loop_count = 1; /* do not loop */ +// break; +// case LOOP_AUTO: +// default: +// if (frame_count == 1) { +// loop_count = 1; +// } else if (loop_count == 0) { +// loop_count = (-1); +// } +//#ifdef HAVE_GDK_PIXBUF2 +// /* do not trust loop_count report of gdk-pixbuf loader */ +// if (loop_count == (-1)) { +// loop_count = 1; +// } +//#endif +// break; +// } /* set signal handler to handle SIGINT/SIGTERM/SIGHUP */ #if HAVE_SIGNAL @@ -1125,20 +1096,39 @@ convert_to_sixel(char const *filename, settings_t *psettings) #endif /* output sixel: junction of multi-frame processing strategy */ - if ((psettings->fuse_macro && frame_count > 1)) { /* -u option */ + if ((psettings->fuse_macro && 1 > 1)) { /* -u option */ /* use macro */ - nret = output_sixel_with_macro(frames, sx, sy, - loop_count, frame_count, delays, - dither, context, psettings); + nret = output_sixel_with_macro(&frame->pixels, + frame->width, + frame->height, + 1, /* loop_count */ + 1, /* frame_count*/ + NULL, /* delays */ + dither, + output, + psettings); } else if (psettings->macro_number >= 0) { /* -n option */ /* use macro */ - nret = output_sixel_with_macro(frames, sx, sy, - loop_count, frame_count, delays, - dither, context, psettings); + nret = output_sixel_with_macro(&frame->pixels, + frame->width, + frame->height, + 1, /* loop_count */ + 1, /* frame_count */ + NULL, /* delays,*/ + dither, + output, + psettings); } else { /* do not use macro */ - nret = output_sixel_without_macro(frames, sx, sy, depth, - loop_count, frame_count, delays, - dither, context, psettings); + nret = output_sixel_without_macro(&frame->pixels, + frame->width, + frame->height, + depth, + 1, /* loop_count */ + 1, /* frame_count */ + NULL, + dither, + output, + psettings); } if (nret != 0) { @@ -1148,10 +1138,82 @@ convert_to_sixel(char const *filename, settings_t *psettings) fflush(stdout); end: - free(frames); - free(pixels); - free(delays); - free(frame); + if (output) { + sixel_output_unref(output); + } + if (dither) { + sixel_dither_unref(dither); + } + + return nret; +} + + + + +static int +convert_to_sixel(char const *filename, settings_t *psettings) +{ + unsigned char *pixels; + unsigned char *p; + unsigned char *frame; + int sx, sy; + int frame_count = 1; + int loop_count = 1; + int *delays; + int n; + int nret = (-1); + unsigned char *palette = NULL; + unsigned char **ppalette = &palette; + int ncolors = 0; + sixel_callback_context_t callback_context; + + if (psettings->reqcolors < 2) { + psettings->reqcolors = 2; + } + + if (psettings->palette_type == PALETTETYPE_AUTO) { + psettings->palette_type = PALETTETYPE_RGB; + } + + if (psettings->mapfile) { + ppalette = NULL; + } + + if (psettings->monochrome > 0) { + ppalette = NULL; + } + + if (psettings->highcolor > 0) { + ppalette = NULL; + } + + if (psettings->builtin_palette > 0) { + ppalette = NULL; + } + + if (psettings->percentwidth > 0 || + psettings->percentheight > 0 || + psettings->pixelwidth > 0 || + psettings->pixelheight > 0) { + ppalette = NULL; + } + +reload: + pixels = NULL; + frame = NULL; + delays = NULL; + + callback_context.settings = psettings; + + nret = sixel_helper_load_image_file(filename, + psettings->fstatic, + 1, /* fuse_palette */ + psettings->reqcolors, + psettings->bgcolor, + load_image_callback, + &callback_context, + &loop_count); if (nret == 0 && psettings->pipe_mode) { #if HAVE_CLEARERR @@ -1173,12 +1235,6 @@ convert_to_sixel(char const *filename, settings_t *psettings) } } - if (context) { - sixel_output_unref(context); - } - if (dither) { - sixel_dither_unref(dither); - } return nret; } diff --git a/include/sixel.h.in b/include/sixel.h.in index 9c2abd72..1e19e783 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -414,22 +414,28 @@ enum imageFormat { extern "C" { #endif -/* load image from file */ +typedef struct sixel_frame { + unsigned char *pixels; /* loaded pixel data */ + unsigned char *palette; /* loaded palette data */ + int width; /* frame width */ + int height; /* frame height */ + int ncolors; /* palette colors */ + int pixelformat; /* one of enum pixelFormat */ + int delay; /* delay in msec */ +} sixel_frame_t; + +typedef int (* sixel_load_image_function)(sixel_frame_t /* in */ *frame, void /* in/out */ *context); + int sixel_helper_load_image_file( - unsigned char /* out */ **ppixels, /* loaded pixel data */ - unsigned char /* out */ **ppalette, /* loaded palette data */ - int /* out */ *psx, /* image width */ - int /* out */ *psy, /* image height */ - int /* out */ *pncolors, /* palette colors */ - int /* out */ *ppixelformat, /* one of enum pixelFormat */ - int /* out */ *pframe_count, /* frame count */ - int /* out */ *ploop_count, /* loop count */ - int /* out */ **ppdelay, /* delay for each frames */ - char const /* in */ *filename, /* source file name */ - int /* in */ fstatic, /* whether to extract static image */ - int /* in */ reqcolors, /* requested number of colors */ - unsigned char /* in */ *bgcolor); /* background color */ + char const /* in */ *filename, /* source file name */ + int /* in */ fstatic, /* whether to extract static image */ + int /* in */ fuse_palette, /* whether to use paletted image */ + int /* in */ reqcolors, /* requested number of colors */ + unsigned char /* in */ *bgcolor, /* background color */ + sixel_load_image_function /* in */ fn_load, /* callback */ + void /* in/out */ *context, /* private data for callback */ + int /* out */ *ploop_count); /* requested number of colors */ /* write image to file */ int diff --git a/src/loader.c b/src/loader.c index 51147d42..b292816f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -834,185 +834,220 @@ chunk_is_jpeg(chunk_t const *chunk) } #endif /* HAVE_JPEG */ +//typedef struct sixel_frame { +// unsigned char *pixels; /* loaded pixel data */ +// unsigned char *palette; /* loaded palette data */ +// int width; /* frame width */ +// int height; /* frame height */ +// int ncolors; /* palette colors */ +// int pixelformat; /* one of enum pixelFormat */ +// int delay; /* delay in msec */ +//} sixel_frame_t; -static unsigned char * + +int load_with_builtin( - chunk_t const *pchunk, - int *psx, - int *psy, - int *pstride, - unsigned char **ppalette, - int *pncolors, - int *ppixelformat, - int *pframe_count, - int *ploop_count, - int **ppdelay, - int fstatic, - int reqcolors, - unsigned char *bgcolor + chunk_t const /* in */ *pchunk, /* image data */ + int /* in */ fstatic, /* static */ + int /* in */ fuse_palette, /* whether to use palette if possible */ + int /* in */ reqcolors, /* reqcolors */ + unsigned char /* in */ *bgcolor, /* background color */ + sixel_load_image_function /* in */ fn_load, /* callback */ + void /* in/out */ *context, /* private data for callback */ + int /* in */ *ploop_count /* reqcolors */ ) { unsigned char *p; - unsigned char *pixels = NULL; static stbi__context s; static stbi__gif g; chunk_t frames; - chunk_t delays; int depth; + sixel_frame_t *frame; + int ret = (-1); + int frame_count = 0; + int stride; #if !defined(HAVE_LIBPNG) (void) bgcolor; #endif + frame = malloc(sizeof(sixel_frame_t)); + if (frame == NULL) { + goto error; + } + memset(frame, 0, sizeof(sixel_frame_t)); + + frame->pixels = NULL; + if (chunk_is_sixel(pchunk)) { - pixels = load_sixel(pchunk->buffer, pchunk->size, - psx, psy, - ppalette, pncolors, reqcolors, - ppixelformat); - if (pixels == NULL) { - return NULL; + frame->pixels = load_sixel(pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + fuse_palette ? &frame->palette: NULL, + &frame->ncolors, + reqcolors, + &frame->pixelformat); + if (frame->pixels == NULL) { + goto error; } - *pframe_count = 1; + frame_count = 1; *ploop_count = 1; - *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); + stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } else if (chunk_is_pnm(pchunk)) { /* pnm */ - pixels = load_pnm(pchunk->buffer, pchunk->size, - psx, psy, ppalette, pncolors, ppixelformat); - if (!pixels) { + frame->pixels = load_pnm(pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + fuse_palette ? &frame->palette: NULL, + &frame->ncolors, + &frame->pixelformat); + if (!frame->pixels) { #if HAVE_ERRNO_H fprintf(stderr, "load_pnm failed.\n" "reason: %s.\n", strerror(errno)); #endif /* HAVE_ERRNO_H */ - return NULL; + goto error; } - *pframe_count = 1; + frame_count = 1; *ploop_count = 1; - *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); + stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #if HAVE_JPEG else if (chunk_is_jpeg(pchunk)) { - pixels = load_jpeg(pchunk->buffer, pchunk->size, - psx, psy, ppixelformat); - if (pixels == NULL) { + frame->pixels = load_jpeg(pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + &frame->pixelformat); + if (frame->pixels == NULL) { free(frames.buffer); - return NULL; + goto error; } - *pframe_count = 1; + frame_count = 1; *ploop_count = 1; - *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); + stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_JPEG */ #if HAVE_LIBPNG else if (chunk_is_png(pchunk)) { - pixels = load_png(pchunk->buffer, pchunk->size, - psx, psy, - ppalette, pncolors, reqcolors, - ppixelformat, bgcolor); - if (pixels == NULL) { + frame->pixels = load_png(pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + fuse_palette ? &frame->palette: NULL, + &frame->ncolors, + reqcolors, + &frame->pixelformat, + bgcolor); + if (frame->pixels == NULL) { free(frames.buffer); - return NULL; + goto error; } - *pframe_count = 1; + frame_count = 1; *ploop_count = 1; - *pstride = *psx * sixel_helper_compute_depth(*ppixelformat); + stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { - chunk_init(&frames, 1024); - if (frames.buffer == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "load_with_builtin: malloc failed.\n" "reason: %s.\n", - strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return NULL; - } - chunk_init(&delays, 1024); - if (delays.buffer == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "load_with_builtin: malloc failed.\n" "reason: %s.\n", - strerror(errno)); -#endif /* HAVE_ERRNO_H */ - free(frames.buffer); - return NULL; - } stbi__start_mem(&s, pchunk->buffer, pchunk->size); - *pframe_count = 0; + frame_count = 0; memset(&g, 0, sizeof(g)); for (;;) { p = stbi__gif_load_next(&s, &g, &depth, 4, bgcolor); - if (p == (void *) &s) { + if (p == (void *)&s) { break; } if (p == NULL) { - pixels = NULL; + frame->pixels = NULL; break; } - *psx = g.w; - *psy = g.h; - memory_write((void *)p, 1, *psx * *psy * depth, (void *)&frames); - memory_write((void *)&g.delay, sizeof(g.delay), 1, (void *)&delays); - ++*pframe_count; - pixels = frames.buffer; - if (fstatic) { - break; + + frame->width = g.w; + frame->height = g.h; + frame->pixels = p; + frame->delay = g.delay; + if (frame->pixels) { + *ploop_count = g.loop_count; + stride = frame->width * depth; + + switch (depth) { + case 3: + frame->pixelformat = PIXELFORMAT_RGB888; + break; + case 4: + frame->pixelformat = PIXELFORMAT_RGBA8888; + break; + default: + stbi_image_free(frame->pixels); + fprintf(stderr, "load_with_builtin() failed.\n" + "reason: unknwon pixel-format.\n"); + goto error; + } + } else { + fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", + stbi_failure_reason()); + goto error; } - } - if (pixels) { - *ploop_count = g.loop_count; - *ppdelay = (int *)delays.buffer; - *pstride = *psx * depth; - switch (depth) { - case 3: - *ppixelformat = PIXELFORMAT_RGB888; - break; - case 4: - *ppixelformat = PIXELFORMAT_RGBA8888; + ret = fn_load(frame, context); + if (ret != 0) { + goto error; + } + ++frame_count; + if (fstatic) { break; - default: - stbi_image_free(pixels); - free(delays.buffer); - free(frames.buffer); - fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknwon pixel-format.\n"); - return NULL; } - } else { - free(delays.buffer); - free(frames.buffer); - fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", - stbi_failure_reason()); - return NULL; } + return 0; +// if (pixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { +// /* RGBA to RGB */ +// ret = sixel_strip_alpha(pixels, *psx, *psy * *pframe_count, bgcolor); +// if (ret != 0) { +// goto end; +// } +// *ppixelformat = PIXELFORMAT_RGB888; +// } } else { stbi__start_mem(&s, pchunk->buffer, pchunk->size); - pixels = stbi_load_main(&s, psx, psy, &depth, 3); - if (!pixels) { + frame->pixels = stbi_load_main(&s, &frame->width, &frame->height, &depth, 3); + if (!frame->pixels) { fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", stbi_failure_reason()); - return NULL; + goto error; } - *pframe_count = 1; + frame_count = 1; *ploop_count = 1; - *pstride = *psx * depth; + stride = frame->width * depth; switch (depth) { case 1: case 3: case 4: - *ppixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = PIXELFORMAT_RGB888; break; default: - stbi_image_free(pixels); + stbi_image_free(frame->pixels); fprintf(stderr, "load_with_builtin() failed.\n" "reason: unknown pixel-format.(depth: %d)\n", depth); - return NULL; + goto error; } } - return pixels; + ret = fn_load(frame, context); + if (ret != 0) { + goto error; + } + + return 0; + +error: + free(frame->pixels); + free(frame->palette); + free(frame); + return (-1); } @@ -1315,31 +1350,24 @@ sixel_strip_alpha(unsigned char *pixels, } +/* load image from file */ + int sixel_helper_load_image_file( - unsigned char /* out */ **ppixels, /* loaded pixel data */ - unsigned char /* out */ **ppalette, /* loaded palette data */ - int /* out */ *psx, /* image width */ - int /* out */ *psy, /* image height */ - int /* out */ *pncolors, /* palette colors */ - int /* out */ *ppixelformat, /* one of enum pixelFormat */ - int /* out */ *pframe_count, /* frame count */ - int /* out */ *ploop_count, /* loop count */ - int /* out */ **ppdelay, /* delay for each frames */ - char const /* in */ *filename, /* source file name */ - int /* in */ fstatic, /* whether to extract static image */ - int /* in */ reqcolors, /* requested number of colors */ - unsigned char /* in */ *bgcolor) /* background color */ + char const /* in */ *filename, /* source file name */ + int /* in */ fstatic, /* whether to extract static image */ + int /* in */ fuse_palette, /* whether to use paletted image */ + int /* in */ reqcolors, /* requested number of colors */ + unsigned char /* in */ *bgcolor, /* background color */ + sixel_load_image_function /* in */ fn_load, /* callback */ + void /* in/out */ *context, /* private data */ + int /* out */ *ploop_count /* requested number of colors */ +) { int stride = (-1); int ret = (-1); chunk_t chunk; - - *ppixels = NULL; - - if (ppalette) { - *ppalette = NULL; - } + unsigned char *pixels = NULL; ret = get_chunk(filename, &chunk); if (ret != 0) { @@ -1351,37 +1379,41 @@ sixel_helper_load_image_file( return 0; } -#ifdef HAVE_GDK_PIXBUF2 - if (!*ppixels) { - *ppixels = load_with_gdkpixbuf(&chunk, psx, psy, ppixelformat, &stride, - pframe_count, ploop_count, ppdelay, - fstatic); - } -#endif /* HAVE_GDK_PIXBUF2 */ -#if HAVE_GD - if (!*ppixels) { - *ppixels = load_with_gd(&chunk, psx, psy, ppixelformat, &stride); - *pframe_count = 1; - } -#endif /* HAVE_GD */ - if (!*ppixels) { - *ppixels = load_with_builtin(&chunk, psx, psy, &stride, - ppalette, pncolors, ppixelformat, - pframe_count, ploop_count, ppdelay, - fstatic, reqcolors, bgcolor); + ret = (-1); +//#ifdef HAVE_GDK_PIXBUF2 +// if (!pixels) { +// pixels = load_with_gdkpixbuf(&chunk, psx, psy, ppixelformat, &stride, +// pframe_count, ploop_count, ppdelay, +// fstatic); +// } +//#endif /* HAVE_GDK_PIXBUF2 */ +//#if HAVE_GD +// if (!pixels) { +// pixels = load_with_gd(&chunk, psx, psy, ppixelformat, &stride); +// *pframe_count = 1; +// } +//#endif /* HAVE_GD */ + if (ret != 0) { + ret = load_with_builtin(&chunk, + fstatic, + fuse_palette, + reqcolors, + bgcolor, + fn_load, + context, + ploop_count); } free(chunk.buffer); - if (*ppixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { - /* RGBA to RGB */ - ret = sixel_strip_alpha(*ppixels, *psx, *psy * *pframe_count, bgcolor); - if (ret != 0) { - goto end; - } - *ppixelformat = PIXELFORMAT_RGB888; - } +// if (pixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { +// /* RGBA to RGB */ +// ret = sixel_strip_alpha(pixels, *psx, *psy * *pframe_count, bgcolor); +// if (ret != 0) { +// goto end; +// } +// *ppixelformat = PIXELFORMAT_RGB888; +// } - if (*ppixels == NULL) { - ret = (-1); + if (ret != 0) { goto end; } From 5a87d3325de5449f0509800c276b261f58310613 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Apr 2015 18:38:24 +0900 Subject: [PATCH 126/451] Don't use fuse_palette flag when using fixed palette --- converters/img2sixel.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index f5d5aa86..ce9d13f6 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -1154,18 +1154,9 @@ load_image_callback(sixel_frame_t *frame, void *data) static int convert_to_sixel(char const *filename, settings_t *psettings) { - unsigned char *pixels; - unsigned char *p; - unsigned char *frame; - int sx, sy; - int frame_count = 1; int loop_count = 1; - int *delays; - int n; int nret = (-1); - unsigned char *palette = NULL; - unsigned char **ppalette = &palette; - int ncolors = 0; + int fuse_palette = 1; sixel_callback_context_t callback_context; if (psettings->reqcolors < 2) { @@ -1177,38 +1168,34 @@ convert_to_sixel(char const *filename, settings_t *psettings) } if (psettings->mapfile) { - ppalette = NULL; + fuse_palette = 0; } if (psettings->monochrome > 0) { - ppalette = NULL; + fuse_palette = 0; } if (psettings->highcolor > 0) { - ppalette = NULL; + fuse_palette = 0; } if (psettings->builtin_palette > 0) { - ppalette = NULL; + fuse_palette = 0; } if (psettings->percentwidth > 0 || psettings->percentheight > 0 || psettings->pixelwidth > 0 || psettings->pixelheight > 0) { - ppalette = NULL; + fuse_palette = 0; } reload: - pixels = NULL; - frame = NULL; - delays = NULL; - callback_context.settings = psettings; nret = sixel_helper_load_image_file(filename, psettings->fstatic, - 1, /* fuse_palette */ + fuse_palette, psettings->reqcolors, psettings->bgcolor, load_image_callback, From b6194e6a94e028ebc23217ce1e722de420f5c721 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 9 Apr 2015 00:01:23 +0900 Subject: [PATCH 127/451] Update tests --- converters/Makefile.am | 2 +- converters/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 0f165c71..ad6c1e0a 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -110,7 +110,7 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -p 16 -C3 -h100 -fnorm -rlanczos2 ../images/snake.jpg $(WINE) ./img2sixel -v -p 8 -h200 -fnorm -rlanczos2 -dnone ../images/snake.jpg $(WINE) ./img2sixel -p 2 -h100 -wauto -rlanczos3 ../images/snake.jpg - $(WINE) ./img2sixel -p 1 -h100 -n1 ../images/snake.jpg + $(WINE) ./img2sixel -p 1 -h100 -n1 ../images/snake.jpg && printf '\033[*1z' $(WINE) ./img2sixel -e -h140 -rlanczos4 -P ../images/snake.jpg $(WINE) ./img2sixel -e -i -P ../images/snake.jpg > /dev/null $(WINE) ./img2sixel -w2047 -h2047 ../images/snake.png | $(WINE) ./img2sixel > /dev/null diff --git a/converters/Makefile.in b/converters/Makefile.in index cc5de42f..0f2d5b52 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1054,7 +1054,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p 16 -C3 -h100 -fnorm -rlanczos2 ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -v -p 8 -h200 -fnorm -rlanczos2 -dnone ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p 2 -h100 -wauto -rlanczos3 ../images/snake.jpg -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p 1 -h100 -n1 ../images/snake.jpg +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p 1 -h100 -n1 ../images/snake.jpg && printf '\033[*1z' @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -e -h140 -rlanczos4 -P ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -e -i -P ../images/snake.jpg > /dev/null @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2047 -h2047 ../images/snake.png | $(WINE) ./img2sixel > /dev/null From 5a50f18c81d35f88bbbe8362e9cf1681973b1704 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 9 Apr 2015 12:24:56 +0900 Subject: [PATCH 128/451] Fix broken animation without macro --- converters/img2sixel.c | 142 +++++++++++++++++++---------------------- include/sixel.h.in | 2 + src/loader.c | 22 +++---- 3 files changed, 76 insertions(+), 90 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index ce9d13f6..113f2ba8 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -714,9 +714,8 @@ output_sixel_without_macro( unsigned char **frames, int sx, int sy, int depth, - int loop_count, - int frame_count, - int *delays, + int frame_no, + int delay, sixel_dither_t *dither, sixel_output_t *context, settings_t *psettings @@ -743,7 +742,7 @@ output_sixel_without_macro( sixel_output_set_penetrate_multiplexer(context, psettings->penetrate_multiplexer); sixel_output_set_encode_policy(context, psettings->encode_policy); - if (frame_count == 1 && !psettings->mapfile && !psettings->monochrome + if (!psettings->mapfile && !psettings->monochrome && !psettings->highcolor && !psettings->builtin_palette) { sixel_dither_set_optimize_palette(dither, 1); } @@ -752,49 +751,34 @@ output_sixel_without_macro( if (nret != 0) { goto end; } - for (c = 0; c != loop_count; ++c) { - for (n = 0; n < frame_count; ++n) { - if (frame_count > 1) { #if HAVE_USLEEP && HAVE_CLOCK - start = clock(); + start = clock(); #endif - printf("\033[H"); - fflush(stdout); + printf("\033[H"); + fflush(stdout); #if HAVE_USLEEP - if (delays != NULL && !psettings->fignore_delay) { + if (!psettings->fignore_delay) { # if HAVE_CLOCK - dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; - lag = 0; + dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; + lag = 0; # else - dulation = 0; + dulation = 0; # endif - if (dulation < 10000 * delays[n]) { - usleep(10000 * delays[n] - dulation); - } else { - lag = 10000 * delays[n] - dulation; - } - } + if (dulation < 10000 * delay) { + usleep(10000 * delay - dulation); + } else { + lag = 10000 * delay - dulation; + } + } #endif - } - memcpy(frame, frames[n], sx * sy * depth); - nret = sixel_encode(frame, sx, sy, depth, dither, context); - if (nret != 0) { - goto end; - } + memcpy(frame, *frames, sx * sy * depth); + nret = sixel_encode(frame, sx, sy, depth, dither, context); + if (nret != 0) { + goto end; + } #if HAVE_SIGNAL - if (signaled) { - break; - } -#endif - } -#if HAVE_SIGNAL - if (signaled) { - break; - } -#endif - } if (signaled) { if (sixel_output_get_8bit_availability(context)) { printf("\x9c"); @@ -802,6 +786,7 @@ output_sixel_without_macro( printf("\x1b\\"); } } +#endif end: return nret; @@ -934,6 +919,7 @@ output_sixel_with_macro( typedef struct sixel_callback_context { settings_t *settings; + int frame_counter; } sixel_callback_context_t; @@ -942,6 +928,7 @@ load_image_callback(sixel_frame_t *frame, void *data) { int nret = (-1); int depth; + int loop_count = frame->loop_count; settings_t *psettings; sixel_dither_t *dither = NULL; int dst_pixelformat = PIXELFORMAT_RGB888; @@ -1058,42 +1045,30 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_dither_set_complexion_score(dither, psettings->complexion); } -// /* evaluate -l option: set loop count */ -// switch (psettings->loop_mode) { -// case LOOP_FORCE: -// loop_count = (-1); /* infinite */ -// break; -// case LOOP_DISABLE: -// loop_count = 1; /* do not loop */ -// break; -// case LOOP_AUTO: -// default: -// if (frame_count == 1) { -// loop_count = 1; -// } else if (loop_count == 0) { -// loop_count = (-1); -// } -//#ifdef HAVE_GDK_PIXBUF2 -// /* do not trust loop_count report of gdk-pixbuf loader */ -// if (loop_count == (-1)) { -// loop_count = 1; -// } -//#endif -// break; -// } - - /* set signal handler to handle SIGINT/SIGTERM/SIGHUP */ -#if HAVE_SIGNAL -# if HAVE_DECL_SIGINT - signal(SIGINT, signal_handler); -# endif -# if HAVE_DECL_SIGTERM - signal(SIGTERM, signal_handler); -# endif -# if HAVE_DECL_SIGHUP - signal(SIGHUP, signal_handler); -# endif + /* evaluate -l option: set loop count */ + switch (psettings->loop_mode) { + case LOOP_FORCE: + loop_count = (-1); /* infinite */ + break; + case LOOP_DISABLE: + loop_count = 1; /* do not loop */ + break; + case LOOP_AUTO: + default: + //if (frame_count == 1) { + // loop_count = 1; + //} else + if (loop_count == 0) { + loop_count = (-1); + } +#ifdef HAVE_GDK_PIXBUF2 + /* do not trust loop_count report of gdk-pixbuf loader */ + if (loop_count == (-1)) { + loop_count = 1; + } #endif + break; + } /* output sixel: junction of multi-frame processing strategy */ if ((psettings->fuse_macro && 1 > 1)) { /* -u option */ @@ -1102,7 +1077,7 @@ load_image_callback(sixel_frame_t *frame, void *data) frame->width, frame->height, 1, /* loop_count */ - 1, /* frame_count*/ + 1, /* frame_no*/ NULL, /* delays */ dither, output, @@ -1123,9 +1098,8 @@ load_image_callback(sixel_frame_t *frame, void *data) frame->width, frame->height, depth, - 1, /* loop_count */ - 1, /* frame_count */ - NULL, + frame->frame_no, + frame->delay, dither, output, psettings); @@ -1137,6 +1111,8 @@ load_image_callback(sixel_frame_t *frame, void *data) nret = 0; fflush(stdout); + ((sixel_callback_context_t *)data)->frame_counter++; + end: if (output) { sixel_output_unref(output); @@ -1190,8 +1166,22 @@ convert_to_sixel(char const *filename, settings_t *psettings) fuse_palette = 0; } + /* set signal handler to handle SIGINT/SIGTERM/SIGHUP */ +#if HAVE_SIGNAL +# if HAVE_DECL_SIGINT + signal(SIGINT, signal_handler); +# endif +# if HAVE_DECL_SIGTERM + signal(SIGTERM, signal_handler); +# endif +# if HAVE_DECL_SIGHUP + signal(SIGHUP, signal_handler); +# endif +#endif + reload: callback_context.settings = psettings; + callback_context.frame_counter = 0; nret = sixel_helper_load_image_file(filename, psettings->fstatic, diff --git a/include/sixel.h.in b/include/sixel.h.in index 1e19e783..63a3ef63 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -422,6 +422,8 @@ typedef struct sixel_frame { int ncolors; /* palette colors */ int pixelformat; /* one of enum pixelFormat */ int delay; /* delay in msec */ + int frame_no; /* frame number */ + int loop_count; /* loop count */ } sixel_frame_t; typedef int (* sixel_load_image_function)(sixel_frame_t /* in */ *frame, void /* in/out */ *context); diff --git a/src/loader.c b/src/loader.c index b292816f..d0472148 100644 --- a/src/loader.c +++ b/src/loader.c @@ -864,7 +864,6 @@ load_with_builtin( int depth; sixel_frame_t *frame; int ret = (-1); - int frame_count = 0; int stride; #if !defined(HAVE_LIBPNG) @@ -878,6 +877,7 @@ load_with_builtin( memset(frame, 0, sizeof(sixel_frame_t)); frame->pixels = NULL; + frame->frame_no = 0; if (chunk_is_sixel(pchunk)) { frame->pixels = load_sixel(pchunk->buffer, @@ -891,8 +891,7 @@ load_with_builtin( if (frame->pixels == NULL) { goto error; } - frame_count = 1; - *ploop_count = 1; + frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } else if (chunk_is_pnm(pchunk)) { /* pnm */ @@ -910,8 +909,7 @@ load_with_builtin( #endif /* HAVE_ERRNO_H */ goto error; } - frame_count = 1; - *ploop_count = 1; + frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #if HAVE_JPEG @@ -925,8 +923,7 @@ load_with_builtin( free(frames.buffer); goto error; } - frame_count = 1; - *ploop_count = 1; + frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_JPEG */ @@ -945,14 +942,12 @@ load_with_builtin( free(frames.buffer); goto error; } - frame_count = 1; - *ploop_count = 1; + frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { stbi__start_mem(&s, pchunk->buffer, pchunk->size); - frame_count = 0; memset(&g, 0, sizeof(g)); for (;;) { @@ -970,7 +965,7 @@ load_with_builtin( frame->pixels = p; frame->delay = g.delay; if (frame->pixels) { - *ploop_count = g.loop_count; + frame->loop_count = g.loop_count; stride = frame->width * depth; switch (depth) { @@ -996,7 +991,7 @@ load_with_builtin( if (ret != 0) { goto error; } - ++frame_count; + ++frame->frame_no; if (fstatic) { break; } @@ -1018,8 +1013,7 @@ load_with_builtin( stbi_failure_reason()); goto error; } - frame_count = 1; - *ploop_count = 1; + frame->loop_count = 1; stride = frame->width * depth; switch (depth) { From 9617f2f085f45ae1565a15b8659aa63ddc9384ee Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 9 Apr 2015 22:51:34 +0900 Subject: [PATCH 129/451] Fix loop control without macro --- converters/img2sixel.c | 117 ++++++++--------------- include/sixel.h.in | 18 +++- src/loader.c | 204 ++++++++++++++++++++--------------------- 3 files changed, 151 insertions(+), 188 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 113f2ba8..a02b7522 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -68,14 +68,6 @@ #include -/* loop modes */ -enum loopMode { - LOOP_AUTO, /* honer the setting of GIF header */ - LOOP_FORCE, /* always enable loop */ - LOOP_DISABLE, /* always disable loop */ -}; - - static char * arg_strdup(char const *s) { @@ -329,7 +321,6 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) static sixel_dither_t * prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgcolor) { - int loop_count; int ret = (-1); sixel_callback_context_for_mapfile_t callback_context; @@ -341,9 +332,9 @@ prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgc 1, /* fuse_palette */ 256, /* reqcolors */ bgcolor, + LOOP_DISABLE, load_image_callback_for_palette, - &callback_context, - &loop_count); + &callback_context); if (ret != 0) { return NULL; } @@ -375,7 +366,7 @@ typedef struct Settings { enum methodForRep method_for_rep; enum qualityMode quality_mode; enum methodForResampling method_for_resampling; - enum loopMode loop_mode; + enum loopControl loop_mode; enum paletteType palette_type; int f8bit; int finvert; @@ -711,10 +702,10 @@ wait_stdin(void) static int output_sixel_without_macro( - unsigned char **frames, - int sx, int sy, + unsigned char *frame, + int width, + int height, int depth, - int frame_no, int delay, sixel_dither_t *dither, sixel_output_t *context, @@ -723,31 +714,19 @@ output_sixel_without_macro( { int nret = 0; int dulation = 0; - int c; - int n; - unsigned char *frame; + unsigned char *p; #if HAVE_USLEEP int lag = 0; # if HAVE_CLOCK clock_t start; # endif #endif - - /* create output context */ - if (!context) { - context = sixel_output_create(sixel_write_callback, stdout); - } - sixel_output_set_8bit_availability(context, psettings->f8bit); - sixel_output_set_palette_type(context, psettings->palette_type); - sixel_output_set_penetrate_multiplexer(context, psettings->penetrate_multiplexer); - sixel_output_set_encode_policy(context, psettings->encode_policy); - if (!psettings->mapfile && !psettings->monochrome && !psettings->highcolor && !psettings->builtin_palette) { sixel_dither_set_optimize_palette(dither, 1); } - frame = malloc(sx * sy * depth); + p = malloc(width * height * depth); if (nret != 0) { goto end; } @@ -757,7 +736,7 @@ output_sixel_without_macro( printf("\033[H"); fflush(stdout); #if HAVE_USLEEP - if (!psettings->fignore_delay) { + if (!psettings->fignore_delay && delay > 0) { # if HAVE_CLOCK dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; lag = 0; @@ -772,22 +751,12 @@ output_sixel_without_macro( } #endif - memcpy(frame, *frames, sx * sy * depth); - nret = sixel_encode(frame, sx, sy, depth, dither, context); + memcpy(p, frame, width * height * depth); + nret = sixel_encode(p, width, height, depth, dither, context); if (nret != 0) { goto end; } -#if HAVE_SIGNAL - if (signaled) { - if (sixel_output_get_8bit_availability(context)) { - printf("\x9c"); - } else { - printf("\x1b\\"); - } - } -#endif - end: return nret; } @@ -919,16 +888,14 @@ output_sixel_with_macro( typedef struct sixel_callback_context { settings_t *settings; - int frame_counter; } sixel_callback_context_t; static int load_image_callback(sixel_frame_t *frame, void *data) { - int nret = (-1); + int nret = SIXEL_FAILED; int depth; - int loop_count = frame->loop_count; settings_t *psettings; sixel_dither_t *dither = NULL; int dst_pixelformat = PIXELFORMAT_RGB888; @@ -969,7 +936,7 @@ load_image_callback(sixel_frame_t *frame, void *data) frame->pixelformat, &dst_pixelformat, psettings); - if (nret != 0) { + if (nret != SIXEL_SUCCESS) { goto end; } if (frame->pixelformat != dst_pixelformat) { @@ -1045,30 +1012,12 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_dither_set_complexion_score(dither, psettings->complexion); } - /* evaluate -l option: set loop count */ - switch (psettings->loop_mode) { - case LOOP_FORCE: - loop_count = (-1); /* infinite */ - break; - case LOOP_DISABLE: - loop_count = 1; /* do not loop */ - break; - case LOOP_AUTO: - default: - //if (frame_count == 1) { - // loop_count = 1; - //} else - if (loop_count == 0) { - loop_count = (-1); - } -#ifdef HAVE_GDK_PIXBUF2 - /* do not trust loop_count report of gdk-pixbuf loader */ - if (loop_count == (-1)) { - loop_count = 1; - } -#endif - break; - } + /* create output context */ + output = sixel_output_create(sixel_write_callback, stdout); + sixel_output_set_8bit_availability(output, psettings->f8bit); + sixel_output_set_palette_type(output, psettings->palette_type); + sixel_output_set_penetrate_multiplexer(output, psettings->penetrate_multiplexer); + sixel_output_set_encode_policy(output, psettings->encode_policy); /* output sixel: junction of multi-frame processing strategy */ if ((psettings->fuse_macro && 1 > 1)) { /* -u option */ @@ -1093,12 +1042,12 @@ load_image_callback(sixel_frame_t *frame, void *data) dither, output, psettings); - } else { /* do not use macro */ - nret = output_sixel_without_macro(&frame->pixels, + } else { + /* do not use macro */ + nret = output_sixel_without_macro(frame->pixels, frame->width, frame->height, depth, - frame->frame_no, frame->delay, dither, output, @@ -1108,11 +1057,22 @@ load_image_callback(sixel_frame_t *frame, void *data) if (nret != 0) { goto end; } + +#if HAVE_SIGNAL + if (signaled) { + if (sixel_output_get_8bit_availability(output)) { + printf("\x9c"); + } else { + printf("\x1b\\"); + } + fflush(stdout); + return SIXEL_INTERRUPTED; + } +#endif + nret = 0; fflush(stdout); - ((sixel_callback_context_t *)data)->frame_counter++; - end: if (output) { sixel_output_unref(output); @@ -1130,9 +1090,9 @@ load_image_callback(sixel_frame_t *frame, void *data) static int convert_to_sixel(char const *filename, settings_t *psettings) { - int loop_count = 1; int nret = (-1); int fuse_palette = 1; + int loop_control = psettings->loop_mode; sixel_callback_context_t callback_context; if (psettings->reqcolors < 2) { @@ -1181,16 +1141,15 @@ convert_to_sixel(char const *filename, settings_t *psettings) reload: callback_context.settings = psettings; - callback_context.frame_counter = 0; nret = sixel_helper_load_image_file(filename, psettings->fstatic, fuse_palette, psettings->reqcolors, psettings->bgcolor, + loop_control, load_image_callback, - &callback_context, - &loop_count); + &callback_context); if (nret == 0 && psettings->pipe_mode) { #if HAVE_CLEARERR diff --git a/include/sixel.h.in b/include/sixel.h.in index 63a3ef63..a79015f6 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -30,6 +30,13 @@ #define SIXEL_OUTPUT_PACKET_SIZE 1024 #define SIXEL_PALETTE_MAX 256 +/* output character size */ +enum statusCode { + SIXEL_SUCCESS = 0x0000, /* succeeded */ + SIXEL_FAILED = 0x1000, /* failed */ + SIXEL_INTERRUPTED = SIXEL_SUCCESS | 0x001, /* interrupted by a signal */ +}; + /* output character size */ enum characterSize { CSIZE_7BIT = 0, /* 7bit character */ @@ -414,6 +421,13 @@ enum imageFormat { extern "C" { #endif +/* loop mode */ +enum loopControl { + LOOP_AUTO = 0, /* honer the setting of GIF header */ + LOOP_FORCE = 1, /* always enable loop */ + LOOP_DISABLE = 2, /* always disable loop */ +}; + typedef struct sixel_frame { unsigned char *pixels; /* loaded pixel data */ unsigned char *palette; /* loaded palette data */ @@ -435,9 +449,9 @@ sixel_helper_load_image_file( int /* in */ fuse_palette, /* whether to use paletted image */ int /* in */ reqcolors, /* requested number of colors */ unsigned char /* in */ *bgcolor, /* background color */ + int /* in */ loop_control, /* one of enum loopControl */ sixel_load_image_function /* in */ fn_load, /* callback */ - void /* in/out */ *context, /* private data for callback */ - int /* out */ *ploop_count); /* requested number of colors */ + void /* in/out */ *context); /* private data for callback */ /* write image to file */ int diff --git a/src/loader.c b/src/loader.c index d0472148..5be03e82 100644 --- a/src/loader.c +++ b/src/loader.c @@ -834,15 +834,39 @@ chunk_is_jpeg(chunk_t const *chunk) } #endif /* HAVE_JPEG */ -//typedef struct sixel_frame { -// unsigned char *pixels; /* loaded pixel data */ -// unsigned char *palette; /* loaded palette data */ -// int width; /* frame width */ -// int height; /* frame height */ -// int ncolors; /* palette colors */ -// int pixelformat; /* one of enum pixelFormat */ -// int delay; /* delay in msec */ -//} sixel_frame_t; + +static int +sixel_strip_alpha(unsigned char *pixels, + int width, + int height, + unsigned char *bgcolor) +{ + int x; + int y; + unsigned char *src; + unsigned char *dst; + unsigned char alpha; + + src = dst = pixels; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + if (bgcolor) { + alpha = src[3]; + *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; + src++; + } else { + *dst++ = *src++; /* R */ + *dst++ = *src++; /* R */ + *dst++ = *src++; /* R */ + src++; /* A */ + } + } + } + + return 0; +} int @@ -852,9 +876,9 @@ load_with_builtin( int /* in */ fuse_palette, /* whether to use palette if possible */ int /* in */ reqcolors, /* reqcolors */ unsigned char /* in */ *bgcolor, /* background color */ + int /* in */ loop_control, /* one of enum loop_control */ sixel_load_image_function /* in */ fn_load, /* callback */ - void /* in/out */ *context, /* private data for callback */ - int /* in */ *ploop_count /* reqcolors */ + void /* in/out */ *context /* private data for callback */ ) { unsigned char *p; @@ -878,6 +902,7 @@ load_with_builtin( frame->pixels = NULL; frame->frame_no = 0; + frame->loop_count = 0; if (chunk_is_sixel(pchunk)) { frame->pixels = load_sixel(pchunk->buffer, @@ -891,7 +916,6 @@ load_with_builtin( if (frame->pixels == NULL) { goto error; } - frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } else if (chunk_is_pnm(pchunk)) { /* pnm */ @@ -909,7 +933,6 @@ load_with_builtin( #endif /* HAVE_ERRNO_H */ goto error; } - frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #if HAVE_JPEG @@ -923,7 +946,6 @@ load_with_builtin( free(frames.buffer); goto error; } - frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_JPEG */ @@ -942,69 +964,81 @@ load_with_builtin( free(frames.buffer); goto error; } - frame->loop_count = 1; stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { - stbi__start_mem(&s, pchunk->buffer, pchunk->size); - memset(&g, 0, sizeof(g)); + + frame->loop_count = 0; for (;;) { - p = stbi__gif_load_next(&s, &g, &depth, 4, bgcolor); - if (p == (void *)&s) { - break; - } - if (p == NULL) { - frame->pixels = NULL; - break; - } - frame->width = g.w; - frame->height = g.h; - frame->pixels = p; - frame->delay = g.delay; - if (frame->pixels) { - frame->loop_count = g.loop_count; - stride = frame->width * depth; - - switch (depth) { - case 3: - frame->pixelformat = PIXELFORMAT_RGB888; + stbi__start_mem(&s, pchunk->buffer, pchunk->size); + memset(&g, 0, sizeof(g)); + frame->frame_no = 0; + + for (;;) { + p = stbi__gif_load_next(&s, &g, &depth, 4, bgcolor); + if (p == (void *)&s) { break; - case 4: - frame->pixelformat = PIXELFORMAT_RGBA8888; + } + if (p == NULL) { + frame->pixels = NULL; break; - default: - stbi_image_free(frame->pixels); - fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknwon pixel-format.\n"); + } + + frame->width = g.w; + frame->height = g.h; + frame->pixels = p; + frame->delay = g.delay; + if (frame->pixels) { + stride = frame->width * depth; + + switch (depth) { + case 3: + frame->pixelformat = PIXELFORMAT_RGB888; + break; + case 4: + /* RGBA to RGB */ + ret = sixel_strip_alpha(frame->pixels, frame->width, frame->height, bgcolor); + if (ret != 0) { + stbi_image_free(frame->pixels); + goto error; + } + frame->pixelformat = PIXELFORMAT_RGB888; + break; + default: + stbi_image_free(frame->pixels); + fprintf(stderr, "load_with_builtin() failed.\n" "reason: unknwon pixel-format.\n"); + goto error; + } + } else { + fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", + stbi_failure_reason()); goto error; } - } else { - fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", - stbi_failure_reason()); - goto error; + + ret = fn_load(frame, context); + if (ret != 0) { + goto error; + } + ++frame->frame_no; + if (fstatic) { + break; + } } - ret = fn_load(frame, context); - if (ret != 0) { - goto error; + ++frame->loop_count; + + if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { + break; } - ++frame->frame_no; - if (fstatic) { + if (loop_control == LOOP_AUTO && frame->loop_count == g.loop_count) { break; } } + return 0; -// if (pixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { -// /* RGBA to RGB */ -// ret = sixel_strip_alpha(pixels, *psx, *psy * *pframe_count, bgcolor); -// if (ret != 0) { -// goto end; -// } -// *ppixelformat = PIXELFORMAT_RGB888; -// } } else { stbi__start_mem(&s, pchunk->buffer, pchunk->size); frame->pixels = stbi_load_main(&s, &frame->width, &frame->height, &depth, 3); @@ -1310,40 +1344,6 @@ load_with_gd(chunk_t const *pchunk, #endif /* HAVE_GD */ -static int -sixel_strip_alpha(unsigned char *pixels, - int width, - int height, - unsigned char *bgcolor) -{ - int x; - int y; - unsigned char *src; - unsigned char *dst; - unsigned char alpha; - - src = dst = pixels; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - if (bgcolor) { - alpha = src[3]; - *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; - *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; - *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; - src++; - } else { - *dst++ = *src++; /* R */ - *dst++ = *src++; /* R */ - *dst++ = *src++; /* R */ - src++; /* A */ - } - } - } - - return 0; -} - - /* load image from file */ int @@ -1353,15 +1353,13 @@ sixel_helper_load_image_file( int /* in */ fuse_palette, /* whether to use paletted image */ int /* in */ reqcolors, /* requested number of colors */ unsigned char /* in */ *bgcolor, /* background color */ + int /* in */ loop_control, /* one of enum loopControl */ sixel_load_image_function /* in */ fn_load, /* callback */ - void /* in/out */ *context, /* private data */ - int /* out */ *ploop_count /* requested number of colors */ + void /* in/out */ *context /* private data */ ) { - int stride = (-1); int ret = (-1); chunk_t chunk; - unsigned char *pixels = NULL; ret = get_chunk(filename, &chunk); if (ret != 0) { @@ -1393,19 +1391,11 @@ sixel_helper_load_image_file( fuse_palette, reqcolors, bgcolor, + loop_control, fn_load, - context, - ploop_count); + context); } free(chunk.buffer); -// if (pixels && stride > 0 && *ppixelformat == PIXELFORMAT_RGBA8888) { -// /* RGBA to RGB */ -// ret = sixel_strip_alpha(pixels, *psx, *psy * *pframe_count, bgcolor); -// if (ret != 0) { -// goto end; -// } -// *ppixelformat = PIXELFORMAT_RGB888; -// } if (ret != 0) { goto end; From 24e7575c775cee5229525b1255a3b64e3429d737 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 9 Apr 2015 23:25:06 +0900 Subject: [PATCH 130/451] Implement macro invocation with callback --- converters/img2sixel.c | 139 +++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 76 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index a02b7522..f439c672 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -764,11 +764,12 @@ output_sixel_without_macro( static int output_sixel_with_macro( - unsigned char **frames, - int sx, int sy, + unsigned char *frame, + int sx, + int sy, + int delay, + int frame_no, int loop_count, - int frame_count, - int *delays, sixel_dither_t *dither, sixel_output_t *context, settings_t *psettings @@ -776,8 +777,6 @@ output_sixel_with_macro( { int nret = 0; int dulation = 0; - int c; - int n; #if HAVE_USLEEP int lag = 0; # if HAVE_CLOCK @@ -785,57 +784,49 @@ output_sixel_with_macro( # endif #endif - if (!context) { - context = sixel_output_create(sixel_hex_write_callback, stdout); - } - sixel_output_set_8bit_availability(context, psettings->f8bit); - sixel_output_set_palette_type(context, psettings->palette_type); - sixel_output_set_penetrate_multiplexer(context, psettings->penetrate_multiplexer); - sixel_output_set_encode_policy(context, psettings->encode_policy); - - for (n = 0; n < frame_count; ++n) { #if HAVE_USLEEP && HAVE_CLOCK - start = clock(); + start = clock(); #endif - if (frame_count == 1 && psettings->macro_number >= 0) { + if (loop_count == 0) { + if (psettings->macro_number >= 0) { printf("\033P%d;0;1!z", psettings->macro_number); } else { - printf("\033P%d;0;1!z", n); + printf("\033P%d;0;1!z", frame_no); } - nret = sixel_encode(frames[n], sx, sy, /* unused */ 3, dither, context); + nret = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); if (nret != 0) { goto end; } printf("\033\\"); - if (loop_count == -1) { - printf("\033[H"); - if (frame_count != 1 || psettings->macro_number < 0) { - printf("\033[%d*z", n); - } - } + } + if (psettings->macro_number < 0) { + printf("\033[H"); + fflush(stdout); + printf("\033[%d*z", frame_no); + } #if HAVE_USLEEP - if (delays != NULL && !psettings->fignore_delay) { + if (delay > 0 && !psettings->fignore_delay) { # if HAVE_CLOCK - dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; - lag = 0; + dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; + lag = 0; # else - dulation = 0; + dulation = 0; # endif - if (dulation < 10000 * delays[n]) { - usleep(10000 * delays[n] - dulation); - } else { - lag = 10000 * delays[n] - dulation; - } + if (dulation < 10000 * delay) { + usleep(10000 * delay - dulation); + } else { + lag = 10000 * delay - dulation; } + } #endif #if HAVE_SIGNAL - if (signaled) { - break; - } -#endif + if (signaled) { + return SIXEL_INTERRUPTED; } +#endif + if (signaled) { if (psettings->f8bit) { printf("\x9c"); @@ -843,43 +834,35 @@ output_sixel_with_macro( printf("\x1b\\"); } } - if (frame_count > 1 || psettings->macro_number < 0) { - for (c = 0; c != loop_count; ++c) { - for (n = 0; n < frame_count; ++n) { + + if (psettings->macro_number < 0) { #if HAVE_USLEEP && HAVE_CLOCK - start = clock(); + start = clock(); #endif - printf("\033[H"); - printf("\033[%d*z", n); - fflush(stdout); + printf("\033[H"); + printf("\033[%d*z", frame_no); + fflush(stdout); #if HAVE_USLEEP - if (delays != NULL && !psettings->fignore_delay) { + if (delay > 0 && !psettings->fignore_delay) { # if HAVE_CLOCK - dulation = (clock() - start) * 1000000 / CLOCKS_PER_SEC - lag; - lag = 0; + dulation = (clock() - start) * 1000000 / CLOCKS_PER_SEC - lag; + lag = 0; # else - dulation = 0; + dulation = 0; # endif - if (dulation < 10000 * delays[n]) { - usleep(10000 * delays[n] - dulation); - } else { - lag = 10000 * delays[n] - dulation; - } - } -#endif -#if HAVE_SIGNAL - if (signaled) { - break; - } -#endif - } -#if HAVE_SIGNAL - if (signaled) { - break; + if (dulation < 10000 * delay) { + usleep(10000 * delay - dulation); + } else { + lag = 10000 * delay - dulation; } -#endif } +#endif } +#if HAVE_SIGNAL + if (signaled) { + return SIXEL_INTERRUPTED; + } +#endif end: return nret; @@ -1013,32 +996,36 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* create output context */ - output = sixel_output_create(sixel_write_callback, stdout); + if (psettings->fuse_macro || psettings->macro_number >= 0) { /* -u or -n option */ + output = sixel_output_create(sixel_hex_write_callback, stdout); + } else { + output = sixel_output_create(sixel_write_callback, stdout); + } sixel_output_set_8bit_availability(output, psettings->f8bit); sixel_output_set_palette_type(output, psettings->palette_type); sixel_output_set_penetrate_multiplexer(output, psettings->penetrate_multiplexer); sixel_output_set_encode_policy(output, psettings->encode_policy); /* output sixel: junction of multi-frame processing strategy */ - if ((psettings->fuse_macro && 1 > 1)) { /* -u option */ + if (psettings->fuse_macro) { /* -u option */ /* use macro */ - nret = output_sixel_with_macro(&frame->pixels, + nret = output_sixel_with_macro(frame->pixels, frame->width, frame->height, - 1, /* loop_count */ - 1, /* frame_no*/ - NULL, /* delays */ + frame->delay, + frame->frame_no, + frame->loop_count, dither, output, psettings); } else if (psettings->macro_number >= 0) { /* -n option */ /* use macro */ - nret = output_sixel_with_macro(&frame->pixels, + nret = output_sixel_with_macro(frame->pixels, frame->width, frame->height, - 1, /* loop_count */ - 1, /* frame_count */ - NULL, /* delays,*/ + frame->delay, + frame->frame_no, + frame->loop_count, dither, output, psettings); From 42d7e1caad9907f5150fded333ab92a303952d93 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 15:26:27 +0900 Subject: [PATCH 131/451] Support callback loader API with gdk-pixbuf loader --- src/loader.c | 163 ++++++++++++++++++++++++++++----------------------- 1 file changed, 90 insertions(+), 73 deletions(-) diff --git a/src/loader.c b/src/loader.c index 5be03e82..ecc76053 100644 --- a/src/loader.c +++ b/src/loader.c @@ -884,7 +884,6 @@ load_with_builtin( unsigned char *p; static stbi__context s; static stbi__gif g; - chunk_t frames; int depth; sixel_frame_t *frame; int ret = (-1); @@ -943,7 +942,6 @@ load_with_builtin( &frame->height, &frame->pixelformat); if (frame->pixels == NULL) { - free(frames.buffer); goto error; } stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); @@ -961,7 +959,6 @@ load_with_builtin( &frame->pixelformat, bgcolor); if (frame->pixels == NULL) { - free(frames.buffer); goto error; } stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); @@ -1080,32 +1077,40 @@ load_with_builtin( #ifdef HAVE_GDK_PIXBUF2 -static unsigned char * -load_with_gdkpixbuf(chunk_t const *pchunk, - int *psx, - int *psy, - int *ppixelformat, - int *pstride, - int *pframe_count, - int *ploop_count, - int **ppdelay, - int fstatic) +static int +load_with_gdkpixbuf( + chunk_t const /* in */ *pchunk, /* image data */ + int /* in */ fstatic, /* static */ + int /* in */ fuse_palette, /* whether to use palette if possible */ + int /* in */ reqcolors, /* reqcolors */ + unsigned char /* in */ *bgcolor, /* background color */ + int /* in */ loop_control, /* one of enum loop_control */ + sixel_load_image_function /* in */ fn_load, /* callback */ + void /* in/out */ *context /* private data for callback */ +) { GdkPixbuf *pixbuf; GdkPixbufAnimation *animation; unsigned char *pixels = NULL; - unsigned char *p; GdkPixbufLoader *loader; - chunk_t frames; - chunk_t delays; - int depth; #if 1 GdkPixbufAnimationIter *it; GTimeVal time; - int delay; #endif + sixel_frame_t *frame; - chunk_init(&frames, 1024); + (void) fuse_palette; + (void) reqcolors; + (void) bgcolor; + + frame = malloc(sizeof(sixel_frame_t)); + if (frame == NULL) { + goto error; + } + memset(frame, 0, sizeof(sixel_frame_t)); + + frame->pixels = NULL; + frame->loop_count = 0; #if (!GLIB_CHECK_VERSION(2, 36, 0)) g_type_init(); @@ -1117,63 +1122,70 @@ load_with_gdkpixbuf(chunk_t const *pchunk, if (!animation || fstatic || gdk_pixbuf_animation_is_static_image(animation)) { pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); if (pixbuf == NULL) { - return NULL; + return SIXEL_FAILED; } - p = gdk_pixbuf_get_pixels(pixbuf); - *psx = gdk_pixbuf_get_width(pixbuf); - *psy = gdk_pixbuf_get_height(pixbuf); + frame->frame_no = 0; + frame->pixels = gdk_pixbuf_get_pixels(pixbuf); + frame->width = gdk_pixbuf_get_width(pixbuf); + frame->height = gdk_pixbuf_get_height(pixbuf); if (gdk_pixbuf_get_has_alpha(pixbuf)) { - *ppixelformat = PIXELFORMAT_RGBA8888; - depth = 4; + frame->pixelformat = PIXELFORMAT_RGBA8888; } else { - *ppixelformat = PIXELFORMAT_RGB888; - depth = 3; + frame->pixelformat = PIXELFORMAT_RGB888; } - *pstride = gdk_pixbuf_get_rowstride(pixbuf); - *pframe_count = 1; - memory_write((void *)p, 1, *psx * *psy * depth, (void *)&frames); - pixels = frames.buffer; + fn_load(frame, context); } else { - chunk_init(&delays, 1024); g_get_current_time(&time); + frame->frame_no = 0; + it = gdk_pixbuf_animation_get_iter(animation, &time); - *pframe_count = 0; - while (!gdk_pixbuf_animation_iter_on_currently_loading_frame(it)) { - delay = gdk_pixbuf_animation_iter_get_delay_time(it); - g_time_val_add(&time, delay * 1000); - pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(it); - p = gdk_pixbuf_get_pixels(pixbuf); - - if (pixbuf == NULL) { - pixels = NULL; + for (;;) { + while (!gdk_pixbuf_animation_iter_on_currently_loading_frame(it)) { + frame->delay = gdk_pixbuf_animation_iter_get_delay_time(it); + g_time_val_add(&time, frame->delay * 1000); + frame->delay /= 10; + pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(it); + frame->pixels = gdk_pixbuf_get_pixels(pixbuf); + + if (pixbuf == NULL) { + pixels = NULL; + break; + } + frame->width = gdk_pixbuf_get_width(pixbuf); + frame->height = gdk_pixbuf_get_height(pixbuf); + if (gdk_pixbuf_get_has_alpha(pixbuf)) { + frame->pixelformat = PIXELFORMAT_RGBA8888; + } else { + frame->pixelformat = PIXELFORMAT_RGB888; + } + frame->frame_no++; + gdk_pixbuf_animation_iter_advance(it, &time); + fn_load(frame, context); + } + + ++frame->loop_count; + + if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { break; } - *psx = gdk_pixbuf_get_width(pixbuf); - *psy = gdk_pixbuf_get_height(pixbuf); - if (gdk_pixbuf_get_has_alpha(pixbuf)) { - *ppixelformat = PIXELFORMAT_RGBA8888; - depth = 4; - } else { - *ppixelformat = PIXELFORMAT_RGB888; - depth = 3; + /* TODO: get loop property */ + if (loop_control == LOOP_AUTO && frame->loop_count == 1) { + break; } - *pstride = gdk_pixbuf_get_rowstride(pixbuf); - memory_write((void *)p, 1, *psx * *psy * depth, (void *)&frames); - delay /= 10; - memory_write((void *)&delay, sizeof(delay), 1, (void *)&delays); - ++*pframe_count; - gdk_pixbuf_animation_iter_advance(it, &time); - pixels = frames.buffer; } - *ppdelay = (int *)delays.buffer; - /* TODO: get loop property */ - *ploop_count = 0; } gdk_pixbuf_loader_close(loader, NULL); g_object_unref(loader); - return pixels; + + return SIXEL_SUCCESS; + +error: + free(frame); + + return SIXEL_FAILED; + } #endif /* HAVE_GDK_PIXBUF2 */ @@ -1372,19 +1384,24 @@ sixel_helper_load_image_file( } ret = (-1); -//#ifdef HAVE_GDK_PIXBUF2 -// if (!pixels) { -// pixels = load_with_gdkpixbuf(&chunk, psx, psy, ppixelformat, &stride, -// pframe_count, ploop_count, ppdelay, -// fstatic); -// } -//#endif /* HAVE_GDK_PIXBUF2 */ -//#if HAVE_GD -// if (!pixels) { -// pixels = load_with_gd(&chunk, psx, psy, ppixelformat, &stride); -// *pframe_count = 1; -// } -//#endif /* HAVE_GD */ +#ifdef HAVE_GDK_PIXBUF2 + if (ret != 0) { + ret = load_with_gdkpixbuf(&chunk, + fstatic, + fuse_palette, + reqcolors, + bgcolor, + loop_control, + fn_load, + context); + } +#endif /* HAVE_GDK_PIXBUF2 */ +#if HAVE_GD + if (!pixels) { + pixels = load_with_gd(&chunk, psx, psy, ppixelformat, &stride); + *pframe_count = 1; + } +#endif /* HAVE_GD */ if (ret != 0) { ret = load_with_builtin(&chunk, fstatic, From 5423db36ca02b843c45000f274da15fdfeca2ef8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 15:38:17 +0900 Subject: [PATCH 132/451] Support callback loader API with libgd loader --- src/loader.c | 75 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/src/loader.c b/src/loader.c index ecc76053..297a9e29 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1253,17 +1253,38 @@ detect_file_format(int len, unsigned char *data) } -static unsigned char * -load_with_gd(chunk_t const *pchunk, - int *psx, - int *psy, - int *ppixelformat, - int *pstride) +static int +load_with_gd( + chunk_t const /* in */ *pchunk, /* image data */ + int /* in */ fstatic, /* static */ + int /* in */ fuse_palette, /* whether to use palette if possible */ + int /* in */ reqcolors, /* reqcolors */ + unsigned char /* in */ *bgcolor, /* background color */ + int /* in */ loop_control, /* one of enum loop_control */ + sixel_load_image_function /* in */ fn_load, /* callback */ + void /* in/out */ *context /* private data for callback */ +) { - unsigned char *pixels, *p; + unsigned char *p; gdImagePtr im; int x, y; int c; + sixel_frame_t *frame; + + (void) fstatic; + (void) fuse_palette; + (void) reqcolors; + (void) bgcolor; + (void) loop_control; + + frame = malloc(sizeof(sixel_frame_t)); + if (frame == NULL) { + return SIXEL_FAILED; + } + memset(frame, 0, sizeof(sixel_frame_t)); + + frame->pixels = NULL; + frame->loop_count = 0; switch(detect_file_format(pchunk->size, pchunk->buffer)) { #if 0 @@ -1311,38 +1332,37 @@ load_with_gd(chunk_t const *pchunk, break; #endif /* HAVE_DECL_GDIMAGECREATEFROMGD2PTR */ default: - return NULL; + return SIXEL_FAILED; } if (im == NULL) { - return NULL; + return SIXEL_FAILED; } if (!gdImageTrueColor(im)) { #if HAVE_DECL_GDIMAGEPALETTETOTRUECOLOR if (!gdImagePaletteToTrueColor(im)) { - return NULL; + return SIXEL_FAILED; } #else - return NULL; + return SIXEL_FAILED; #endif } - *psx = gdImageSX(im); - *psy = gdImageSY(im); - *ppixelformat = PIXELFORMAT_RGB888; - *pstride = *psx * 3; - p = pixels = malloc(*pstride * *psy); - if (p == NULL) { + frame->width = gdImageSX(im); + frame->height = gdImageSY(im); + frame->pixelformat = PIXELFORMAT_RGB888; + p = frame->pixels = malloc(frame->width * frame->height * 3); + if (frame->pixels == NULL) { #if HAVE_ERRNO_H fprintf(stderr, "load_with_gd failed.\n" "reason: %s.\n", strerror(errno)); #endif /* HAVE_ERRNO_H */ gdImageDestroy(im); - return NULL; + return SIXEL_FAILED; } - for (y = 0; y < *psy; y++) { - for (x = 0; x < *psx; x++) { + for (y = 0; y < frame->height; y++) { + for (x = 0; x < frame->width; x++) { c = gdImageTrueColorPixel(im, x, y); *p++ = gdTrueColorGetRed(c); *p++ = gdTrueColorGetGreen(c); @@ -1350,7 +1370,8 @@ load_with_gd(chunk_t const *pchunk, } } gdImageDestroy(im); - return pixels; + + return fn_load(frame, context); } #endif /* HAVE_GD */ @@ -1397,9 +1418,15 @@ sixel_helper_load_image_file( } #endif /* HAVE_GDK_PIXBUF2 */ #if HAVE_GD - if (!pixels) { - pixels = load_with_gd(&chunk, psx, psy, ppixelformat, &stride); - *pframe_count = 1; + if (!ret != 0) { + ret = load_with_gd(&chunk, + fstatic, + fuse_palette, + reqcolors, + bgcolor, + loop_control, + fn_load, + context); } #endif /* HAVE_GD */ if (ret != 0) { From 32e5115deee175b2b73d9f85c042c7fe7c4e6e3f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 15:39:06 +0900 Subject: [PATCH 133/451] Rebuild --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 443934ed..a68c2474 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ From ad567cf3d640b40d01424415327e71e76c3e3770 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 16:47:25 +0900 Subject: [PATCH 134/451] Suppress GCC warnings --- src/loader.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/loader.c b/src/loader.c index 297a9e29..700d5ff9 100644 --- a/src/loader.c +++ b/src/loader.c @@ -109,6 +109,7 @@ chunk_init(chunk_t * const pchunk, } +# ifdef HAVE_LIBCURL static size_t memory_write(void *ptr, size_t size, @@ -137,6 +138,7 @@ memory_write(void *ptr, return nbytes; } +# endif static FILE * @@ -887,7 +889,6 @@ load_with_builtin( int depth; sixel_frame_t *frame; int ret = (-1); - int stride; #if !defined(HAVE_LIBPNG) (void) bgcolor; @@ -915,7 +916,6 @@ load_with_builtin( if (frame->pixels == NULL) { goto error; } - stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } else if (chunk_is_pnm(pchunk)) { /* pnm */ frame->pixels = load_pnm(pchunk->buffer, @@ -932,7 +932,6 @@ load_with_builtin( #endif /* HAVE_ERRNO_H */ goto error; } - stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #if HAVE_JPEG else if (chunk_is_jpeg(pchunk)) { @@ -944,7 +943,6 @@ load_with_builtin( if (frame->pixels == NULL) { goto error; } - stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_JPEG */ #if HAVE_LIBPNG @@ -961,7 +959,6 @@ load_with_builtin( if (frame->pixels == NULL) { goto error; } - stride = frame->width * sixel_helper_compute_depth(frame->pixelformat); } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { @@ -989,8 +986,6 @@ load_with_builtin( frame->pixels = p; frame->delay = g.delay; if (frame->pixels) { - stride = frame->width * depth; - switch (depth) { case 3: frame->pixelformat = PIXELFORMAT_RGB888; @@ -1045,7 +1040,6 @@ load_with_builtin( goto error; } frame->loop_count = 1; - stride = frame->width * depth; switch (depth) { case 1: From 8bdee033c1ac3cad3c0a113921b009b37b406d29 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 21:29:02 +1100 Subject: [PATCH 135/451] Fix a segmentation error occurs when resizing --- converters/img2sixel.c | 123 ++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 83 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index f439c672..6d09003e 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -465,38 +465,30 @@ prepare_palette(sixel_dither_t *former_dither, static int -do_resize(unsigned char **ppixels, - unsigned char **frames, int frame_count, - int /* in,out */ *psx, - int /* in,out */ *psy, - int /* in */ pixelformat, - int /* out */ *dst_pixelformat, - settings_t *psettings) +do_resize(sixel_frame_t *frame, settings_t *psettings) { unsigned char *p; int size; - int n; unsigned char *scaled_frame = NULL; unsigned char *normalized_pixels = NULL; int nret; if (psettings->percentwidth > 0) { - psettings->pixelwidth = *psx * psettings->percentwidth / 100; + psettings->pixelwidth = frame->width * psettings->percentwidth / 100; } if (psettings->percentheight > 0) { - psettings->pixelheight = *psy * psettings->percentheight / 100; + psettings->pixelheight = frame->height * psettings->percentheight / 100; } if (psettings->pixelwidth > 0 && psettings->pixelheight <= 0) { - psettings->pixelheight = *psy * psettings->pixelwidth / *psx; + psettings->pixelheight = frame->height * psettings->pixelwidth / frame->width; } if (psettings->pixelheight > 0 && psettings->pixelwidth <= 0) { - psettings->pixelwidth = *psx * psettings->pixelheight / *psy; + psettings->pixelwidth = frame->width * psettings->pixelheight / frame->height; } if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { - switch (pixelformat) { + switch (frame->pixelformat) { case PIXELFORMAT_RGB888: - *dst_pixelformat = pixelformat; break; case PIXELFORMAT_PAL8: case PIXELFORMAT_G8: @@ -509,58 +501,44 @@ do_resize(unsigned char **ppixels, case PIXELFORMAT_RGBA8888: case PIXELFORMAT_ARGB8888: /* normalize pixelformat */ - size = *psx * *psy * 3; - normalized_pixels = malloc(size * frame_count); + size = frame->width * frame->height * 3; + normalized_pixels = malloc(size); nret = sixel_helper_normalize_pixelformat(normalized_pixels, - &pixelformat, - *ppixels, pixelformat, - *psx, *psy); + &frame->pixelformat, + frame->pixels, frame->pixelformat, + frame->width, frame->height); if (nret != 0) { free(normalized_pixels); return nret; } - free(*ppixels); - *ppixels = normalized_pixels; - *dst_pixelformat = pixelformat; - - for (n = 0; n < frame_count; ++n) { - frames[n] = *ppixels + size * n; - } + free(frame->pixels); + frame->pixels = normalized_pixels; break; default: - *dst_pixelformat = pixelformat; fprintf(stderr, "do_resize: invalid pixelformat.\n"); return (-1); } size = psettings->pixelwidth * psettings->pixelheight * 3; - p = malloc(size * frame_count); + scaled_frame = malloc(size); - if (p == NULL) { + if (scaled_frame == NULL) { return (-1); } - for (n = 0; n < frame_count; ++n) { - scaled_frame = p + size * n; - nret = sixel_helper_scale_image( - scaled_frame, - frames[n], *psx, *psy, 3, - psettings->pixelwidth, - psettings->pixelheight, - psettings->method_for_resampling); - if (nret != 0) { - return nret; - } - } - for (n = 0; n < frame_count; ++n) { - frames[n] = p + size * n; + nret = sixel_helper_scale_image( + scaled_frame, + frame->pixels, frame->width, frame->height, 3, + psettings->pixelwidth, + psettings->pixelheight, + psettings->method_for_resampling); + if (nret != 0) { + return nret; } - free(*ppixels); - *ppixels = p; - *psx = psettings->pixelwidth; - *psy = psettings->pixelheight; - } else { - *dst_pixelformat = pixelformat; + free(frame->pixels); + frame->pixels = scaled_frame; + frame->width = psettings->pixelwidth; + frame->height = psettings->pixelheight; } return 0; @@ -733,7 +711,7 @@ output_sixel_without_macro( #if HAVE_USLEEP && HAVE_CLOCK start = clock(); #endif - printf("\033[H"); +// printf("\033[H"); fflush(stdout); #if HAVE_USLEEP if (!psettings->fignore_delay && delay > 0) { @@ -802,7 +780,7 @@ output_sixel_with_macro( printf("\033\\"); } if (psettings->macro_number < 0) { - printf("\033[H"); +// printf("\033[H"); fflush(stdout); printf("\033[%d*z", frame_no); } @@ -839,7 +817,7 @@ output_sixel_with_macro( #if HAVE_USLEEP && HAVE_CLOCK start = clock(); #endif - printf("\033[H"); +// printf("\033[H"); printf("\033[%d*z", frame_no); fflush(stdout); #if HAVE_USLEEP @@ -881,7 +859,6 @@ load_image_callback(sixel_frame_t *frame, void *data) int depth; settings_t *psettings; sixel_dither_t *dither = NULL; - int dst_pixelformat = PIXELFORMAT_RGB888; sixel_output_t *output = NULL; if (frame->pixels == NULL || frame->width == 0 || frame->height == 0) { @@ -911,46 +888,26 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* scaling */ - nret = do_resize(&frame->pixels, - &frame->pixels, - 1, - &frame->width, - &frame->height, - frame->pixelformat, - &dst_pixelformat, - psettings); + nret = do_resize(frame, psettings); if (nret != SIXEL_SUCCESS) { goto end; } - if (frame->pixelformat != dst_pixelformat) { - frame->pixelformat = dst_pixelformat; - depth = sixel_helper_compute_depth(frame->pixelformat); - if (depth == (-1)) { - nret = (-1); - goto end; - } + depth = sixel_helper_compute_depth(frame->pixelformat); + if (depth == (-1)) { + nret = (-1); + goto end; } } else { /* scaling */ - nret = do_resize(&frame->pixels, - &frame->pixels, - 1, - &frame->width, - &frame->height, - frame->pixelformat, - &dst_pixelformat, - psettings); + nret = do_resize(frame, psettings); if (nret != 0) { goto end; } - if (frame->pixelformat != dst_pixelformat) { - frame->pixelformat = dst_pixelformat; - depth = sixel_helper_compute_depth(frame->pixelformat); - if (depth == (-1)) { - nret = (-1); - goto end; - } + depth = sixel_helper_compute_depth(frame->pixelformat); + if (depth == (-1)) { + nret = (-1); + goto end; } /* clipping */ From 1491aa3f116b1e1fbad4e15fbdfdedc663915ed7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 21:55:08 +1100 Subject: [PATCH 136/451] Fix a memory leak found in cropping routine --- converters/img2sixel.c | 92 ++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 6d09003e..483f6e80 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -467,7 +467,6 @@ prepare_palette(sixel_dither_t *former_dither, static int do_resize(sixel_frame_t *frame, settings_t *psettings) { - unsigned char *p; int size; unsigned char *scaled_frame = NULL; unsigned char *normalized_pixels = NULL; @@ -547,15 +546,18 @@ do_resize(sixel_frame_t *frame, settings_t *psettings) static int clip(unsigned char *pixels, - int sx, int sy, - int depth, - int cx, int cy, - int cw, int ch, - int pixelformat) + int sx, + int sy, + int pixelformat, + int cx, + int cy, + int cw, + int ch) { int y; unsigned char *src; unsigned char *dst; + int depth = sixel_helper_compute_depth(pixelformat); /* unused */ (void) sx; /* unused */ (void) sy; @@ -590,52 +592,58 @@ clip(unsigned char *pixels, static int -do_crop(unsigned char **frames, int frame_count, - int *psx, int *psy, int pixelformat, int *dst_pixelformat, - settings_t *psettings) +do_crop(sixel_frame_t *frame, settings_t *psettings) { - int n; int ret; - int depth; unsigned char *normalized_pixels; /* clipping */ - if (psettings->clipwidth + psettings->clipx > *psx) { - psettings->clipwidth = (psettings->clipx > *psx) ? 0 : *psx - psettings->clipx; + if (psettings->clipwidth + psettings->clipx > frame->width) { + if (psettings->clipx > frame->width) { + psettings->clipwidth = 0; + } else { + psettings->clipwidth = frame->width - psettings->clipx; + } } - if (psettings->clipheight + psettings->clipy > *psy) { - psettings->clipheight = (psettings->clipy > *psy) ? 0 : *psy - psettings->clipy; + if (psettings->clipheight + psettings->clipy > frame->height) { + if (psettings->clipy > frame->height) { + psettings->clipheight = 0; + } else { + psettings->clipheight = frame->height - psettings->clipy; + } } if (psettings->clipwidth > 0 && psettings->clipheight > 0) { - depth = sixel_helper_compute_depth(pixelformat); - switch (pixelformat) { + switch (frame->pixelformat) { case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: - normalized_pixels = malloc(*psx * *psy * frame_count); + normalized_pixels = malloc(frame->width * frame->height); ret = sixel_helper_normalize_pixelformat(normalized_pixels, - &pixelformat, - *frames, pixelformat, - *psx, *psy); - for (n = 0; n < frame_count; ++n) { - frames[n] = normalized_pixels + *psx * *psy * n; - } - *dst_pixelformat = PIXELFORMAT_PAL8; + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + free(frame->pixels); + frame->pixels = normalized_pixels; break; default: - *dst_pixelformat = pixelformat; break; } - for (n = 0; n < frame_count; ++n) { - ret = clip(frames[n], *psx, *psy, depth, psettings->clipx, psettings->clipy, - psettings->clipwidth, psettings->clipheight, *dst_pixelformat); - if (ret != 0) { - return ret; - } + ret = clip(frame->pixels, + frame->width, + frame->height, + frame->pixelformat, + psettings->clipx, + psettings->clipy, + psettings->clipwidth, + psettings->clipheight); + if (ret != 0) { + return ret; } - *psx = psettings->clipwidth; - *psy = psettings->clipheight; + frame->width = psettings->clipwidth; + frame->height = psettings->clipheight; } return 0; @@ -876,13 +884,7 @@ load_image_callback(sixel_frame_t *frame, void *data) /* evaluate -w, -h, and -c option: crop/scale input source */ if (psettings->clipfirst) { /* clipping */ - nret = do_crop(&frame->pixels, - 1, - &frame->width, - &frame->height, - frame->pixelformat, - &frame->pixelformat, - psettings); + nret = do_crop(frame, psettings); if (nret != 0) { goto end; } @@ -911,13 +913,7 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* clipping */ - nret = do_crop(&frame->pixels, - 1, - &frame->width, - &frame->height, - frame->pixelformat, - &frame->pixelformat, - psettings); + nret = do_crop(frame, psettings); if (nret != 0) { goto end; } From 4c97cf5f41e5196da269051b748fe2f3e5a6d689 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Apr 2015 23:26:33 +1100 Subject: [PATCH 137/451] Update .travis.yml to check --without-png configure option correctly --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4ab04993..35815161 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ before_install: - "if [ x$GCOV != x ]; then sudo pip install cpp-coveralls pyyaml; fi" before_script: - - "CC=$XCC ./configure --prefix=${PREFIX} ${DEBUG} ${HOST} ${GDKPIXBUF} ${GD} ${LIBCURL} ${GCOV} ${STATIC}" + - "CC=$XCC ./configure --prefix=${PREFIX} ${DEBUG} ${HOST} ${GDKPIXBUF} ${GD} ${LIBCURL} ${PNG} ${JPEG} ${GCOV} ${STATIC}" script: - "make" From 2daf7be70d327cecbf79d47c5226e7e5edf89c75 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Apr 2015 00:34:09 +1100 Subject: [PATCH 138/451] Fix broken sixel_helper_normalize_pixelforma(), return dst_pixelformat correctly --- converters/img2sixel.c | 27 +++++++++++++++++---------- src/pixelformat.c | 2 ++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 483f6e80..13ac113f 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -504,8 +504,10 @@ do_resize(sixel_frame_t *frame, settings_t *psettings) normalized_pixels = malloc(size); nret = sixel_helper_normalize_pixelformat(normalized_pixels, &frame->pixelformat, - frame->pixels, frame->pixelformat, - frame->width, frame->height); + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); if (nret != 0) { free(normalized_pixels); return nret; @@ -566,14 +568,6 @@ clip(unsigned char *pixels, switch (pixelformat) { case PIXELFORMAT_PAL8: case PIXELFORMAT_G8: - dst = pixels; - src = pixels + cy * sx * 1 + cx * 1; - for (y = 0; y < ch; y++) { - memmove(dst, src, cw * 1); - dst += (cw * 1); - src += (sx * 1); - } - break; case PIXELFORMAT_RGB888: dst = pixels; src = pixels + cy * sx * depth + cx * depth; @@ -624,6 +618,10 @@ do_crop(sixel_frame_t *frame, settings_t *psettings) frame->pixelformat, frame->width, frame->height); + if (ret != 0) { + free(normalized_pixels); + return ret; + } free(frame->pixels); frame->pixels = normalized_pixels; break; @@ -631,6 +629,15 @@ do_crop(sixel_frame_t *frame, settings_t *psettings) break; } + switch (frame->pixelformat) { + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + puts("aaa"); + default: + break; + } + ret = clip(frame->pixels, frame->width, frame->height, diff --git a/src/pixelformat.c b/src/pixelformat.c index 2fb2f1ad..3c097a15 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -258,9 +258,11 @@ sixel_helper_normalize_pixelformat( case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: + *dst_pixelformat = PIXELFORMAT_PAL8; return expand_palette(dst, src, width, height, src_pixelformat); case PIXELFORMAT_PAL8: memcpy(dst, src, width * height); + *dst_pixelformat = src_pixelformat; break; default: return (-1); From 1ea3e1c3b63c1916020ef8a23d12d36736503294 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Apr 2015 01:49:55 +1100 Subject: [PATCH 139/451] Suppress a GCC warning when specified --with-gdk-pixbuf2 configure option --- src/loader.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/loader.c b/src/loader.c index 700d5ff9..dbe57f1d 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1085,7 +1085,6 @@ load_with_gdkpixbuf( { GdkPixbuf *pixbuf; GdkPixbufAnimation *animation; - unsigned char *pixels = NULL; GdkPixbufLoader *loader; #if 1 GdkPixbufAnimationIter *it; From 6d2f24e699214b6fce70bf3d9129f2e2ef1f5985 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Apr 2015 01:58:13 +1100 Subject: [PATCH 140/451] Minor fix --- src/loader.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/loader.c b/src/loader.c index dbe57f1d..29d1c379 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1139,12 +1139,10 @@ load_with_gdkpixbuf( g_time_val_add(&time, frame->delay * 1000); frame->delay /= 10; pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(it); - frame->pixels = gdk_pixbuf_get_pixels(pixbuf); - if (pixbuf == NULL) { - pixels = NULL; break; } + frame->pixels = gdk_pixbuf_get_pixels(pixbuf); frame->width = gdk_pixbuf_get_width(pixbuf); frame->height = gdk_pixbuf_get_height(pixbuf); if (gdk_pixbuf_get_has_alpha(pixbuf)) { From cb2b6cfed45bc7dd25b6c67347387711f3252b95 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Apr 2015 02:52:52 +1100 Subject: [PATCH 141/451] Fix a double free error in gdk-pixbuf loader --- converters/img2sixel.c | 2 -- src/loader.c | 39 ++++++++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 13ac113f..646ce1da 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -312,8 +312,6 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) } end: - free(frame->palette); - return ret; } diff --git a/src/loader.c b/src/loader.c index 29d1c379..1475d57d 100644 --- a/src/loader.c +++ b/src/loader.c @@ -896,11 +896,12 @@ load_with_builtin( frame = malloc(sizeof(sixel_frame_t)); if (frame == NULL) { - goto error; + return SIXEL_FAILED; } memset(frame, 0, sizeof(sixel_frame_t)); frame->pixels = NULL; + frame->palette = NULL; frame->frame_no = 0; frame->loop_count = 0; @@ -1091,6 +1092,8 @@ load_with_gdkpixbuf( GTimeVal time; #endif sixel_frame_t *frame; + int stride; + int ret = SIXEL_FAILED; (void) fuse_palette; (void) reqcolors; @@ -1098,11 +1101,12 @@ load_with_gdkpixbuf( frame = malloc(sizeof(sixel_frame_t)); if (frame == NULL) { - goto error; + return SIXEL_FAILED; } memset(frame, 0, sizeof(sixel_frame_t)); frame->pixels = NULL; + frame->palette = NULL; frame->loop_count = 0; #if (!GLIB_CHECK_VERSION(2, 36, 0)) @@ -1115,12 +1119,18 @@ load_with_gdkpixbuf( if (!animation || fstatic || gdk_pixbuf_animation_is_static_image(animation)) { pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); if (pixbuf == NULL) { - return SIXEL_FAILED; + goto end; } frame->frame_no = 0; - frame->pixels = gdk_pixbuf_get_pixels(pixbuf); frame->width = gdk_pixbuf_get_width(pixbuf); frame->height = gdk_pixbuf_get_height(pixbuf); + stride = gdk_pixbuf_get_rowstride(pixbuf); + frame->pixels = malloc(frame->height * stride); + if (frame->pixels == NULL) { + goto end; + } + memcpy(frame->pixels, gdk_pixbuf_get_pixels(pixbuf), + frame->height * stride); if (gdk_pixbuf_get_has_alpha(pixbuf)) { frame->pixelformat = PIXELFORMAT_RGBA8888; } else { @@ -1142,9 +1152,15 @@ load_with_gdkpixbuf( if (pixbuf == NULL) { break; } - frame->pixels = gdk_pixbuf_get_pixels(pixbuf); frame->width = gdk_pixbuf_get_width(pixbuf); frame->height = gdk_pixbuf_get_height(pixbuf); + stride = gdk_pixbuf_get_rowstride(pixbuf); + frame->pixels = malloc(frame->height * stride); + if (frame->pixels == NULL) { + goto end; + } + memcpy(frame->pixels, gdk_pixbuf_get_pixels(pixbuf), + frame->height * stride); if (gdk_pixbuf_get_has_alpha(pixbuf)) { frame->pixelformat = PIXELFORMAT_RGBA8888; } else { @@ -1166,16 +1182,17 @@ load_with_gdkpixbuf( } } } - gdk_pixbuf_loader_close(loader, NULL); - g_object_unref(loader); - - return SIXEL_SUCCESS; + ret = SIXEL_SUCCESS; -error: +end: + gdk_pixbuf_loader_close(loader, NULL); + g_object_unref(loader); + free(frame->pixels); + free(frame->palette); free(frame); - return SIXEL_FAILED; + return ret; } #endif /* HAVE_GDK_PIXBUF2 */ From 2f72490ad09790d3d567437cb907005307c06fb3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Apr 2015 20:17:13 +1100 Subject: [PATCH 142/451] Detect if the image has multi-frames by builtin gif loader --- converters/img2sixel.c | 50 +++++++++--------------------------------- include/sixel.h.in | 1 + src/loader.c | 8 ++++++- src/stb_image.h | 3 +++ 4 files changed, 21 insertions(+), 41 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 646ce1da..867cc5f0 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -724,7 +724,6 @@ output_sixel_without_macro( #if HAVE_USLEEP && HAVE_CLOCK start = clock(); #endif -// printf("\033[H"); fflush(stdout); #if HAVE_USLEEP if (!psettings->fignore_delay && delay > 0) { @@ -793,50 +792,12 @@ output_sixel_with_macro( printf("\033\\"); } if (psettings->macro_number < 0) { -// printf("\033[H"); fflush(stdout); printf("\033[%d*z", frame_no); - } -#if HAVE_USLEEP - if (delay > 0 && !psettings->fignore_delay) { -# if HAVE_CLOCK - dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; - lag = 0; -# else - dulation = 0; -# endif - if (dulation < 10000 * delay) { - usleep(10000 * delay - dulation); - } else { - lag = 10000 * delay - dulation; - } - } -#endif -#if HAVE_SIGNAL - if (signaled) { - return SIXEL_INTERRUPTED; - } -#endif - - if (signaled) { - if (psettings->f8bit) { - printf("\x9c"); - } else { - printf("\x1b\\"); - } - } - - if (psettings->macro_number < 0) { -#if HAVE_USLEEP && HAVE_CLOCK - start = clock(); -#endif -// printf("\033[H"); - printf("\033[%d*z", frame_no); - fflush(stdout); #if HAVE_USLEEP if (delay > 0 && !psettings->fignore_delay) { # if HAVE_CLOCK - dulation = (clock() - start) * 1000000 / CLOCKS_PER_SEC - lag; + dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; lag = 0; # else dulation = 0; @@ -851,6 +812,11 @@ output_sixel_with_macro( } #if HAVE_SIGNAL if (signaled) { + if (psettings->f8bit) { + printf("\x9c"); + } else { + printf("\x1b\\"); + } return SIXEL_INTERRUPTED; } #endif @@ -964,6 +930,10 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_output_set_penetrate_multiplexer(output, psettings->penetrate_multiplexer); sixel_output_set_encode_policy(output, psettings->encode_policy); + if (frame->multiframe) { + printf("\033[H"); + } + /* output sixel: junction of multi-frame processing strategy */ if (psettings->fuse_macro) { /* -u option */ /* use macro */ diff --git a/include/sixel.h.in b/include/sixel.h.in index a79015f6..c7369f50 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -438,6 +438,7 @@ typedef struct sixel_frame { int delay; /* delay in msec */ int frame_no; /* frame number */ int loop_count; /* loop count */ + int multiframe; /* whether the image has multiple frames */ } sixel_frame_t; typedef int (* sixel_load_image_function)(sixel_frame_t /* in */ *frame, void /* in/out */ *context); diff --git a/src/loader.c b/src/loader.c index 1475d57d..7330eb69 100644 --- a/src/loader.c +++ b/src/loader.c @@ -970,6 +970,7 @@ load_with_builtin( stbi__start_mem(&s, pchunk->buffer, pchunk->size); memset(&g, 0, sizeof(g)); + g.loop_count = (-1); frame->frame_no = 0; for (;;) { @@ -1010,6 +1011,7 @@ load_with_builtin( stbi_failure_reason()); goto error; } + frame->multiframe = (g.loop_count != (-1)); ret = fn_load(frame, context); if (ret != 0) { @@ -1023,6 +1025,9 @@ load_with_builtin( ++frame->loop_count; + if (g.loop_count == (-1)) { + break; + } if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { break; } @@ -1166,9 +1171,10 @@ load_with_gdkpixbuf( } else { frame->pixelformat = PIXELFORMAT_RGB888; } - frame->frame_no++; + frame->multiframe = 1; gdk_pixbuf_animation_iter_advance(it, &time); fn_load(frame, context); + frame->frame_no++; } ++frame->loop_count; diff --git a/src/stb_image.h b/src/stb_image.h index 9d1a085c..daa3ac10 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -5349,6 +5349,7 @@ typedef struct int line_size; int loop_count; int delay; + int is_multiframe; } stbi__gif; static int stbi__gif_test_raw(stbi__context *s) @@ -5688,6 +5689,8 @@ static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int stbi__gif g; memset(&g, 0, sizeof(g)); + g.loop_count = -1; + u = stbi__gif_load_next(s, &g, comp, req_comp, NULL); if (u == (stbi_uc *) s) u = 0; // end of animated gif marker if (u) { From 25ae02ff8d06ed4919f9147fe82edeff0bea6fb1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Apr 2015 00:42:47 +0900 Subject: [PATCH 143/451] Scroll the terminal on demand when playing gif animation --- converters/img2sixel.c | 51 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 867cc5f0..8bfe5761 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -58,6 +58,9 @@ # include #endif +#include +#include + #if HAVE_SIGNAL_H # include #endif @@ -831,6 +834,50 @@ typedef struct sixel_callback_context { } sixel_callback_context_t; +static void +scroll_on_demand(sixel_frame_t const *frame) +{ + struct winsize size = {0, 0, 0, 0}; + struct termios old_termios; + struct termios new_termios; + int fd1 = fileno(stdin); + int fd2 = fileno(stdout); + int row = 0; + int col = 0; + int n; + + if (isatty(fd1) && isatty(fd2)) { + ioctl(fd2, TIOCGWINSZ, &size); + if (size.ws_ypixel > 0) { + if (frame->loop_count == 0 && frame->frame_no == 0) { + tcgetattr(fd1, &old_termios); + memcpy(&new_termios, &old_termios, sizeof(old_termios)); + new_termios.c_lflag &= ~(ECHO | ICANON); + new_termios.c_cc[VMIN] = 1; + new_termios.c_cc[VTIME] = 0; + tcsetattr(fd1, TCSAFLUSH, &new_termios); + printf("\033[6n"); + fflush(stdout); + scanf("\033[%d;%dR", &row, &col); + tcsetattr(fd1, TCSAFLUSH, &old_termios); + n = frame->height * size.ws_row / size.ws_ypixel + 1 + + row - size.ws_row; + if (n > 0) { + printf("\033[%dS\033[%dA", n, n); + } + printf("\0337"); + } else { + printf("\0338"); + } + } else { + printf("\033[H"); + } + } else { + printf("\033[H"); + } +} + + static int load_image_callback(sixel_frame_t *frame, void *data) { @@ -930,8 +977,8 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_output_set_penetrate_multiplexer(output, psettings->penetrate_multiplexer); sixel_output_set_encode_policy(output, psettings->encode_policy); - if (frame->multiframe) { - printf("\033[H"); + if (frame->multiframe && !psettings->fstatic) { + scroll_on_demand(frame); } /* output sixel: junction of multi-frame processing strategy */ From 0d907f2242a176e321e5e51d5c94c52f9d1ccb80 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Apr 2015 00:51:41 +0900 Subject: [PATCH 144/451] Check the availability of isatty(), termios.h, sys/ioctl.h --- config.h.in | 9 +++++++++ configure | 7 +++++-- configure.ac | 7 +++++-- converters/img2sixel.c | 13 +++++++++++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/config.h.in b/config.h.in index 79f80cb4..613800d6 100644 --- a/config.h.in +++ b/config.h.in @@ -102,6 +102,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Define to 1 if you have the `isatty' function. */ +#undef HAVE_ISATTY + /* whether jpeg codec library is available */ #undef HAVE_JPEG @@ -173,6 +176,9 @@ /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H @@ -191,6 +197,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UNISTD_H +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMIOS_H + /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H diff --git a/configure b/configure index 6f764b02..24959b01 100755 --- a/configure +++ b/configure @@ -13286,7 +13286,9 @@ for ac_header in memory.h \ time.h \ signal.h \ sys/select.h \ - sys/signal.h + sys/signal.h \ + termios.h \ + sys/ioctl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -13488,7 +13490,8 @@ for ac_func in memcpy \ clock \ clearerr \ stat \ - setjmp + setjmp \ + isatty do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/configure.ac b/configure.ac index 23770a52..ec1d11a7 100644 --- a/configure.ac +++ b/configure.ac @@ -166,7 +166,9 @@ AC_CHECK_HEADERS([memory.h \ time.h \ signal.h \ sys/select.h \ - sys/signal.h]) + sys/signal.h \ + termios.h \ + sys/ioctl.h]) # Checks for typedefs, structures, and compiler characteristics. #AC_CHECK_HEADER_STDBOOL @@ -200,7 +202,8 @@ AC_CHECK_FUNCS([memcpy \ clock \ clearerr \ stat \ - setjmp]) + setjmp \ + isatty]) # for HDR AC_CHECK_FUNCS([strtol pow]) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 8bfe5761..9e888129 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -58,8 +58,13 @@ # include #endif -#include -#include +#if HAVE_TERMIOS_H +# include +#endif + +#if HAVE_SYS_IOCTL_H +# include +#endif #if HAVE_SIGNAL_H # include @@ -837,6 +842,7 @@ typedef struct sixel_callback_context { static void scroll_on_demand(sixel_frame_t const *frame) { +#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY struct winsize size = {0, 0, 0, 0}; struct termios old_termios; struct termios new_termios; @@ -875,6 +881,9 @@ scroll_on_demand(sixel_frame_t const *frame) } else { printf("\033[H"); } +#else + printf("\033[H"); +#endif } From 27e1418973e6158a5b64c7b6e057d660ee8cf6e0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Apr 2015 01:12:44 +0900 Subject: [PATCH 145/451] Set timeout on waiting CPR response --- Makefile.in | 2 +- converters/img2sixel.c | 41 +++++++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/Makefile.in b/Makefile.in index a68c2474..443934ed 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 9e888129..6b121185 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -682,14 +682,14 @@ print_palette(sixel_dither_t *dither) #if HAVE_SYS_SELECT_H static int -wait_stdin(void) +wait_stdin(int usec) { fd_set rfds; struct timeval tv; int ret; - tv.tv_sec = 1; - tv.tv_usec = 0; + tv.tv_sec = usec / 1000000; + tv.tv_usec = usec % 1000000; FD_ZERO(&rfds); FD_SET(STDIN_FILENO, &rfds); ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); @@ -846,32 +846,37 @@ scroll_on_demand(sixel_frame_t const *frame) struct winsize size = {0, 0, 0, 0}; struct termios old_termios; struct termios new_termios; - int fd1 = fileno(stdin); - int fd2 = fileno(stdout); int row = 0; int col = 0; int n; - if (isatty(fd1) && isatty(fd2)) { - ioctl(fd2, TIOCGWINSZ, &size); + if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { + ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); if (size.ws_ypixel > 0) { if (frame->loop_count == 0 && frame->frame_no == 0) { - tcgetattr(fd1, &old_termios); + tcgetattr(STDIN_FILENO, &old_termios); memcpy(&new_termios, &old_termios, sizeof(old_termios)); new_termios.c_lflag &= ~(ECHO | ICANON); new_termios.c_cc[VMIN] = 1; new_termios.c_cc[VTIME] = 0; - tcsetattr(fd1, TCSAFLUSH, &new_termios); + tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); printf("\033[6n"); fflush(stdout); - scanf("\033[%d;%dR", &row, &col); - tcsetattr(fd1, TCSAFLUSH, &old_termios); - n = frame->height * size.ws_row / size.ws_ypixel + 1 - + row - size.ws_row; - if (n > 0) { - printf("\033[%dS\033[%dA", n, n); + if (wait_stdin(1000000) != (-1)) { + if (scanf("\033[%d;%dR", &row, &col) == 2) { + tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); + n = frame->height * size.ws_row / size.ws_ypixel + 1 + + row - size.ws_row; + if (n > 0) { + printf("\033[%dS\033[%dA", n, n); + } + printf("\0337"); + } else { + printf("\033[H"); + } + } else { + printf("\033[H"); } - printf("\0337"); } else { printf("\0338"); } @@ -1128,8 +1133,8 @@ convert_to_sixel(char const *filename, settings_t *psettings) #endif /* HAVE_FSEEK */ while (!signaled) { #if HAVE_SYS_SELECT_H - nret = wait_stdin(); - if (nret == -1) { + nret = wait_stdin(1000000); + if (nret == (-1)) { return nret; } #endif /* HAVE_SYS_SELECT_H */ From eb288ad5493852d03e7d3033fff98f4eb1480144 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Apr 2015 01:18:17 +0900 Subject: [PATCH 146/451] Fix a gcc warning (unused parameter) --- converters/img2sixel.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 6b121185..e02a567a 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -854,15 +854,18 @@ scroll_on_demand(sixel_frame_t const *frame) ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); if (size.ws_ypixel > 0) { if (frame->loop_count == 0 && frame->frame_no == 0) { + /* set the terminal to cbreak mode */ tcgetattr(STDIN_FILENO, &old_termios); memcpy(&new_termios, &old_termios, sizeof(old_termios)); new_termios.c_lflag &= ~(ECHO | ICANON); new_termios.c_cc[VMIN] = 1; new_termios.c_cc[VTIME] = 0; tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + + /* request cursor position report */ printf("\033[6n"); fflush(stdout); - if (wait_stdin(1000000) != (-1)) { + if (wait_stdin(1000000) != (-1)) { /* wait 1 sec */ if (scanf("\033[%d;%dR", &row, &col) == 2) { tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); n = frame->height * size.ws_row / size.ws_ypixel + 1 @@ -887,6 +890,7 @@ scroll_on_demand(sixel_frame_t const *frame) printf("\033[H"); } #else + (void) frame; printf("\033[H"); #endif } From 9ff06edf1dcf66b6a20ab4cf149f5c56c635bb13 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Apr 2015 01:37:32 +0900 Subject: [PATCH 147/451] Rebuild --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 443934ed..a68c2474 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ From c61a7354a80623e8e464c52a91ae1f783c1dc1da Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 19 Apr 2015 21:42:20 +0900 Subject: [PATCH 148/451] Load gif as PAL8 pixelformat --- src/loader.c | 54 ++++++++++++++++++++++++++++--------------------- src/stb_image.h | 14 ++----------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/src/loader.c b/src/loader.c index 7330eb69..5f55c378 100644 --- a/src/loader.c +++ b/src/loader.c @@ -838,10 +838,11 @@ chunk_is_jpeg(chunk_t const *chunk) static int -sixel_strip_alpha(unsigned char *pixels, - int width, - int height, - unsigned char *bgcolor) +sixel_strip_alpha( + unsigned char /* in/out */ *pixels, + int /* in */ width, + int /* in */ height, + unsigned char /* in */ *bgcolor) { int x; int y; @@ -889,6 +890,8 @@ load_with_builtin( int depth; sixel_frame_t *frame; int ret = (-1); + int i; + unsigned char palette[256 * 3]; #if !defined(HAVE_LIBPNG) (void) bgcolor; @@ -985,28 +988,28 @@ load_with_builtin( frame->width = g.w; frame->height = g.h; - frame->pixels = p; frame->delay = g.delay; - if (frame->pixels) { - switch (depth) { - case 3: - frame->pixelformat = PIXELFORMAT_RGB888; - break; - case 4: - /* RGBA to RGB */ - ret = sixel_strip_alpha(frame->pixels, frame->width, frame->height, bgcolor); - if (ret != 0) { - stbi_image_free(frame->pixels); - goto error; - } - frame->pixelformat = PIXELFORMAT_RGB888; - break; - default: - stbi_image_free(frame->pixels); - fprintf(stderr, "load_with_builtin() failed.\n" "reason: unknwon pixel-format.\n"); - goto error; + frame->ncolors = 2 << (g.flags & 7); + frame->palette = palette; + if (frame->ncolors <= reqcolors) { + frame->pixelformat = PIXELFORMAT_PAL8; + frame->pixels = p; + for (i = 0; i < frame->ncolors; ++i) { + frame->palette[i * 3 + 0] = g.color_table[i * 4 + 2]; + frame->palette[i * 3 + 1] = g.color_table[i * 4 + 1]; + frame->palette[i * 3 + 2] = g.color_table[i * 4 + 0]; } } else { + frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixels = malloc(g.w * g.h * 3); + for (i = 0; i < g.w * g.h; ++i) { + frame->pixels[i * 3 + 0] = g.color_table[p[i] * 4 + 2]; + frame->pixels[i * 3 + 1] = g.color_table[p[i] * 4 + 1]; + frame->pixels[i * 3 + 2] = g.color_table[p[i] * 4 + 0]; + } + free(p); + } + if (frame->pixels == NULL) { fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", stbi_failure_reason()); goto error; @@ -1061,6 +1064,11 @@ load_with_builtin( } } + if (frame->pixelformat == PIXELFORMAT_RGBA8888) { + sixel_strip_alpha(frame->pixels, frame->width, frame->height, bgcolor); + frame->pixelformat = PIXELFORMAT_RGB888; + } + ret = fn_load(frame, context); if (ret != 0) { goto error; diff --git a/src/stb_image.h b/src/stb_image.h index daa3ac10..3c7c7388 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -5422,8 +5422,6 @@ static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) { - stbi_uc *p, *c; - // recurse to decode the prefixes, since the linked-list is backwards, // and working backwards through an interleaved image would be nasty if (g->codes[code].prefix >= 0) @@ -5431,16 +5429,8 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) if (g->cur_y >= g->max_y) return; - p = &g->out[g->cur_x + g->cur_y]; - c = &g->color_table[g->codes[code].suffix * 4]; - - if (c[3] >= 128) { - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; + g->out[g->cur_x + g->cur_y] = g->codes[code].suffix; + g->cur_x++; if (g->cur_x >= g->max_x) { g->cur_x = g->start_x; From 6ffba96e50eccdfd1b7554a7b5ad4f1c035a03f9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 22 Apr 2015 19:42:17 +0900 Subject: [PATCH 149/451] Convert PIXELFORMAT_ARGB8888 into PIXELFORMAT_RGB888 in sixel_strip_alpha() --- src/loader.c | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/loader.c b/src/loader.c index 5f55c378..7b8d5a60 100644 --- a/src/loader.c +++ b/src/loader.c @@ -839,9 +839,7 @@ chunk_is_jpeg(chunk_t const *chunk) static int sixel_strip_alpha( - unsigned char /* in/out */ *pixels, - int /* in */ width, - int /* in */ height, + sixel_frame_t /* in */ *frame, unsigned char /* in */ *bgcolor) { int x; @@ -850,22 +848,36 @@ sixel_strip_alpha( unsigned char *dst; unsigned char alpha; - src = dst = pixels; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - if (bgcolor) { - alpha = src[3]; - *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; - *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; - *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; - src++; - } else { - *dst++ = *src++; /* R */ - *dst++ = *src++; /* R */ - *dst++ = *src++; /* R */ - src++; /* A */ + src = dst = frame->pixels; + + switch (frame->pixelformat) { + case PIXELFORMAT_RGBA8888: + case PIXELFORMAT_ARGB8888: + for (y = 0; y < frame->height; y++) { + for (x = 0; x < frame->width; x++) { + if (bgcolor) { + alpha = src[3]; + *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; + src++; + } else if (frame->pixelformat == PIXELFORMAT_ARGB8888){ + src++; /* A */ + *dst++ = *src++; /* R */ + *dst++ = *src++; /* G */ + *dst++ = *src++; /* B */ + } else if (frame->pixelformat == PIXELFORMAT_RGBA8888){ + *dst++ = *src++; /* R */ + *dst++ = *src++; /* G */ + *dst++ = *src++; /* B */ + src++; /* A */ + } } } + frame->pixelformat = PIXELFORMAT_RGB888; + break; + default: + break; } return 0; @@ -1064,9 +1076,9 @@ load_with_builtin( } } - if (frame->pixelformat == PIXELFORMAT_RGBA8888) { - sixel_strip_alpha(frame->pixels, frame->width, frame->height, bgcolor); - frame->pixelformat = PIXELFORMAT_RGB888; + ret = sixel_strip_alpha(frame, bgcolor); + if (ret != 0) { + goto error; } ret = fn_load(frame, context); From 1f2ae6404cf553874ee39a5ab3c0276bd92c37f1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Apr 2015 20:47:27 +0900 Subject: [PATCH 150/451] Retrieve transparent color index from gif --- include/sixel.h.in | 1 + src/loader.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/include/sixel.h.in b/include/sixel.h.in index c7369f50..9c75e1ae 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -439,6 +439,7 @@ typedef struct sixel_frame { int frame_no; /* frame number */ int loop_count; /* loop count */ int multiframe; /* whether the image has multiple frames */ + int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ } sixel_frame_t; typedef int (* sixel_load_image_function)(sixel_frame_t /* in */ *frame, void /* in/out */ *context); diff --git a/src/loader.c b/src/loader.c index 7b8d5a60..f63e300f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1011,6 +1011,15 @@ load_with_builtin( frame->palette[i * 3 + 1] = g.color_table[i * 4 + 1]; frame->palette[i * 3 + 2] = g.color_table[i * 4 + 0]; } + if (g.lflags & 0x80) { + if (g.eflags & 0x01) { + frame->transparent = g.transparent; + } + } else if (g.flags & 0x80) { + if (g.eflags & 0x01) { + frame->transparent = g.transparent; + } + } } else { frame->pixelformat = PIXELFORMAT_RGB888; frame->pixels = malloc(g.w * g.h * 3); From 5adad9116f18a7cab4dbedb326d805d0b2d3e2d7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Apr 2015 20:52:07 +0900 Subject: [PATCH 151/451] Add new API: sixel_dither_set_transparent() --- include/sixel.h.in | 6 ++++++ src/dither.c | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/include/sixel.h.in b/include/sixel.h.in index c7369f50..018bb613 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -322,6 +322,12 @@ sixel_dither_set_pixelformat( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ pixelformat); /* one of enum pixelFormat */ +/* set transparent */ +void +sixel_dither_set_transparent( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ transparent); /* transparent color index */ + #ifdef __cplusplus } #endif diff --git a/src/dither.c b/src/dither.c index c18a50f7..93374ede 100644 --- a/src/dither.c +++ b/src/dither.c @@ -480,6 +480,15 @@ sixel_dither_set_pixelformat( } +void +sixel_dither_set_transparent( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ transparent) /* transparent color index */ +{ + dither->keycolor = transparent; +} + + unsigned char * sixel_dither_apply_palette(sixel_dither_t *dither, unsigned char *pixels, From 2f853b02ffc29fa15633be99b35d7fadf15800e8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Apr 2015 22:32:37 +0900 Subject: [PATCH 152/451] Pass the keycolor of gif to the encoder by using sixel_dither_set_transpaernt() --- converters/img2sixel.c | 35 +++++++++++++++-------------------- src/loader.c | 1 + 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e02a567a..bedcbce2 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -402,9 +402,7 @@ typedef struct Settings { static sixel_dither_t * prepare_palette(sixel_dither_t *former_dither, - unsigned char *frame, int sx, int sy, - unsigned char *palette, int ncolors, - int pixelformat, + sixel_frame_t const *frame, settings_t *psettings) { sixel_dither_t *dither; @@ -433,16 +431,19 @@ prepare_palette(sixel_dither_t *former_dither, return former_dither; } dither = prepare_builtin_palette(psettings->builtin_palette); - } else if (palette && pixelformat & FORMATTYPE_PALETTE) { - dither = sixel_dither_create(ncolors); + } else if (frame->palette && (frame->pixelformat & FORMATTYPE_PALETTE)) { + dither = sixel_dither_create(frame->ncolors); if (!dither) { return NULL; } - sixel_dither_set_palette(dither, palette); - sixel_dither_set_pixelformat(dither, pixelformat); - } else if (pixelformat == PIXELFORMAT_G8) { + sixel_dither_set_palette(dither, frame->palette); + sixel_dither_set_pixelformat(dither, frame->pixelformat); + if (frame->transparent != (-1)) { + sixel_dither_set_transparent(dither, frame->transparent); + } + } else if (frame->pixelformat == PIXELFORMAT_G8) { dither = sixel_dither_create(-1); - sixel_dither_set_pixelformat(dither, pixelformat); + sixel_dither_set_pixelformat(dither, frame->pixelformat); } else { if (former_dither) { sixel_dither_unref(former_dither); @@ -451,8 +452,9 @@ prepare_palette(sixel_dither_t *former_dither, if (!dither) { return NULL; } - ret = sixel_dither_initialize(dither, frame, sx, sy, - pixelformat, + ret = sixel_dither_initialize(dither, frame->pixels, + frame->width, frame->height, + frame->pixelformat, psettings->method_for_largest, psettings->method_for_rep, psettings->quality_mode); @@ -464,7 +466,7 @@ prepare_palette(sixel_dither_t *former_dither, if (histogram_colors <= psettings->reqcolors) { psettings->method_for_diffuse = DIFFUSE_NONE; } - sixel_dither_set_pixelformat(dither, pixelformat); + sixel_dither_set_pixelformat(dither, frame->pixelformat); } return dither; } @@ -956,14 +958,7 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* prepare dither context */ - dither = prepare_palette(dither, - frame->pixels, - frame->width, - frame->height, - frame->palette, - frame->ncolors, - frame->pixelformat, - psettings); + dither = prepare_palette(dither, frame, psettings); if (!dither) { nret = (-1); goto end; diff --git a/src/loader.c b/src/loader.c index f63e300f..5ce442b1 100644 --- a/src/loader.c +++ b/src/loader.c @@ -919,6 +919,7 @@ load_with_builtin( frame->palette = NULL; frame->frame_no = 0; frame->loop_count = 0; + frame->transparent = (-1); if (chunk_is_sixel(pchunk)) { frame->pixels = load_sixel(pchunk->buffer, From fd2886e2fe10ef3caf4a79e38ff71fa59d0fff70 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Apr 2015 22:37:04 +0900 Subject: [PATCH 153/451] Set default transparent color index in with_load_gdkpixbuf() and load_with_gd() --- src/loader.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/loader.c b/src/loader.c index 5ce442b1..c569776a 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1143,6 +1143,7 @@ load_with_gdkpixbuf( frame->pixels = NULL; frame->palette = NULL; frame->loop_count = 0; + frame->transparent = (-1); #if (!GLIB_CHECK_VERSION(2, 36, 0)) g_type_init(); @@ -1329,6 +1330,7 @@ load_with_gd( frame->pixels = NULL; frame->loop_count = 0; + frame->transparent = (-1); switch(detect_file_format(pchunk->size, pchunk->buffer)) { #if 0 From d9d04fcd9eb7284e255399930fcba8e1f8e209ca Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Apr 2015 23:15:35 +0900 Subject: [PATCH 154/451] Don't output palette definition of the keycolor --- src/tosixel.c | 139 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 89 insertions(+), 50 deletions(-) diff --git a/src/tosixel.c b/src/tosixel.c index 14a21425..b2c9f4cd 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -282,6 +282,90 @@ sixel_encode_header(int width, int height, sixel_output_t *context) } +static int +output_rgb_palette_definition( + sixel_output_t /* in */ *output, + unsigned char /* in */ *palette, + int /* in */ n, + int /* in */ keycolor +) +{ + int nwrite; + + if (n != keycolor) { + /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ + nwrite = sprintf((char *)output->buffer + output->pos, + "#%d;2;%d;%d;%d", + n, + (palette[n * 3 + 0] * 100 + 127) / 255, + (palette[n * 3 + 1] * 100 + 127) / 255, + (palette[n * 3 + 2] * 100 + 127) / 255); + if (nwrite <= 0) { + return (-1); + } + sixel_advance(output, nwrite); + } + + return (0); +} + + +static int +output_hls_palette_definition( + sixel_output_t /* in */ *output, + unsigned char /* in */ *palette, + int /* in */ n, + int /* in */ keycolor +) +{ + int h; + int l; + int s; + int r; + int g; + int b; + int max; + int min; + int nwrite; + + if (n != keycolor) { + r = palette[n * 3 + 0]; + g = palette[n * 3 + 1]; + b = palette[n * 3 + 2]; + max = r > g ? (r > b ? r: b): (g > b ? g: b); + min = r < g ? (r < b ? r: b): (g < b ? g: b); + l = ((max + min) * 100 + 255) / 510; + if (max == min) { + h = s = 0; + } else { + if (l < 50) { + s = ((max - min) * 100 + 127) / (max + min); + } else { + s = ((max - min) * 100 + 127) / ((255 - max) + (255 - min)); + } + if (r == max) { + h = 120 + (g - b) * 60 / (max - min); + } else if (g == max) { + h = 240 + (b - r) * 60 / (max - min); + } else if (r < g) /* if (b == max) */ { + h = 360 + (r - g) * 60 / (max - min); + } else { + h = 0 + (r - g) * 60 / (max - min); + } + } + /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ + nwrite = sprintf((char *)output->buffer + output->pos, + "#%d;1;%d;%d;%d", n, h, l, s); + if (nwrite <= 0) { + return (-1); + } + sixel_advance(output, nwrite); + } + + return (0); +} + + static int sixel_encode_body(unsigned char *pixels, int width, int height, unsigned char *palette, int ncolors, int keycolor, @@ -293,7 +377,6 @@ sixel_encode_body(unsigned char *pixels, int width, int height, int len, pix; unsigned char *map = NULL; sixel_node_t *np, *tp, top; - int nwrite; int nret = (-1); if (ncolors < 1) { @@ -315,64 +398,20 @@ sixel_encode_body(unsigned char *pixels, int width, int height, memset(map, 0, len); #endif - if (!bodyonly && (ncolors != 2 || keycolor == -1)) { + if (!bodyonly && (ncolors != 2 || keycolor == (-1))) { if (context->palette_type == PALETTETYPE_HLS) { for (n = 0; n < ncolors; n++) { - int h; - int l; - int s; - int r, g, b, max, min; - if (palstate && palstate[n] != PALETTE_CHANGE) { - continue; - } - r = palette[n * 3 + 0]; - g = palette[n * 3 + 1]; - b = palette[n * 3 + 2]; - max = r > g ? (r > b ? r: b): (g > b ? g: b); - min = r < g ? (r < b ? r: b): (g < b ? g: b); - l = ((max + min) * 100 + 255) / 510; - if (max == min) { - h = s = 0; - } else { - if (l < 50) { - s = ((max - min) * 100 + 127) / (max + min); - } else { - s = ((max - min) * 100 + 127) / ((255 - max) + (255 - min)); - } - if (r == max) { - h = 120 + (g - b) * 60 / (max - min); - } else if (g == max) { - h = 240 + (b - r) * 60 / (max - min); - } else if (r < g) /* if (b == max) */ { - h = 360 + (r - g) * 60 / (max - min); - } else { - h = 0 + (r - g) * 60 / (max - min); - } - } - /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ - nwrite = sprintf((char *)context->buffer + context->pos, - "#%d;1;%d;%d;%d", n, h, l, s); - if (nwrite <= 0) { + nret = output_hls_palette_definition(context, palette, n, keycolor); + if (nret != 0) { goto end; } - sixel_advance(context, nwrite); } } else { for (n = 0; n < ncolors; n++) { - if (palstate && palstate[n] != PALETTE_CHANGE) { - continue; - } - /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ - nwrite = sprintf((char *)context->buffer + context->pos, - "#%d;2;%d;%d;%d", - n, - (palette[n * 3 + 0] * 100 + 127) / 255, - (palette[n * 3 + 1] * 100 + 127) / 255, - (palette[n * 3 + 2] * 100 + 127) / 255); - if (nwrite <= 0) { + nret = output_rgb_palette_definition(context, palette, n, keycolor); + if (nret != 0) { goto end; } - sixel_advance(context, nwrite); } } } From 27a45b6ca634817f368a19a7e5b0b74c1d4b8bf1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Apr 2015 23:46:43 +0900 Subject: [PATCH 155/451] Minor fix --- converters/img2sixel.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index bedcbce2..27c839b5 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -487,10 +487,12 @@ do_resize(sixel_frame_t *frame, settings_t *psettings) psettings->pixelheight = frame->height * psettings->percentheight / 100; } if (psettings->pixelwidth > 0 && psettings->pixelheight <= 0) { - psettings->pixelheight = frame->height * psettings->pixelwidth / frame->width; + psettings->pixelheight + = frame->height * psettings->pixelwidth / frame->width; } if (psettings->pixelheight > 0 && psettings->pixelwidth <= 0) { - psettings->pixelwidth = frame->width * psettings->pixelheight / frame->height; + psettings->pixelwidth + = frame->width * psettings->pixelheight / frame->height; } if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { @@ -980,14 +982,16 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* create output context */ - if (psettings->fuse_macro || psettings->macro_number >= 0) { /* -u or -n option */ + if (psettings->fuse_macro || psettings->macro_number >= 0) { + /* -u or -n option */ output = sixel_output_create(sixel_hex_write_callback, stdout); } else { output = sixel_output_create(sixel_write_callback, stdout); } sixel_output_set_8bit_availability(output, psettings->f8bit); sixel_output_set_palette_type(output, psettings->palette_type); - sixel_output_set_penetrate_multiplexer(output, psettings->penetrate_multiplexer); + sixel_output_set_penetrate_multiplexer( + output, psettings->penetrate_multiplexer); sixel_output_set_encode_policy(output, psettings->encode_policy); if (frame->multiframe && !psettings->fstatic) { From 008ac9543eb517d5bfb6826579499ad351bb3a66 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 26 Apr 2015 00:18:03 +0900 Subject: [PATCH 156/451] Handle SIGINT correctly --- converters/img2sixel.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 27c839b5..f5e372c7 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -824,11 +824,8 @@ output_sixel_with_macro( } #if HAVE_SIGNAL if (signaled) { - if (psettings->f8bit) { - printf("\x9c"); - } else { - printf("\x1b\\"); - } + printf("\x1b\\"); + fflush(stdout); return SIXEL_INTERRUPTED; } #endif @@ -1033,23 +1030,18 @@ load_image_callback(sixel_frame_t *frame, void *data) psettings); } - if (nret != 0) { - goto end; - } - #if HAVE_SIGNAL if (signaled) { - if (sixel_output_get_8bit_availability(output)) { - printf("\x9c"); - } else { - printf("\x1b\\"); - } + printf("\x1b\\"); fflush(stdout); - return SIXEL_INTERRUPTED; + nret = SIXEL_INTERRUPTED; } #endif - nret = 0; + if (nret != 0) { + goto end; + } + fflush(stdout); end: From f8daa20cdc475a9cc823d9d02c357bd51cf9b672 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 26 Apr 2015 00:53:22 +0900 Subject: [PATCH 157/451] Prevent segmentation fault when receiving SIGINT during playing gif animation --- src/loader.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/loader.c b/src/loader.c index c569776a..a9af826e 100644 --- a/src/loader.c +++ b/src/loader.c @@ -903,7 +903,6 @@ load_with_builtin( sixel_frame_t *frame; int ret = (-1); int i; - unsigned char palette[256 * 3]; #if !defined(HAVE_LIBPNG) (void) bgcolor; @@ -1003,7 +1002,7 @@ load_with_builtin( frame->height = g.h; frame->delay = g.delay; frame->ncolors = 2 << (g.flags & 7); - frame->palette = palette; + frame->palette = malloc(frame->ncolors * 3); if (frame->ncolors <= reqcolors) { frame->pixelformat = PIXELFORMAT_PAL8; frame->pixels = p; @@ -1079,7 +1078,6 @@ load_with_builtin( frame->pixelformat = PIXELFORMAT_RGB888; break; default: - stbi_image_free(frame->pixels); fprintf(stderr, "load_with_builtin() failed.\n" "reason: unknown pixel-format.(depth: %d)\n", depth); goto error; @@ -1096,13 +1094,12 @@ load_with_builtin( goto error; } - return 0; - error: free(frame->pixels); free(frame->palette); free(frame); - return (-1); + + return ret; } @@ -1172,7 +1169,10 @@ load_with_gdkpixbuf( } else { frame->pixelformat = PIXELFORMAT_RGB888; } - fn_load(frame, context); + ret = fn_load(frame, context); + if (ret != SIXEL_SUCCESS) { + goto end; + } } else { g_get_current_time(&time); @@ -1204,7 +1204,10 @@ load_with_gdkpixbuf( } frame->multiframe = 1; gdk_pixbuf_animation_iter_advance(it, &time); - fn_load(frame, context); + ret = fn_load(frame, context); + if (ret != SIXEL_SUCCESS) { + goto end; + } frame->frame_no++; } From 71c45513879d73e329fd58120e2f8efa3b6b6a92 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 26 Apr 2015 01:04:52 +0900 Subject: [PATCH 158/451] Respect -B option regarding with GIF images with transparent index (for Issue #25) --- src/loader.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/loader.c b/src/loader.c index a9af826e..3c7c28a4 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1013,11 +1013,29 @@ load_with_builtin( } if (g.lflags & 0x80) { if (g.eflags & 0x01) { - frame->transparent = g.transparent; + if (bgcolor) { + frame->palette[g.transparent * 3 + 0] + = bgcolor[0]; + frame->palette[g.transparent * 3 + 1] + = bgcolor[1]; + frame->palette[g.transparent * 3 + 2] + = bgcolor[2]; + } else { + frame->transparent = g.transparent; + } } } else if (g.flags & 0x80) { if (g.eflags & 0x01) { - frame->transparent = g.transparent; + if (bgcolor) { + frame->palette[g.transparent * 3 + 0] + = bgcolor[0]; + frame->palette[g.transparent * 3 + 1] + = bgcolor[1]; + frame->palette[g.transparent * 3 + 2] + = bgcolor[2]; + } else { + frame->transparent = g.transparent; + } } } } else { From 59c446bd22140a42b2db207758658a5958c97c7e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 28 Apr 2015 00:44:59 +0900 Subject: [PATCH 159/451] Strip -lsixel-imageio from libsixel.pc --- libsixel.pc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsixel.pc.in b/libsixel.pc.in index db1f8244..6333f026 100644 --- a/libsixel.pc.in +++ b/libsixel.pc.in @@ -6,5 +6,5 @@ includedir=@includedir@ Name: libsixel Description: @PACKAGE_DESCRIPTION@ Version: @PACKAGE_VERSION@ -Libs: -L${libdir} -lsixel -lsixel-imageio +Libs: -L${libdir} -lsixel Cflags: -I${includedir} From 29e2f05020e3148ef27bf1c3429436371fc9893e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 00:07:28 +0900 Subject: [PATCH 160/451] Add reference counter to struct sixel_frame_t --- include/sixel.h.in | 1 + 1 file changed, 1 insertion(+) diff --git a/include/sixel.h.in b/include/sixel.h.in index be33d4e5..a73daae2 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -435,6 +435,7 @@ enum loopControl { }; typedef struct sixel_frame { + int ref; /* reference counter */ unsigned char *pixels; /* loaded pixel data */ unsigned char *palette; /* loaded palette data */ int width; /* frame width */ From fb5866107c1b16bb0e48d484a0f7426bf5792c7c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 01:41:56 +0900 Subject: [PATCH 161/451] Add frame.c/frame.h --- src/frame.c | 441 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/frame.h | 49 ++++++ 2 files changed, 490 insertions(+) create mode 100644 src/frame.c create mode 100644 src/frame.h diff --git a/src/frame.c b/src/frame.c new file mode 100644 index 00000000..2432b1d0 --- /dev/null +++ b/src/frame.c @@ -0,0 +1,441 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include + +#if HAVE_LIMITS_H +# include +#endif + +#if HAVE_INTTYPES_H +# include +#endif + +#include "frame.h" +#include "sixel.h" + + +sixel_frame_t * +sixel_frame_create() +{ + sixel_frame_t *frame; + + frame = malloc(sizeof(sixel_frame_t)); + if (frame == NULL) { + return NULL; + } + frame->ref = 1; + frame->pixels = NULL; + frame->palette = NULL; + frame->width = 0; + frame->height = 0; + frame->ncolors = (-1); + frame->pixelformat = PIXELFORMAT_RGB888; + frame->delay = 0; + frame->frame_no = 0; + frame->loop_count = 0; + frame->multiframe = 0; + frame->transparent = (-1); + + return frame; +} + + +void +sixel_frame_destroy(sixel_frame_t *frame) +{ + if (frame) { + free(frame->pixels); + free(frame->palette); + free(frame); + } +} + + +void +sixel_frame_ref(sixel_frame_t *frame) +{ + /* TODO: be thread safe */ + ++frame->ref; +} + + +void +sixel_frame_unref(sixel_frame_t *frame) +{ + /* TODO: be thread safe */ + if (frame != NULL && --frame->ref == 0) { + sixel_frame_destroy(frame); + } +} + + +int +sixel_frame_init( + sixel_frame_t *frame, + unsigned char *pixels, + int width, + int height, + int pixelformat, + unsigned char *palette, + int ncolors +) +{ + frame->pixels = pixels; + frame->width = width; + frame->height = height; + frame->pixelformat = pixelformat; + frame->palette = palette; + frame->ncolors = ncolors; + + return 0; +} + + +/* get pixels */ +unsigned char * +sixel_frame_get_pixels(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->pixels; +} + + +/* get palette */ +unsigned char * +sixel_frame_get_palette(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->palette; +} + + +/* get width */ +int +sixel_frame_get_width(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->width; +} + + +/* get height */ +int +sixel_frame_get_height(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->height; +} + + +/* get ncolors */ +int +sixel_frame_get_ncolors(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->ncolors; +} + + +/* get pixelformat */ +int +sixel_frame_get_pixelformat(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->pixelformat; +} + + +/* get transparent */ +int +sixel_frame_get_transparent(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->transparent; +} + + +/* get transparent */ +int +sixel_frame_get_multiframe(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->multiframe; +} + + +/* get delay */ +int +sixel_frame_get_delay(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->delay; +} + + +/* get frame no */ +int +sixel_frame_get_frame_no(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->frame_no; +} + + +/* get loop no */ +int +sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame) /* frame object */ +{ + return frame->loop_count; +} + + +/* set palette */ +void +sixel_frame_set_palette( + sixel_frame_t /* in */ *frame, /* frame object */ + unsigned char /* in */ *palette, + int /* in */ ncolors) +{ + frame->palette = palette; + frame->ncolors = ncolors; +} + + +int +sixel_strip_alpha( + sixel_frame_t /* in */ *frame, + unsigned char /* in */ *bgcolor +) +{ + int x; + int y; + unsigned char *src; + unsigned char *dst; + unsigned char alpha; + + src = dst = frame->pixels; + + switch (frame->pixelformat) { + case PIXELFORMAT_RGBA8888: + case PIXELFORMAT_ARGB8888: + for (y = 0; y < frame->height; y++) { + for (x = 0; x < frame->width; x++) { + if (bgcolor) { + alpha = src[3]; + *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; + *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; + src++; + } else if (frame->pixelformat == PIXELFORMAT_ARGB8888){ + src++; /* A */ + *dst++ = *src++; /* R */ + *dst++ = *src++; /* G */ + *dst++ = *src++; /* B */ + } else if (frame->pixelformat == PIXELFORMAT_RGBA8888){ + *dst++ = *src++; /* R */ + *dst++ = *src++; /* G */ + *dst++ = *src++; /* B */ + src++; /* A */ + } + } + } + frame->pixelformat = PIXELFORMAT_RGB888; + break; + default: + break; + } + + return 0; +} + + +int +sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) +{ + unsigned char *normalized_pixels = NULL; + int size; + int nret = 0; + + switch (frame->pixelformat) { + case PIXELFORMAT_RGB888: + break; + case PIXELFORMAT_PAL8: + case PIXELFORMAT_G8: + case PIXELFORMAT_GA88: + case PIXELFORMAT_AG88: + case PIXELFORMAT_RGB555: + case PIXELFORMAT_RGB565: + case PIXELFORMAT_BGR555: + case PIXELFORMAT_BGR565: + case PIXELFORMAT_RGBA8888: + case PIXELFORMAT_ARGB8888: + /* normalize pixelformat */ + size = frame->width * frame->height * 3; + normalized_pixels = malloc(size); + nret = sixel_helper_normalize_pixelformat(normalized_pixels, + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + if (nret != 0) { + free(normalized_pixels); + return nret; + } + free(frame->pixels); + frame->pixels = normalized_pixels; + break; + default: + fprintf(stderr, "do_resize: invalid pixelformat.\n"); + return (-1); + } + + return nret; +} + + +int +sixel_frame_resize( + sixel_frame_t *frame, + int width, + int height, + int method_for_resampling +) +{ + int size; + unsigned char *scaled_frame = NULL; + int nret; + + size = width * height * 3; + scaled_frame = malloc(size); + + if (scaled_frame == NULL) { + return (-1); + } + + nret = sixel_helper_scale_image( + scaled_frame, + frame->pixels, frame->width, frame->height, 3, + width, + height, + method_for_resampling); + if (nret != 0) { + return nret; + } + free(frame->pixels); + frame->pixels = scaled_frame; + frame->width = width; + frame->height = height; + + return nret; +} + + +static int +clip(unsigned char *pixels, + int sx, + int sy, + int pixelformat, + int cx, + int cy, + int cw, + int ch) +{ + int y; + unsigned char *src; + unsigned char *dst; + int depth = sixel_helper_compute_depth(pixelformat); + + /* unused */ (void) sx; + /* unused */ (void) sy; + /* unused */ (void) cx; + + switch (pixelformat) { + case PIXELFORMAT_PAL8: + case PIXELFORMAT_G8: + case PIXELFORMAT_RGB888: + dst = pixels; + src = pixels + cy * sx * depth + cx * depth; + for (y = 0; y < ch; y++) { + memmove(dst, src, cw * depth); + dst += (cw * depth); + src += (sx * depth); + } + break; + default: + return (-1); + } + + return 0; +} + + +int +sixel_frame_clip( + sixel_frame_t *frame, + int x, + int y, + int width, + int height +) +{ + int ret = 0; + unsigned char *normalized_pixels; + + switch (frame->pixelformat) { + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + normalized_pixels = malloc(frame->width * frame->height); + ret = sixel_helper_normalize_pixelformat(normalized_pixels, + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + if (ret != 0) { + free(normalized_pixels); + return ret; + } + free(frame->pixels); + frame->pixels = normalized_pixels; + break; + default: + break; + } + + ret = clip(frame->pixels, + frame->width, + frame->height, + frame->pixelformat, + x, + y, + width, + height); + if (ret != 0) { + return ret; + } + frame->width = width; + frame->height = height; + + return ret; +} + + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/frame.h b/src/frame.h new file mode 100644 index 00000000..06bf7a6f --- /dev/null +++ b/src/frame.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_FRAME_H +#define LIBSIXEL_FRAME_H + +/* frame object */ +typedef struct sixel_frame { + unsigned int ref; /* reference counter */ + unsigned char *pixels; /* loaded pixel data */ + unsigned char *palette; /* loaded palette data */ + int width; /* frame width */ + int height; /* frame height */ + int ncolors; /* palette colors */ + int pixelformat; /* one of enum pixelFormat */ + int delay; /* delay in msec */ + int frame_no; /* frame number */ + int loop_count; /* loop count */ + int multiframe; /* whether the image has multiple frames */ + int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ +} sixel_frame_t; + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_FRAME_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 12450309f78684d02f161f3f0b3eb776120586ba Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 01:42:49 +0900 Subject: [PATCH 162/451] Introduce frame API --- converters/img2sixel.c | 270 ++++++++++++----------------------------- include/sixel.h.in | 140 ++++++++++++++++++--- src/Makefile.am | 2 + src/Makefile.in | 17 ++- src/loader.c | 76 +----------- 5 files changed, 220 insertions(+), 285 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index f5e372c7..660fd7ec 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -277,25 +277,22 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) sixel_callback_context_for_mapfile_t *callback_context; int ret = (-1); - if (frame->pixels == NULL || frame->width == 0 || frame->height == 0) { - goto end; - } - callback_context = (sixel_callback_context_for_mapfile_t *)data; - switch (frame->pixelformat) { + switch (sixel_frame_get_pixelformat(frame)) { case PIXELFORMAT_PAL1: case PIXELFORMAT_PAL2: case PIXELFORMAT_PAL4: case PIXELFORMAT_PAL8: - if (frame->palette == NULL) { + if (sixel_frame_get_palette(frame) == NULL) { goto end; } - callback_context->dither = sixel_dither_create(frame->ncolors); + callback_context->dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (callback_context->dither == NULL) { goto end; } - sixel_dither_set_palette(callback_context->dither, frame->palette); + sixel_dither_set_palette(callback_context->dither, + sixel_frame_get_palette(frame)); ret = 0; break; default: @@ -305,10 +302,10 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) } ret = sixel_dither_initialize(callback_context->dither, - frame->pixels, - frame->width, - frame->height, - frame->pixelformat, + sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), LARGE_NORM, REP_CENTER_BOX, QUALITY_HIGH); @@ -402,7 +399,7 @@ typedef struct Settings { static sixel_dither_t * prepare_palette(sixel_dither_t *former_dither, - sixel_frame_t const *frame, + sixel_frame_t *frame, settings_t *psettings) { sixel_dither_t *dither; @@ -431,19 +428,19 @@ prepare_palette(sixel_dither_t *former_dither, return former_dither; } dither = prepare_builtin_palette(psettings->builtin_palette); - } else if (frame->palette && (frame->pixelformat & FORMATTYPE_PALETTE)) { - dither = sixel_dither_create(frame->ncolors); + } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & FORMATTYPE_PALETTE)) { + dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (!dither) { return NULL; } - sixel_dither_set_palette(dither, frame->palette); - sixel_dither_set_pixelformat(dither, frame->pixelformat); - if (frame->transparent != (-1)) { - sixel_dither_set_transparent(dither, frame->transparent); + sixel_dither_set_palette(dither, sixel_frame_get_palette(frame)); + sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + if (sixel_frame_get_transparent(frame) != (-1)) { + sixel_dither_set_transparent(dither, sixel_frame_get_transparent(frame)); } - } else if (frame->pixelformat == PIXELFORMAT_G8) { + } else if (sixel_frame_get_pixelformat(frame) == PIXELFORMAT_G8) { dither = sixel_dither_create(-1); - sixel_dither_set_pixelformat(dither, frame->pixelformat); + sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); } else { if (former_dither) { sixel_dither_unref(former_dither); @@ -452,9 +449,11 @@ prepare_palette(sixel_dither_t *former_dither, if (!dither) { return NULL; } - ret = sixel_dither_initialize(dither, frame->pixels, - frame->width, frame->height, - frame->pixelformat, + ret = sixel_dither_initialize(dither, + sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), psettings->method_for_largest, psettings->method_for_rep, psettings->quality_mode); @@ -466,7 +465,7 @@ prepare_palette(sixel_dither_t *former_dither, if (histogram_colors <= psettings->reqcolors) { psettings->method_for_diffuse = DIFFUSE_NONE; } - sixel_dither_set_pixelformat(dither, frame->pixelformat); + sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); } return dither; } @@ -475,120 +474,37 @@ prepare_palette(sixel_dither_t *former_dither, static int do_resize(sixel_frame_t *frame, settings_t *psettings) { - int size; - unsigned char *scaled_frame = NULL; - unsigned char *normalized_pixels = NULL; int nret; if (psettings->percentwidth > 0) { - psettings->pixelwidth = frame->width * psettings->percentwidth / 100; + psettings->pixelwidth = sixel_frame_get_width(frame) * psettings->percentwidth / 100; } if (psettings->percentheight > 0) { - psettings->pixelheight = frame->height * psettings->percentheight / 100; + psettings->pixelheight = sixel_frame_get_height(frame) * psettings->percentheight / 100; } if (psettings->pixelwidth > 0 && psettings->pixelheight <= 0) { psettings->pixelheight - = frame->height * psettings->pixelwidth / frame->width; + = sixel_frame_get_height(frame) * psettings->pixelwidth / sixel_frame_get_width(frame); } if (psettings->pixelheight > 0 && psettings->pixelwidth <= 0) { psettings->pixelwidth - = frame->width * psettings->pixelheight / frame->height; + = sixel_frame_get_width(frame) * psettings->pixelheight / sixel_frame_get_height(frame); } if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { - switch (frame->pixelformat) { - case PIXELFORMAT_RGB888: - break; - case PIXELFORMAT_PAL8: - case PIXELFORMAT_G8: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: - case PIXELFORMAT_RGB555: - case PIXELFORMAT_RGB565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: - /* normalize pixelformat */ - size = frame->width * frame->height * 3; - normalized_pixels = malloc(size); - nret = sixel_helper_normalize_pixelformat(normalized_pixels, - &frame->pixelformat, - frame->pixels, - frame->pixelformat, - frame->width, - frame->height); - if (nret != 0) { - free(normalized_pixels); - return nret; - } - free(frame->pixels); - frame->pixels = normalized_pixels; - break; - default: - fprintf(stderr, "do_resize: invalid pixelformat.\n"); - return (-1); - } - - size = psettings->pixelwidth * psettings->pixelheight * 3; - scaled_frame = malloc(size); - if (scaled_frame == NULL) { - return (-1); - } - - nret = sixel_helper_scale_image( - scaled_frame, - frame->pixels, frame->width, frame->height, 3, - psettings->pixelwidth, - psettings->pixelheight, - psettings->method_for_resampling); + nret = sixel_frame_convert_to_rgb888(frame); if (nret != 0) { return nret; } - free(frame->pixels); - frame->pixels = scaled_frame; - frame->width = psettings->pixelwidth; - frame->height = psettings->pixelheight; - } - - return 0; -} - - -static int -clip(unsigned char *pixels, - int sx, - int sy, - int pixelformat, - int cx, - int cy, - int cw, - int ch) -{ - int y; - unsigned char *src; - unsigned char *dst; - int depth = sixel_helper_compute_depth(pixelformat); - /* unused */ (void) sx; - /* unused */ (void) sy; - /* unused */ (void) cx; - - switch (pixelformat) { - case PIXELFORMAT_PAL8: - case PIXELFORMAT_G8: - case PIXELFORMAT_RGB888: - dst = pixels; - src = pixels + cy * sx * depth + cx * depth; - for (y = 0; y < ch; y++) { - memmove(dst, src, cw * depth); - dst += (cw * depth); - src += (sx * depth); + nret = sixel_frame_resize(frame, + psettings->pixelwidth, + psettings->pixelheight, + psettings->method_for_resampling); + if (nret != 0) { + return nret; } - break; - default: - return (-1); } return 0; @@ -599,68 +515,36 @@ static int do_crop(sixel_frame_t *frame, settings_t *psettings) { int ret; - unsigned char *normalized_pixels; + int width; + int height; + + width = sixel_frame_get_width(frame); + height = sixel_frame_get_height(frame); /* clipping */ - if (psettings->clipwidth + psettings->clipx > frame->width) { - if (psettings->clipx > frame->width) { + if (psettings->clipwidth + psettings->clipx > width) { + if (psettings->clipx > width) { psettings->clipwidth = 0; } else { - psettings->clipwidth = frame->width - psettings->clipx; + psettings->clipwidth = width - psettings->clipx; } } - if (psettings->clipheight + psettings->clipy > frame->height) { - if (psettings->clipy > frame->height) { + if (psettings->clipheight + psettings->clipy > height) { + if (psettings->clipy > height) { psettings->clipheight = 0; } else { - psettings->clipheight = frame->height - psettings->clipy; + psettings->clipheight = height - psettings->clipy; } } if (psettings->clipwidth > 0 && psettings->clipheight > 0) { - switch (frame->pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - normalized_pixels = malloc(frame->width * frame->height); - ret = sixel_helper_normalize_pixelformat(normalized_pixels, - &frame->pixelformat, - frame->pixels, - frame->pixelformat, - frame->width, - frame->height); - if (ret != 0) { - free(normalized_pixels); - return ret; - } - free(frame->pixels); - frame->pixels = normalized_pixels; - break; - default: - break; - } - - switch (frame->pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - puts("aaa"); - default: - break; - } - - ret = clip(frame->pixels, - frame->width, - frame->height, - frame->pixelformat, - psettings->clipx, - psettings->clipy, - psettings->clipwidth, - psettings->clipheight); + ret = sixel_frame_clip(frame, + psettings->clipx, + psettings->clipy, + psettings->clipwidth, + psettings->clipheight); if (ret != 0) { return ret; } - frame->width = psettings->clipwidth; - frame->height = psettings->clipheight; } return 0; @@ -841,7 +725,7 @@ typedef struct sixel_callback_context { static void -scroll_on_demand(sixel_frame_t const *frame) +scroll_on_demand(sixel_frame_t *frame) { #if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY struct winsize size = {0, 0, 0, 0}; @@ -854,7 +738,7 @@ scroll_on_demand(sixel_frame_t const *frame) if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); if (size.ws_ypixel > 0) { - if (frame->loop_count == 0 && frame->frame_no == 0) { + if (sixel_frame_get_loop_no(frame) == 0 && sixel_frame_get_frame_no(frame) == 0) { /* set the terminal to cbreak mode */ tcgetattr(STDIN_FILENO, &old_termios); memcpy(&new_termios, &old_termios, sizeof(old_termios)); @@ -869,7 +753,7 @@ scroll_on_demand(sixel_frame_t const *frame) if (wait_stdin(1000000) != (-1)) { /* wait 1 sec */ if (scanf("\033[%d;%dR", &row, &col) == 2) { tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); - n = frame->height * size.ws_row / size.ws_ypixel + 1 + n = sixel_frame_get_height(frame) * size.ws_row / size.ws_ypixel + 1 + row - size.ws_row; if (n > 0) { printf("\033[%dS\033[%dA", n, n); @@ -906,13 +790,9 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; - if (frame->pixels == NULL || frame->width == 0 || frame->height == 0) { - goto end; - } - psettings = ((sixel_callback_context_t *)data)->settings; - depth = sixel_helper_compute_depth(frame->pixelformat); + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); if (depth == (-1)) { nret = (-1); goto end; @@ -931,7 +811,7 @@ load_image_callback(sixel_frame_t *frame, void *data) if (nret != SIXEL_SUCCESS) { goto end; } - depth = sixel_helper_compute_depth(frame->pixelformat); + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); if (depth == (-1)) { nret = (-1); goto end; @@ -943,7 +823,7 @@ load_image_callback(sixel_frame_t *frame, void *data) goto end; } - depth = sixel_helper_compute_depth(frame->pixelformat); + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); if (depth == (-1)) { nret = (-1); goto end; @@ -965,7 +845,7 @@ load_image_callback(sixel_frame_t *frame, void *data) /* evaluate -v option: print palette */ if (psettings->verbose) { - if (!(frame->pixelformat & FORMATTYPE_GRAYSCALE)) { + if (!(sixel_frame_get_pixelformat(frame) & FORMATTYPE_GRAYSCALE)) { print_palette(dither); } } @@ -991,40 +871,40 @@ load_image_callback(sixel_frame_t *frame, void *data) output, psettings->penetrate_multiplexer); sixel_output_set_encode_policy(output, psettings->encode_policy); - if (frame->multiframe && !psettings->fstatic) { + if (sixel_frame_get_multiframe(frame) && !psettings->fstatic) { scroll_on_demand(frame); } /* output sixel: junction of multi-frame processing strategy */ if (psettings->fuse_macro) { /* -u option */ /* use macro */ - nret = output_sixel_with_macro(frame->pixels, - frame->width, - frame->height, - frame->delay, - frame->frame_no, - frame->loop_count, + nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_delay(frame), + sixel_frame_get_frame_no(frame), + sixel_frame_get_loop_no(frame), dither, output, psettings); } else if (psettings->macro_number >= 0) { /* -n option */ /* use macro */ - nret = output_sixel_with_macro(frame->pixels, - frame->width, - frame->height, - frame->delay, - frame->frame_no, - frame->loop_count, + nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_delay(frame), + sixel_frame_get_frame_no(frame), + sixel_frame_get_loop_no(frame), dither, output, psettings); } else { /* do not use macro */ - nret = output_sixel_without_macro(frame->pixels, - frame->width, - frame->height, + nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), depth, - frame->delay, + sixel_frame_get_delay(frame), dither, output, psettings); diff --git a/include/sixel.h.in b/include/sixel.h.in index a73daae2..a82e594b 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -434,22 +434,129 @@ enum loopControl { LOOP_DISABLE = 2, /* always disable loop */ }; -typedef struct sixel_frame { - int ref; /* reference counter */ - unsigned char *pixels; /* loaded pixel data */ - unsigned char *palette; /* loaded palette data */ - int width; /* frame width */ - int height; /* frame height */ - int ncolors; /* palette colors */ - int pixelformat; /* one of enum pixelFormat */ - int delay; /* delay in msec */ - int frame_no; /* frame number */ - int loop_count; /* loop count */ - int multiframe; /* whether the image has multiple frames */ - int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ -} sixel_frame_t; - -typedef int (* sixel_load_image_function)(sixel_frame_t /* in */ *frame, void /* in/out */ *context); +#ifndef LIBSIXEL_FRAME_H + +/* handle type of dither context object */ +typedef struct sixel_frame { int dummy; } sixel_frame_t; + +#endif /* LIBSIXEL_FRAME_H */ + +sixel_frame_t * +sixel_frame_create(); + + +unsigned char * +sixel_frame_get_pixels(sixel_frame_t *frame); + + +typedef int (* sixel_load_image_function)( + sixel_frame_t /* in */ *frame, + void /* in/out */ *context +); + + +void +sixel_frame_ref(sixel_frame_t *frame); + + +void +sixel_frame_unref(sixel_frame_t *frame); + + +int +sixel_frame_init( + sixel_frame_t *frame, + unsigned char *pixels, + int width, + int height, + int pixelformat, + unsigned char *palette, + int ncolors +); + + +int +sixel_strip_alpha( + sixel_frame_t /* in */ *frame, + unsigned char /* in */ *bgcolor +); + + +/* get pixels */ +unsigned char * +sixel_frame_get_pixels(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get palette */ +unsigned char * +sixel_frame_get_palette(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get width */ +int +sixel_frame_get_width(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get height */ +int +sixel_frame_get_height(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get ncolors */ +int +sixel_frame_get_ncolors(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get pixelformat */ +int +sixel_frame_get_pixelformat(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get transparent */ +int +sixel_frame_get_transparent(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get transparent */ +int +sixel_frame_get_multiframe(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get delay */ +int +sixel_frame_get_delay(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get frame no */ +int +sixel_frame_get_frame_no(sixel_frame_t /* in */ *frame); /* frame object */ + + +/* get loop no */ +int +sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame); /* frame object */ + + +int +sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame); /* frame object */ + + +int +sixel_frame_resize( + sixel_frame_t /* in */ *frame, + int /* in */ width, + int /* in */ height, + int /* in */ method_for_resampling); + + +int +sixel_frame_clip( + sixel_frame_t /* in */ *frame, + int /* in */ x, + int /* in */ y, + int /* in */ width, + int /* in */ height); + int sixel_helper_load_image_file( @@ -462,6 +569,7 @@ sixel_helper_load_image_file( sixel_load_image_function /* in */ fn_load, /* callback */ void /* in/out */ *context); /* private data for callback */ + /* write image to file */ int sixel_helper_write_image_file( diff --git a/src/Makefile.am b/src/Makefile.am index 347cde26..cd990913 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,6 +14,8 @@ libsixel_la_SOURCES = output.c \ quant.h \ dither.c \ dither.h \ + frame.c \ + frame.h \ pixelformat.c \ scale.c \ loader.c \ diff --git a/src/Makefile.in b/src/Makefile.in index d660db83..1d3edc55 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -129,9 +129,10 @@ libsixel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ - libsixel_la-pixelformat.lo libsixel_la-scale.lo \ - libsixel_la-loader.lo libsixel_la-frompnm.lo \ - libsixel_la-writer.lo libsixel_la-stb_image_write.lo + libsixel_la-frame.lo libsixel_la-pixelformat.lo \ + libsixel_la-scale.lo libsixel_la-loader.lo \ + libsixel_la-frompnm.lo libsixel_la-writer.lo \ + libsixel_la-stb_image_write.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -352,6 +353,8 @@ libsixel_la_SOURCES = output.c \ quant.h \ dither.c \ dither.h \ + frame.c \ + frame.h \ pixelformat.c \ scale.c \ loader.c \ @@ -459,6 +462,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frompnm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-loader.Plo@am__quote@ @@ -526,6 +530,13 @@ libsixel_la-dither.lo: dither.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-dither.lo `test -f 'dither.c' || echo '$(srcdir)/'`dither.c +libsixel_la-frame.lo: frame.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-frame.lo -MD -MP -MF $(DEPDIR)/libsixel_la-frame.Tpo -c -o libsixel_la-frame.lo `test -f 'frame.c' || echo '$(srcdir)/'`frame.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-frame.Tpo $(DEPDIR)/libsixel_la-frame.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frame.c' object='libsixel_la-frame.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-frame.lo `test -f 'frame.c' || echo '$(srcdir)/'`frame.c + libsixel_la-pixelformat.lo: pixelformat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-pixelformat.lo -MD -MP -MF $(DEPDIR)/libsixel_la-pixelformat.Tpo -c -o libsixel_la-pixelformat.lo `test -f 'pixelformat.c' || echo '$(srcdir)/'`pixelformat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-pixelformat.Tpo $(DEPDIR)/libsixel_la-pixelformat.Plo diff --git a/src/loader.c b/src/loader.c index 3c7c28a4..2e9ef4d1 100644 --- a/src/loader.c +++ b/src/loader.c @@ -84,6 +84,7 @@ #include #include "frompnm.h" +#include "frame.h" #include #define STBI_NO_STDIO 1 @@ -837,53 +838,6 @@ chunk_is_jpeg(chunk_t const *chunk) #endif /* HAVE_JPEG */ -static int -sixel_strip_alpha( - sixel_frame_t /* in */ *frame, - unsigned char /* in */ *bgcolor) -{ - int x; - int y; - unsigned char *src; - unsigned char *dst; - unsigned char alpha; - - src = dst = frame->pixels; - - switch (frame->pixelformat) { - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: - for (y = 0; y < frame->height; y++) { - for (x = 0; x < frame->width; x++) { - if (bgcolor) { - alpha = src[3]; - *dst++ = (*src++ * alpha + bgcolor[0] * (0xff - alpha)) >> 8; - *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; - *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; - src++; - } else if (frame->pixelformat == PIXELFORMAT_ARGB8888){ - src++; /* A */ - *dst++ = *src++; /* R */ - *dst++ = *src++; /* G */ - *dst++ = *src++; /* B */ - } else if (frame->pixelformat == PIXELFORMAT_RGBA8888){ - *dst++ = *src++; /* R */ - *dst++ = *src++; /* G */ - *dst++ = *src++; /* B */ - src++; /* A */ - } - } - } - frame->pixelformat = PIXELFORMAT_RGB888; - break; - default: - break; - } - - return 0; -} - - int load_with_builtin( chunk_t const /* in */ *pchunk, /* image data */ @@ -908,17 +862,10 @@ load_with_builtin( (void) bgcolor; #endif - frame = malloc(sizeof(sixel_frame_t)); + frame = sixel_frame_create(); if (frame == NULL) { return SIXEL_FAILED; } - memset(frame, 0, sizeof(sixel_frame_t)); - - frame->pixels = NULL; - frame->palette = NULL; - frame->frame_no = 0; - frame->loop_count = 0; - frame->transparent = (-1); if (chunk_is_sixel(pchunk)) { frame->pixels = load_sixel(pchunk->buffer, @@ -1113,9 +1060,7 @@ load_with_builtin( } error: - free(frame->pixels); - free(frame->palette); - free(frame); + sixel_frame_unref(frame); return ret; } @@ -1149,16 +1094,10 @@ load_with_gdkpixbuf( (void) reqcolors; (void) bgcolor; - frame = malloc(sizeof(sixel_frame_t)); + frame = sixel_frame_create(); if (frame == NULL) { return SIXEL_FAILED; } - memset(frame, 0, sizeof(sixel_frame_t)); - - frame->pixels = NULL; - frame->palette = NULL; - frame->loop_count = 0; - frame->transparent = (-1); #if (!GLIB_CHECK_VERSION(2, 36, 0)) g_type_init(); @@ -1343,15 +1282,10 @@ load_with_gd( (void) bgcolor; (void) loop_control; - frame = malloc(sizeof(sixel_frame_t)); + frame = sixel_frame_create(); if (frame == NULL) { return SIXEL_FAILED; } - memset(frame, 0, sizeof(sixel_frame_t)); - - frame->pixels = NULL; - frame->loop_count = 0; - frame->transparent = (-1); switch(detect_file_format(pchunk->size, pchunk->buffer)) { #if 0 From 1815ab3e4874034709bbf5afa006d1f318cd65ed Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 02:12:54 +0900 Subject: [PATCH 163/451] Minor fixes --- converters/img2sixel.c | 5 ---- include/sixel.h.in | 52 +++++++++++++----------------------------- src/frame.c | 5 ++++ src/frame.h | 4 ++++ 4 files changed, 25 insertions(+), 41 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 660fd7ec..68f166e9 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -493,11 +493,6 @@ do_resize(sixel_frame_t *frame, settings_t *psettings) if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { - nret = sixel_frame_convert_to_rgb888(frame); - if (nret != 0) { - return nret; - } - nret = sixel_frame_resize(frame, psettings->pixelwidth, psettings->pixelheight, diff --git a/include/sixel.h.in b/include/sixel.h.in index a82e594b..ecb0c18c 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -406,6 +406,7 @@ sixel_helper_scale_image( } #endif + /* image loader/writer API */ enum imageFormat { @@ -423,10 +424,6 @@ enum imageFormat { FORMAT_HDR = 11, /* read only */ }; -#ifdef __cplusplus -extern "C" { -#endif - /* loop mode */ enum loopControl { LOOP_AUTO = 0, /* honer the setting of GIF header */ @@ -441,28 +438,19 @@ typedef struct sixel_frame { int dummy; } sixel_frame_t; #endif /* LIBSIXEL_FRAME_H */ -sixel_frame_t * -sixel_frame_create(); - +#ifdef __cplusplus +extern "C" { +#endif unsigned char * sixel_frame_get_pixels(sixel_frame_t *frame); - -typedef int (* sixel_load_image_function)( - sixel_frame_t /* in */ *frame, - void /* in/out */ *context -); - - void sixel_frame_ref(sixel_frame_t *frame); - void sixel_frame_unref(sixel_frame_t *frame); - int sixel_frame_init( sixel_frame_t *frame, @@ -474,72 +462,59 @@ sixel_frame_init( int ncolors ); - -int -sixel_strip_alpha( - sixel_frame_t /* in */ *frame, - unsigned char /* in */ *bgcolor -); - - /* get pixels */ unsigned char * sixel_frame_get_pixels(sixel_frame_t /* in */ *frame); /* frame object */ - /* get palette */ unsigned char * sixel_frame_get_palette(sixel_frame_t /* in */ *frame); /* frame object */ - /* get width */ int sixel_frame_get_width(sixel_frame_t /* in */ *frame); /* frame object */ - /* get height */ int sixel_frame_get_height(sixel_frame_t /* in */ *frame); /* frame object */ - /* get ncolors */ int sixel_frame_get_ncolors(sixel_frame_t /* in */ *frame); /* frame object */ - /* get pixelformat */ int sixel_frame_get_pixelformat(sixel_frame_t /* in */ *frame); /* frame object */ - /* get transparent */ int sixel_frame_get_transparent(sixel_frame_t /* in */ *frame); /* frame object */ - /* get transparent */ int sixel_frame_get_multiframe(sixel_frame_t /* in */ *frame); /* frame object */ - /* get delay */ int sixel_frame_get_delay(sixel_frame_t /* in */ *frame); /* frame object */ - /* get frame no */ int sixel_frame_get_frame_no(sixel_frame_t /* in */ *frame); /* frame object */ - /* get loop no */ int sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame); /* frame object */ - +/* strip alpha from RGBA/ARGB formatted pixbuf */ int -sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame); /* frame object */ +sixel_strip_alpha( + sixel_frame_t /* in */ *frame, + unsigned char /* in */ *bgcolor +); +int +sixel_frame_normalize(sixel_frame_t /*in */ *frame); /* frame object */ int sixel_frame_resize( @@ -558,6 +533,11 @@ sixel_frame_clip( int /* in */ height); +typedef int (* sixel_load_image_function)( + sixel_frame_t /* in */ *frame, + void /* in/out */ *context +); + int sixel_helper_load_image_file( char const /* in */ *filename, /* source file name */ diff --git a/src/frame.c b/src/frame.c index 2432b1d0..57b2edb1 100644 --- a/src/frame.c +++ b/src/frame.c @@ -320,6 +320,11 @@ sixel_frame_resize( unsigned char *scaled_frame = NULL; int nret; + nret = sixel_frame_convert_to_rgb888(frame); + if (nret != 0) { + return nret; + } + size = width * height * 3; scaled_frame = malloc(size); diff --git a/src/frame.h b/src/frame.h index 06bf7a6f..5c97a1bd 100644 --- a/src/frame.h +++ b/src/frame.h @@ -38,6 +38,10 @@ typedef struct sixel_frame { int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ } sixel_frame_t; +/* create frame object */ +sixel_frame_t * +sixel_frame_create(); + #ifdef __cplusplus } #endif From a3006a552881d38c6675aa666f2efcf788aa8f00 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 02:17:15 +0900 Subject: [PATCH 164/451] Cleanup --- include/sixel.h.in | 4 ---- src/loader.c | 4 ---- 2 files changed, 8 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index ecb0c18c..bdb7d7b9 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -513,9 +513,6 @@ sixel_strip_alpha( unsigned char /* in */ *bgcolor ); -int -sixel_frame_normalize(sixel_frame_t /*in */ *frame); /* frame object */ - int sixel_frame_resize( sixel_frame_t /* in */ *frame, @@ -523,7 +520,6 @@ sixel_frame_resize( int /* in */ height, int /* in */ method_for_resampling); - int sixel_frame_clip( sixel_frame_t /* in */ *frame, diff --git a/src/loader.c b/src/loader.c index 2e9ef4d1..a2b7bcd4 100644 --- a/src/loader.c +++ b/src/loader.c @@ -858,10 +858,6 @@ load_with_builtin( int ret = (-1); int i; -#if !defined(HAVE_LIBPNG) - (void) bgcolor; -#endif - frame = sixel_frame_create(); if (frame == NULL) { return SIXEL_FAILED; From 40f3552f5d6ef967d0b0f129d941400c49f0e602 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 04:33:59 +0900 Subject: [PATCH 165/451] Load paletted PNG with keycolor (for Issue #28) --- src/loader.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/loader.c b/src/loader.c index 3c7c28a4..1b902e01 100644 --- a/src/loader.c +++ b/src/loader.c @@ -356,7 +356,8 @@ read_palette(png_structp png_ptr, unsigned char *palette, int ncolors, png_color *png_palette, - png_color_16 *pbackground) + png_color_16 *pbackground, + int *transparent) { png_bytep trans = NULL; int num_trans = 0; @@ -365,6 +366,9 @@ read_palette(png_structp png_ptr, if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL); } + if (num_trans > 0) { + *transparent = trans[0]; + } for (i = 0; i < ncolors; ++i) { if (pbackground && i < num_trans) { palette[i * 3 + 0] = ((0xff - trans[i]) * pbackground->red @@ -392,7 +396,8 @@ load_png(unsigned char *buffer, int *pncolors, int reqcolors, int *pixelformat, - unsigned char *bgcolor) + unsigned char *bgcolor, + int *transparent) { chunk_t read_chunk; png_uint_32 bitdepth; @@ -483,7 +488,7 @@ load_png(unsigned char *buffer, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, &background); + *pncolors, png_palette, &background, transparent); *pixelformat = PIXELFORMAT_PAL1; break; case 2: @@ -492,7 +497,7 @@ load_png(unsigned char *buffer, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, &background); + *pncolors, png_palette, &background, transparent); *pixelformat = PIXELFORMAT_PAL2; break; case 4: @@ -501,7 +506,7 @@ load_png(unsigned char *buffer, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, &background); + *pncolors, png_palette, &background, transparent); *pixelformat = PIXELFORMAT_PAL4; break; case 8: @@ -510,7 +515,7 @@ load_png(unsigned char *buffer, goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, - *pncolors, png_palette, &background); + *pncolors, png_palette, &background, transparent); *pixelformat = PIXELFORMAT_PAL8; break; default: @@ -971,7 +976,8 @@ load_with_builtin( &frame->ncolors, reqcolors, &frame->pixelformat, - bgcolor); + bgcolor, + &frame->transparent); if (frame->pixels == NULL) { goto error; } From d8842293cff0b9b7f2d870b33015b299842ac68a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 04:42:02 +0900 Subject: [PATCH 166/451] Rebuild --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index a68c2474..443934ed 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh + config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ From e437da142b752d05545315b7f3dce3fb7ccc1391 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Apr 2015 22:57:26 +0900 Subject: [PATCH 167/451] Clean up --- converters/img2sixel.c | 635 +++++++++++++++++++++-------------------- 1 file changed, 327 insertions(+), 308 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 68f166e9..965a95ce 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -322,9 +322,13 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) static sixel_dither_t * -prepare_specified_palette(char const *mapfile, int reqcolors, unsigned char *bgcolor) +prepare_specified_palette( + char const *mapfile, + int reqcolors, + unsigned char *bgcolor) { int ret = (-1); + sixel_callback_context_for_mapfile_t callback_context; callback_context.reqcolors = reqcolors; @@ -933,8 +937,8 @@ load_image_callback(sixel_frame_t *frame, void *data) -static int -convert_to_sixel(char const *filename, settings_t *psettings) +int +sixel_easy_encode(char const *filename, settings_t *psettings) { int nret = (-1); int fuse_palette = 1; @@ -1227,20 +1231,331 @@ void show_help(void) } +int +sixel_easy_encode_setopt( + settings_t /* in */ *psettings, + int /* in */ arg, + char /* in */ *optarg) +{ + int number; + int parsed; + char unit[32]; + + switch(arg) { + case '7': + psettings->f8bit = 0; + break; + case '8': + psettings->f8bit = 1; + break; + case 'p': + psettings->reqcolors = atoi(optarg); + break; + case 'm': + if (psettings->mapfile) { + free(psettings->mapfile); + } + psettings->mapfile = arg_strdup(optarg); + break; + case 'e': + psettings->monochrome = 1; + break; + case 'I': + psettings->highcolor = 1; + break; + case 'b': + if (strcmp(optarg, "xterm16") == 0) { + psettings->builtin_palette = BUILTIN_XTERM16; + } else if (strcmp(optarg, "xterm256") == 0) { + psettings->builtin_palette = BUILTIN_XTERM256; + } else if (strcmp(optarg, "vt340mono") == 0) { + psettings->builtin_palette = BUILTIN_VT340_MONO; + } else if (strcmp(optarg, "vt340color") == 0) { + psettings->builtin_palette = BUILTIN_VT340_COLOR; + } else { + fprintf(stderr, + "Cannot parse builtin palette option.\n"); + goto argerr; + } + break; + case 'd': + /* parse --diffusion option */ + if (strcmp(optarg, "auto") == 0) { + psettings->method_for_diffuse = DIFFUSE_AUTO; + } else if (strcmp(optarg, "none") == 0) { + psettings->method_for_diffuse = DIFFUSE_NONE; + } else if (strcmp(optarg, "fs") == 0) { + psettings->method_for_diffuse = DIFFUSE_FS; + } else if (strcmp(optarg, "atkinson") == 0) { + psettings->method_for_diffuse = DIFFUSE_ATKINSON; + } else if (strcmp(optarg, "jajuni") == 0) { + psettings->method_for_diffuse = DIFFUSE_JAJUNI; + } else if (strcmp(optarg, "stucki") == 0) { + psettings->method_for_diffuse = DIFFUSE_STUCKI; + } else if (strcmp(optarg, "burkes") == 0) { + psettings->method_for_diffuse = DIFFUSE_BURKES; + } else { + fprintf(stderr, + "Diffusion method '%s' is not supported.\n", + optarg); + goto argerr; + } + break; + case 'f': + /* parse --find-largest option */ + if (optarg) { + if (strcmp(optarg, "auto") == 0) { + psettings->method_for_largest = LARGE_AUTO; + } else if (strcmp(optarg, "norm") == 0) { + psettings->method_for_largest = LARGE_NORM; + } else if (strcmp(optarg, "lum") == 0) { + psettings->method_for_largest = LARGE_LUM; + } else { + fprintf(stderr, + "Finding method '%s' is not supported.\n", + optarg); + goto argerr; + } + } + break; + case 's': + /* parse --select-color option */ + if (strcmp(optarg, "auto") == 0) { + psettings->method_for_rep = REP_AUTO; + } else if (strcmp(optarg, "center") == 0) { + psettings->method_for_rep = REP_CENTER_BOX; + } else if (strcmp(optarg, "average") == 0) { + psettings->method_for_rep = REP_AVERAGE_COLORS; + } else if ((strcmp(optarg, "histogram") == 0) || + (strcmp(optarg, "histgram") == 0)) { + psettings->method_for_rep = REP_AVERAGE_PIXELS; + } else { + fprintf(stderr, + "Finding method '%s' is not supported.\n", + optarg); + goto argerr; + } + break; + case 'c': + number = sscanf(optarg, "%dx%d+%d+%d", + &psettings->clipwidth, &psettings->clipheight, + &psettings->clipx, &psettings->clipy); + if (number != 4) { + goto argerr; + } + if (psettings->clipwidth <= 0 || psettings->clipheight <= 0) { + goto argerr; + } + if (psettings->clipx < 0 || psettings->clipy < 0) { + goto argerr; + } + psettings->clipfirst = 0; + break; + case 'w': + parsed = sscanf(optarg, "%d%2s", &number, unit); + if (parsed == 2 && strcmp(unit, "%") == 0) { + psettings->pixelwidth = (-1); + psettings->percentwidth = number; + } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { + psettings->pixelwidth = number; + psettings->percentwidth = (-1); + } else if (strcmp(optarg, "auto") == 0) { + psettings->pixelwidth = (-1); + psettings->percentwidth = (-1); + } else { + fprintf(stderr, + "Cannot parse -w/--width option.\n"); + goto argerr; + } + if (psettings->clipwidth) { + psettings->clipfirst = 1; + } + break; + case 'h': + parsed = sscanf(optarg, "%d%2s", &number, unit); + if (parsed == 2 && strcmp(unit, "%") == 0) { + psettings->pixelheight = (-1); + psettings->percentheight = number; + } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { + psettings->pixelheight = number; + psettings->percentheight = (-1); + } else if (strcmp(optarg, "auto") == 0) { + psettings->pixelheight = (-1); + psettings->percentheight = (-1); + } else { + fprintf(stderr, + "Cannot parse -h/--height option.\n"); + goto argerr; + } + if (psettings->clipheight) { + psettings->clipfirst = 1; + } + break; + case 'r': + /* parse --resampling option */ + if (strcmp(optarg, "nearest") == 0) { + psettings->method_for_resampling = RES_NEAREST; + } else if (strcmp(optarg, "gaussian") == 0) { + psettings->method_for_resampling = RES_GAUSSIAN; + } else if (strcmp(optarg, "hanning") == 0) { + psettings->method_for_resampling = RES_HANNING; + } else if (strcmp(optarg, "hamming") == 0) { + psettings->method_for_resampling = RES_HAMMING; + } else if (strcmp(optarg, "bilinear") == 0) { + psettings->method_for_resampling = RES_BILINEAR; + } else if (strcmp(optarg, "welsh") == 0) { + psettings->method_for_resampling = RES_WELSH; + } else if (strcmp(optarg, "bicubic") == 0) { + psettings->method_for_resampling = RES_BICUBIC; + } else if (strcmp(optarg, "lanczos2") == 0) { + psettings->method_for_resampling = RES_LANCZOS2; + } else if (strcmp(optarg, "lanczos3") == 0) { + psettings->method_for_resampling = RES_LANCZOS3; + } else if (strcmp(optarg, "lanczos4") == 0) { + psettings->method_for_resampling = RES_LANCZOS4; + } else { + fprintf(stderr, + "Resampling method '%s' is not supported.\n", + optarg); + goto argerr; + } + break; + case 'q': + /* parse --quality option */ + if (strcmp(optarg, "auto") == 0) { + psettings->quality_mode = QUALITY_AUTO; + } else if (strcmp(optarg, "high") == 0) { + psettings->quality_mode = QUALITY_HIGH; + } else if (strcmp(optarg, "low") == 0) { + psettings->quality_mode = QUALITY_LOW; + } else if (strcmp(optarg, "full") == 0) { + psettings->quality_mode = QUALITY_FULL; + } else { + fprintf(stderr, + "Cannot parse quality option.\n"); + goto argerr; + } + break; + case 'l': + /* parse --loop-control option */ + if (strcmp(optarg, "auto") == 0) { + psettings->loop_mode = LOOP_AUTO; + } else if (strcmp(optarg, "force") == 0) { + psettings->loop_mode = LOOP_FORCE; + } else if (strcmp(optarg, "disable") == 0) { + psettings->loop_mode = LOOP_DISABLE; + } else { + fprintf(stderr, + "Cannot parse loop-control option.\n"); + goto argerr; + } + break; + case 't': + /* parse --palette-type option */ + if (strcmp(optarg, "auto") == 0) { + psettings->palette_type = PALETTETYPE_AUTO; + } else if (strcmp(optarg, "hls") == 0) { + psettings->palette_type = PALETTETYPE_HLS; + } else if (strcmp(optarg, "rgb") == 0) { + psettings->palette_type = PALETTETYPE_RGB; + } else { + fprintf(stderr, + "Cannot parse palette type option.\n"); + goto argerr; + } + break; + case 'B': + /* parse --bgcolor option */ + if (psettings->bgcolor) { + free(psettings->bgcolor); + } + if (parse_x_colorspec(optarg, &psettings->bgcolor) == 0) { + psettings->palette_type = PALETTETYPE_AUTO; + } else { + fprintf(stderr, + "Cannot parse bgcolor option.\n"); + goto argerr; + } + break; + case 'i': + psettings->finvert = 1; + break; + case 'u': + psettings->fuse_macro = 1; + break; + case 'n': + psettings->macro_number = atoi(optarg); + if (psettings->macro_number < 0) { + goto argerr; + } + break; + case 'g': + psettings->fignore_delay = 1; + break; + case 'v': + psettings->verbose = 1; + break; + case 'S': + psettings->fstatic = 1; + break; + case 'P': + psettings->penetrate_multiplexer = 1; + break; + case 'E': + if (strcmp(optarg, "auto") == 0) { + psettings->encode_policy = ENCODEPOLICY_AUTO; + } else if (strcmp(optarg, "fast") == 0) { + psettings->encode_policy = ENCODEPOLICY_FAST; + } else if (strcmp(optarg, "size") == 0) { + psettings->encode_policy = ENCODEPOLICY_SIZE; + } else { + fprintf(stderr, + "Cannot parse encode policy option.\n"); + goto argerr; + } + break; + case 'C': + psettings->complexion = atoi(optarg); + if (psettings->complexion < 1) { + fprintf(stderr, + "complexion parameter must be 1 or more.\n"); + goto argerr; + } + break; + case 'D': + psettings->pipe_mode = 1; + break; + case 'V': + psettings->show_version = 1; + break; + case 'H': + psettings->show_help = 1; + break; + case '?': /* unknown option */ + default: + /* exit if unknown options are specified */ + fprintf(stderr, + "Unknwon option '-%c' is specified.\n", arg); + goto argerr; + } + + return (0); + +argerr: + return (-1); +} + + int main(int argc, char *argv[]) { int n; - int unknown_opt = 0; #if HAVE_GETOPT_LONG int long_opt; int option_index; #endif /* HAVE_GETOPT_LONG */ int ret; int exit_code; - int number; - char unit[32]; - int parsed; char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:B:C:DVH"; settings_t settings = { @@ -1333,300 +1648,9 @@ main(int argc, char *argv[]) n = long_opt; } #endif /* HAVE_GETOPT_LONG */ - switch(n) { - case '7': - settings.f8bit = 0; - break; - case '8': - settings.f8bit = 1; - break; - case 'p': - settings.reqcolors = atoi(optarg); - break; - case 'm': - if (settings.mapfile) { - free(settings.mapfile); - } - settings.mapfile = arg_strdup(optarg); - break; - case 'e': - settings.monochrome = 1; - break; - case 'I': - settings.highcolor = 1; - break; - case 'b': - if (strcmp(optarg, "xterm16") == 0) { - settings.builtin_palette = BUILTIN_XTERM16; - } else if (strcmp(optarg, "xterm256") == 0) { - settings.builtin_palette = BUILTIN_XTERM256; - } else if (strcmp(optarg, "vt340mono") == 0) { - settings.builtin_palette = BUILTIN_VT340_MONO; - } else if (strcmp(optarg, "vt340color") == 0) { - settings.builtin_palette = BUILTIN_VT340_COLOR; - } else { - fprintf(stderr, - "Cannot parse builtin palette option.\n"); - goto argerr; - } - break; - case 'd': - /* parse --diffusion option */ - if (strcmp(optarg, "auto") == 0) { - settings.method_for_diffuse = DIFFUSE_AUTO; - } else if (strcmp(optarg, "none") == 0) { - settings.method_for_diffuse = DIFFUSE_NONE; - } else if (strcmp(optarg, "fs") == 0) { - settings.method_for_diffuse = DIFFUSE_FS; - } else if (strcmp(optarg, "atkinson") == 0) { - settings.method_for_diffuse = DIFFUSE_ATKINSON; - } else if (strcmp(optarg, "jajuni") == 0) { - settings.method_for_diffuse = DIFFUSE_JAJUNI; - } else if (strcmp(optarg, "stucki") == 0) { - settings.method_for_diffuse = DIFFUSE_STUCKI; - } else if (strcmp(optarg, "burkes") == 0) { - settings.method_for_diffuse = DIFFUSE_BURKES; - } else { - fprintf(stderr, - "Diffusion method '%s' is not supported.\n", - optarg); - goto argerr; - } - break; - case 'f': - /* parse --find-largest option */ - if (optarg) { - if (strcmp(optarg, "auto") == 0) { - settings.method_for_largest = LARGE_AUTO; - } else if (strcmp(optarg, "norm") == 0) { - settings.method_for_largest = LARGE_NORM; - } else if (strcmp(optarg, "lum") == 0) { - settings.method_for_largest = LARGE_LUM; - } else { - fprintf(stderr, - "Finding method '%s' is not supported.\n", - optarg); - goto argerr; - } - } - break; - case 's': - /* parse --select-color option */ - if (strcmp(optarg, "auto") == 0) { - settings.method_for_rep = REP_AUTO; - } else if (strcmp(optarg, "center") == 0) { - settings.method_for_rep = REP_CENTER_BOX; - } else if (strcmp(optarg, "average") == 0) { - settings.method_for_rep = REP_AVERAGE_COLORS; - } else if ((strcmp(optarg, "histogram") == 0) || - (strcmp(optarg, "histgram") == 0)) { - settings.method_for_rep = REP_AVERAGE_PIXELS; - } else { - fprintf(stderr, - "Finding method '%s' is not supported.\n", - optarg); - goto argerr; - } - break; - case 'c': - number = sscanf(optarg, "%dx%d+%d+%d", - &settings.clipwidth, &settings.clipheight, - &settings.clipx, &settings.clipy); - if (number != 4) { - goto argerr; - } - if (settings.clipwidth <= 0 || settings.clipheight <= 0) { - goto argerr; - } - if (settings.clipx < 0 || settings.clipy < 0) { - goto argerr; - } - settings.clipfirst = 0; - break; - case 'w': - parsed = sscanf(optarg, "%d%2s", &number, unit); - if (parsed == 2 && strcmp(unit, "%") == 0) { - settings.pixelwidth = (-1); - settings.percentwidth = number; - } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { - settings.pixelwidth = number; - settings.percentwidth = (-1); - } else if (strcmp(optarg, "auto") == 0) { - settings.pixelwidth = (-1); - settings.percentwidth = (-1); - } else { - fprintf(stderr, - "Cannot parse -w/--width option.\n"); - goto argerr; - } - if (settings.clipwidth) { - settings.clipfirst = 1; - } - break; - case 'h': - parsed = sscanf(optarg, "%d%2s", &number, unit); - if (parsed == 2 && strcmp(unit, "%") == 0) { - settings.pixelheight = (-1); - settings.percentheight = number; - } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { - settings.pixelheight = number; - settings.percentheight = (-1); - } else if (strcmp(optarg, "auto") == 0) { - settings.pixelheight = (-1); - settings.percentheight = (-1); - } else { - fprintf(stderr, - "Cannot parse -h/--height option.\n"); - goto argerr; - } - if (settings.clipheight) { - settings.clipfirst = 1; - } - break; - case 'r': - /* parse --resampling option */ - if (strcmp(optarg, "nearest") == 0) { - settings.method_for_resampling = RES_NEAREST; - } else if (strcmp(optarg, "gaussian") == 0) { - settings.method_for_resampling = RES_GAUSSIAN; - } else if (strcmp(optarg, "hanning") == 0) { - settings.method_for_resampling = RES_HANNING; - } else if (strcmp(optarg, "hamming") == 0) { - settings.method_for_resampling = RES_HAMMING; - } else if (strcmp(optarg, "bilinear") == 0) { - settings.method_for_resampling = RES_BILINEAR; - } else if (strcmp(optarg, "welsh") == 0) { - settings.method_for_resampling = RES_WELSH; - } else if (strcmp(optarg, "bicubic") == 0) { - settings.method_for_resampling = RES_BICUBIC; - } else if (strcmp(optarg, "lanczos2") == 0) { - settings.method_for_resampling = RES_LANCZOS2; - } else if (strcmp(optarg, "lanczos3") == 0) { - settings.method_for_resampling = RES_LANCZOS3; - } else if (strcmp(optarg, "lanczos4") == 0) { - settings.method_for_resampling = RES_LANCZOS4; - } else { - fprintf(stderr, - "Resampling method '%s' is not supported.\n", - optarg); - goto argerr; - } - break; - case 'q': - /* parse --quality option */ - if (strcmp(optarg, "auto") == 0) { - settings.quality_mode = QUALITY_AUTO; - } else if (strcmp(optarg, "high") == 0) { - settings.quality_mode = QUALITY_HIGH; - } else if (strcmp(optarg, "low") == 0) { - settings.quality_mode = QUALITY_LOW; - } else if (strcmp(optarg, "full") == 0) { - settings.quality_mode = QUALITY_FULL; - } else { - fprintf(stderr, - "Cannot parse quality option.\n"); - goto argerr; - } - break; - case 'l': - /* parse --loop-control option */ - if (strcmp(optarg, "auto") == 0) { - settings.loop_mode = LOOP_AUTO; - } else if (strcmp(optarg, "force") == 0) { - settings.loop_mode = LOOP_FORCE; - } else if (strcmp(optarg, "disable") == 0) { - settings.loop_mode = LOOP_DISABLE; - } else { - fprintf(stderr, - "Cannot parse loop-control option.\n"); - goto argerr; - } - break; - case 't': - /* parse --palette-type option */ - if (strcmp(optarg, "auto") == 0) { - settings.palette_type = PALETTETYPE_AUTO; - } else if (strcmp(optarg, "hls") == 0) { - settings.palette_type = PALETTETYPE_HLS; - } else if (strcmp(optarg, "rgb") == 0) { - settings.palette_type = PALETTETYPE_RGB; - } else { - fprintf(stderr, - "Cannot parse palette type option.\n"); - goto argerr; - } - break; - case 'B': - /* parse --bgcolor option */ - if (settings.bgcolor) { - free(settings.bgcolor); - } - if (parse_x_colorspec(optarg, &settings.bgcolor) == 0) { - settings.palette_type = PALETTETYPE_AUTO; - } else { - fprintf(stderr, - "Cannot parse bgcolor option.\n"); - goto argerr; - } - break; - case 'i': - settings.finvert = 1; - break; - case 'u': - settings.fuse_macro = 1; - break; - case 'n': - settings.macro_number = atoi(optarg); - if (settings.macro_number < 0) { - goto argerr; - } - break; - case 'g': - settings.fignore_delay = 1; - break; - case 'v': - settings.verbose = 1; - break; - case 'S': - settings.fstatic = 1; - break; - case 'P': - settings.penetrate_multiplexer = 1; - break; - case 'E': - if (strcmp(optarg, "auto") == 0) { - settings.encode_policy = ENCODEPOLICY_AUTO; - } else if (strcmp(optarg, "fast") == 0) { - settings.encode_policy = ENCODEPOLICY_FAST; - } else if (strcmp(optarg, "size") == 0) { - settings.encode_policy = ENCODEPOLICY_SIZE; - } else { - fprintf(stderr, - "Cannot parse encode policy option.\n"); - goto argerr; - } - break; - case 'C': - settings.complexion = atoi(optarg); - if (settings.complexion < 1) { - fprintf(stderr, - "complexion parameter must be 1 or more.\n"); - goto argerr; - } - break; - case 'D': - settings.pipe_mode = 1; - break; - case 'V': - settings.show_version = 1; - break; - case 'H': - settings.show_help = 1; - break; - case '?': /* unknown option */ - default: - unknown_opt = 1; - break; + ret = sixel_easy_encode_setopt(&settings, n, optarg); + if (ret != 0) { + goto argerr; } } @@ -1706,24 +1730,19 @@ main(int argc, char *argv[]) goto end; } - /* exit if unknown options are specified */ - if (unknown_opt) { - goto argerr; - } - if (settings.reqcolors == (-1)) { settings.reqcolors = SIXEL_PALETTE_MAX; } if (optind == argc) { - ret = convert_to_sixel(NULL, &settings); + ret = sixel_easy_encode(NULL, &settings); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; } } else { for (n = optind; n < argc; n++) { - ret = convert_to_sixel(argv[n], &settings); + ret = sixel_easy_encode(argv[n], &settings); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; From b2b6900b0bbd8416363d3d666c5d3b272aadc7b7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 00:39:52 +0900 Subject: [PATCH 168/451] Add easy converter API set --- converters/Makefile.am | 1 - converters/Makefile.in | 1 - converters/img2sixel.c | 1417 +-------------------------------------- include/sixel.h.in | 49 ++ src/Makefile.am | 2 + src/Makefile.in | 14 +- src/easy_encode.c | 1419 ++++++++++++++++++++++++++++++++++++++++ src/easy_encode.h | 73 +++ src/frame.c | 2 +- src/frame.h | 2 +- 10 files changed, 1584 insertions(+), 1396 deletions(-) create mode 100644 src/easy_encode.c create mode 100644 src/easy_encode.h diff --git a/converters/Makefile.am b/converters/Makefile.am index ad6c1e0a..4b6c298b 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -59,7 +59,6 @@ if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) test ! $$($(WINE) ./img2sixel -m ../images/map8.png -e ../images/snake.jpg) test ! $$($(WINE) ./img2sixel -p16 -e ../images/snake.jpg) - test ! $$($(WINE) ./img2sixel -D ../images/snake.jpg) test ! $$($(WINE) ./img2sixel -I -C0 ../images/snake.png) test ! $$($(WINE) ./img2sixel -I -e ../images/snake.png) test ! $$($(WINE) ./img2sixel -I -p8 ../images/snake.png) diff --git a/converters/Makefile.in b/converters/Makefile.in index 0f2d5b52..ab1845ee 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1003,7 +1003,6 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -e ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -p16 -e ../images/snake.jpg) -@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -D ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -I -C0 ../images/snake.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -I -e ../images/snake.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -I -p8 ../images/snake.png) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 965a95ce..53db125e 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -36,36 +36,15 @@ #if HAVE_SYS_TYPES_H #include #endif -#if HAVE_SYS_SELECT_H -#include -#endif - -#if HAVE_TIME_H -# include -#endif -#if HAVE_SYS_TIME_H -# include -#endif #if HAVE_GETOPT_H # include #endif - #if HAVE_INTTYPES_H # include #endif - #if HAVE_ERRNO_H # include #endif - -#if HAVE_TERMIOS_H -# include -#endif - -#if HAVE_SYS_IOCTL_H -# include -#endif - #if HAVE_SIGNAL_H # include #endif @@ -76,955 +55,6 @@ #include -static char * -arg_strdup(char const *s) -{ - char *p; - - p = malloc(strlen(s) + 1); - if (p) { - strcpy(p, s); - } - return p; -} - - -static int -parse_x_colorspec(char const *s, unsigned char **bgcolor) -{ - char *p; - unsigned char components[3]; - int index = 0; - int ret = 0; - unsigned long v; - char *endptr; - char *buf = NULL; - - if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { - p = buf = arg_strdup(s + 4); - while (*p) { - v = 0; - for (endptr = p; endptr - p <= 12; ++endptr) { - if (*endptr >= '0' && *endptr <= '9') { - v = (v << 4) | (*endptr - '0'); - } else if (*endptr >= 'a' && *endptr <= 'f') { - v = (v << 4) | (*endptr - 'a' + 10); - } else if (*endptr >= 'A' && *endptr <= 'F') { - v = (v << 4) | (*endptr - 'A' + 10); - } else { - break; - } - } - if (endptr - p == 0) { - break; - } - if (endptr - p > 4) { - break; - } - v = v << ((4 - (endptr - p)) * 4) >> 8; - components[index++] = (unsigned char)v; - p = endptr; - if (index == 3) { - break; - } - if (*p == '\0') { - break; - } - if (*p != '/') { - break; - } - ++p; - } - if (index != 3 || *p != '\0' || *p == '/') { - ret = (-1); - goto end; - } - *bgcolor = malloc(3); - (*bgcolor)[0] = components[0]; - (*bgcolor)[1] = components[1]; - (*bgcolor)[2] = components[2]; - } else if (*s == '#') { - buf = arg_strdup(s + 1); - for (p = endptr = buf; endptr - p <= 12; ++endptr) { - if (*endptr >= '0' && *endptr <= '9') { - *endptr -= '0'; - } else if (*endptr >= 'a' && *endptr <= 'f') { - *endptr -= 'a' - 10; - } else if (*endptr >= 'A' && *endptr <= 'F') { - *endptr -= 'A' - 10; - } else if (*endptr == '\0') { - break; - } else { - ret = (-1); - goto end; - } - } - if (endptr - p > 12) { - ret = (-1); - goto end; - } - *bgcolor = malloc(3); - switch (endptr - p) { - case 3: - (*bgcolor)[0] = (unsigned char)(p[0] << 4); - (*bgcolor)[1] = (unsigned char)(p[1] << 4); - (*bgcolor)[2] = (unsigned char)(p[2] << 4); - break; - case 6: - (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); - (*bgcolor)[1] = (unsigned char)(p[2] << 4 | p[3]); - (*bgcolor)[2] = (unsigned char)(p[4] << 4 | p[4]); - break; - case 9: - (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); - (*bgcolor)[1] = (unsigned char)(p[3] << 4 | p[4]); - (*bgcolor)[2] = (unsigned char)(p[6] << 4 | p[7]); - break; - case 12: - (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); - (*bgcolor)[1] = (unsigned char)(p[4] << 4 | p[5]); - (*bgcolor)[2] = (unsigned char)(p[8] << 4 | p[9]); - break; - default: - ret = (-1); - goto end; - } - } else { - ret = (-1); - goto end; - } - - ret = 0; - -end: - free(buf); - - return ret; -} - - -static int -sixel_write_callback(char *data, int size, void *priv) -{ - /* unused */ (void) priv; - - return fwrite(data, 1, size, stdout); -} - - -static int -sixel_hex_write_callback(char *data, int size, void *priv) -{ - char hex[SIXEL_OUTPUT_PACKET_SIZE * 2]; - int i; - int j; - - /* unused */ (void) priv; - - for (i = j = 0; i < size; ++i, ++j) { - hex[j] = (data[i] >> 4) & 0xf; - hex[j] += (hex[j] < 10 ? '0': ('a' - 10)); - hex[++j] = data[i] & 0xf; - hex[j] += (hex[j] < 10 ? '0': ('a' - 10)); - } - - return fwrite(hex, 1, size * 2, stdout); -} - - -static sixel_dither_t * -prepare_monochrome_palette(int finvert) -{ - sixel_dither_t *dither; - - if (finvert) { - dither = sixel_dither_get(BUILTIN_MONO_LIGHT); - } else { - dither = sixel_dither_get(BUILTIN_MONO_DARK); - } - if (dither == NULL) { - return NULL; - } - - return dither; -} - - -static sixel_dither_t * -prepare_builtin_palette(int builtin_palette) -{ - sixel_dither_t *dither; - - dither = sixel_dither_get(builtin_palette); - - if (dither == NULL) { - return NULL; - } - - return dither; -} - - -typedef struct sixel_callback_context_for_mapfile { - int reqcolors; - sixel_dither_t *dither; -} sixel_callback_context_for_mapfile_t; - - -static int -load_image_callback_for_palette(sixel_frame_t *frame, void *data) -{ - sixel_callback_context_for_mapfile_t *callback_context; - int ret = (-1); - - callback_context = (sixel_callback_context_for_mapfile_t *)data; - - switch (sixel_frame_get_pixelformat(frame)) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - case PIXELFORMAT_PAL8: - if (sixel_frame_get_palette(frame) == NULL) { - goto end; - } - callback_context->dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); - if (callback_context->dither == NULL) { - goto end; - } - sixel_dither_set_palette(callback_context->dither, - sixel_frame_get_palette(frame)); - ret = 0; - break; - default: - callback_context->dither = sixel_dither_create(callback_context->reqcolors); - if (callback_context->dither == NULL) { - goto end; - } - - ret = sixel_dither_initialize(callback_context->dither, - sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_pixelformat(frame), - LARGE_NORM, - REP_CENTER_BOX, - QUALITY_HIGH); - if (ret != 0) { - sixel_dither_unref(callback_context->dither); - goto end; - } - break; - } - -end: - return ret; -} - - -static sixel_dither_t * -prepare_specified_palette( - char const *mapfile, - int reqcolors, - unsigned char *bgcolor) -{ - int ret = (-1); - - sixel_callback_context_for_mapfile_t callback_context; - - callback_context.reqcolors = reqcolors; - callback_context.dither = NULL; - - ret = sixel_helper_load_image_file(mapfile, - 1, /* fstatic */ - 1, /* fuse_palette */ - 256, /* reqcolors */ - bgcolor, - LOOP_DISABLE, - load_image_callback_for_palette, - &callback_context); - if (ret != 0) { - return NULL; - } - - return callback_context.dither; -} - - -#if HAVE_SIGNAL - -static volatile int signaled = 0; - -static void -signal_handler(int sig) -{ - signaled = sig; -} - -#endif - -typedef struct Settings { - int reqcolors; - char *mapfile; - int monochrome; - int highcolor; - int builtin_palette; - enum methodForDiffuse method_for_diffuse; - enum methodForLargest method_for_largest; - enum methodForRep method_for_rep; - enum qualityMode quality_mode; - enum methodForResampling method_for_resampling; - enum loopControl loop_mode; - enum paletteType palette_type; - int f8bit; - int finvert; - int fuse_macro; - int fignore_delay; - int complexion; - int fstatic; - int pixelwidth; - int pixelheight; - int percentwidth; - int percentheight; - int clipx; - int clipy; - int clipwidth; - int clipheight; - int clipfirst; - int macro_number; - int penetrate_multiplexer; - int encode_policy; - int pipe_mode; - int verbose; - int show_version; - int show_help; - unsigned char *bgcolor; -} settings_t; - - -static sixel_dither_t * -prepare_palette(sixel_dither_t *former_dither, - sixel_frame_t *frame, - settings_t *psettings) -{ - sixel_dither_t *dither; - int ret; - int histogram_colors; - - if (psettings->highcolor) { - if (former_dither) { - return former_dither; - } - dither = sixel_dither_create(-1); - } else if (psettings->monochrome) { - if (former_dither) { - return former_dither; - } - dither = prepare_monochrome_palette(psettings->finvert); - } else if (psettings->mapfile) { - if (former_dither) { - return former_dither; - } - dither = prepare_specified_palette(psettings->mapfile, - psettings->reqcolors, - psettings->bgcolor); - } else if (psettings->builtin_palette) { - if (former_dither) { - return former_dither; - } - dither = prepare_builtin_palette(psettings->builtin_palette); - } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & FORMATTYPE_PALETTE)) { - dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); - if (!dither) { - return NULL; - } - sixel_dither_set_palette(dither, sixel_frame_get_palette(frame)); - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); - if (sixel_frame_get_transparent(frame) != (-1)) { - sixel_dither_set_transparent(dither, sixel_frame_get_transparent(frame)); - } - } else if (sixel_frame_get_pixelformat(frame) == PIXELFORMAT_G8) { - dither = sixel_dither_create(-1); - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); - } else { - if (former_dither) { - sixel_dither_unref(former_dither); - } - dither = sixel_dither_create(psettings->reqcolors); - if (!dither) { - return NULL; - } - ret = sixel_dither_initialize(dither, - sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_pixelformat(frame), - psettings->method_for_largest, - psettings->method_for_rep, - psettings->quality_mode); - if (ret != 0) { - sixel_dither_unref(dither); - return NULL; - } - histogram_colors = sixel_dither_get_num_of_histogram_colors(dither); - if (histogram_colors <= psettings->reqcolors) { - psettings->method_for_diffuse = DIFFUSE_NONE; - } - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); - } - return dither; -} - - -static int -do_resize(sixel_frame_t *frame, settings_t *psettings) -{ - int nret; - - if (psettings->percentwidth > 0) { - psettings->pixelwidth = sixel_frame_get_width(frame) * psettings->percentwidth / 100; - } - if (psettings->percentheight > 0) { - psettings->pixelheight = sixel_frame_get_height(frame) * psettings->percentheight / 100; - } - if (psettings->pixelwidth > 0 && psettings->pixelheight <= 0) { - psettings->pixelheight - = sixel_frame_get_height(frame) * psettings->pixelwidth / sixel_frame_get_width(frame); - } - if (psettings->pixelheight > 0 && psettings->pixelwidth <= 0) { - psettings->pixelwidth - = sixel_frame_get_width(frame) * psettings->pixelheight / sixel_frame_get_height(frame); - } - - if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { - - nret = sixel_frame_resize(frame, - psettings->pixelwidth, - psettings->pixelheight, - psettings->method_for_resampling); - if (nret != 0) { - return nret; - } - } - - return 0; -} - - -static int -do_crop(sixel_frame_t *frame, settings_t *psettings) -{ - int ret; - int width; - int height; - - width = sixel_frame_get_width(frame); - height = sixel_frame_get_height(frame); - - /* clipping */ - if (psettings->clipwidth + psettings->clipx > width) { - if (psettings->clipx > width) { - psettings->clipwidth = 0; - } else { - psettings->clipwidth = width - psettings->clipx; - } - } - if (psettings->clipheight + psettings->clipy > height) { - if (psettings->clipy > height) { - psettings->clipheight = 0; - } else { - psettings->clipheight = height - psettings->clipy; - } - } - if (psettings->clipwidth > 0 && psettings->clipheight > 0) { - ret = sixel_frame_clip(frame, - psettings->clipx, - psettings->clipy, - psettings->clipwidth, - psettings->clipheight); - if (ret != 0) { - return ret; - } - } - - return 0; -} - - -static void -print_palette(sixel_dither_t *dither) -{ - unsigned char *palette; - int i; - - palette = sixel_dither_get_palette(dither); - fprintf(stderr, "palette:\n"); - for (i = 0; i < sixel_dither_get_num_of_palette_colors(dither); ++i) { - fprintf(stderr, "%d: #%02x%02x%02x\n", i, - palette[i * 3 + 1], - palette[i * 3 + 2], - palette[i * 3 + 3]); - } -} - - -#if HAVE_SYS_SELECT_H -static int -wait_stdin(int usec) -{ - fd_set rfds; - struct timeval tv; - int ret; - - tv.tv_sec = usec / 1000000; - tv.tv_usec = usec % 1000000; - FD_ZERO(&rfds); - FD_SET(STDIN_FILENO, &rfds); - ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); - - return ret; -} -#endif /* HAVE_SYS_SELECT_H */ - - -static int -output_sixel_without_macro( - unsigned char *frame, - int width, - int height, - int depth, - int delay, - sixel_dither_t *dither, - sixel_output_t *context, - settings_t *psettings -) -{ - int nret = 0; - int dulation = 0; - unsigned char *p; -#if HAVE_USLEEP - int lag = 0; -# if HAVE_CLOCK - clock_t start; -# endif -#endif - if (!psettings->mapfile && !psettings->monochrome - && !psettings->highcolor && !psettings->builtin_palette) { - sixel_dither_set_optimize_palette(dither, 1); - } - - p = malloc(width * height * depth); - if (nret != 0) { - goto end; - } -#if HAVE_USLEEP && HAVE_CLOCK - start = clock(); -#endif - fflush(stdout); -#if HAVE_USLEEP - if (!psettings->fignore_delay && delay > 0) { -# if HAVE_CLOCK - dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; - lag = 0; -# else - dulation = 0; -# endif - if (dulation < 10000 * delay) { - usleep(10000 * delay - dulation); - } else { - lag = 10000 * delay - dulation; - } - } -#endif - - memcpy(p, frame, width * height * depth); - nret = sixel_encode(p, width, height, depth, dither, context); - if (nret != 0) { - goto end; - } - -end: - return nret; -} - - -static int -output_sixel_with_macro( - unsigned char *frame, - int sx, - int sy, - int delay, - int frame_no, - int loop_count, - sixel_dither_t *dither, - sixel_output_t *context, - settings_t *psettings -) -{ - int nret = 0; - int dulation = 0; -#if HAVE_USLEEP - int lag = 0; -# if HAVE_CLOCK - clock_t start; -# endif -#endif - -#if HAVE_USLEEP && HAVE_CLOCK - start = clock(); -#endif - if (loop_count == 0) { - if (psettings->macro_number >= 0) { - printf("\033P%d;0;1!z", psettings->macro_number); - } else { - printf("\033P%d;0;1!z", frame_no); - } - - nret = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); - if (nret != 0) { - goto end; - } - - printf("\033\\"); - } - if (psettings->macro_number < 0) { - fflush(stdout); - printf("\033[%d*z", frame_no); -#if HAVE_USLEEP - if (delay > 0 && !psettings->fignore_delay) { -# if HAVE_CLOCK - dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; - lag = 0; -# else - dulation = 0; -# endif - if (dulation < 10000 * delay) { - usleep(10000 * delay - dulation); - } else { - lag = 10000 * delay - dulation; - } - } -#endif - } -#if HAVE_SIGNAL - if (signaled) { - printf("\x1b\\"); - fflush(stdout); - return SIXEL_INTERRUPTED; - } -#endif - -end: - return nret; -} - - -typedef struct sixel_callback_context { - settings_t *settings; -} sixel_callback_context_t; - - -static void -scroll_on_demand(sixel_frame_t *frame) -{ -#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY - struct winsize size = {0, 0, 0, 0}; - struct termios old_termios; - struct termios new_termios; - int row = 0; - int col = 0; - int n; - - if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { - ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); - if (size.ws_ypixel > 0) { - if (sixel_frame_get_loop_no(frame) == 0 && sixel_frame_get_frame_no(frame) == 0) { - /* set the terminal to cbreak mode */ - tcgetattr(STDIN_FILENO, &old_termios); - memcpy(&new_termios, &old_termios, sizeof(old_termios)); - new_termios.c_lflag &= ~(ECHO | ICANON); - new_termios.c_cc[VMIN] = 1; - new_termios.c_cc[VTIME] = 0; - tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); - - /* request cursor position report */ - printf("\033[6n"); - fflush(stdout); - if (wait_stdin(1000000) != (-1)) { /* wait 1 sec */ - if (scanf("\033[%d;%dR", &row, &col) == 2) { - tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); - n = sixel_frame_get_height(frame) * size.ws_row / size.ws_ypixel + 1 - + row - size.ws_row; - if (n > 0) { - printf("\033[%dS\033[%dA", n, n); - } - printf("\0337"); - } else { - printf("\033[H"); - } - } else { - printf("\033[H"); - } - } else { - printf("\0338"); - } - } else { - printf("\033[H"); - } - } else { - printf("\033[H"); - } -#else - (void) frame; - printf("\033[H"); -#endif -} - - -static int -load_image_callback(sixel_frame_t *frame, void *data) -{ - int nret = SIXEL_FAILED; - int depth; - settings_t *psettings; - sixel_dither_t *dither = NULL; - sixel_output_t *output = NULL; - - psettings = ((sixel_callback_context_t *)data)->settings; - - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } - - /* evaluate -w, -h, and -c option: crop/scale input source */ - if (psettings->clipfirst) { - /* clipping */ - nret = do_crop(frame, psettings); - if (nret != 0) { - goto end; - } - - /* scaling */ - nret = do_resize(frame, psettings); - if (nret != SIXEL_SUCCESS) { - goto end; - } - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } - } else { - /* scaling */ - nret = do_resize(frame, psettings); - if (nret != 0) { - goto end; - } - - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } - - /* clipping */ - nret = do_crop(frame, psettings); - if (nret != 0) { - goto end; - } - } - - /* prepare dither context */ - dither = prepare_palette(dither, frame, psettings); - if (!dither) { - nret = (-1); - goto end; - } - - /* evaluate -v option: print palette */ - if (psettings->verbose) { - if (!(sixel_frame_get_pixelformat(frame) & FORMATTYPE_GRAYSCALE)) { - print_palette(dither); - } - } - - /* evaluate -d option: set method for diffusion */ - sixel_dither_set_diffusion_type(dither, psettings->method_for_diffuse); - - /* evaluate -C option: set complexion score */ - if (psettings->complexion > 1) { - sixel_dither_set_complexion_score(dither, psettings->complexion); - } - - /* create output context */ - if (psettings->fuse_macro || psettings->macro_number >= 0) { - /* -u or -n option */ - output = sixel_output_create(sixel_hex_write_callback, stdout); - } else { - output = sixel_output_create(sixel_write_callback, stdout); - } - sixel_output_set_8bit_availability(output, psettings->f8bit); - sixel_output_set_palette_type(output, psettings->palette_type); - sixel_output_set_penetrate_multiplexer( - output, psettings->penetrate_multiplexer); - sixel_output_set_encode_policy(output, psettings->encode_policy); - - if (sixel_frame_get_multiframe(frame) && !psettings->fstatic) { - scroll_on_demand(frame); - } - - /* output sixel: junction of multi-frame processing strategy */ - if (psettings->fuse_macro) { /* -u option */ - /* use macro */ - nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_delay(frame), - sixel_frame_get_frame_no(frame), - sixel_frame_get_loop_no(frame), - dither, - output, - psettings); - } else if (psettings->macro_number >= 0) { /* -n option */ - /* use macro */ - nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_delay(frame), - sixel_frame_get_frame_no(frame), - sixel_frame_get_loop_no(frame), - dither, - output, - psettings); - } else { - /* do not use macro */ - nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - depth, - sixel_frame_get_delay(frame), - dither, - output, - psettings); - } - -#if HAVE_SIGNAL - if (signaled) { - printf("\x1b\\"); - fflush(stdout); - nret = SIXEL_INTERRUPTED; - } -#endif - - if (nret != 0) { - goto end; - } - - fflush(stdout); - -end: - if (output) { - sixel_output_unref(output); - } - if (dither) { - sixel_dither_unref(dither); - } - - return nret; -} - - - - -int -sixel_easy_encode(char const *filename, settings_t *psettings) -{ - int nret = (-1); - int fuse_palette = 1; - int loop_control = psettings->loop_mode; - sixel_callback_context_t callback_context; - - if (psettings->reqcolors < 2) { - psettings->reqcolors = 2; - } - - if (psettings->palette_type == PALETTETYPE_AUTO) { - psettings->palette_type = PALETTETYPE_RGB; - } - - if (psettings->mapfile) { - fuse_palette = 0; - } - - if (psettings->monochrome > 0) { - fuse_palette = 0; - } - - if (psettings->highcolor > 0) { - fuse_palette = 0; - } - - if (psettings->builtin_palette > 0) { - fuse_palette = 0; - } - - if (psettings->percentwidth > 0 || - psettings->percentheight > 0 || - psettings->pixelwidth > 0 || - psettings->pixelheight > 0) { - fuse_palette = 0; - } - - /* set signal handler to handle SIGINT/SIGTERM/SIGHUP */ -#if HAVE_SIGNAL -# if HAVE_DECL_SIGINT - signal(SIGINT, signal_handler); -# endif -# if HAVE_DECL_SIGTERM - signal(SIGTERM, signal_handler); -# endif -# if HAVE_DECL_SIGHUP - signal(SIGHUP, signal_handler); -# endif -#endif - -reload: - callback_context.settings = psettings; - - nret = sixel_helper_load_image_file(filename, - psettings->fstatic, - fuse_palette, - psettings->reqcolors, - psettings->bgcolor, - loop_control, - load_image_callback, - &callback_context); - - if (nret == 0 && psettings->pipe_mode) { -#if HAVE_CLEARERR - clearerr(stdin); -#endif /* HAVE_FSEEK */ - while (!signaled) { -#if HAVE_SYS_SELECT_H - nret = wait_stdin(1000000); - if (nret == (-1)) { - return nret; - } -#endif /* HAVE_SYS_SELECT_H */ - if (nret != 0) { - break; - } - } - if (!signaled) { - goto reload; - } - } - - return nret; -} - - static void show_version(void) { @@ -1230,321 +260,17 @@ void show_help(void) ); } +#if HAVE_SIGNAL -int -sixel_easy_encode_setopt( - settings_t /* in */ *psettings, - int /* in */ arg, - char /* in */ *optarg) -{ - int number; - int parsed; - char unit[32]; - - switch(arg) { - case '7': - psettings->f8bit = 0; - break; - case '8': - psettings->f8bit = 1; - break; - case 'p': - psettings->reqcolors = atoi(optarg); - break; - case 'm': - if (psettings->mapfile) { - free(psettings->mapfile); - } - psettings->mapfile = arg_strdup(optarg); - break; - case 'e': - psettings->monochrome = 1; - break; - case 'I': - psettings->highcolor = 1; - break; - case 'b': - if (strcmp(optarg, "xterm16") == 0) { - psettings->builtin_palette = BUILTIN_XTERM16; - } else if (strcmp(optarg, "xterm256") == 0) { - psettings->builtin_palette = BUILTIN_XTERM256; - } else if (strcmp(optarg, "vt340mono") == 0) { - psettings->builtin_palette = BUILTIN_VT340_MONO; - } else if (strcmp(optarg, "vt340color") == 0) { - psettings->builtin_palette = BUILTIN_VT340_COLOR; - } else { - fprintf(stderr, - "Cannot parse builtin palette option.\n"); - goto argerr; - } - break; - case 'd': - /* parse --diffusion option */ - if (strcmp(optarg, "auto") == 0) { - psettings->method_for_diffuse = DIFFUSE_AUTO; - } else if (strcmp(optarg, "none") == 0) { - psettings->method_for_diffuse = DIFFUSE_NONE; - } else if (strcmp(optarg, "fs") == 0) { - psettings->method_for_diffuse = DIFFUSE_FS; - } else if (strcmp(optarg, "atkinson") == 0) { - psettings->method_for_diffuse = DIFFUSE_ATKINSON; - } else if (strcmp(optarg, "jajuni") == 0) { - psettings->method_for_diffuse = DIFFUSE_JAJUNI; - } else if (strcmp(optarg, "stucki") == 0) { - psettings->method_for_diffuse = DIFFUSE_STUCKI; - } else if (strcmp(optarg, "burkes") == 0) { - psettings->method_for_diffuse = DIFFUSE_BURKES; - } else { - fprintf(stderr, - "Diffusion method '%s' is not supported.\n", - optarg); - goto argerr; - } - break; - case 'f': - /* parse --find-largest option */ - if (optarg) { - if (strcmp(optarg, "auto") == 0) { - psettings->method_for_largest = LARGE_AUTO; - } else if (strcmp(optarg, "norm") == 0) { - psettings->method_for_largest = LARGE_NORM; - } else if (strcmp(optarg, "lum") == 0) { - psettings->method_for_largest = LARGE_LUM; - } else { - fprintf(stderr, - "Finding method '%s' is not supported.\n", - optarg); - goto argerr; - } - } - break; - case 's': - /* parse --select-color option */ - if (strcmp(optarg, "auto") == 0) { - psettings->method_for_rep = REP_AUTO; - } else if (strcmp(optarg, "center") == 0) { - psettings->method_for_rep = REP_CENTER_BOX; - } else if (strcmp(optarg, "average") == 0) { - psettings->method_for_rep = REP_AVERAGE_COLORS; - } else if ((strcmp(optarg, "histogram") == 0) || - (strcmp(optarg, "histgram") == 0)) { - psettings->method_for_rep = REP_AVERAGE_PIXELS; - } else { - fprintf(stderr, - "Finding method '%s' is not supported.\n", - optarg); - goto argerr; - } - break; - case 'c': - number = sscanf(optarg, "%dx%d+%d+%d", - &psettings->clipwidth, &psettings->clipheight, - &psettings->clipx, &psettings->clipy); - if (number != 4) { - goto argerr; - } - if (psettings->clipwidth <= 0 || psettings->clipheight <= 0) { - goto argerr; - } - if (psettings->clipx < 0 || psettings->clipy < 0) { - goto argerr; - } - psettings->clipfirst = 0; - break; - case 'w': - parsed = sscanf(optarg, "%d%2s", &number, unit); - if (parsed == 2 && strcmp(unit, "%") == 0) { - psettings->pixelwidth = (-1); - psettings->percentwidth = number; - } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { - psettings->pixelwidth = number; - psettings->percentwidth = (-1); - } else if (strcmp(optarg, "auto") == 0) { - psettings->pixelwidth = (-1); - psettings->percentwidth = (-1); - } else { - fprintf(stderr, - "Cannot parse -w/--width option.\n"); - goto argerr; - } - if (psettings->clipwidth) { - psettings->clipfirst = 1; - } - break; - case 'h': - parsed = sscanf(optarg, "%d%2s", &number, unit); - if (parsed == 2 && strcmp(unit, "%") == 0) { - psettings->pixelheight = (-1); - psettings->percentheight = number; - } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { - psettings->pixelheight = number; - psettings->percentheight = (-1); - } else if (strcmp(optarg, "auto") == 0) { - psettings->pixelheight = (-1); - psettings->percentheight = (-1); - } else { - fprintf(stderr, - "Cannot parse -h/--height option.\n"); - goto argerr; - } - if (psettings->clipheight) { - psettings->clipfirst = 1; - } - break; - case 'r': - /* parse --resampling option */ - if (strcmp(optarg, "nearest") == 0) { - psettings->method_for_resampling = RES_NEAREST; - } else if (strcmp(optarg, "gaussian") == 0) { - psettings->method_for_resampling = RES_GAUSSIAN; - } else if (strcmp(optarg, "hanning") == 0) { - psettings->method_for_resampling = RES_HANNING; - } else if (strcmp(optarg, "hamming") == 0) { - psettings->method_for_resampling = RES_HAMMING; - } else if (strcmp(optarg, "bilinear") == 0) { - psettings->method_for_resampling = RES_BILINEAR; - } else if (strcmp(optarg, "welsh") == 0) { - psettings->method_for_resampling = RES_WELSH; - } else if (strcmp(optarg, "bicubic") == 0) { - psettings->method_for_resampling = RES_BICUBIC; - } else if (strcmp(optarg, "lanczos2") == 0) { - psettings->method_for_resampling = RES_LANCZOS2; - } else if (strcmp(optarg, "lanczos3") == 0) { - psettings->method_for_resampling = RES_LANCZOS3; - } else if (strcmp(optarg, "lanczos4") == 0) { - psettings->method_for_resampling = RES_LANCZOS4; - } else { - fprintf(stderr, - "Resampling method '%s' is not supported.\n", - optarg); - goto argerr; - } - break; - case 'q': - /* parse --quality option */ - if (strcmp(optarg, "auto") == 0) { - psettings->quality_mode = QUALITY_AUTO; - } else if (strcmp(optarg, "high") == 0) { - psettings->quality_mode = QUALITY_HIGH; - } else if (strcmp(optarg, "low") == 0) { - psettings->quality_mode = QUALITY_LOW; - } else if (strcmp(optarg, "full") == 0) { - psettings->quality_mode = QUALITY_FULL; - } else { - fprintf(stderr, - "Cannot parse quality option.\n"); - goto argerr; - } - break; - case 'l': - /* parse --loop-control option */ - if (strcmp(optarg, "auto") == 0) { - psettings->loop_mode = LOOP_AUTO; - } else if (strcmp(optarg, "force") == 0) { - psettings->loop_mode = LOOP_FORCE; - } else if (strcmp(optarg, "disable") == 0) { - psettings->loop_mode = LOOP_DISABLE; - } else { - fprintf(stderr, - "Cannot parse loop-control option.\n"); - goto argerr; - } - break; - case 't': - /* parse --palette-type option */ - if (strcmp(optarg, "auto") == 0) { - psettings->palette_type = PALETTETYPE_AUTO; - } else if (strcmp(optarg, "hls") == 0) { - psettings->palette_type = PALETTETYPE_HLS; - } else if (strcmp(optarg, "rgb") == 0) { - psettings->palette_type = PALETTETYPE_RGB; - } else { - fprintf(stderr, - "Cannot parse palette type option.\n"); - goto argerr; - } - break; - case 'B': - /* parse --bgcolor option */ - if (psettings->bgcolor) { - free(psettings->bgcolor); - } - if (parse_x_colorspec(optarg, &psettings->bgcolor) == 0) { - psettings->palette_type = PALETTETYPE_AUTO; - } else { - fprintf(stderr, - "Cannot parse bgcolor option.\n"); - goto argerr; - } - break; - case 'i': - psettings->finvert = 1; - break; - case 'u': - psettings->fuse_macro = 1; - break; - case 'n': - psettings->macro_number = atoi(optarg); - if (psettings->macro_number < 0) { - goto argerr; - } - break; - case 'g': - psettings->fignore_delay = 1; - break; - case 'v': - psettings->verbose = 1; - break; - case 'S': - psettings->fstatic = 1; - break; - case 'P': - psettings->penetrate_multiplexer = 1; - break; - case 'E': - if (strcmp(optarg, "auto") == 0) { - psettings->encode_policy = ENCODEPOLICY_AUTO; - } else if (strcmp(optarg, "fast") == 0) { - psettings->encode_policy = ENCODEPOLICY_FAST; - } else if (strcmp(optarg, "size") == 0) { - psettings->encode_policy = ENCODEPOLICY_SIZE; - } else { - fprintf(stderr, - "Cannot parse encode policy option.\n"); - goto argerr; - } - break; - case 'C': - psettings->complexion = atoi(optarg); - if (psettings->complexion < 1) { - fprintf(stderr, - "complexion parameter must be 1 or more.\n"); - goto argerr; - } - break; - case 'D': - psettings->pipe_mode = 1; - break; - case 'V': - psettings->show_version = 1; - break; - case 'H': - psettings->show_help = 1; - break; - case '?': /* unknown option */ - default: - /* exit if unknown options are specified */ - fprintf(stderr, - "Unknwon option '-%c' is specified.\n", arg); - goto argerr; - } - - return (0); +static int signaled = 0; -argerr: - return (-1); +static void +signal_handler(int sig) +{ + signaled = sig; } +#endif int main(int argc, char *argv[]) @@ -1556,45 +282,10 @@ main(int argc, char *argv[]) #endif /* HAVE_GETOPT_LONG */ int ret; int exit_code; + sixel_encode_settings_t *settings; char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:B:C:DVH"; - settings_t settings = { - -1, /* reqcolors */ - NULL, /* mapfile */ - 0, /* monochrome */ - 0, /* highcolor */ - 0, /* builtin_palette */ - DIFFUSE_AUTO, /* method_for_diffuse */ - LARGE_AUTO, /* method_for_largest */ - REP_AUTO, /* method_for_rep */ - QUALITY_AUTO, /* quality_mode */ - RES_BILINEAR, /* method_for_resampling */ - LOOP_AUTO, /* loop_mode */ - PALETTETYPE_AUTO, /* palette_type */ - 0, /* f8bit */ - 0, /* finvert */ - 0, /* fuse_macro */ - 0, /* fignore_delay */ - 1, /* complexion */ - 0, /* static */ - -1, /* pixelwidth */ - -1, /* pixelheight */ - -1, /* percentwidth */ - -1, /* percentheight */ - 0, /* clipx */ - 0, /* clipy */ - 0, /* clipwidth */ - 0, /* clipheight */ - 0, /* clipfirst */ - -1, /* macro_number */ - 0, /* verbose */ - 0, /* penetrate_multiplexer */ - ENCODEPOLICY_AUTO, /* encode_policy */ - 0, /* pipe_mode */ - 0, /* show_version */ - 0, /* show_help */ - NULL, /* bgcolor */ - }; + settings = sixel_encode_settings_create(); #if HAVE_GETOPT_LONG struct option long_options[] = { @@ -1648,101 +339,48 @@ main(int argc, char *argv[]) n = long_opt; } #endif /* HAVE_GETOPT_LONG */ - ret = sixel_easy_encode_setopt(&settings, n, optarg); + ret = sixel_easy_encode_setopt(settings, n, optarg); if (ret != 0) { goto argerr; } } - /* detects arguments conflictions */ - if (settings.reqcolors != -1 && settings.mapfile) { - fprintf(stderr, "option -p, --colors conflicts " - "with -m, --mapfile.\n"); - goto argerr; - } - if (settings.mapfile && settings.monochrome) { - fprintf(stderr, "option -m, --mapfile conflicts " - "with -e, --monochrome.\n"); - goto argerr; - } - if (settings.monochrome && settings.reqcolors != (-1)) { - fprintf(stderr, "option -e, --monochrome conflicts" - " with -p, --colors.\n"); - goto argerr; - } - if (settings.monochrome && settings.highcolor) { - fprintf(stderr, "option -e, --monochrome conflicts" - " with -I, --high-color.\n"); - goto argerr; - } - if (settings.reqcolors != (-1) && settings.highcolor) { - fprintf(stderr, "option -p, --colors conflicts" - " with -I, --high-color.\n"); - goto argerr; - } - if (settings.mapfile && settings.highcolor) { - fprintf(stderr, "option -m, --mapfile conflicts" - " with -I, --high-color.\n"); - goto argerr; - } - if (settings.builtin_palette && settings.highcolor) { - fprintf(stderr, "option -b, --builtin-palette conflicts" - " with -I, --high-color.\n"); - goto argerr; - } - if (settings.monochrome && settings.builtin_palette) { - fprintf(stderr, "option -e, --monochrome conflicts" - " with -b, --builtin-palette.\n"); - goto argerr; - } - if (settings.mapfile && settings.builtin_palette) { - fprintf(stderr, "option -m, --mapfile conflicts" - " with -b, --builtin-palette.\n"); - goto argerr; - } - if (settings.reqcolors != (-1) && settings.builtin_palette) { - fprintf(stderr, "option -p, --colors conflicts" - " with -b, --builtin-palette.\n"); - goto argerr; - } - if (settings.f8bit && settings.penetrate_multiplexer) { - fprintf(stderr, "option -8 --8bit-mode conflicts" - " with -P, --penetrate.\n"); - goto argerr; - } - if (settings.pipe_mode && optind != argc) { - fprintf(stderr, "option -D, --pipe_mode conflicts" - " with arguments [filename ...].\n"); - goto argerr; - } - /* evaluate the option -v,--version */ - if (settings.show_version) { + if (sixel_encode_settings_has_version(settings)) { show_version(); exit_code = EXIT_SUCCESS; goto end; } /* evaluate the option -h,--help */ - if (settings.show_help) { + if (sixel_encode_settings_has_help(settings)) { show_help(); exit_code = EXIT_SUCCESS; goto end; } - if (settings.reqcolors == (-1)) { - settings.reqcolors = SIXEL_PALETTE_MAX; - } + /* set signal handler to handle SIGINT/SIGTERM/SIGHUP */ +#if HAVE_SIGNAL +# if HAVE_DECL_SIGINT + signal(SIGINT, signal_handler); +# endif +# if HAVE_DECL_SIGTERM + signal(SIGTERM, signal_handler); +# endif +# if HAVE_DECL_SIGHUP + signal(SIGHUP, signal_handler); +# endif +#endif if (optind == argc) { - ret = sixel_easy_encode(NULL, &settings); + ret = sixel_easy_encode(NULL, settings, &signaled); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; } } else { for (n = optind; n < argc; n++) { - ret = sixel_easy_encode(argv[n], &settings); + ret = sixel_easy_encode(argv[n], settings, &signaled); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; @@ -1764,8 +402,7 @@ main(int argc, char *argv[]) "for more details, type: 'img2sixel -H'.\n"); end: - free(settings.mapfile); - free(settings.bgcolor); + sixel_encode_settings_unref(settings); return exit_code; } diff --git a/include/sixel.h.in b/include/sixel.h.in index bdb7d7b9..cbf8b122 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -562,6 +562,55 @@ sixel_helper_write_image_file( #endif +/* easy converter API */ + +#ifndef LIBSIXEL_EASY_ENCODE_H + +/* handle type of dither context object */ +typedef struct sixel_encode_settings { int dummy; } sixel_encode_settings_t; + +#endif /* LIBSIXEL_EASY_ENCODE_H */ + + +#ifdef __cplusplus +extern "C" { +#endif + +/* create frame object */ +sixel_encode_settings_t * +sixel_encode_settings_create(void); + +void +sixel_encode_settings_ref(sixel_encode_settings_t *settings); + +void +sixel_encode_settings_unref(sixel_encode_settings_t *settings); + +/* get show_version flag */ +int +sixel_encode_settings_has_version(sixel_encode_settings_t *settings); + +/* get show_help flag */ +int +sixel_encode_settings_has_help(sixel_encode_settings_t *settings); + +int +sixel_easy_encode_setopt( + sixel_encode_settings_t /* in */ *psettings, + int /* in */ arg, + char /* in */ *optarg); + +int +sixel_easy_encode( + char const /* in */ *filename, + sixel_encode_settings_t /* in */ *psettings, + int /* in */ *cancel_flag); + +#ifdef __cplusplus +} +#endif + + #endif /* LIBSIXEL_SIXEL_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/Makefile.am b/src/Makefile.am index cd990913..d45bc4a4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,6 +21,8 @@ libsixel_la_SOURCES = output.c \ loader.c \ frompnm.c \ frompnm.h \ + easy_encode.c \ + easy_encode.h \ stb_image.h \ writer.c \ stb_image_write.c \ diff --git a/src/Makefile.in b/src/Makefile.in index 1d3edc55..6c5f22ba 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -131,8 +131,8 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ libsixel_la-frame.lo libsixel_la-pixelformat.lo \ libsixel_la-scale.lo libsixel_la-loader.lo \ - libsixel_la-frompnm.lo libsixel_la-writer.lo \ - libsixel_la-stb_image_write.lo + libsixel_la-frompnm.lo libsixel_la-easy_encode.lo \ + libsixel_la-writer.lo libsixel_la-stb_image_write.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -360,6 +360,8 @@ libsixel_la_SOURCES = output.c \ loader.c \ frompnm.c \ frompnm.h \ + easy_encode.c \ + easy_encode.h \ stb_image.h \ writer.c \ stb_image_write.c \ @@ -462,6 +464,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frompnm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ @@ -565,6 +568,13 @@ libsixel_la-frompnm.lo: frompnm.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c +libsixel_la-easy_encode.lo: easy_encode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-easy_encode.lo -MD -MP -MF $(DEPDIR)/libsixel_la-easy_encode.Tpo -c -o libsixel_la-easy_encode.lo `test -f 'easy_encode.c' || echo '$(srcdir)/'`easy_encode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-easy_encode.Tpo $(DEPDIR)/libsixel_la-easy_encode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easy_encode.c' object='libsixel_la-easy_encode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-easy_encode.lo `test -f 'easy_encode.c' || echo '$(srcdir)/'`easy_encode.c + libsixel_la-writer.lo: writer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-writer.lo -MD -MP -MF $(DEPDIR)/libsixel_la-writer.Tpo -c -o libsixel_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-writer.Tpo $(DEPDIR)/libsixel_la-writer.Plo diff --git a/src/easy_encode.c b/src/easy_encode.c new file mode 100644 index 00000000..465e5551 --- /dev/null +++ b/src/easy_encode.c @@ -0,0 +1,1419 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_SYS_UNISTD_H +# include +#endif +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_SELECT_H +#include +#endif +#if HAVE_TIME_H +# include +#endif +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif +#if HAVE_ERRNO_H +# include +#endif +#if HAVE_TERMIOS_H +# include +#endif +#if HAVE_SYS_IOCTL_H +# include +#endif + +#include "easy_encode.h" +#include + + +static char * +arg_strdup(char const *s) +{ + char *p; + + p = malloc(strlen(s) + 1); + if (p) { + strcpy(p, s); + } + return p; +} + + +static int +parse_x_colorspec(char const *s, unsigned char **bgcolor) +{ + char *p; + unsigned char components[3]; + int index = 0; + int ret = 0; + unsigned long v; + char *endptr; + char *buf = NULL; + + if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { + p = buf = arg_strdup(s + 4); + while (*p) { + v = 0; + for (endptr = p; endptr - p <= 12; ++endptr) { + if (*endptr >= '0' && *endptr <= '9') { + v = (v << 4) | (*endptr - '0'); + } else if (*endptr >= 'a' && *endptr <= 'f') { + v = (v << 4) | (*endptr - 'a' + 10); + } else if (*endptr >= 'A' && *endptr <= 'F') { + v = (v << 4) | (*endptr - 'A' + 10); + } else { + break; + } + } + if (endptr - p == 0) { + break; + } + if (endptr - p > 4) { + break; + } + v = v << ((4 - (endptr - p)) * 4) >> 8; + components[index++] = (unsigned char)v; + p = endptr; + if (index == 3) { + break; + } + if (*p == '\0') { + break; + } + if (*p != '/') { + break; + } + ++p; + } + if (index != 3 || *p != '\0' || *p == '/') { + ret = (-1); + goto end; + } + *bgcolor = malloc(3); + (*bgcolor)[0] = components[0]; + (*bgcolor)[1] = components[1]; + (*bgcolor)[2] = components[2]; + } else if (*s == '#') { + buf = arg_strdup(s + 1); + for (p = endptr = buf; endptr - p <= 12; ++endptr) { + if (*endptr >= '0' && *endptr <= '9') { + *endptr -= '0'; + } else if (*endptr >= 'a' && *endptr <= 'f') { + *endptr -= 'a' - 10; + } else if (*endptr >= 'A' && *endptr <= 'F') { + *endptr -= 'A' - 10; + } else if (*endptr == '\0') { + break; + } else { + ret = (-1); + goto end; + } + } + if (endptr - p > 12) { + ret = (-1); + goto end; + } + *bgcolor = malloc(3); + switch (endptr - p) { + case 3: + (*bgcolor)[0] = (unsigned char)(p[0] << 4); + (*bgcolor)[1] = (unsigned char)(p[1] << 4); + (*bgcolor)[2] = (unsigned char)(p[2] << 4); + break; + case 6: + (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); + (*bgcolor)[1] = (unsigned char)(p[2] << 4 | p[3]); + (*bgcolor)[2] = (unsigned char)(p[4] << 4 | p[4]); + break; + case 9: + (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); + (*bgcolor)[1] = (unsigned char)(p[3] << 4 | p[4]); + (*bgcolor)[2] = (unsigned char)(p[6] << 4 | p[7]); + break; + case 12: + (*bgcolor)[0] = (unsigned char)(p[0] << 4 | p[1]); + (*bgcolor)[1] = (unsigned char)(p[4] << 4 | p[5]); + (*bgcolor)[2] = (unsigned char)(p[8] << 4 | p[9]); + break; + default: + ret = (-1); + goto end; + } + } else { + ret = (-1); + goto end; + } + + ret = 0; + +end: + free(buf); + + return ret; +} + + +static int +sixel_write_callback(char *data, int size, void *priv) +{ + /* unused */ (void) priv; + + return fwrite(data, 1, size, stdout); +} + + +static int +sixel_hex_write_callback(char *data, int size, void *priv) +{ + char hex[SIXEL_OUTPUT_PACKET_SIZE * 2]; + int i; + int j; + + /* unused */ (void) priv; + + for (i = j = 0; i < size; ++i, ++j) { + hex[j] = (data[i] >> 4) & 0xf; + hex[j] += (hex[j] < 10 ? '0': ('a' - 10)); + hex[++j] = data[i] & 0xf; + hex[j] += (hex[j] < 10 ? '0': ('a' - 10)); + } + + return fwrite(hex, 1, size * 2, stdout); +} + + +static sixel_dither_t * +prepare_monochrome_palette(int finvert) +{ + sixel_dither_t *dither; + + if (finvert) { + dither = sixel_dither_get(BUILTIN_MONO_LIGHT); + } else { + dither = sixel_dither_get(BUILTIN_MONO_DARK); + } + if (dither == NULL) { + return NULL; + } + + return dither; +} + + +static sixel_dither_t * +prepare_builtin_palette(int builtin_palette) +{ + sixel_dither_t *dither; + + dither = sixel_dither_get(builtin_palette); + + if (dither == NULL) { + return NULL; + } + + return dither; +} + + +typedef struct sixel_callback_context_for_mapfile { + int reqcolors; + sixel_dither_t *dither; +} sixel_callback_context_for_mapfile_t; + + +static int +load_image_callback_for_palette(sixel_frame_t *frame, void *data) +{ + sixel_callback_context_for_mapfile_t *callback_context; + int ret = (-1); + + callback_context = (sixel_callback_context_for_mapfile_t *)data; + + switch (sixel_frame_get_pixelformat(frame)) { + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + case PIXELFORMAT_PAL8: + if (sixel_frame_get_palette(frame) == NULL) { + goto end; + } + callback_context->dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); + if (callback_context->dither == NULL) { + goto end; + } + sixel_dither_set_palette(callback_context->dither, + sixel_frame_get_palette(frame)); + ret = 0; + break; + default: + callback_context->dither = sixel_dither_create(callback_context->reqcolors); + if (callback_context->dither == NULL) { + goto end; + } + + ret = sixel_dither_initialize(callback_context->dither, + sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), + LARGE_NORM, + REP_CENTER_BOX, + QUALITY_HIGH); + if (ret != 0) { + sixel_dither_unref(callback_context->dither); + goto end; + } + break; + } + +end: + return ret; +} + + +static sixel_dither_t * +prepare_specified_palette( + char const *mapfile, + int reqcolors, + unsigned char *bgcolor) +{ + int ret = (-1); + + sixel_callback_context_for_mapfile_t callback_context; + + callback_context.reqcolors = reqcolors; + callback_context.dither = NULL; + + ret = sixel_helper_load_image_file(mapfile, + 1, /* fstatic */ + 1, /* fuse_palette */ + 256, /* reqcolors */ + bgcolor, + LOOP_DISABLE, + load_image_callback_for_palette, + &callback_context); + if (ret != 0) { + return NULL; + } + + return callback_context.dither; +} + + +static sixel_dither_t * +prepare_palette(sixel_dither_t *former_dither, + sixel_frame_t *frame, + sixel_encode_settings_t *psettings) +{ + sixel_dither_t *dither; + int ret; + int histogram_colors; + + if (psettings->highcolor) { + if (former_dither) { + return former_dither; + } + dither = sixel_dither_create(-1); + } else if (psettings->monochrome) { + if (former_dither) { + return former_dither; + } + dither = prepare_monochrome_palette(psettings->finvert); + } else if (psettings->mapfile) { + if (former_dither) { + return former_dither; + } + dither = prepare_specified_palette(psettings->mapfile, + psettings->reqcolors, + psettings->bgcolor); + } else if (psettings->builtin_palette) { + if (former_dither) { + return former_dither; + } + dither = prepare_builtin_palette(psettings->builtin_palette); + } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & FORMATTYPE_PALETTE)) { + dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); + if (!dither) { + return NULL; + } + sixel_dither_set_palette(dither, sixel_frame_get_palette(frame)); + sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + if (sixel_frame_get_transparent(frame) != (-1)) { + sixel_dither_set_transparent(dither, sixel_frame_get_transparent(frame)); + } + } else if (sixel_frame_get_pixelformat(frame) == PIXELFORMAT_G8) { + dither = sixel_dither_create(-1); + sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + } else { + if (former_dither) { + sixel_dither_unref(former_dither); + } + dither = sixel_dither_create(psettings->reqcolors); + if (!dither) { + return NULL; + } + ret = sixel_dither_initialize(dither, + sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), + psettings->method_for_largest, + psettings->method_for_rep, + psettings->quality_mode); + if (ret != 0) { + sixel_dither_unref(dither); + return NULL; + } + histogram_colors = sixel_dither_get_num_of_histogram_colors(dither); + if (histogram_colors <= psettings->reqcolors) { + psettings->method_for_diffuse = DIFFUSE_NONE; + } + sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + } + return dither; +} + + +static int +do_resize(sixel_frame_t *frame, sixel_encode_settings_t *psettings) +{ + int nret; + + if (psettings->percentwidth > 0) { + psettings->pixelwidth = sixel_frame_get_width(frame) * psettings->percentwidth / 100; + } + if (psettings->percentheight > 0) { + psettings->pixelheight = sixel_frame_get_height(frame) * psettings->percentheight / 100; + } + if (psettings->pixelwidth > 0 && psettings->pixelheight <= 0) { + psettings->pixelheight + = sixel_frame_get_height(frame) * psettings->pixelwidth / sixel_frame_get_width(frame); + } + if (psettings->pixelheight > 0 && psettings->pixelwidth <= 0) { + psettings->pixelwidth + = sixel_frame_get_width(frame) * psettings->pixelheight / sixel_frame_get_height(frame); + } + + if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { + + nret = sixel_frame_resize(frame, + psettings->pixelwidth, + psettings->pixelheight, + psettings->method_for_resampling); + if (nret != 0) { + return nret; + } + } + + return 0; +} + + +static int +do_crop(sixel_frame_t *frame, sixel_encode_settings_t *psettings) +{ + int ret; + int width; + int height; + + width = sixel_frame_get_width(frame); + height = sixel_frame_get_height(frame); + + /* clipping */ + if (psettings->clipwidth + psettings->clipx > width) { + if (psettings->clipx > width) { + psettings->clipwidth = 0; + } else { + psettings->clipwidth = width - psettings->clipx; + } + } + if (psettings->clipheight + psettings->clipy > height) { + if (psettings->clipy > height) { + psettings->clipheight = 0; + } else { + psettings->clipheight = height - psettings->clipy; + } + } + if (psettings->clipwidth > 0 && psettings->clipheight > 0) { + ret = sixel_frame_clip(frame, + psettings->clipx, + psettings->clipy, + psettings->clipwidth, + psettings->clipheight); + if (ret != 0) { + return ret; + } + } + + return 0; +} + + +static void +print_palette(sixel_dither_t *dither) +{ + unsigned char *palette; + int i; + + palette = sixel_dither_get_palette(dither); + fprintf(stderr, "palette:\n"); + for (i = 0; i < sixel_dither_get_num_of_palette_colors(dither); ++i) { + fprintf(stderr, "%d: #%02x%02x%02x\n", i, + palette[i * 3 + 1], + palette[i * 3 + 2], + palette[i * 3 + 3]); + } +} + + +#if HAVE_SYS_SELECT_H +static int +wait_stdin(int usec) +{ + fd_set rfds; + struct timeval tv; + int ret; + + tv.tv_sec = usec / 1000000; + tv.tv_usec = usec % 1000000; + FD_ZERO(&rfds); + FD_SET(STDIN_FILENO, &rfds); + ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); + + return ret; +} +#endif /* HAVE_SYS_SELECT_H */ + + +static int +output_sixel_without_macro( + unsigned char *frame, + int width, + int height, + int depth, + int delay, + sixel_dither_t *dither, + sixel_output_t *context, + sixel_encode_settings_t *psettings +) +{ + int nret = 0; + int dulation = 0; + unsigned char *p; +#if HAVE_USLEEP + int lag = 0; +# if HAVE_CLOCK + clock_t start; +# endif +#endif + if (!psettings->mapfile && !psettings->monochrome + && !psettings->highcolor && !psettings->builtin_palette) { + sixel_dither_set_optimize_palette(dither, 1); + } + + p = malloc(width * height * depth); + if (nret != 0) { + goto end; + } +#if HAVE_USLEEP && HAVE_CLOCK + start = clock(); +#endif + fflush(stdout); +#if HAVE_USLEEP + if (!psettings->fignore_delay && delay > 0) { +# if HAVE_CLOCK + dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; + lag = 0; +# else + dulation = 0; +# endif + if (dulation < 10000 * delay) { + usleep(10000 * delay - dulation); + } else { + lag = 10000 * delay - dulation; + } + } +#endif + + memcpy(p, frame, width * height * depth); + nret = sixel_encode(p, width, height, depth, dither, context); + if (nret != 0) { + goto end; + } + +end: + return nret; +} + + +static int +output_sixel_with_macro( + unsigned char *frame, + int sx, + int sy, + int delay, + int frame_no, + int loop_count, + sixel_dither_t *dither, + sixel_output_t *context, + sixel_encode_settings_t *psettings +) +{ + int nret = 0; + int dulation = 0; +#if HAVE_USLEEP + int lag = 0; +# if HAVE_CLOCK + clock_t start; +# endif +#endif + +#if HAVE_USLEEP && HAVE_CLOCK + start = clock(); +#endif + if (loop_count == 0) { + if (psettings->macro_number >= 0) { + printf("\033P%d;0;1!z", psettings->macro_number); + } else { + printf("\033P%d;0;1!z", frame_no); + } + + nret = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); + if (nret != 0) { + goto end; + } + + printf("\033\\"); + } + if (psettings->macro_number < 0) { + fflush(stdout); + printf("\033[%d*z", frame_no); +#if HAVE_USLEEP + if (delay > 0 && !psettings->fignore_delay) { +# if HAVE_CLOCK + dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; + lag = 0; +# else + dulation = 0; +# endif + if (dulation < 10000 * delay) { + usleep(10000 * delay - dulation); + } else { + lag = 10000 * delay - dulation; + } + } +#endif + } + +end: + return nret; +} + + +typedef struct sixel_callback_context { + sixel_encode_settings_t *settings; + int *cancel_flag; +} sixel_callback_context_t; + + +static void +scroll_on_demand(sixel_frame_t *frame) +{ +#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY + struct winsize size = {0, 0, 0, 0}; + struct termios old_termios; + struct termios new_termios; + int row = 0; + int col = 0; + int n; + + if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { + ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); + if (size.ws_ypixel > 0) { + if (sixel_frame_get_loop_no(frame) == 0 && sixel_frame_get_frame_no(frame) == 0) { + /* set the terminal to cbreak mode */ + tcgetattr(STDIN_FILENO, &old_termios); + memcpy(&new_termios, &old_termios, sizeof(old_termios)); + new_termios.c_lflag &= ~(ECHO | ICANON); + new_termios.c_cc[VMIN] = 1; + new_termios.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + + /* request cursor position report */ + printf("\033[6n"); + fflush(stdout); + if (wait_stdin(1000000) != (-1)) { /* wait 1 sec */ + if (scanf("\033[%d;%dR", &row, &col) == 2) { + tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); + n = sixel_frame_get_height(frame) * size.ws_row / size.ws_ypixel + 1 + + row - size.ws_row; + if (n > 0) { + printf("\033[%dS\033[%dA", n, n); + } + printf("\0337"); + } else { + printf("\033[H"); + } + } else { + printf("\033[H"); + } + } else { + printf("\0338"); + } + } else { + printf("\033[H"); + } + } else { + printf("\033[H"); + } +#else + (void) frame; + printf("\033[H"); +#endif +} + + +static int +load_image_callback(sixel_frame_t *frame, void *data) +{ + int nret = SIXEL_FAILED; + int depth; + sixel_encode_settings_t *psettings; + sixel_dither_t *dither = NULL; + sixel_output_t *output = NULL; + sixel_callback_context_t *callback_context = (sixel_callback_context_t *)data; + + psettings = callback_context->settings; + + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); + if (depth == (-1)) { + nret = (-1); + goto end; + } + + /* evaluate -w, -h, and -c option: crop/scale input source */ + if (psettings->clipfirst) { + /* clipping */ + nret = do_crop(frame, psettings); + if (nret != 0) { + goto end; + } + + /* scaling */ + nret = do_resize(frame, psettings); + if (nret != SIXEL_SUCCESS) { + goto end; + } + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); + if (depth == (-1)) { + nret = (-1); + goto end; + } + } else { + /* scaling */ + nret = do_resize(frame, psettings); + if (nret != 0) { + goto end; + } + + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); + if (depth == (-1)) { + nret = (-1); + goto end; + } + + /* clipping */ + nret = do_crop(frame, psettings); + if (nret != 0) { + goto end; + } + } + + /* prepare dither context */ + dither = prepare_palette(dither, frame, psettings); + if (!dither) { + nret = (-1); + goto end; + } + + /* evaluate -v option: print palette */ + if (psettings->verbose) { + if (!(sixel_frame_get_pixelformat(frame) & FORMATTYPE_GRAYSCALE)) { + print_palette(dither); + } + } + + /* evaluate -d option: set method for diffusion */ + sixel_dither_set_diffusion_type(dither, psettings->method_for_diffuse); + + /* evaluate -C option: set complexion score */ + if (psettings->complexion > 1) { + sixel_dither_set_complexion_score(dither, psettings->complexion); + } + + /* create output context */ + if (psettings->fuse_macro || psettings->macro_number >= 0) { + /* -u or -n option */ + output = sixel_output_create(sixel_hex_write_callback, stdout); + } else { + output = sixel_output_create(sixel_write_callback, stdout); + } + sixel_output_set_8bit_availability(output, psettings->f8bit); + sixel_output_set_palette_type(output, psettings->palette_type); + sixel_output_set_penetrate_multiplexer( + output, psettings->penetrate_multiplexer); + sixel_output_set_encode_policy(output, psettings->encode_policy); + + if (sixel_frame_get_multiframe(frame) && !psettings->fstatic) { + scroll_on_demand(frame); + } + + /* output sixel: junction of multi-frame processing strategy */ + if (psettings->fuse_macro) { /* -u option */ + /* use macro */ + nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_delay(frame), + sixel_frame_get_frame_no(frame), + sixel_frame_get_loop_no(frame), + dither, + output, + psettings); + } else if (psettings->macro_number >= 0) { /* -n option */ + /* use macro */ + nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_delay(frame), + sixel_frame_get_frame_no(frame), + sixel_frame_get_loop_no(frame), + dither, + output, + psettings); + } else { + /* do not use macro */ + nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + depth, + sixel_frame_get_delay(frame), + dither, + output, + psettings); + } + + if (*callback_context->cancel_flag) { + printf("\x1b\\"); + fflush(stdout); + nret = SIXEL_INTERRUPTED; + } + + if (nret != 0) { + goto end; + } + + fflush(stdout); + +end: + if (output) { + sixel_output_unref(output); + } + if (dither) { + sixel_dither_unref(dither); + } + + return nret; +} + + +int +sixel_easy_encode( + char const /* in */ *filename, + sixel_encode_settings_t /* in */ *psettings, + int /* in */ *cancel_flag) +{ + int nret = (-1); + int fuse_palette = 1; + int loop_control = psettings->loop_mode; + sixel_callback_context_t callback_context; + + if (psettings->reqcolors == (-1)) { + psettings->reqcolors = SIXEL_PALETTE_MAX; + } + + if (psettings->reqcolors < 2) { + psettings->reqcolors = 2; + } + + if (psettings->palette_type == PALETTETYPE_AUTO) { + psettings->palette_type = PALETTETYPE_RGB; + } + + if (psettings->mapfile) { + fuse_palette = 0; + } + + if (psettings->monochrome > 0) { + fuse_palette = 0; + } + + if (psettings->highcolor > 0) { + fuse_palette = 0; + } + + if (psettings->builtin_palette > 0) { + fuse_palette = 0; + } + + if (psettings->percentwidth > 0 || + psettings->percentheight > 0 || + psettings->pixelwidth > 0 || + psettings->pixelheight > 0) { + fuse_palette = 0; + } + +reload: + callback_context.settings = psettings; + callback_context.cancel_flag = cancel_flag; + + nret = sixel_helper_load_image_file(filename, + psettings->fstatic, + fuse_palette, + psettings->reqcolors, + psettings->bgcolor, + loop_control, + load_image_callback, + &callback_context); + + if (nret == 0 && psettings->pipe_mode) { +#if HAVE_CLEARERR + clearerr(stdin); +#endif /* HAVE_FSEEK */ + while (!*cancel_flag) { +#if HAVE_SYS_SELECT_H + nret = wait_stdin(1000000); + if (nret == (-1)) { + return nret; + } +#endif /* HAVE_SYS_SELECT_H */ + if (nret != 0) { + break; + } + } + if (!*cancel_flag) { + goto reload; + } + } + + return nret; +} + + +int +sixel_easy_encode_setopt( + sixel_encode_settings_t /* in */ *psettings, + int /* in */ arg, + char /* in */ *optarg) +{ + int number; + int parsed; + char unit[32]; + + switch(arg) { + case '7': + psettings->f8bit = 0; + break; + case '8': + psettings->f8bit = 1; + break; + case 'p': + psettings->reqcolors = atoi(optarg); + break; + case 'm': + if (psettings->mapfile) { + free(psettings->mapfile); + } + psettings->mapfile = arg_strdup(optarg); + break; + case 'e': + psettings->monochrome = 1; + break; + case 'I': + psettings->highcolor = 1; + break; + case 'b': + if (strcmp(optarg, "xterm16") == 0) { + psettings->builtin_palette = BUILTIN_XTERM16; + } else if (strcmp(optarg, "xterm256") == 0) { + psettings->builtin_palette = BUILTIN_XTERM256; + } else if (strcmp(optarg, "vt340mono") == 0) { + psettings->builtin_palette = BUILTIN_VT340_MONO; + } else if (strcmp(optarg, "vt340color") == 0) { + psettings->builtin_palette = BUILTIN_VT340_COLOR; + } else { + fprintf(stderr, + "Cannot parse builtin palette option.\n"); + goto argerr; + } + break; + case 'd': + /* parse --diffusion option */ + if (strcmp(optarg, "auto") == 0) { + psettings->method_for_diffuse = DIFFUSE_AUTO; + } else if (strcmp(optarg, "none") == 0) { + psettings->method_for_diffuse = DIFFUSE_NONE; + } else if (strcmp(optarg, "fs") == 0) { + psettings->method_for_diffuse = DIFFUSE_FS; + } else if (strcmp(optarg, "atkinson") == 0) { + psettings->method_for_diffuse = DIFFUSE_ATKINSON; + } else if (strcmp(optarg, "jajuni") == 0) { + psettings->method_for_diffuse = DIFFUSE_JAJUNI; + } else if (strcmp(optarg, "stucki") == 0) { + psettings->method_for_diffuse = DIFFUSE_STUCKI; + } else if (strcmp(optarg, "burkes") == 0) { + psettings->method_for_diffuse = DIFFUSE_BURKES; + } else { + fprintf(stderr, + "Diffusion method '%s' is not supported.\n", + optarg); + goto argerr; + } + break; + case 'f': + /* parse --find-largest option */ + if (optarg) { + if (strcmp(optarg, "auto") == 0) { + psettings->method_for_largest = LARGE_AUTO; + } else if (strcmp(optarg, "norm") == 0) { + psettings->method_for_largest = LARGE_NORM; + } else if (strcmp(optarg, "lum") == 0) { + psettings->method_for_largest = LARGE_LUM; + } else { + fprintf(stderr, + "Finding method '%s' is not supported.\n", + optarg); + goto argerr; + } + } + break; + case 's': + /* parse --select-color option */ + if (strcmp(optarg, "auto") == 0) { + psettings->method_for_rep = REP_AUTO; + } else if (strcmp(optarg, "center") == 0) { + psettings->method_for_rep = REP_CENTER_BOX; + } else if (strcmp(optarg, "average") == 0) { + psettings->method_for_rep = REP_AVERAGE_COLORS; + } else if ((strcmp(optarg, "histogram") == 0) || + (strcmp(optarg, "histgram") == 0)) { + psettings->method_for_rep = REP_AVERAGE_PIXELS; + } else { + fprintf(stderr, + "Finding method '%s' is not supported.\n", + optarg); + goto argerr; + } + break; + case 'c': + number = sscanf(optarg, "%dx%d+%d+%d", + &psettings->clipwidth, &psettings->clipheight, + &psettings->clipx, &psettings->clipy); + if (number != 4) { + goto argerr; + } + if (psettings->clipwidth <= 0 || psettings->clipheight <= 0) { + goto argerr; + } + if (psettings->clipx < 0 || psettings->clipy < 0) { + goto argerr; + } + psettings->clipfirst = 0; + break; + case 'w': + parsed = sscanf(optarg, "%d%2s", &number, unit); + if (parsed == 2 && strcmp(unit, "%") == 0) { + psettings->pixelwidth = (-1); + psettings->percentwidth = number; + } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { + psettings->pixelwidth = number; + psettings->percentwidth = (-1); + } else if (strcmp(optarg, "auto") == 0) { + psettings->pixelwidth = (-1); + psettings->percentwidth = (-1); + } else { + fprintf(stderr, + "Cannot parse -w/--width option.\n"); + goto argerr; + } + if (psettings->clipwidth) { + psettings->clipfirst = 1; + } + break; + case 'h': + parsed = sscanf(optarg, "%d%2s", &number, unit); + if (parsed == 2 && strcmp(unit, "%") == 0) { + psettings->pixelheight = (-1); + psettings->percentheight = number; + } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { + psettings->pixelheight = number; + psettings->percentheight = (-1); + } else if (strcmp(optarg, "auto") == 0) { + psettings->pixelheight = (-1); + psettings->percentheight = (-1); + } else { + fprintf(stderr, + "Cannot parse -h/--height option.\n"); + goto argerr; + } + if (psettings->clipheight) { + psettings->clipfirst = 1; + } + break; + case 'r': + /* parse --resampling option */ + if (strcmp(optarg, "nearest") == 0) { + psettings->method_for_resampling = RES_NEAREST; + } else if (strcmp(optarg, "gaussian") == 0) { + psettings->method_for_resampling = RES_GAUSSIAN; + } else if (strcmp(optarg, "hanning") == 0) { + psettings->method_for_resampling = RES_HANNING; + } else if (strcmp(optarg, "hamming") == 0) { + psettings->method_for_resampling = RES_HAMMING; + } else if (strcmp(optarg, "bilinear") == 0) { + psettings->method_for_resampling = RES_BILINEAR; + } else if (strcmp(optarg, "welsh") == 0) { + psettings->method_for_resampling = RES_WELSH; + } else if (strcmp(optarg, "bicubic") == 0) { + psettings->method_for_resampling = RES_BICUBIC; + } else if (strcmp(optarg, "lanczos2") == 0) { + psettings->method_for_resampling = RES_LANCZOS2; + } else if (strcmp(optarg, "lanczos3") == 0) { + psettings->method_for_resampling = RES_LANCZOS3; + } else if (strcmp(optarg, "lanczos4") == 0) { + psettings->method_for_resampling = RES_LANCZOS4; + } else { + fprintf(stderr, + "Resampling method '%s' is not supported.\n", + optarg); + goto argerr; + } + break; + case 'q': + /* parse --quality option */ + if (strcmp(optarg, "auto") == 0) { + psettings->quality_mode = QUALITY_AUTO; + } else if (strcmp(optarg, "high") == 0) { + psettings->quality_mode = QUALITY_HIGH; + } else if (strcmp(optarg, "low") == 0) { + psettings->quality_mode = QUALITY_LOW; + } else if (strcmp(optarg, "full") == 0) { + psettings->quality_mode = QUALITY_FULL; + } else { + fprintf(stderr, + "Cannot parse quality option.\n"); + goto argerr; + } + break; + case 'l': + /* parse --loop-control option */ + if (strcmp(optarg, "auto") == 0) { + psettings->loop_mode = LOOP_AUTO; + } else if (strcmp(optarg, "force") == 0) { + psettings->loop_mode = LOOP_FORCE; + } else if (strcmp(optarg, "disable") == 0) { + psettings->loop_mode = LOOP_DISABLE; + } else { + fprintf(stderr, + "Cannot parse loop-control option.\n"); + goto argerr; + } + break; + case 't': + /* parse --palette-type option */ + if (strcmp(optarg, "auto") == 0) { + psettings->palette_type = PALETTETYPE_AUTO; + } else if (strcmp(optarg, "hls") == 0) { + psettings->palette_type = PALETTETYPE_HLS; + } else if (strcmp(optarg, "rgb") == 0) { + psettings->palette_type = PALETTETYPE_RGB; + } else { + fprintf(stderr, + "Cannot parse palette type option.\n"); + goto argerr; + } + break; + case 'B': + /* parse --bgcolor option */ + if (psettings->bgcolor) { + free(psettings->bgcolor); + } + if (parse_x_colorspec(optarg, &psettings->bgcolor) == 0) { + psettings->palette_type = PALETTETYPE_AUTO; + } else { + fprintf(stderr, + "Cannot parse bgcolor option.\n"); + goto argerr; + } + break; + case 'i': + psettings->finvert = 1; + break; + case 'u': + psettings->fuse_macro = 1; + break; + case 'n': + psettings->macro_number = atoi(optarg); + if (psettings->macro_number < 0) { + goto argerr; + } + break; + case 'g': + psettings->fignore_delay = 1; + break; + case 'v': + psettings->verbose = 1; + break; + case 'S': + psettings->fstatic = 1; + break; + case 'P': + psettings->penetrate_multiplexer = 1; + break; + case 'E': + if (strcmp(optarg, "auto") == 0) { + psettings->encode_policy = ENCODEPOLICY_AUTO; + } else if (strcmp(optarg, "fast") == 0) { + psettings->encode_policy = ENCODEPOLICY_FAST; + } else if (strcmp(optarg, "size") == 0) { + psettings->encode_policy = ENCODEPOLICY_SIZE; + } else { + fprintf(stderr, + "Cannot parse encode policy option.\n"); + goto argerr; + } + break; + case 'C': + psettings->complexion = atoi(optarg); + if (psettings->complexion < 1) { + fprintf(stderr, + "complexion parameter must be 1 or more.\n"); + goto argerr; + } + break; + case 'D': + psettings->pipe_mode = 1; + break; + case 'V': + psettings->show_version = 1; + break; + case 'H': + psettings->show_help = 1; + break; + case '?': /* unknown option */ + default: + /* exit if unknown options are specified */ + fprintf(stderr, + "Unknwon option '-%c' is specified.\n", arg); + goto argerr; + } + + /* detects arguments conflictions */ + if (psettings->reqcolors != -1 && psettings->mapfile) { + fprintf(stderr, "option -p, --colors conflicts " + "with -m, --mapfile.\n"); + goto argerr; + } + if (psettings->mapfile && psettings->monochrome) { + fprintf(stderr, "option -m, --mapfile conflicts " + "with -e, --monochrome.\n"); + goto argerr; + } + if (psettings->monochrome && psettings->reqcolors != (-1)) { + fprintf(stderr, "option -e, --monochrome conflicts" + " with -p, --colors.\n"); + goto argerr; + } + if (psettings->monochrome && psettings->highcolor) { + fprintf(stderr, "option -e, --monochrome conflicts" + " with -I, --high-color.\n"); + goto argerr; + } + if (psettings->reqcolors != (-1) && psettings->highcolor) { + fprintf(stderr, "option -p, --colors conflicts" + " with -I, --high-color.\n"); + goto argerr; + } + if (psettings->mapfile && psettings->highcolor) { + fprintf(stderr, "option -m, --mapfile conflicts" + " with -I, --high-color.\n"); + goto argerr; + } + if (psettings->builtin_palette && psettings->highcolor) { + fprintf(stderr, "option -b, --builtin-palette conflicts" + " with -I, --high-color.\n"); + goto argerr; + } + if (psettings->monochrome && psettings->builtin_palette) { + fprintf(stderr, "option -e, --monochrome conflicts" + " with -b, --builtin-palette.\n"); + goto argerr; + } + if (psettings->mapfile && psettings->builtin_palette) { + fprintf(stderr, "option -m, --mapfile conflicts" + " with -b, --builtin-palette.\n"); + goto argerr; + } + if (psettings->reqcolors != (-1) && psettings->builtin_palette) { + fprintf(stderr, "option -p, --colors conflicts" + " with -b, --builtin-palette.\n"); + goto argerr; + } + if (psettings->f8bit && psettings->penetrate_multiplexer) { + fprintf(stderr, "option -8 --8bit-mode conflicts" + " with -P, --penetrate.\n"); + goto argerr; + } + + return (0); + +argerr: + return (-1); +} + + + +/* create frame object */ +sixel_encode_settings_t * +sixel_encode_settings_create(void) +{ + sixel_encode_settings_t *settings; + + settings = malloc(sizeof(sixel_encode_settings_t)); + if (settings == NULL) { + return NULL; + } + + settings->ref = 1; + settings->reqcolors = (-1); + settings->mapfile = NULL; + settings->monochrome = 0; + settings->highcolor = 0; + settings->builtin_palette = 0; + settings->method_for_diffuse = DIFFUSE_AUTO; + settings->method_for_largest = LARGE_AUTO; + settings->method_for_rep = REP_AUTO; + settings->quality_mode = QUALITY_AUTO; + settings->method_for_resampling = RES_BILINEAR; + settings->loop_mode = LOOP_AUTO; + settings->palette_type = PALETTETYPE_AUTO; + settings->f8bit = 0; + settings->finvert = 0; + settings->fuse_macro = 0; + settings->fignore_delay = 0; + settings->complexion = 1; + settings->fstatic = 0; + settings->pixelwidth = -1; + settings->pixelheight = -1; + settings->percentwidth = -1; + settings->percentheight = -1; + settings->clipx = 0; + settings->clipy = 0; + settings->clipwidth = 0; + settings->clipheight = 0; + settings->clipfirst = 0; + settings->macro_number = -1; + settings->verbose = 0; + settings->penetrate_multiplexer = 0; + settings->encode_policy = ENCODEPOLICY_AUTO; + settings->pipe_mode = 0; + settings->show_version = 0; + settings->show_help = 0; + settings->bgcolor = NULL; + + return settings; +} + + +void +sixel_encode_settings_destroy(sixel_encode_settings_t *settings) +{ + if (settings) { + free(settings->mapfile); + free(settings->bgcolor); + free(settings); + } +} + + +void +sixel_encode_settings_ref(sixel_encode_settings_t *settings) +{ + /* TODO: be thread safe */ + ++settings->ref; +} + + +void +sixel_encode_settings_unref(sixel_encode_settings_t *settings) +{ + /* TODO: be thread safe */ + if (settings != NULL && --settings->ref == 0) { + sixel_encode_settings_destroy(settings); + } +} + + +/* get show_version flag */ +int +sixel_encode_settings_has_version(sixel_encode_settings_t *settings) +{ + return settings->show_version; +} + + +/* get show_help flag */ +int +sixel_encode_settings_has_help(sixel_encode_settings_t *settings) +{ + return settings->show_help; +} + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/easy_encode.h b/src/easy_encode.h new file mode 100644 index 00000000..684733c1 --- /dev/null +++ b/src/easy_encode.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_EASY_ENCODE_H +#define LIBSIXEL_EASY_ENCODE_H + +/* encode settings object */ +typedef struct sixel_encode_settings { + unsigned int ref; /* reference counter */ + int reqcolors; + char *mapfile; + int monochrome; + int highcolor; + int builtin_palette; + int method_for_diffuse; + int method_for_largest; + int method_for_rep; + int quality_mode; + int method_for_resampling; + int loop_mode; + int palette_type; + int f8bit; + int finvert; + int fuse_macro; + int fignore_delay; + int complexion; + int fstatic; + int pixelwidth; + int pixelheight; + int percentwidth; + int percentheight; + int clipx; + int clipy; + int clipwidth; + int clipheight; + int clipfirst; + int macro_number; + int penetrate_multiplexer; + int encode_policy; + int pipe_mode; + int verbose; + int show_version; + int show_help; + unsigned char *bgcolor; +} sixel_encode_settings_t; + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_EASY_ENCODE_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/frame.c b/src/frame.c index 57b2edb1..c6fd4278 100644 --- a/src/frame.c +++ b/src/frame.c @@ -39,7 +39,7 @@ sixel_frame_t * -sixel_frame_create() +sixel_frame_create(void) { sixel_frame_t *frame; diff --git a/src/frame.h b/src/frame.h index 5c97a1bd..7cb19880 100644 --- a/src/frame.h +++ b/src/frame.h @@ -40,7 +40,7 @@ typedef struct sixel_frame { /* create frame object */ sixel_frame_t * -sixel_frame_create(); +sixel_frame_create(void); #ifdef __cplusplus } From af12687ab12049ab42d629e2199b7e9553c7c6a0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 02:31:54 +0900 Subject: [PATCH 169/451] Add easy decode API set --- converters/sixel2png.c | 163 +++++++++-------------------------------- include/sixel.h.in | 53 +++++++++++++- src/Makefile.am | 2 + src/Makefile.in | 13 +++- src/easy_encode.c | 2 +- src/easy_encode.h | 4 - 6 files changed, 101 insertions(+), 136 deletions(-) diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 4637a2f3..b6af5c84 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -57,91 +57,6 @@ #include -static int -sixel_to_png(char const *input, char const *output) -{ - unsigned char *raw_data; - int sx, sy; - int raw_len; - int max; - int n; - FILE *input_fp = NULL; - unsigned char *indexed_pixels; - unsigned char *palette; - int ncolors; - unsigned char *pixels = NULL; - int ret = 0; - - if (strcmp(input, "-") == 0) { - /* for windows */ -#if defined(O_BINARY) -# if HAVE__SETMODE - _setmode(fileno(stdin), O_BINARY); -# elif HAVE_SETMODE - setmode(fileno(stdin), O_BINARY); -# endif /* HAVE_SETMODE */ -#endif /* defined(O_BINARY) */ - input_fp = stdin; - } else { - input_fp = fopen(input, "rb"); - if (!input_fp) { -#if HAVE_ERRNO_H - fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", - input, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); - } - } - - raw_len = 0; - max = 64 * 1024; - - if ((raw_data = (unsigned char *)malloc(max)) == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "malloc(%d) failed.\n" "reason: %s.\n", - max, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); - } - - for (;;) { - if ((max - raw_len) < 4096) { - max *= 2; - if ((raw_data = (unsigned char *)realloc(raw_data, max)) == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "realloc(raw_data, %d) failed.\n" - "reason: %s.\n", - max, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); - } - } - if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) - break; - raw_len += n; - } - - if (input_fp != stdout) { - fclose(input_fp); - } - - ret = sixel_decode(raw_data, raw_len, &indexed_pixels, - &sx, &sy, &palette, &ncolors, malloc); - - if (ret != 0) { - fprintf(stderr, "sixel_decode failed.\n"); - goto end; - } - - ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, - PIXELFORMAT_PAL8, output, FORMAT_PNG); - -end: - free(pixels); - return ret; -} - - static void show_version(void) { @@ -184,31 +99,18 @@ show_help(void) } -static char * -arg_strdup(char const *s) -{ - char *p; - - p = malloc(strlen(s) + 1); - if (p) { - strcpy(p, s); - } - return p; -} - - int main(int argc, char *argv[]) { int n; - char *output = arg_strdup("-"); - char *input = arg_strdup("-"); + sixel_decode_settings_t *settings; #if HAVE_GETOPT_LONG int long_opt; int option_index; #endif /* HAVE_GETOPT_LONG */ int nret = 0; char const *optstring = "i:o:VH"; + int cancel_flag = 0; #if HAVE_GETOPT_LONG struct option long_options[] = { @@ -218,6 +120,13 @@ main(int argc, char *argv[]) {"help", no_argument, &long_opt, 'H'}, {0, 0, 0, 0} }; + + settings = sixel_decode_settings_create(); + if (settings == NULL) { + nret = (-1); + goto end; + } + #endif /* HAVE_GETOPT_LONG */ for (;;) { #if HAVE_GETOPT_LONG @@ -236,53 +145,53 @@ main(int argc, char *argv[]) n = long_opt; } #endif /* HAVE_GETOPT_LONG */ - switch(n) { - case 'i': - free(input); - input = arg_strdup(optarg); - break; - case 'o': - free(output); - output = arg_strdup(optarg); - break; - case 'V': - show_version(); - goto end; - case 'H': - show_help(); - goto end; - case '?': - default: - nret = (-1); + + nret = sixel_easy_decode_setopt(settings, n, optarg); + if (nret != 0) { goto argerr; } + if (optind >= argc) { break; } + } - if (strcmp(input, "-") == 0 && optind < argc) { - free(input); - input = arg_strdup(argv[optind++]); + if (sixel_decode_settings_has_version(settings)) { + show_version(); + goto end; + } + + if (sixel_decode_settings_has_help(settings)) { + show_help(); + goto end; } - if (strcmp(output, "-") == 0 && optind < argc) { - free(output); - output = arg_strdup(argv[optind++]); + + if (optind < argc) { + nret = sixel_easy_decode_setopt(settings, 'i', argv[optind++]); + if (nret != 0) { + goto argerr; + } + } + if (optind < argc) { + nret = sixel_easy_decode_setopt(settings, 'o', argv[optind++]); + if (nret != 0) { + goto argerr; + } } if (optind != argc) { nret = (-1); goto argerr; } - nret = sixel_to_png(input, output); + nret = sixel_easy_decode(settings, &cancel_flag); goto end; argerr: show_help(); end: - free(input); - free(output); + sixel_decode_settings_unref(settings); return nret; } diff --git a/include/sixel.h.in b/include/sixel.h.in index cbf8b122..f84a771e 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -562,7 +562,7 @@ sixel_helper_write_image_file( #endif -/* easy converter API */ +/* easy encode API */ #ifndef LIBSIXEL_EASY_ENCODE_H @@ -571,12 +571,11 @@ typedef struct sixel_encode_settings { int dummy; } sixel_encode_settings_t; #endif /* LIBSIXEL_EASY_ENCODE_H */ - #ifdef __cplusplus extern "C" { #endif -/* create frame object */ +/* create settings object */ sixel_encode_settings_t * sixel_encode_settings_create(void); @@ -611,6 +610,54 @@ sixel_easy_encode( #endif +/* easy encode API */ + +#ifndef LIBSIXEL_EASY_DECODE_H + +/* handle type of dither context object */ +typedef struct sixel_decode_settings { int dummy; } sixel_decode_settings_t; + +#endif /* LIBSIXEL_EASY_ENCODE_H */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* create settings object */ +sixel_decode_settings_t * +sixel_decode_settings_create(void); + +void +sixel_decode_settings_ref(sixel_decode_settings_t *settings); + +void +sixel_decode_settings_unref(sixel_decode_settings_t *settings); + +/* get show_version flag */ +int +sixel_decode_settings_has_version(sixel_decode_settings_t *settings); + +/* get show_help flag */ +int +sixel_decode_settings_has_help(sixel_decode_settings_t *settings); + +int +sixel_easy_decode_setopt( + sixel_decode_settings_t /* in */ *psettings, + int /* in */ arg, + char /* in */ *optarg); + +int +sixel_easy_decode( + sixel_decode_settings_t /* in */ *psettings, + int /* in */ *cancel_flag); + +#ifdef __cplusplus +} +#endif + + + #endif /* LIBSIXEL_SIXEL_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/Makefile.am b/src/Makefile.am index d45bc4a4..fbbf98e5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,6 +23,8 @@ libsixel_la_SOURCES = output.c \ frompnm.h \ easy_encode.c \ easy_encode.h \ + easy_decode.c \ + easy_decode.h \ stb_image.h \ writer.c \ stb_image_write.c \ diff --git a/src/Makefile.in b/src/Makefile.in index 6c5f22ba..c58ac86f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -132,7 +132,8 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-frame.lo libsixel_la-pixelformat.lo \ libsixel_la-scale.lo libsixel_la-loader.lo \ libsixel_la-frompnm.lo libsixel_la-easy_encode.lo \ - libsixel_la-writer.lo libsixel_la-stb_image_write.lo + libsixel_la-easy_decode.lo libsixel_la-writer.lo \ + libsixel_la-stb_image_write.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -362,6 +363,8 @@ libsixel_la_SOURCES = output.c \ frompnm.h \ easy_encode.c \ easy_encode.h \ + easy_decode.c \ + easy_decode.h \ stb_image.h \ writer.c \ stb_image_write.c \ @@ -464,6 +467,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frompnm.Plo@am__quote@ @@ -575,6 +579,13 @@ libsixel_la-easy_encode.lo: easy_encode.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-easy_encode.lo `test -f 'easy_encode.c' || echo '$(srcdir)/'`easy_encode.c +libsixel_la-easy_decode.lo: easy_decode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-easy_decode.lo -MD -MP -MF $(DEPDIR)/libsixel_la-easy_decode.Tpo -c -o libsixel_la-easy_decode.lo `test -f 'easy_decode.c' || echo '$(srcdir)/'`easy_decode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-easy_decode.Tpo $(DEPDIR)/libsixel_la-easy_decode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easy_decode.c' object='libsixel_la-easy_decode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-easy_decode.lo `test -f 'easy_decode.c' || echo '$(srcdir)/'`easy_decode.c + libsixel_la-writer.lo: writer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-writer.lo -MD -MP -MF $(DEPDIR)/libsixel_la-writer.Tpo -c -o libsixel_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-writer.Tpo $(DEPDIR)/libsixel_la-writer.Plo diff --git a/src/easy_encode.c b/src/easy_encode.c index 465e5551..11872d6d 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -1318,7 +1318,7 @@ sixel_easy_encode_setopt( -/* create frame object */ +/* create settings object */ sixel_encode_settings_t * sixel_encode_settings_create(void) { diff --git a/src/easy_encode.h b/src/easy_encode.h index 684733c1..fce36719 100644 --- a/src/easy_encode.h +++ b/src/easy_encode.h @@ -62,10 +62,6 @@ typedef struct sixel_encode_settings { unsigned char *bgcolor; } sixel_encode_settings_t; -#ifdef __cplusplus -} -#endif - #endif /* LIBSIXEL_EASY_ENCODE_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ From e0b2e4e5a8334bac85c691bbadf57d6de71af81e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 10:31:30 +0900 Subject: [PATCH 170/451] Allow NULL as cancel_flag argument in sixel_easy_encode() --- src/easy_encode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 11872d6d..6e3d81f5 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -838,7 +838,7 @@ load_image_callback(sixel_frame_t *frame, void *data) psettings); } - if (*callback_context->cancel_flag) { + if (callback_context->cancel_flag && *callback_context->cancel_flag) { printf("\x1b\\"); fflush(stdout); nret = SIXEL_INTERRUPTED; From ca33a7294461e26ced7ef96319d74996621568e2 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 10:34:50 +0900 Subject: [PATCH 171/451] Abolish cancel_flag argument of sixel_easy_decode() --- converters/sixel2png.c | 3 +-- include/sixel.h.in | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/converters/sixel2png.c b/converters/sixel2png.c index b6af5c84..4dddfaa5 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -110,7 +110,6 @@ main(int argc, char *argv[]) #endif /* HAVE_GETOPT_LONG */ int nret = 0; char const *optstring = "i:o:VH"; - int cancel_flag = 0; #if HAVE_GETOPT_LONG struct option long_options[] = { @@ -184,7 +183,7 @@ main(int argc, char *argv[]) goto argerr; } - nret = sixel_easy_decode(settings, &cancel_flag); + nret = sixel_easy_decode(settings); goto end; argerr: diff --git a/include/sixel.h.in b/include/sixel.h.in index f84a771e..d16585e0 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -649,8 +649,7 @@ sixel_easy_decode_setopt( int sixel_easy_decode( - sixel_decode_settings_t /* in */ *psettings, - int /* in */ *cancel_flag); + sixel_decode_settings_t /* in */ *psettings); #ifdef __cplusplus } From f1aad020fe0a3e766e7837f4e8b33a3b01e21e77 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 18:27:25 +0900 Subject: [PATCH 172/451] Allow NULL as 2nd argument in sixel_easy_encode() --- src/easy_encode.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 6e3d81f5..9b2970b4 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -873,6 +873,12 @@ sixel_easy_encode( int loop_control = psettings->loop_mode; sixel_callback_context_t callback_context; + if (psettings) { + sixel_encode_settings_ref(psettings); + } else { + psettings = sixel_encode_settings_create(); + } + if (psettings->reqcolors == (-1)) { psettings->reqcolors = SIXEL_PALETTE_MAX; } @@ -929,7 +935,7 @@ sixel_easy_encode( #if HAVE_SYS_SELECT_H nret = wait_stdin(1000000); if (nret == (-1)) { - return nret; + goto end; } #endif /* HAVE_SYS_SELECT_H */ if (nret != 0) { @@ -941,6 +947,9 @@ sixel_easy_encode( } } +end: + sixel_encode_settings_unref(psettings); + return nret; } From 1b7975969d6f753abbb0d15302a0df9c44054222 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 19:07:18 +0900 Subject: [PATCH 173/451] Minor fix --- src/easy_encode.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 9b2970b4..1f219502 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -870,15 +870,17 @@ sixel_easy_encode( { int nret = (-1); int fuse_palette = 1; - int loop_control = psettings->loop_mode; + int loop_control; sixel_callback_context_t callback_context; - if (psettings) { - sixel_encode_settings_ref(psettings); - } else { + if (psettings == NULL) { psettings = sixel_encode_settings_create(); + } else { + sixel_encode_settings_ref(psettings); } + loop_control = psettings->loop_mode; + if (psettings->reqcolors == (-1)) { psettings->reqcolors = SIXEL_PALETTE_MAX; } @@ -1326,7 +1328,6 @@ sixel_easy_encode_setopt( } - /* create settings object */ sixel_encode_settings_t * sixel_encode_settings_create(void) From 1d18ee2ee9231c85aa37831250089e9a532f1e6a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 22:09:24 +0900 Subject: [PATCH 174/451] Strip unused code around resize/crop --- src/easy_encode.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 1f219502..1b4177e1 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -720,12 +720,6 @@ load_image_callback(sixel_frame_t *frame, void *data) psettings = callback_context->settings; - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } - /* evaluate -w, -h, and -c option: crop/scale input source */ if (psettings->clipfirst) { /* clipping */ @@ -739,11 +733,6 @@ load_image_callback(sixel_frame_t *frame, void *data) if (nret != SIXEL_SUCCESS) { goto end; } - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } } else { /* scaling */ nret = do_resize(frame, psettings); @@ -751,12 +740,6 @@ load_image_callback(sixel_frame_t *frame, void *data) goto end; } - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } - /* clipping */ nret = do_crop(frame, psettings); if (nret != 0) { @@ -827,6 +810,13 @@ load_image_callback(sixel_frame_t *frame, void *data) output, psettings); } else { + + depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); + if (depth == (-1)) { + nret = (-1); + goto end; + } + /* do not use macro */ nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), sixel_frame_get_width(frame), From 7f10f119453dd8f7f037aa43623bec0e8d499d95 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 22:10:36 +0900 Subject: [PATCH 175/451] Resize PAL8 formatted pixel buffer correctly --- src/frame.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/frame.c b/src/frame.c index c6fd4278..14f3a70c 100644 --- a/src/frame.c +++ b/src/frame.c @@ -269,11 +269,52 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) unsigned char *normalized_pixels = NULL; int size; int nret = 0; + unsigned char *dst; + unsigned char *src; switch (frame->pixelformat) { - case PIXELFORMAT_RGB888: + case PIXELFORMAT_PAL1: + case PIXELFORMAT_PAL2: + case PIXELFORMAT_PAL4: + size = frame->width * frame->height * 4; + normalized_pixels = malloc(size); + src = normalized_pixels + frame->width * frame->height * 3; + dst = normalized_pixels; + nret = sixel_helper_normalize_pixelformat(src, + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + if (nret != 0) { + free(normalized_pixels); + return nret; + } + for (; src != dst + size; ++src) { + *dst++ = *(frame->palette + *src * 3 + 0); + *dst++ = *(frame->palette + *src * 3 + 1); + *dst++ = *(frame->palette + *src * 3 + 2); + } + free(frame->pixels); + frame->pixels = normalized_pixels; + frame->pixelformat = PIXELFORMAT_RGB888; break; case PIXELFORMAT_PAL8: + size = frame->width * frame->height * 3; + normalized_pixels = malloc(size); + src = frame->pixels; + dst = normalized_pixels; + for (; dst != normalized_pixels + size; ++src) { + *dst++ = frame->palette[*src * 3 + 0]; + *dst++ = frame->palette[*src * 3 + 1]; + *dst++ = frame->palette[*src * 3 + 2]; + } + free(frame->pixels); + frame->pixels = normalized_pixels; + frame->pixelformat = PIXELFORMAT_RGB888; + break; + case PIXELFORMAT_RGB888: + break; case PIXELFORMAT_G8: case PIXELFORMAT_GA88: case PIXELFORMAT_AG88: From cd4911d64b8777e8eeaea92d6dd433549ea2ed29 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 22:11:33 +0900 Subject: [PATCH 176/451] Fix leak around playing GIF animation --- src/loader.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/loader.c b/src/loader.c index f0570f08..350c92a9 100644 --- a/src/loader.c +++ b/src/loader.c @@ -952,9 +952,13 @@ load_with_builtin( frame->delay = g.delay; frame->ncolors = 2 << (g.flags & 7); frame->palette = malloc(frame->ncolors * 3); + if (frame->palette == NULL) { + goto error; + } if (frame->ncolors <= reqcolors) { frame->pixelformat = PIXELFORMAT_PAL8; - frame->pixels = p; + frame->pixels = malloc(frame->width * frame->height); + memcpy(frame->pixels, g.out, frame->width * frame->height); for (i = 0; i < frame->ncolors; ++i) { frame->palette[i * 3 + 0] = g.color_table[i * 4 + 2]; frame->palette[i * 3 + 1] = g.color_table[i * 4 + 1]; @@ -995,7 +999,6 @@ load_with_builtin( frame->pixels[i * 3 + 1] = g.color_table[p[i] * 4 + 1]; frame->pixels[i * 3 + 2] = g.color_table[p[i] * 4 + 0]; } - free(p); } if (frame->pixels == NULL) { fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", @@ -1014,6 +1017,8 @@ load_with_builtin( } } + free(g.out); + ++frame->loop_count; if (g.loop_count == (-1)) { From 2aa6ebd30ca84d12229f2cb5dd09c908b10b47b6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 23:34:13 +0900 Subject: [PATCH 177/451] Minor fixes --- src/easy_encode.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 1b4177e1..4a5639de 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -525,7 +525,7 @@ output_sixel_without_macro( unsigned char *frame, int width, int height, - int depth, + int pixelformat, int delay, sixel_dither_t *dither, sixel_output_t *context, @@ -535,6 +535,7 @@ output_sixel_without_macro( int nret = 0; int dulation = 0; unsigned char *p; + int depth; #if HAVE_USLEEP int lag = 0; # if HAVE_CLOCK @@ -546,6 +547,12 @@ output_sixel_without_macro( sixel_dither_set_optimize_palette(dither, 1); } + depth = sixel_helper_compute_depth(pixelformat); + if (depth == (-1)) { + nret = (-1); + goto end; + } + p = malloc(width * height * depth); if (nret != 0) { goto end; @@ -810,18 +817,11 @@ load_image_callback(sixel_frame_t *frame, void *data) output, psettings); } else { - - depth = sixel_helper_compute_depth(sixel_frame_get_pixelformat(frame)); - if (depth == (-1)) { - nret = (-1); - goto end; - } - /* do not use macro */ nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), sixel_frame_get_width(frame), sixel_frame_get_height(frame), - depth, + sixel_frame_get_pixelformat(frame), sixel_frame_get_delay(frame), dither, output, From c51f16acda431e3c797b91fc3bb844b1608b0c19 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 23:34:24 +0900 Subject: [PATCH 178/451] Add ctypes(ffi) python binding examples --- python/libsixel.py | 111 +++++++++++++++++++++++++++++++++++++++++++++ python/sample1.py | 11 +++++ 2 files changed, 122 insertions(+) create mode 100755 python/libsixel.py create mode 100755 python/sample1.py diff --git a/python/libsixel.py b/python/libsixel.py new file mode 100755 index 00000000..8b397245 --- /dev/null +++ b/python/libsixel.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# +# This code is in public domain +# + +from ctypes import * +import ctypes.util + +def _load(): + sixel = CDLL(ctypes.util.find_library("sixel")) + sixel.sixel_encode_settings_create.restype = c_void_p + sixel.sixel_encode_settings_unref.restype = None + sixel.sixel_encode_settings_unref.argtypes = [c_void_p] + sixel.sixel_easy_encode_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_easy_encode.argtypes = [c_char_p, c_void_p, c_void_p] + sixel.sixel_decode_settings_create.restype = c_void_p + sixel.sixel_decode_settings_unref.restype = None + sixel.sixel_decode_settings_unref.argtypes = [c_void_p] + sixel.sixel_easy_decode_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_easy_decode.argtypes = [c_void_p] + + return sixel + + +class Encoder(object): + + def __init__(self): + self._sixel = _load() + self._settings = self._sixel.sixel_encode_settings_create() + + def __del__(self): + self._sixel.sixel_encode_settings_unref(self._settings) + + def setopt(self, flag, arg=None): + flag = ord(flag) + if arg: + arg = str(arg) + settings = self._settings + result = self._sixel.sixel_easy_encode_setopt(settings, flag, arg) + if result != 0: + raise RuntimeError() + + def encode(self, filename="-"): + result = self._sixel.sixel_easy_encode(filename, self._settings, None) + if result != 0: + raise RuntimeError() + + def test(self, filename): + import threading + + self.setopt("p", 16) + self.setopt("d", "atkinson") + self.setopt("w", "200") + t = threading.Thread(target=self.encode, args=[filename]) + t.daemon = True + t.start() + try: + while t.is_alive(): + t.join(1) + except KeyboardInterrupt as e: + print "\033\\\033[Jcanceled." + + +class Decoder(object): + + def __init__(self): + self._sixel = _load() + self._settings = self._sixel.sixel_decode_settings_create() + + def __del__(self): + self._sixel.sixel_decode_settings_unref(self._settings) + + def setopt(self, flag, arg=None): + flag = ord(flag) + if arg: + arg = str(arg) + settings = self._settings + result = self._sixel.sixel_easy_decode_setopt(settings, flag, arg) + if result != 0: + raise RuntimeError() + + def decode(self): + result = self._sixel.sixel_easy_decode(self._settings) + if result != 0: + raise RuntimeError() + + def test(self, infile=None, outfile=None): + import threading + + if infile: + self.setopt("i", infile) + if outfile: + self.setopt("o", outfile) + t = threading.Thread(target=self.decode) + t.daemon = True + t.start() + try: + while t.is_alive(): + t.join(1) + except KeyboardInterrupt as e: + print "\033\\\033[Jcanceled." + + +if __name__ == '__main__': + import sys + + arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] +# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] + Encoder().test(arg1) +# Decoder().test(arg1, arg2) + diff --git a/python/sample1.py b/python/sample1.py new file mode 100755 index 00000000..e017de38 --- /dev/null +++ b/python/sample1.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +# +# This code is in public domain +# + +import ctypes +import ctypes.util + +dllpath = ctypes.util.find_library("sixel") +sixel = ctypes.CDLL(dllpath) +sixel.sixel_easy_encode("-", None, None) From a8ad51f192e19b7d83d3006b1ea91d29ba46dd21 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 30 Apr 2015 23:34:24 +0900 Subject: [PATCH 179/451] Add ctypes(ffi) python binding examples --- libsixel.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ sample1.py | 11 ++++++ 2 files changed, 122 insertions(+) create mode 100755 libsixel.py create mode 100755 sample1.py diff --git a/libsixel.py b/libsixel.py new file mode 100755 index 00000000..8b397245 --- /dev/null +++ b/libsixel.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# +# This code is in public domain +# + +from ctypes import * +import ctypes.util + +def _load(): + sixel = CDLL(ctypes.util.find_library("sixel")) + sixel.sixel_encode_settings_create.restype = c_void_p + sixel.sixel_encode_settings_unref.restype = None + sixel.sixel_encode_settings_unref.argtypes = [c_void_p] + sixel.sixel_easy_encode_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_easy_encode.argtypes = [c_char_p, c_void_p, c_void_p] + sixel.sixel_decode_settings_create.restype = c_void_p + sixel.sixel_decode_settings_unref.restype = None + sixel.sixel_decode_settings_unref.argtypes = [c_void_p] + sixel.sixel_easy_decode_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_easy_decode.argtypes = [c_void_p] + + return sixel + + +class Encoder(object): + + def __init__(self): + self._sixel = _load() + self._settings = self._sixel.sixel_encode_settings_create() + + def __del__(self): + self._sixel.sixel_encode_settings_unref(self._settings) + + def setopt(self, flag, arg=None): + flag = ord(flag) + if arg: + arg = str(arg) + settings = self._settings + result = self._sixel.sixel_easy_encode_setopt(settings, flag, arg) + if result != 0: + raise RuntimeError() + + def encode(self, filename="-"): + result = self._sixel.sixel_easy_encode(filename, self._settings, None) + if result != 0: + raise RuntimeError() + + def test(self, filename): + import threading + + self.setopt("p", 16) + self.setopt("d", "atkinson") + self.setopt("w", "200") + t = threading.Thread(target=self.encode, args=[filename]) + t.daemon = True + t.start() + try: + while t.is_alive(): + t.join(1) + except KeyboardInterrupt as e: + print "\033\\\033[Jcanceled." + + +class Decoder(object): + + def __init__(self): + self._sixel = _load() + self._settings = self._sixel.sixel_decode_settings_create() + + def __del__(self): + self._sixel.sixel_decode_settings_unref(self._settings) + + def setopt(self, flag, arg=None): + flag = ord(flag) + if arg: + arg = str(arg) + settings = self._settings + result = self._sixel.sixel_easy_decode_setopt(settings, flag, arg) + if result != 0: + raise RuntimeError() + + def decode(self): + result = self._sixel.sixel_easy_decode(self._settings) + if result != 0: + raise RuntimeError() + + def test(self, infile=None, outfile=None): + import threading + + if infile: + self.setopt("i", infile) + if outfile: + self.setopt("o", outfile) + t = threading.Thread(target=self.decode) + t.daemon = True + t.start() + try: + while t.is_alive(): + t.join(1) + except KeyboardInterrupt as e: + print "\033\\\033[Jcanceled." + + +if __name__ == '__main__': + import sys + + arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] +# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] + Encoder().test(arg1) +# Decoder().test(arg1, arg2) + diff --git a/sample1.py b/sample1.py new file mode 100755 index 00000000..e017de38 --- /dev/null +++ b/sample1.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +# +# This code is in public domain +# + +import ctypes +import ctypes.util + +dllpath = ctypes.util.find_library("sixel") +sixel = ctypes.CDLL(dllpath) +sixel.sixel_easy_encode("-", None, None) From b9fffc6e84bbae2a4d2d6711517a5356e00fc977 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 2 May 2015 09:04:06 +0900 Subject: [PATCH 180/451] Respect fuse_palette flag when decoding GIF images --- src/loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loader.c b/src/loader.c index 350c92a9..cd5b02a4 100644 --- a/src/loader.c +++ b/src/loader.c @@ -955,7 +955,7 @@ load_with_builtin( if (frame->palette == NULL) { goto error; } - if (frame->ncolors <= reqcolors) { + if (frame->ncolors <= reqcolors && fuse_palette) { frame->pixelformat = PIXELFORMAT_PAL8; frame->pixels = malloc(frame->width * frame->height); memcpy(frame->pixels, g.out, frame->width * frame->height); From 27e0190ed5bac669e3f2940b679316346214e3b8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 2 May 2015 09:05:15 +0900 Subject: [PATCH 181/451] Add missing files, src/easy_decode.{c,h} --- src/easy_decode.c | 261 ++++++++++++++++++++++++++++++++++++++++++++++ src/easy_decode.h | 38 +++++++ 2 files changed, 299 insertions(+) create mode 100644 src/easy_decode.c create mode 100644 src/easy_decode.h diff --git a/src/easy_decode.c b/src/easy_decode.c new file mode 100644 index 00000000..1ae39a54 --- /dev/null +++ b/src/easy_decode.c @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_SYS_UNISTD_H +# include +#endif +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_SELECT_H +#include +#endif +#if HAVE_TIME_H +# include +#endif +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif +#if HAVE_ERRNO_H +# include +#endif +#if HAVE_TERMIOS_H +# include +#endif +#if HAVE_SYS_IOCTL_H +# include +#endif + +#include "easy_decode.h" +#include + + +static char * +arg_strdup(char const *s) +{ + char *p; + + p = malloc(strlen(s) + 1); + if (p) { + strcpy(p, s); + } + return p; +} + + +int +sixel_easy_decode( + sixel_decode_settings_t /* in */ *psettings) +{ + unsigned char *raw_data; + int sx, sy; + int raw_len; + int max; + int n; + FILE *input_fp = NULL; + unsigned char *indexed_pixels; + unsigned char *palette; + int ncolors; + unsigned char *pixels = NULL; + int ret = 0; + + if (strcmp(psettings->input, "-") == 0) { + /* for windows */ +#if defined(O_BINARY) +# if HAVE__SETMODE + _setmode(fileno(stdin), O_BINARY); +# elif HAVE_SETMODE + setmode(fileno(stdin), O_BINARY); +# endif /* HAVE_SETMODE */ +#endif /* defined(O_BINARY) */ + input_fp = stdin; + } else { + input_fp = fopen(psettings->input, "rb"); + if (!input_fp) { +#if HAVE_ERRNO_H + fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", + psettings->input, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } + } + + raw_len = 0; + max = 64 * 1024; + + if ((raw_data = (unsigned char *)malloc(max)) == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "malloc(%d) failed.\n" "reason: %s.\n", + max, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } + + for (;;) { + if ((max - raw_len) < 4096) { + max *= 2; + if ((raw_data = (unsigned char *)realloc(raw_data, max)) == NULL) { +#if HAVE_ERRNO_H + fprintf(stderr, "realloc(raw_data, %d) failed.\n" + "reason: %s.\n", + max, strerror(errno)); +#endif /* HAVE_ERRNO_H */ + return (-1); + } + } + if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) + break; + raw_len += n; + } + + if (input_fp != stdout) { + fclose(input_fp); + } + + ret = sixel_decode(raw_data, raw_len, &indexed_pixels, + &sx, &sy, &palette, &ncolors, malloc); + + if (ret != 0) { + fprintf(stderr, "sixel_decode failed.\n"); + goto end; + } + + ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, + PIXELFORMAT_PAL8, + psettings->output, + FORMAT_PNG); + +end: + free(pixels); + return ret; +} + + +int +sixel_easy_decode_setopt( + sixel_decode_settings_t /* in */ *settings, + int /* in */ arg, + char /* in */ *optarg +) +{ + switch(arg) { + case 'i': + free(settings->input); + settings->input = arg_strdup(optarg); + break; + case 'o': + free(settings->output); + settings->output = arg_strdup(optarg); + break; + case 'V': + settings->show_version = 1; + break; + case 'H': + settings->show_help = 1; + break; + case '?': + default: + return (-1); + } + + return 0; +} + + +/* create settings object */ +sixel_decode_settings_t * +sixel_decode_settings_create(void) +{ + sixel_decode_settings_t *settings; + + settings = malloc(sizeof(sixel_decode_settings_t)); + + settings->ref = 1; + settings->output = arg_strdup("-"); + settings->input = arg_strdup("-"); + settings->show_version = 0; + settings->show_help = 0; + + return settings; +} + + +void +sixel_decode_settings_destroy(sixel_decode_settings_t *settings) +{ + if (settings) { + free(settings->input); + free(settings->output); + free(settings); + } +} + + +void +sixel_decode_settings_ref(sixel_decode_settings_t *settings) +{ + /* TODO: be thread safe */ + ++settings->ref; +} + + +void +sixel_decode_settings_unref(sixel_decode_settings_t *settings) +{ + /* TODO: be thread safe */ + if (settings != NULL && --settings->ref == 0) { + sixel_decode_settings_destroy(settings); + } +} + + +/* get show_version flag */ +int +sixel_decode_settings_has_version(sixel_decode_settings_t *settings) +{ + return settings->show_version; +} + + +/* get show_help flag */ +int +sixel_decode_settings_has_help(sixel_decode_settings_t *settings) +{ + return settings->show_help; +} + + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/easy_decode.h b/src/easy_decode.h new file mode 100644 index 00000000..15e04c3b --- /dev/null +++ b/src/easy_decode.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_EASY_DECODE_H +#define LIBSIXEL_EASY_DECODE_H + +/* encode settings object */ +typedef struct sixel_decode_settings { + unsigned int ref; + char *input; + char *output; + int show_version; + int show_help; +} sixel_decode_settings_t; + +#endif /* LIBSIXEL_EASY_DECODE_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 6e0d86e04991ece3fd3fe37572e10a05e66034ed Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 2 May 2015 10:17:00 +0900 Subject: [PATCH 182/451] Suppress a gcc warning [-Werror=unused-variable] --- src/easy_encode.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 4a5639de..a21dd282 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -719,7 +719,6 @@ static int load_image_callback(sixel_frame_t *frame, void *data) { int nret = SIXEL_FAILED; - int depth; sixel_encode_settings_t *psettings; sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; From 23d4e0ca12a71082e059938f34037c2af0a558ba Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 2 May 2015 10:38:29 +0900 Subject: [PATCH 183/451] Rename python class names --- python/libsixel.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/python/libsixel.py b/python/libsixel.py index 8b397245..fea1ae33 100755 --- a/python/libsixel.py +++ b/python/libsixel.py @@ -22,7 +22,7 @@ def _load(): return sixel -class Encoder(object): +class EasyEncoder(object): def __init__(self): self._sixel = _load() @@ -38,12 +38,12 @@ def setopt(self, flag, arg=None): settings = self._settings result = self._sixel.sixel_easy_encode_setopt(settings, flag, arg) if result != 0: - raise RuntimeError() + raise RuntimeError("Invalid option was set.") def encode(self, filename="-"): result = self._sixel.sixel_easy_encode(filename, self._settings, None) if result != 0: - raise RuntimeError() + raise RuntimeError("Unexpected Error") def test(self, filename): import threading @@ -61,7 +61,7 @@ def test(self, filename): print "\033\\\033[Jcanceled." -class Decoder(object): +class EasyDecoder(object): def __init__(self): self._sixel = _load() @@ -77,12 +77,14 @@ def setopt(self, flag, arg=None): settings = self._settings result = self._sixel.sixel_easy_decode_setopt(settings, flag, arg) if result != 0: - raise RuntimeError() + raise RuntimeError("Invalid option was set.") - def decode(self): + def decode(self, infile=None): + if infile: + self.setopt("i", infile) result = self._sixel.sixel_easy_decode(self._settings) if result != 0: - raise RuntimeError() + raise RuntimeError("Unexpected Error") def test(self, infile=None, outfile=None): import threading @@ -106,6 +108,6 @@ def test(self, infile=None, outfile=None): arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] # arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] - Encoder().test(arg1) -# Decoder().test(arg1, arg2) + EasyEncoder().test(arg1) +# EasyDecoder().test(arg1, arg2) From 30feca7491295058b5476c19e05b1da3107a82f7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 2 May 2015 10:38:29 +0900 Subject: [PATCH 184/451] Rename python class names --- libsixel.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/libsixel.py b/libsixel.py index 8b397245..fea1ae33 100755 --- a/libsixel.py +++ b/libsixel.py @@ -22,7 +22,7 @@ def _load(): return sixel -class Encoder(object): +class EasyEncoder(object): def __init__(self): self._sixel = _load() @@ -38,12 +38,12 @@ def setopt(self, flag, arg=None): settings = self._settings result = self._sixel.sixel_easy_encode_setopt(settings, flag, arg) if result != 0: - raise RuntimeError() + raise RuntimeError("Invalid option was set.") def encode(self, filename="-"): result = self._sixel.sixel_easy_encode(filename, self._settings, None) if result != 0: - raise RuntimeError() + raise RuntimeError("Unexpected Error") def test(self, filename): import threading @@ -61,7 +61,7 @@ def test(self, filename): print "\033\\\033[Jcanceled." -class Decoder(object): +class EasyDecoder(object): def __init__(self): self._sixel = _load() @@ -77,12 +77,14 @@ def setopt(self, flag, arg=None): settings = self._settings result = self._sixel.sixel_easy_decode_setopt(settings, flag, arg) if result != 0: - raise RuntimeError() + raise RuntimeError("Invalid option was set.") - def decode(self): + def decode(self, infile=None): + if infile: + self.setopt("i", infile) result = self._sixel.sixel_easy_decode(self._settings) if result != 0: - raise RuntimeError() + raise RuntimeError("Unexpected Error") def test(self, infile=None, outfile=None): import threading @@ -106,6 +108,6 @@ def test(self, infile=None, outfile=None): arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] # arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] - Encoder().test(arg1) -# Decoder().test(arg1, arg2) + EasyEncoder().test(arg1) +# EasyDecoder().test(arg1, arg2) From 59f92552ffab3a4c6582452b0ea22a3826bd84ce Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 4 May 2015 10:14:34 +0900 Subject: [PATCH 185/451] Fix a memory leak --- src/easy_encode.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/easy_encode.c b/src/easy_encode.c index a21dd282..8628a006 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -584,6 +584,7 @@ output_sixel_without_macro( } end: + free(p); return nret; } From 93c5e6c43d55702776c203a3f893660181bb4813 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 4 May 2015 10:15:28 +0900 Subject: [PATCH 186/451] Minor fix around auto-scrolling --- src/easy_encode.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 8628a006..c73209f3 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -668,7 +668,9 @@ scroll_on_demand(sixel_frame_t *frame) struct termios new_termios; int row = 0; int col = 0; - int n; + int pixelheight; + int cellheight; + int scroll; if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); @@ -685,13 +687,14 @@ scroll_on_demand(sixel_frame_t *frame) /* request cursor position report */ printf("\033[6n"); fflush(stdout); - if (wait_stdin(1000000) != (-1)) { /* wait 1 sec */ + if (wait_stdin(1000 * 1000) != (-1)) { /* wait 1 sec */ if (scanf("\033[%d;%dR", &row, &col) == 2) { tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); - n = sixel_frame_get_height(frame) * size.ws_row / size.ws_ypixel + 1 - + row - size.ws_row; - if (n > 0) { - printf("\033[%dS\033[%dA", n, n); + pixelheight = sixel_frame_get_height(frame); + cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; + scroll = cellheight + row - size.ws_row + 1; + if (scroll > 0) { + printf("\033[%dS\033[%dA", scroll, scroll); } printf("\0337"); } else { From 96b0a6e52c0eb810318a444bdcaee1b3bfc568e5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 4 May 2015 10:16:15 +0900 Subject: [PATCH 187/451] Emit CAN(\x18) when received signals --- src/easy_encode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index c73209f3..e3fc3e3d 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -832,7 +832,7 @@ load_image_callback(sixel_frame_t *frame, void *data) } if (callback_context->cancel_flag && *callback_context->cancel_flag) { - printf("\x1b\\"); + printf("\x18\x1b\\"); fflush(stdout); nret = SIXEL_INTERRUPTED; } From 30b80e140871732313a2faca78e4bc9bcc0a7b9d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 5 May 2015 01:06:26 +0900 Subject: [PATCH 188/451] Add new file fromgif.{c,h} --- src/fromgif.c | 621 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/fromgif.h | 51 +++++ 2 files changed, 672 insertions(+) create mode 100644 src/fromgif.c create mode 100644 src/fromgif.h diff --git a/src/fromgif.c b/src/fromgif.c new file mode 100644 index 00000000..47293f28 --- /dev/null +++ b/src/fromgif.c @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include "frame.h" +#include + + +typedef unsigned char stbi_uc; + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original; +} stbi__context; + +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][3]; + stbi_uc lpal[256][3]; + stbi__gif_lzw codes[4096]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int loop_count; + int delay; + int is_multiframe; + int is_terminated; +} stbi__gif; + + + +// initialize a memory-decode context +static void +start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = (stbi_uc *) buffer+len; +} + + +static +stbi_uc get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) { + return *s->img_buffer++; + } + return 0; +} + + +static int get16le(stbi__context *s) +{ + int z = get8(s); + return z + (get8(s) << 8); +} + + +static int +stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + + +static void +stbi__skip(stbi__context *s, int n) +{ + s->img_buffer += n; +} + + +static void +stbi__rewind(stbi__context *s) +{ + s->img_buffer = s->img_buffer_original; +} + + +static void +gif_parse_colortable( + stbi__context *s, + stbi_uc pal[256][3], + int num_entries) +{ + int i; + + for (i = 0; i < num_entries; ++i) { + pal[i][2] = get8(s); + pal[i][1] = get8(s); + pal[i][0] = get8(s); + } +} + + +static int +load_gif_header(stbi__context *s, stbi__gif *g) +{ + stbi_uc version; + if (get8(s) != 'G') { + return (-1); + } + if (get8(s) != 'I') { + return (-1); + } + if (get8(s) != 'F') { + return (-1); + } + if (get8(s) != '8') { + return (-1); + } + + version = get8(s); + + if (version != '7' && version != '9') { + return (-1); + } + if (get8(s) != 'a') { + return (-1); + } + + g->w = get16le(s); + g->h = get16le(s); + g->flags = get8(s); + g->bgindex = get8(s); + g->ratio = get8(s); + g->transparent = -1; + g->loop_count = -1; + + if (g->flags & 0x80) { + gif_parse_colortable(s,g->pal, 2 << (g->flags & 7)); + } + + return 0; +} + + +int +init_gif_frame( + sixel_frame_t *frame, + stbi__gif *pg, + unsigned char *bgcolor, + int reqcolors, + int fuse_palette) +{ + int i; + + frame->delay = pg->delay; + frame->ncolors = 2 << (pg->flags & 7); + frame->palette = malloc(frame->ncolors * 3); + if (frame->palette == NULL) { + return (-1); + } + if (frame->ncolors <= reqcolors && fuse_palette) { + frame->pixelformat = PIXELFORMAT_PAL8; + frame->pixels = malloc(frame->width * frame->height); + memcpy(frame->pixels, pg->out, frame->width * frame->height); + + for (i = 0; i < frame->ncolors; ++i) { + frame->palette[i * 3 + 0] = pg->color_table[i * 3 + 2]; + frame->palette[i * 3 + 1] = pg->color_table[i * 3 + 1]; + frame->palette[i * 3 + 2] = pg->color_table[i * 3 + 0]; + } + if (pg->lflags & 0x80) { + if (pg->eflags & 0x01) { + if (bgcolor) { + frame->palette[pg->transparent * 3 + 0] = bgcolor[0]; + frame->palette[pg->transparent * 3 + 1] = bgcolor[1]; + frame->palette[pg->transparent * 3 + 2] = bgcolor[2]; + } else { + frame->transparent = pg->transparent; + } + } + } else if (pg->flags & 0x80) { + if (pg->eflags & 0x01) { + if (bgcolor) { + frame->palette[pg->transparent * 3 + 0] = bgcolor[0]; + frame->palette[pg->transparent * 3 + 1] = bgcolor[1]; + frame->palette[pg->transparent * 3 + 2] = bgcolor[2]; + } else { + frame->transparent = pg->transparent; + } + } + } + } else { + frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixels = malloc(pg->w * pg->h * 3); + for (i = 0; i < pg->w * pg->h; ++i) { + frame->pixels[i * 3 + 0] = pg->color_table[pg->out[i] * 3 + 2]; + frame->pixels[i * 3 + 1] = pg->color_table[pg->out[i] * 3 + 1]; + frame->pixels[i * 3 + 2] = pg->color_table[pg->out[i] * 3 + 0]; + } + } + if (frame->pixels == NULL) { + fprintf(stderr, "stbi_load_from_file failed.\n"); + return (-1); + } + frame->multiframe = (pg->loop_count != (-1)); + + return 0; +} + + +static void +out_gif_code( + stbi__gif *g, + stbi__uint16 code +) +{ + /* recurse to decode the prefixes, since the linked-list is backwards, + and working backwards through an interleaved image would be nasty */ + if (g->codes[code].prefix >= 0) { + out_gif_code(g, g->codes[code].prefix); + } + + if (g->cur_y >= g->max_y) { + return; + } + + g->out[g->cur_x + g->cur_y] = g->codes[code].suffix; + g->cur_x++; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + + +static int +process_gif_raster( + stbi__context *s, + stbi__gif *g +) +{ + stbi_uc lzw_cs; + stbi__int32 len, code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = get8(s); + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (code = 0; code < clear; code++) { + g->codes[code].prefix = -1; + g->codes[code].first = (stbi_uc) code; + g->codes[code].suffix = (stbi_uc) code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = get8(s); // start new block + if (len == 0) { + return SIXEL_SUCCESS; + } + } + --len; + bits |= (stbi__int32) get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = get8(s)) > 0) { + stbi__skip(s,len); + } + return SIXEL_SUCCESS; + } else if (code <= avail) { + if (first) { + fprintf(stderr, + "Corrupt GIF\n" "reason: no clear code\n"); + return SIXEL_FAILED; + } + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) { + fprintf(stderr, + "Corrupt GIF\n" "reason: too many codes\n"); + return SIXEL_FAILED; + } + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) { + fprintf(stderr, + "Corrupt GIF\n" "reason: illegal code in raster\n"); + return SIXEL_FAILED; + } + + out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + fprintf(stderr, + "Corrupt GIF\n" "reason: illegal code in raster\n"); + return SIXEL_FAILED; + } + } + } +} + + +/* this function is ported from stb_image.h */ +static int +gif_load_next( + stbi__context *s, + stbi__gif *g, + stbi_uc *bgcolor +) +{ + stbi_uc buffer[256]; + + for (;;) { + switch (get8(s)) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + + x = get16le(s); + y = get16le(s); + w = get16le(s); + h = get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) { + fprintf(stderr, + "Corrupt GIF.\n" "reason: bad Image Descriptor.\n"); + return SIXEL_FAILED; + } + + g->line_size = g->w; + g->start_x = x; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; /* first interlaced spacing */ + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + gif_parse_colortable(s, + g->lpal, + 2 << (g->lflags & 7)); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + /* @OPTIMIZE: stbi__jpeg_reset only the previous transparent */ + if (g->transparent >= 0 && (g->eflags & 0x01)) { + if (bgcolor) { + g->pal[g->transparent][0] = bgcolor[2]; + g->pal[g->transparent][1] = bgcolor[1]; + g->pal[g->transparent][2] = bgcolor[0]; + } + } + g->color_table = (stbi_uc *)g->pal; + } else { + fprintf(stderr, + "Corrupt GIF.\n" "reason: missing color table.\n"); + return SIXEL_FAILED; + } + + return process_gif_raster(s, g); + } + + case 0x21: // Comment Extension. + { + int len; + switch (get8(s)) { + case 0x01: // Plain Text Extension + break; + case 0x21: // Comment Extension + break; + case 0xF9: // Graphic Control Extension + len = get8(s); // block size + if (len == 4) { + g->eflags = get8(s); + g->delay = get16le(s); // delay + g->transparent = get8(s); + } else { + stbi__skip(s, len); + break; + } + break; + case 0xFF: // Application Extension + len = get8(s); // block size + stbi__getn(s, buffer, len); + buffer[len] = 0; + if (len == 11 && strcmp((char *)buffer, "NETSCAPE2.0") == 0) { + if (get8(s) == 0x03) { + /* loop count */ + switch (get8(s)) { + case 0x00: + g->loop_count = 1; + break; + case 0x01: + g->loop_count = get16le(s); + break; + } + } + } + break; + default: + break; + } + while ((len = get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + g->is_terminated = 1; + return SIXEL_SUCCESS; + + default: + fprintf(stderr, + "Corrupt GIF.\n" "reason: unknown code.\n"); + return SIXEL_FAILED; + } + } + + return SIXEL_SUCCESS; +} + + +int +load_gif(unsigned char *buffer, + int size, + unsigned char *bgcolor, + int reqcolors, + int fuse_palette, + int fstatic, + int loop_control, + sixel_load_image_function /* in */ fn_load, /* callback */ + void /* in/out */ *context /* private data for callback */ +) +{ + stbi__context s; + stbi__gif g; + int ret; + sixel_frame_t *frame; + + frame = sixel_frame_create(); + if (frame == NULL) { + return SIXEL_FAILED; + } + start_mem(&s, buffer, size); + ret = load_gif_header(&s, &g); + if (ret != SIXEL_SUCCESS) { + goto end; + } + frame->width = g.w, + frame->height = g.h, + g.out = (stbi_uc *)malloc(g.w * g.h); + if (g.out == NULL) { + goto end; + } + + frame->loop_count = 0; + + for (;;) { /* per loop */ + + frame->frame_no = 0; + + stbi__rewind(&s); + ret = load_gif_header(&s, &g); + if (ret != 0) { + goto end; + } + + g.is_terminated = 0; + + for (;;) { /* per frame */ + ret = gif_load_next(&s, &g, bgcolor); + if (ret != 0) { + goto end; + } + if (g.is_terminated) { + break; + } + + ret = init_gif_frame(frame, &g, bgcolor, reqcolors, fuse_palette); + if (ret != 0) { + goto end; + } + + ret = fn_load(frame, context); + if (ret != 0) { + goto end; + } + + if (fstatic) { + break; + } + ++frame->frame_no; + } + + ++frame->loop_count; + + if (g.loop_count == (-1)) { + break; + } + if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { + break; + } + if (loop_control == LOOP_AUTO && frame->loop_count == g.loop_count) { + break; + } + } + +end: + free(g.out); + + return 0; +} + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/fromgif.h b/src/fromgif.h new file mode 100644 index 00000000..9e01f0b9 --- /dev/null +++ b/src/fromgif.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_FROMGIF_H +#define LIBSIXEL_FROMGIF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* load gif */ + +int +load_gif(unsigned char *buffer, + int size, + unsigned char *bgcolor, + int reqcolors, + int fuse_palette, + int fstatic, + int loop_control, + void /* in */ *fn_load, /* callback */ + void /* in/out */ *context /* private data for callback */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_FROMGIF */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 775174d3148ec12b249b8151bf913f15b7e05e17 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 5 May 2015 01:08:19 +0900 Subject: [PATCH 189/451] Minor fixes --- src/easy_encode.c | 28 ++++++++++++++++++++++------ src/loader.c | 1 + 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index e3fc3e3d..398f4e5f 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -522,19 +522,20 @@ wait_stdin(int usec) static int output_sixel_without_macro( - unsigned char *frame, + unsigned char *buffer, int width, int height, int pixelformat, int delay, sixel_dither_t *dither, sixel_output_t *context, - sixel_encode_settings_t *psettings + sixel_encode_settings_t *psettings, + int *cancel_flag ) { int nret = 0; int dulation = 0; - unsigned char *p; + static unsigned char *p; int depth; #if HAVE_USLEEP int lag = 0; @@ -577,7 +578,12 @@ output_sixel_without_macro( } #endif - memcpy(p, frame, width * height * depth); + memcpy(p, buffer, width * height * depth); + + if (*cancel_flag) { + goto end; + } + nret = sixel_encode(p, width, height, depth, dither, context); if (nret != 0) { goto end; @@ -796,6 +802,11 @@ load_image_callback(sixel_frame_t *frame, void *data) scroll_on_demand(frame); } + if (callback_context->cancel_flag && *callback_context->cancel_flag) { + nret = SIXEL_INTERRUPTED; + goto end; + } + /* output sixel: junction of multi-frame processing strategy */ if (psettings->fuse_macro) { /* -u option */ /* use macro */ @@ -828,7 +839,8 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_frame_get_delay(frame), dither, output, - psettings); + psettings, + callback_context->cancel_flag); } if (callback_context->cancel_flag && *callback_context->cancel_flag) { @@ -922,7 +934,11 @@ sixel_easy_encode( load_image_callback, &callback_context); - if (nret == 0 && psettings->pipe_mode) { + if (nret != 0) { + goto end; + } + + if (psettings->pipe_mode) { #if HAVE_CLEARERR clearerr(stdin); #endif /* HAVE_FSEEK */ diff --git a/src/loader.c b/src/loader.c index cd5b02a4..7040e047 100644 --- a/src/loader.c +++ b/src/loader.c @@ -843,6 +843,7 @@ chunk_is_jpeg(chunk_t const *chunk) #endif /* HAVE_JPEG */ + int load_with_builtin( chunk_t const /* in */ *pchunk, /* image data */ From 1d92429d7a01cbeb583566f5c32d41f6d2bb9dde Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 5 May 2015 01:10:31 +0900 Subject: [PATCH 190/451] Use built-in gif loader --- src/Makefile.am | 2 + src/Makefile.in | 16 ++++- src/loader.c | 154 ++++++++++++------------------------------------ 3 files changed, 53 insertions(+), 119 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index fbbf98e5..e35c12eb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,6 +21,8 @@ libsixel_la_SOURCES = output.c \ loader.c \ frompnm.c \ frompnm.h \ + fromgif.c \ + fromgif.h \ easy_encode.c \ easy_encode.h \ easy_decode.c \ diff --git a/src/Makefile.in b/src/Makefile.in index c58ac86f..03d7ff6b 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -131,9 +131,9 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ libsixel_la-frame.lo libsixel_la-pixelformat.lo \ libsixel_la-scale.lo libsixel_la-loader.lo \ - libsixel_la-frompnm.lo libsixel_la-easy_encode.lo \ - libsixel_la-easy_decode.lo libsixel_la-writer.lo \ - libsixel_la-stb_image_write.lo + libsixel_la-frompnm.lo libsixel_la-fromgif.lo \ + libsixel_la-easy_encode.lo libsixel_la-easy_decode.lo \ + libsixel_la-writer.lo libsixel_la-stb_image_write.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -361,6 +361,8 @@ libsixel_la_SOURCES = output.c \ loader.c \ frompnm.c \ frompnm.h \ + fromgif.c \ + fromgif.h \ easy_encode.c \ easy_encode.h \ easy_decode.c \ @@ -470,6 +472,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frame.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromgif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frompnm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromsixel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-loader.Plo@am__quote@ @@ -572,6 +575,13 @@ libsixel_la-frompnm.lo: frompnm.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-frompnm.lo `test -f 'frompnm.c' || echo '$(srcdir)/'`frompnm.c +libsixel_la-fromgif.lo: fromgif.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-fromgif.lo -MD -MP -MF $(DEPDIR)/libsixel_la-fromgif.Tpo -c -o libsixel_la-fromgif.lo `test -f 'fromgif.c' || echo '$(srcdir)/'`fromgif.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-fromgif.Tpo $(DEPDIR)/libsixel_la-fromgif.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fromgif.c' object='libsixel_la-fromgif.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-fromgif.lo `test -f 'fromgif.c' || echo '$(srcdir)/'`fromgif.c + libsixel_la-easy_encode.lo: easy_encode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-easy_encode.lo -MD -MP -MF $(DEPDIR)/libsixel_la-easy_encode.Tpo -c -o libsixel_la-easy_encode.lo `test -f 'easy_encode.c' || echo '$(srcdir)/'`easy_encode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-easy_encode.Tpo $(DEPDIR)/libsixel_la-easy_encode.Plo diff --git a/src/loader.c b/src/loader.c index 7040e047..44ec6bff 100644 --- a/src/loader.c +++ b/src/loader.c @@ -84,6 +84,7 @@ #include #include "frompnm.h" +#include "fromgif.h" #include "frame.h" #include @@ -856,20 +857,14 @@ load_with_builtin( void /* in/out */ *context /* private data for callback */ ) { - unsigned char *p; - static stbi__context s; - static stbi__gif g; - int depth; - sixel_frame_t *frame; + sixel_frame_t *frame = NULL; int ret = (-1); - int i; - - frame = sixel_frame_create(); - if (frame == NULL) { - return SIXEL_FAILED; - } if (chunk_is_sixel(pchunk)) { + frame = sixel_frame_create(); + if (frame == NULL) { + return SIXEL_FAILED; + } frame->pixels = load_sixel(pchunk->buffer, pchunk->size, &frame->width, @@ -882,6 +877,10 @@ load_with_builtin( goto error; } } else if (chunk_is_pnm(pchunk)) { + frame = sixel_frame_create(); + if (frame == NULL) { + return SIXEL_FAILED; + } /* pnm */ frame->pixels = load_pnm(pchunk->buffer, pchunk->size, @@ -900,6 +899,10 @@ load_with_builtin( } #if HAVE_JPEG else if (chunk_is_jpeg(pchunk)) { + frame = sixel_frame_create(); + if (frame == NULL) { + return SIXEL_FAILED; + } frame->pixels = load_jpeg(pchunk->buffer, pchunk->size, &frame->width, @@ -912,6 +915,10 @@ load_with_builtin( #endif /* HAVE_JPEG */ #if HAVE_LIBPNG else if (chunk_is_png(pchunk)) { + frame = sixel_frame_create(); + if (frame == NULL) { + return SIXEL_FAILED; + } frame->pixels = load_png(pchunk->buffer, pchunk->size, &frame->width, @@ -928,113 +935,27 @@ load_with_builtin( } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { - - frame->loop_count = 0; - - for (;;) { - - stbi__start_mem(&s, pchunk->buffer, pchunk->size); - memset(&g, 0, sizeof(g)); - g.loop_count = (-1); - frame->frame_no = 0; - - for (;;) { - p = stbi__gif_load_next(&s, &g, &depth, 4, bgcolor); - if (p == (void *)&s) { - break; - } - if (p == NULL) { - frame->pixels = NULL; - break; - } - - frame->width = g.w; - frame->height = g.h; - frame->delay = g.delay; - frame->ncolors = 2 << (g.flags & 7); - frame->palette = malloc(frame->ncolors * 3); - if (frame->palette == NULL) { - goto error; - } - if (frame->ncolors <= reqcolors && fuse_palette) { - frame->pixelformat = PIXELFORMAT_PAL8; - frame->pixels = malloc(frame->width * frame->height); - memcpy(frame->pixels, g.out, frame->width * frame->height); - for (i = 0; i < frame->ncolors; ++i) { - frame->palette[i * 3 + 0] = g.color_table[i * 4 + 2]; - frame->palette[i * 3 + 1] = g.color_table[i * 4 + 1]; - frame->palette[i * 3 + 2] = g.color_table[i * 4 + 0]; - } - if (g.lflags & 0x80) { - if (g.eflags & 0x01) { - if (bgcolor) { - frame->palette[g.transparent * 3 + 0] - = bgcolor[0]; - frame->palette[g.transparent * 3 + 1] - = bgcolor[1]; - frame->palette[g.transparent * 3 + 2] - = bgcolor[2]; - } else { - frame->transparent = g.transparent; - } - } - } else if (g.flags & 0x80) { - if (g.eflags & 0x01) { - if (bgcolor) { - frame->palette[g.transparent * 3 + 0] - = bgcolor[0]; - frame->palette[g.transparent * 3 + 1] - = bgcolor[1]; - frame->palette[g.transparent * 3 + 2] - = bgcolor[2]; - } else { - frame->transparent = g.transparent; - } - } - } - } else { - frame->pixelformat = PIXELFORMAT_RGB888; - frame->pixels = malloc(g.w * g.h * 3); - for (i = 0; i < g.w * g.h; ++i) { - frame->pixels[i * 3 + 0] = g.color_table[p[i] * 4 + 2]; - frame->pixels[i * 3 + 1] = g.color_table[p[i] * 4 + 1]; - frame->pixels[i * 3 + 2] = g.color_table[p[i] * 4 + 0]; - } - } - if (frame->pixels == NULL) { - fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", - stbi_failure_reason()); - goto error; - } - frame->multiframe = (g.loop_count != (-1)); - - ret = fn_load(frame, context); - if (ret != 0) { - goto error; - } - ++frame->frame_no; - if (fstatic) { - break; - } - } - - free(g.out); - - ++frame->loop_count; - - if (g.loop_count == (-1)) { - break; - } - if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { - break; - } - if (loop_control == LOOP_AUTO && frame->loop_count == g.loop_count) { - break; - } + ret = load_gif(pchunk->buffer, + pchunk->size, + bgcolor, + reqcolors, + fuse_palette, + fstatic, + loop_control, + fn_load, + context); + if (ret != 0) { + goto error; } - - return 0; + goto end; } else { + stbi__context s; + int depth; + + frame = sixel_frame_create(); + if (frame == NULL) { + return SIXEL_FAILED; + } stbi__start_mem(&s, pchunk->buffer, pchunk->size); frame->pixels = stbi_load_main(&s, &frame->width, &frame->height, &depth, 3); if (!frame->pixels) { @@ -1068,6 +989,7 @@ load_with_builtin( } error: +end: sixel_frame_unref(frame); return ret; From 3bf480ed65227b5e4006782d35a8808db2c4e72d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 6 May 2015 03:51:11 +0900 Subject: [PATCH 191/451] Add missing memset() initialization of the structure stbi__gif (for Issue #42, reported by @msmhrt) --- src/fromgif.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fromgif.c b/src/fromgif.c index 47293f28..7e3d5204 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -547,6 +547,7 @@ load_gif(unsigned char *buffer, return SIXEL_FAILED; } start_mem(&s, buffer, size); + memset(&g, 0, sizeof(g)); ret = load_gif_header(&s, &g); if (ret != SIXEL_SUCCESS) { goto end; From 7a9775f7fbb9c2ecb83dd15140c746db2ce713ed Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 10 May 2015 23:22:22 +0900 Subject: [PATCH 192/451] Fix segmentation errors around evaluating cancel_flag --- src/easy_encode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 398f4e5f..ee022fa9 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -580,7 +580,7 @@ output_sixel_without_macro( memcpy(p, buffer, width * height * depth); - if (*cancel_flag) { + if (cancel_flag && *cancel_flag) { goto end; } @@ -942,7 +942,7 @@ sixel_easy_encode( #if HAVE_CLEARERR clearerr(stdin); #endif /* HAVE_FSEEK */ - while (!*cancel_flag) { + while (cancel_flag && !*cancel_flag) { #if HAVE_SYS_SELECT_H nret = wait_stdin(1000000); if (nret == (-1)) { @@ -953,7 +953,7 @@ sixel_easy_encode( break; } } - if (!*cancel_flag) { + if (cancel_flag && !*cancel_flag) { goto reload; } } From d5de97785a4219378864ff364ebe8a83a498b6e2 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 10 May 2015 23:46:48 +0900 Subject: [PATCH 193/451] Update package version and libtool version --- Makefile.in | 3 +- configure | 194 +++++++++++++++++++++++++++++++++++------ configure.ac | 4 +- converters/Makefile.in | 1 + include/Makefile.in | 1 + ltmain.sh | 81 ++++++++++++++--- m4/libtool.m4 | 171 +++++++++++++++++++++++------------- m4/ltoptions.m4 | 2 +- m4/ltsugar.m4 | 2 +- m4/ltversion.m4 | 12 +-- m4/lt~obsolete.m4 | 2 +- src/Makefile.in | 1 + 12 files changed, 363 insertions(+), 111 deletions(-) diff --git a/Makefile.in b/Makefile.in index 443934ed..3af7b6c3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -277,6 +277,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ diff --git a/configure b/configure index 24959b01..cd9fd618 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sixel 1.4.11. +# Generated by GNU Autoconf 2.69 for sixel 1.5.0. # # Report bugs to . # @@ -589,8 +589,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sixel' PACKAGE_TARNAME='sixel' -PACKAGE_VERSION='1.4.11' -PACKAGE_STRING='sixel 1.4.11' +PACKAGE_VERSION='1.5.0' +PACKAGE_STRING='sixel 1.5.0' PACKAGE_BUGREPORT='user@zuse.jp' PACKAGE_URL='' @@ -673,6 +673,7 @@ WANT_IMG2SIXEL_TRUE attr_func_deprecated attr_var_deprecated CPP +LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO @@ -820,6 +821,7 @@ CFLAGS LDFLAGS LIBS CPPFLAGS +LT_SYS_LIBRARY_PATH CPP PKG_CONFIG PKG_CONFIG_PATH @@ -1374,7 +1376,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sixel 1.4.11 to adapt to many kinds of systems. +\`configure' configures sixel 1.5.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1444,7 +1446,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sixel 1.4.11:";; + short | recursive ) echo "Configuration of sixel 1.5.0:";; esac cat <<\_ACEOF @@ -1498,6 +1500,8 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH @@ -1588,7 +1592,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sixel configure 1.4.11 +sixel configure 1.5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2003,7 +2007,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sixel $as_me 1.4.11, which was +It was created by sixel $as_me 1.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2352,7 +2356,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu LS_LT_CURRENT=1 -LS_LT_REVISION=3 +LS_LT_REVISION=4 LS_LT_AGE=0 LS_LTVERSION=$LS_LT_CURRENT:$LS_LT_REVISION:$LS_LT_AGE @@ -2946,7 +2950,7 @@ fi # Define the identity of the package. PACKAGE='sixel' - VERSION='1.4.11' + VERSION='1.5.0' cat >>confdefs.h <<_ACEOF @@ -3046,8 +3050,8 @@ esac -macro_version='2.4.4' -macro_revision='2.4.4' +macro_version='2.4.6' +macro_revision='2.4.6' @@ -6438,6 +6442,21 @@ $as_echo "$lt_cv_truncate_bin" >&6; } + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; @@ -7445,6 +7464,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; } ;; esac +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -8032,15 +8086,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +func_cc_basename $compiler +cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it @@ -10499,6 +10546,8 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown + + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor @@ -10787,6 +10836,7 @@ freebsd* | dragonfly*) case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; @@ -10846,10 +10896,11 @@ hpux9* | hpux10* | hpux11*) soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -11001,7 +11052,12 @@ fi # before this can be enabled. hardcode_into_libs=yes - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" @@ -11226,10 +11282,25 @@ fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi + if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + @@ -15590,7 +15661,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sixel $as_me 1.4.11, which was +This file was extended by sixel $as_me 1.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -15656,7 +15727,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sixel config.status 1.4.11 +sixel config.status 1.5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -15912,7 +15983,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' @@ -16030,7 +16102,8 @@ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes @@ -16811,6 +16884,9 @@ $as_echo X"$file" | # The names of the tagged configurations supported by this script. available_tags='' +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? @@ -17060,8 +17136,11 @@ hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen @@ -17210,6 +17289,65 @@ hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in diff --git a/configure.ac b/configure.ac index ec1d11a7..4e85923a 100644 --- a/configure.ac +++ b/configure.ac @@ -3,9 +3,9 @@ AC_PREREQ([2.60]) LT_PREREQ([2.4]) -AC_INIT([sixel], [1.4.11], [user@zuse.jp]) +AC_INIT([sixel], [1.5.0], [user@zuse.jp]) LS_LT_CURRENT=1 -LS_LT_REVISION=3 +LS_LT_REVISION=4 LS_LT_AGE=0 AC_SUBST([LS_LTVERSION], [$LS_LT_CURRENT:$LS_LT_REVISION:$LS_LT_AGE]) AC_SUBST([PACKAGE_DESCRIPTION], diff --git a/converters/Makefile.in b/converters/Makefile.in index ab1845ee..e4c9fcda 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -322,6 +322,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ diff --git a/include/Makefile.in b/include/Makefile.in index dde14c26..8f0ecf45 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -213,6 +213,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ diff --git a/ltmain.sh b/ltmain.sh index 5eca4aea..0f0a2da3 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -2,11 +2,11 @@ ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 -# libtool (GNU libtool) 2.4.4 +# libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -31,8 +31,8 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.4 -package_revision=2.4.4 +VERSION=2.4.6 +package_revision=2.4.6 ## ------ ## @@ -64,12 +64,12 @@ package_revision=2.4.4 # libraries, which are installed to $pkgauxdir. # Set a version string for this script. -scriptversion=2014-01-03.01; # UTC +scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -192,7 +192,7 @@ func_path_progs () _G_path_prog_max=0 _G_path_prog_found=false - _G_save_IFS=$IFS; IFS=$PATH_SEPARATOR + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. @@ -1375,7 +1375,7 @@ scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 -# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# Copyright (C) 2010-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -1977,7 +1977,7 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.4' +scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... @@ -2039,7 +2039,12 @@ usage_message="Options: " # Additional text appended to 'usage_message' in response to '--help'. -long_help_message=$long_help_message" +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message MODE must be one of the following: @@ -2063,13 +2068,15 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.4 + version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." + exit 0 +} # func_lo2o OBJECT-NAME @@ -6461,6 +6468,24 @@ func_win32_import_lib_p () esac } +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + # func_mode_link arg... func_mode_link () { @@ -7437,6 +7462,9 @@ func_mode_link () eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" @@ -8599,6 +8627,37 @@ func_mode_link () eval $var=\"$tmp_libs\" done # for var fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= diff --git a/m4/libtool.m4 b/m4/libtool.m4 index 9c089e00..a3bc337b 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -1,6 +1,6 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996-2001, 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -103,19 +103,36 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + # _LT_CC_BASENAME(CC) # ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result ]) @@ -720,11 +737,25 @@ _LT_CONFIG_SAVE_COMMANDS([ _LT_COPYING _LT_LIBTOOL_TAGS +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -2202,6 +2233,47 @@ _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics @@ -2212,6 +2284,7 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ @@ -2306,6 +2379,9 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor @@ -2594,6 +2670,7 @@ freebsd* | dragonfly*) case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; @@ -2653,10 +2730,11 @@ hpux9* | hpux10* | hpux11*) soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -2789,7 +2867,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) # before this can be enabled. hardcode_into_libs=yes - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" @@ -3013,10 +3096,20 @@ fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi + if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) @@ -3049,8 +3142,10 @@ _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER @@ -7350,6 +7445,7 @@ func_stripname_cnf () } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose @@ -7528,51 +7624,6 @@ interix[[3-9]]*) _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test yes != "$solaris_use_stlport4"; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test yes != "$solaris_use_stlport4"; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; esac ]) diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 index f51ec8c0..94b08297 100644 --- a/m4/ltoptions.m4 +++ b/m4/ltoptions.m4 @@ -1,6 +1,6 @@ # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004-2005, 2007-2009, 2011-2014 Free Software +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 index da4ac6b3..48bc9344 100644 --- a/m4/ltsugar.m4 +++ b/m4/ltsugar.m4 @@ -1,6 +1,6 @@ # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007-2008, 2011-2014 Free Software +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 index cb6da687..fa04b52a 100644 --- a/m4/ltversion.m4 +++ b/m4/ltversion.m4 @@ -1,6 +1,6 @@ # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004, 2011-2014 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -9,15 +9,15 @@ # @configure_input@ -# serial 4151 ltversion.m4 +# serial 4179 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.4]) -m4_define([LT_PACKAGE_REVISION], [2.4.4]) +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.4' -macro_revision='2.4.4' +[macro_version='2.4.6' +macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 index 6975098b..c6b26f88 100644 --- a/m4/lt~obsolete.m4 +++ b/m4/lt~obsolete.m4 @@ -1,6 +1,6 @@ # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007, 2009, 2011-2014 Free Software +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # diff --git a/src/Makefile.in b/src/Makefile.in index 03d7ff6b..5cad28fd 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -258,6 +258,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ From cd314ec3a4c78bdac5de340c382ed4c63ea79245 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 10 May 2015 23:46:48 +0900 Subject: [PATCH 194/451] Update package version and libtool version --- Makefile.in | 3 +- configure | 194 +++++++++++++++++++++++++++++++++++------ configure.ac | 4 +- converters/Makefile.in | 1 + include/Makefile.in | 1 + ltmain.sh | 81 ++++++++++++++--- m4/libtool.m4 | 171 +++++++++++++++++++++++------------- m4/ltoptions.m4 | 2 +- m4/ltsugar.m4 | 2 +- m4/ltversion.m4 | 12 +-- m4/lt~obsolete.m4 | 2 +- package.json | 2 +- src/Makefile.in | 1 + 13 files changed, 364 insertions(+), 112 deletions(-) diff --git a/Makefile.in b/Makefile.in index 443934ed..3af7b6c3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -83,7 +83,7 @@ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub depcomp install-sh missing ltmain.sh + config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -277,6 +277,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ diff --git a/configure b/configure index 24959b01..cd9fd618 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sixel 1.4.11. +# Generated by GNU Autoconf 2.69 for sixel 1.5.0. # # Report bugs to . # @@ -589,8 +589,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sixel' PACKAGE_TARNAME='sixel' -PACKAGE_VERSION='1.4.11' -PACKAGE_STRING='sixel 1.4.11' +PACKAGE_VERSION='1.5.0' +PACKAGE_STRING='sixel 1.5.0' PACKAGE_BUGREPORT='user@zuse.jp' PACKAGE_URL='' @@ -673,6 +673,7 @@ WANT_IMG2SIXEL_TRUE attr_func_deprecated attr_var_deprecated CPP +LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO @@ -820,6 +821,7 @@ CFLAGS LDFLAGS LIBS CPPFLAGS +LT_SYS_LIBRARY_PATH CPP PKG_CONFIG PKG_CONFIG_PATH @@ -1374,7 +1376,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sixel 1.4.11 to adapt to many kinds of systems. +\`configure' configures sixel 1.5.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1444,7 +1446,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sixel 1.4.11:";; + short | recursive ) echo "Configuration of sixel 1.5.0:";; esac cat <<\_ACEOF @@ -1498,6 +1500,8 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH @@ -1588,7 +1592,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sixel configure 1.4.11 +sixel configure 1.5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2003,7 +2007,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sixel $as_me 1.4.11, which was +It was created by sixel $as_me 1.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2352,7 +2356,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu LS_LT_CURRENT=1 -LS_LT_REVISION=3 +LS_LT_REVISION=4 LS_LT_AGE=0 LS_LTVERSION=$LS_LT_CURRENT:$LS_LT_REVISION:$LS_LT_AGE @@ -2946,7 +2950,7 @@ fi # Define the identity of the package. PACKAGE='sixel' - VERSION='1.4.11' + VERSION='1.5.0' cat >>confdefs.h <<_ACEOF @@ -3046,8 +3050,8 @@ esac -macro_version='2.4.4' -macro_revision='2.4.4' +macro_version='2.4.6' +macro_revision='2.4.6' @@ -6438,6 +6442,21 @@ $as_echo "$lt_cv_truncate_bin" >&6; } + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; @@ -7445,6 +7464,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; } ;; esac +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -8032,15 +8086,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +func_cc_basename $compiler +cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it @@ -10499,6 +10546,8 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown + + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor @@ -10787,6 +10836,7 @@ freebsd* | dragonfly*) case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; @@ -10846,10 +10896,11 @@ hpux9* | hpux10* | hpux11*) soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -11001,7 +11052,12 @@ fi # before this can be enabled. hardcode_into_libs=yes - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" @@ -11226,10 +11282,25 @@ fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi + if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + @@ -15590,7 +15661,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sixel $as_me 1.4.11, which was +This file was extended by sixel $as_me 1.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -15656,7 +15727,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sixel config.status 1.4.11 +sixel config.status 1.5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -15912,7 +15983,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' @@ -16030,7 +16102,8 @@ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes @@ -16811,6 +16884,9 @@ $as_echo X"$file" | # The names of the tagged configurations supported by this script. available_tags='' +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? @@ -17060,8 +17136,11 @@ hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen @@ -17210,6 +17289,65 @@ hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in diff --git a/configure.ac b/configure.ac index ec1d11a7..4e85923a 100644 --- a/configure.ac +++ b/configure.ac @@ -3,9 +3,9 @@ AC_PREREQ([2.60]) LT_PREREQ([2.4]) -AC_INIT([sixel], [1.4.11], [user@zuse.jp]) +AC_INIT([sixel], [1.5.0], [user@zuse.jp]) LS_LT_CURRENT=1 -LS_LT_REVISION=3 +LS_LT_REVISION=4 LS_LT_AGE=0 AC_SUBST([LS_LTVERSION], [$LS_LT_CURRENT:$LS_LT_REVISION:$LS_LT_AGE]) AC_SUBST([PACKAGE_DESCRIPTION], diff --git a/converters/Makefile.in b/converters/Makefile.in index ab1845ee..e4c9fcda 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -322,6 +322,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ diff --git a/include/Makefile.in b/include/Makefile.in index dde14c26..8f0ecf45 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -213,6 +213,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ diff --git a/ltmain.sh b/ltmain.sh index 5eca4aea..0f0a2da3 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -2,11 +2,11 @@ ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 -# libtool (GNU libtool) 2.4.4 +# libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -31,8 +31,8 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.4 -package_revision=2.4.4 +VERSION=2.4.6 +package_revision=2.4.6 ## ------ ## @@ -64,12 +64,12 @@ package_revision=2.4.4 # libraries, which are installed to $pkgauxdir. # Set a version string for this script. -scriptversion=2014-01-03.01; # UTC +scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -192,7 +192,7 @@ func_path_progs () _G_path_prog_max=0 _G_path_prog_found=false - _G_save_IFS=$IFS; IFS=$PATH_SEPARATOR + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. @@ -1375,7 +1375,7 @@ scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 -# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# Copyright (C) 2010-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -1977,7 +1977,7 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.4' +scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... @@ -2039,7 +2039,12 @@ usage_message="Options: " # Additional text appended to 'usage_message' in response to '--help'. -long_help_message=$long_help_message" +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message MODE must be one of the following: @@ -2063,13 +2068,15 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.4 + version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." + exit 0 +} # func_lo2o OBJECT-NAME @@ -6461,6 +6468,24 @@ func_win32_import_lib_p () esac } +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + # func_mode_link arg... func_mode_link () { @@ -7437,6 +7462,9 @@ func_mode_link () eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" @@ -8599,6 +8627,37 @@ func_mode_link () eval $var=\"$tmp_libs\" done # for var fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= diff --git a/m4/libtool.m4 b/m4/libtool.m4 index 9c089e00..a3bc337b 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -1,6 +1,6 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996-2001, 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -103,19 +103,36 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + # _LT_CC_BASENAME(CC) # ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result ]) @@ -720,11 +737,25 @@ _LT_CONFIG_SAVE_COMMANDS([ _LT_COPYING _LT_LIBTOOL_TAGS +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -2202,6 +2233,47 @@ _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics @@ -2212,6 +2284,7 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ @@ -2306,6 +2379,9 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor @@ -2594,6 +2670,7 @@ freebsd* | dragonfly*) case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; @@ -2653,10 +2730,11 @@ hpux9* | hpux10* | hpux11*) soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -2789,7 +2867,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) # before this can be enabled. hardcode_into_libs=yes - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" @@ -3013,10 +3096,20 @@ fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi + if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) @@ -3049,8 +3142,10 @@ _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER @@ -7350,6 +7445,7 @@ func_stripname_cnf () } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose @@ -7528,51 +7624,6 @@ interix[[3-9]]*) _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test yes != "$solaris_use_stlport4"; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test yes != "$solaris_use_stlport4"; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; esac ]) diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 index f51ec8c0..94b08297 100644 --- a/m4/ltoptions.m4 +++ b/m4/ltoptions.m4 @@ -1,6 +1,6 @@ # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004-2005, 2007-2009, 2011-2014 Free Software +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 index da4ac6b3..48bc9344 100644 --- a/m4/ltsugar.m4 +++ b/m4/ltsugar.m4 @@ -1,6 +1,6 @@ # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007-2008, 2011-2014 Free Software +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 index cb6da687..fa04b52a 100644 --- a/m4/ltversion.m4 +++ b/m4/ltversion.m4 @@ -1,6 +1,6 @@ # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004, 2011-2014 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -9,15 +9,15 @@ # @configure_input@ -# serial 4151 ltversion.m4 +# serial 4179 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.4]) -m4_define([LT_PACKAGE_REVISION], [2.4.4]) +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.4' -macro_revision='2.4.4' +[macro_version='2.4.6' +macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 index 6975098b..c6b26f88 100644 --- a/m4/lt~obsolete.m4 +++ b/m4/lt~obsolete.m4 @@ -1,6 +1,6 @@ # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007, 2009, 2011-2014 Free Software +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # diff --git a/package.json b/package.json index 01777f9e..d803e91c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "libsixel", - "version": "1.4.11", + "version": "1.5.0", "repo": "saitoha/libsixel", "description": "A lightweight, fast implementation of DEC SIXEL graphics codec", "keywords": ["terminal", "graphics", "image", "sixel"], diff --git a/src/Makefile.in b/src/Makefile.in index 03d7ff6b..5cad28fd 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -258,6 +258,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LS_LTVERSION = @LS_LTVERSION@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MD5SUM = @MD5SUM@ From d333ae6a346f47afc9fc63fb705e8df84b811bae Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 11 May 2015 00:14:45 +0900 Subject: [PATCH 195/451] Add php extension --- php/README | 13 + php/sixel/.cvsignore | 44 +++ php/sixel/CREDITS | 2 + php/sixel/EXPERIMENTAL | 5 + php/sixel/README | 70 +++++ php/sixel/config.m4 | 63 +++++ php/sixel/config.w32 | 8 + php/sixel/manual/file-entities.ent | 5 + php/sixel/manual/functions.xml | 0 php/sixel/manual/manual.xml.in | 37 +++ php/sixel/manual/sixel/configure.xml | 37 +++ php/sixel/manual/sixel/constants.xml | 30 ++ php/sixel/manual/sixel/ini.xml | 30 ++ php/sixel/manual/sixel/reference.xml | 60 ++++ php/sixel/package.xml | 54 ++++ php/sixel/package2.xml | 77 ++++++ php/sixel/php_sixel.h | 124 +++++++++ php/sixel/sixel.c | 261 ++++++++++++++++++ php/sixel/sixel.dsp | 112 ++++++++ php/sixel/sixel.xml | 57 ++++ .../tests/SixelEncoder____construct.phpt | 14 + php/sixel/tests/SixelEncoder____destruct.phpt | 14 + .../SixelEncoder__sixel_easy_encode.phpt | 14 + ...ixelEncoder__sixel_easy_encode_setopt.phpt | 14 + 24 files changed, 1145 insertions(+) create mode 100644 php/README create mode 100644 php/sixel/.cvsignore create mode 100644 php/sixel/CREDITS create mode 100644 php/sixel/EXPERIMENTAL create mode 100644 php/sixel/README create mode 100644 php/sixel/config.m4 create mode 100644 php/sixel/config.w32 create mode 100644 php/sixel/manual/file-entities.ent create mode 100644 php/sixel/manual/functions.xml create mode 100644 php/sixel/manual/manual.xml.in create mode 100644 php/sixel/manual/sixel/configure.xml create mode 100644 php/sixel/manual/sixel/constants.xml create mode 100644 php/sixel/manual/sixel/ini.xml create mode 100644 php/sixel/manual/sixel/reference.xml create mode 100644 php/sixel/package.xml create mode 100644 php/sixel/package2.xml create mode 100644 php/sixel/php_sixel.h create mode 100644 php/sixel/sixel.c create mode 100644 php/sixel/sixel.dsp create mode 100644 php/sixel/sixel.xml create mode 100644 php/sixel/tests/SixelEncoder____construct.phpt create mode 100644 php/sixel/tests/SixelEncoder____destruct.phpt create mode 100644 php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt create mode 100644 php/sixel/tests/SixelEncoder__sixel_easy_encode_setopt.phpt diff --git a/php/README b/php/README new file mode 100644 index 00000000..f0f755b7 --- /dev/null +++ b/php/README @@ -0,0 +1,13 @@ +How to build php extension +========================== + +$ cd sixel +$ phpize +$ ./configure +$ make + + +Install +======= + +# make install diff --git a/php/sixel/.cvsignore b/php/sixel/.cvsignore new file mode 100644 index 00000000..0b2afde7 --- /dev/null +++ b/php/sixel/.cvsignore @@ -0,0 +1,44 @@ +*.lo +*.la +.deps +.libs +Makefile +Makefile.fragments +Makefile.global +Makefile.objects +acinclude.m4 +aclocal.m4 +autom4te.cache +build +config.cache +config.guess +config.h +config.h.in +config.log +config.nice +config.status +config.sub +configure +configure.in +conftest +conftest.c +include +install-sh +libtool +ltmain.sh +missing +mkinstalldirs +modules +scan_makefile_in.awk +*.dsw +*.plg +*.opt +*.ncb +Release +Release_inline +Debug +Release_TS +Release_TSDbg +Release_TS_inline +Debug_TS +sixel*.tgz diff --git a/php/sixel/CREDITS b/php/sixel/CREDITS new file mode 100644 index 00000000..d5b8ce80 --- /dev/null +++ b/php/sixel/CREDITS @@ -0,0 +1,2 @@ +sixel +Unknown User diff --git a/php/sixel/EXPERIMENTAL b/php/sixel/EXPERIMENTAL new file mode 100644 index 00000000..6443e996 --- /dev/null +++ b/php/sixel/EXPERIMENTAL @@ -0,0 +1,5 @@ +this extension is experimental, +its functions may change their names +or move to extension all together +so do not rely to much on them +you have been warned! diff --git a/php/sixel/README b/php/sixel/README new file mode 100644 index 00000000..e31885ac --- /dev/null +++ b/php/sixel/README @@ -0,0 +1,70 @@ +This is a standalone PHP extension created using CodeGen_PECL 1.1.3 + +HACKING +======= + +There are two ways to modify an extension created using CodeGen_PECL: + +1) you can modify the generated code as with any other PHP extension + +2) you can add custom code to the CodeGen_PECL XML source and re-run pecl-gen + +The 2nd approach may look a bit complicated but you have be aware that any +manual changes to the generated code will be lost if you ever change the +XML specs and re-run PECL-Gen. All changes done before have to be applied +to the newly generated code again. +Adding code snippets to the XML source itself on the other hand may be a +bit more complicated but this way your custom code will always be in the +generated code no matter how often you rerun CodeGen_PECL. + + +BUILDING ON UNIX etc. +===================== + +To compile your new extension, you will have to execute the following steps: + +1. $ ./phpize +2. $ ./configure [--with-libsixel=...] +3. $ make +4. $ make test +5. $ [sudo] make install + + + +BUILDING ON WINDOWS +=================== + +The extension provides the VisualStudio V6 project file + + sixel.dsp +To compile the extension you open this file using VisualStudio, +select the apropriate configuration for your installation +(either "Release_TS" or "Debug_TS") and create "php_sixel.dll" + +After successfull compilation you have to copy the newly +created "sixel.dll" to the PHP +extension directory (default: C:\PHP\extensions). + + +TESTING +======= + +You can now load the extension using a php.ini directive + + extension="sixel.[so|dll]" + +or load it at runtime using the dl() function + + dl("sixel.[so|dll]"); + +The extension should now be available, you can test this +using the extension_loaded() function: + + if (extension_loaded("sixel")) + echo "sixel loaded :)"; + else + echo "something is wrong :("; + +The extension will also add its own block to the output +of phpinfo(); + diff --git a/php/sixel/config.m4 b/php/sixel/config.m4 new file mode 100644 index 00000000..8950a808 --- /dev/null +++ b/php/sixel/config.m4 @@ -0,0 +1,63 @@ +dnl +dnl $ Id: $ +dnl + +PHP_ARG_ENABLE(sixel, whether to enable sixel functions, +[ --enable-sixel Enable sixel support]) + +if test "$PHP_SIXEL" != "no"; then + +PHP_ARG_WITH(libsixel, whether libsixel is available,[ --with-libsixel[=DIR] With libsixel support]) + + + + if test -z "$PKG_CONFIG" + then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + if test "$PKG_CONFIG" = "no" + then + AC_MSG_ERROR([required utility 'pkg-config' not found]) + fi + + if ! $PKG_CONFIG --exists libsixel + then + AC_MSG_ERROR(['libsixel' not known to pkg-config]) + fi + + if ! $PKG_CONFIG --atleast-version 1.5 libsixel + then + PKG_VERSION=`$PKG_CONFIG --modversion libsixel` + AC_MSG_ERROR(['libsixel'\ is version $PKG_VERSION, 1.5 required]) + fi + + PHP_EVAL_INCLINE(`$PKG_CONFIG --cflags-only-I libsixel`) + PHP_EVAL_LIBLINE(`$PKG_CONFIG --libs libsixel`, SIXEL_SHARED_LIBADD) + + export OLD_CPPFLAGS="$CPPFLAGS" + export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_LIBSIXEL" + AC_CHECK_HEADER([sixel.h], [], AC_MSG_ERROR('sixel.h' header not found)) + export CPPFLAGS="$OLD_CPPFLAGS" + + export OLD_CPPFLAGS="$CPPFLAGS" + export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_SIXEL" + + AC_MSG_CHECKING(PHP version) + AC_TRY_COMPILE([#include ], [ +#if PHP_VERSION_ID < 50000 +#error this extension requires at least PHP version 5.0.0 +#endif +], +[AC_MSG_RESULT(ok)], +[AC_MSG_ERROR([need at least PHP 5.0.0])]) + + export CPPFLAGS="$OLD_CPPFLAGS" + + + PHP_SUBST(SIXEL_SHARED_LIBADD) + AC_DEFINE(HAVE_SIXEL, 1, [ ]) + + PHP_NEW_EXTENSION(sixel, sixel.c , $ext_shared) + +fi + diff --git a/php/sixel/config.w32 b/php/sixel/config.w32 new file mode 100644 index 00000000..d41423f8 --- /dev/null +++ b/php/sixel/config.w32 @@ -0,0 +1,8 @@ +// $ Id: $ +// vim:ft=javascript + +ARG_ENABLE('sixel' , 'The unknown extension', 'no'); +if (PHP_SIXEL == "yes") { + EXTENSION("sixel", "sixel.c"); + AC_DEFINE("HAVE_SIXEL", 1, "sixel support"); +} diff --git a/php/sixel/manual/file-entities.ent b/php/sixel/manual/file-entities.ent new file mode 100644 index 00000000..026cce52 --- /dev/null +++ b/php/sixel/manual/file-entities.ent @@ -0,0 +1,5 @@ + + + + + diff --git a/php/sixel/manual/functions.xml b/php/sixel/manual/functions.xml new file mode 100644 index 00000000..e69de29b diff --git a/php/sixel/manual/manual.xml.in b/php/sixel/manual/manual.xml.in new file mode 100644 index 00000000..12e9202b --- /dev/null +++ b/php/sixel/manual/manual.xml.in @@ -0,0 +1,37 @@ + + + + + +%language-defs; +%language-snippets; + + + + + + +%language-defs.default; +%language-snippets.default; +%extensions.default; + + + + + + + +%global.entities; +%file.entities; + + + +%missing-entities; +]> + + + &reference.sixel.reference; + diff --git a/php/sixel/manual/sixel/configure.xml b/php/sixel/manual/sixel/configure.xml new file mode 100644 index 00000000..56df4ca9 --- /dev/null +++ b/php/sixel/manual/sixel/configure.xml @@ -0,0 +1,37 @@ + + + +
+ &reftitle.required; + &no.requirement; + +
+ + +
+ &reftitle.install; + Requires libsixel + +
+ + + diff --git a/php/sixel/manual/sixel/constants.xml b/php/sixel/manual/sixel/constants.xml new file mode 100644 index 00000000..8b81b7fd --- /dev/null +++ b/php/sixel/manual/sixel/constants.xml @@ -0,0 +1,30 @@ + + +
+ &reftitle.constants; + &extension.constants; + + &no.constants; + +
+ + diff --git a/php/sixel/manual/sixel/ini.xml b/php/sixel/manual/sixel/ini.xml new file mode 100644 index 00000000..7f1e8b62 --- /dev/null +++ b/php/sixel/manual/sixel/ini.xml @@ -0,0 +1,30 @@ + + +
+ &reftitle.runtime; + &extension.runtime; + + &no.config; + +
+ + diff --git a/php/sixel/manual/sixel/reference.xml b/php/sixel/manual/sixel/reference.xml new file mode 100644 index 00000000..792302a1 --- /dev/null +++ b/php/sixel/manual/sixel/reference.xml @@ -0,0 +1,60 @@ + + + + + + + + The unknown extension + sixel + + +
+ &reftitle.intro; + +none + +
+ +
+ &reftitle.required; + + + +
+ + &reference.sixel.configure; + &reference.extname.ini; + +
+ &reftitle.resources; + &no.resource; +
+ + &reference.extname.constants; +
+ +&reference.sixel.functions; + +
+ + diff --git a/php/sixel/package.xml b/php/sixel/package.xml new file mode 100644 index 00000000..82f9e3a8 --- /dev/null +++ b/php/sixel/package.xml @@ -0,0 +1,54 @@ + + + + + sixel + The unknown extension + +none + + + + + + + + + unknown + Unknown User + unknown@example.com + lead + + + + + 0.0.1dev + devel + unknown + 2015-05-11 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/php/sixel/package2.xml b/php/sixel/package2.xml new file mode 100644 index 00000000..9ea877c3 --- /dev/null +++ b/php/sixel/package2.xml @@ -0,0 +1,77 @@ + + + + sixel + pecl.php.net + + The unknown extension + + +none + + + + Unknown User + unknown + unknown@example.com + yes + + + 2015-05-11 + + 0.0.1dev + 0.0.1dev + + + devel + devel + + + unknown + + +none + + + + + + + + + + + + + + + + + + + + + + + + 5.0.0 + + + 1.4.0a1 + + + + + sixel + + + + + + diff --git a/php/sixel/php_sixel.h b/php/sixel/php_sixel.h new file mode 100644 index 00000000..a0326e28 --- /dev/null +++ b/php/sixel/php_sixel.h @@ -0,0 +1,124 @@ +/* + +----------------------------------------------------------------------+ + | unknown license: | + +----------------------------------------------------------------------+ + | Authors: Unknown User | + +----------------------------------------------------------------------+ +*/ + +/* $ Id: $ */ + +#ifndef PHP_SIXEL_H +#define PHP_SIXEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_SIXEL +#define PHP_SIXEL_VERSION "0.0.1dev" + + +#include +#include +#include +#include +#ifdef __cplusplus +} // extern "C" +#endif +#include +#ifdef __cplusplus +extern "C" { +#endif + +extern zend_module_entry sixel_module_entry; +#define phpext_sixel_ptr &sixel_module_entry + +#ifdef PHP_WIN32 +#define PHP_SIXEL_API __declspec(dllexport) +#else +#define PHP_SIXEL_API +#endif + +PHP_MINIT_FUNCTION(sixel); +PHP_MSHUTDOWN_FUNCTION(sixel); +PHP_RINIT_FUNCTION(sixel); +PHP_RSHUTDOWN_FUNCTION(sixel); +PHP_MINFO_FUNCTION(sixel); + +#ifdef ZTS +#include "TSRM.h" +#endif + +#define FREE_RESOURCE(resource) zend_list_delete(Z_LVAL_P(resource)) + +#define PROP_GET_LONG(name) Z_LVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_LONG(name, l) zend_update_property_long(_this_ce, _this_zval, #name, strlen(#name), l TSRMLS_CC) + +#define PROP_GET_DOUBLE(name) Z_DVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_DOUBLE(name, d) zend_update_property_double(_this_ce, _this_zval, #name, strlen(#name), d TSRMLS_CC) + +#define PROP_GET_STRING(name) Z_STRVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_GET_STRLEN(name) Z_STRLEN_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_STRING(name, s) zend_update_property_string(_this_ce, _this_zval, #name, strlen(#name), s TSRMLS_CC) +#define PROP_SET_STRINGL(name, s, l) zend_update_property_stringl(_this_ce, _this_zval, #name, strlen(#name), s, l TSRMLS_CC) + + +PHP_METHOD(SixelEncoder, __construct); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder____construct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder____construct_args NULL +#endif + +PHP_METHOD(SixelEncoder, __destruct); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder____destruct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder____destruct_args NULL +#endif + +PHP_METHOD(SixelEncoder, sixel_easy_encode_setopt); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__sixel_easy_encode_setopt_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) + ZEND_ARG_INFO(0, opt) + ZEND_ARG_INFO(0, arg) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder__sixel_easy_encode_setopt_args NULL +#endif + +PHP_METHOD(SixelEncoder, sixel_easy_encode); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__sixel_easy_encode_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) + ZEND_ARG_INFO(0, filename) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder__sixel_easy_encode_args NULL +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* PHP_HAVE_SIXEL */ + +#endif /* PHP_SIXEL_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/php/sixel/sixel.c b/php/sixel/sixel.c new file mode 100644 index 00000000..73fcbbea --- /dev/null +++ b/php/sixel/sixel.c @@ -0,0 +1,261 @@ +/* + +----------------------------------------------------------------------+ + | unknown license: | + +----------------------------------------------------------------------+ + | Authors: Unknown User | + +----------------------------------------------------------------------+ +*/ + +/* $ Id: $ */ + +#include "php_sixel.h" + +#if HAVE_SIXEL + +/* {{{ Class definitions */ + +/* {{{ Class SixelEncoder */ + +static zend_class_entry * SixelEncoder_ce_ptr = NULL; + +/* {{{ Methods */ + + +/* {{{ proto object __construct() + */ +PHP_METHOD(SixelEncoder, __construct) +{ + zend_class_entry * _this_ce; + zval * _this_zval; + + + + if (ZEND_NUM_ARGS()>0) { + WRONG_PARAM_COUNT; + } + + + do { + sixel_encode_settings_t *settings; + settings = sixel_encode_settings_create(); + if (settings == NULL) { + zend_throw_exception_ex(zend_exception_get_default(), 1, + "sixel_encode_settings_create() failed. %s:%d", __FILE__, __LINE__); + } else { + zval *value = emalloc(sizeof(zval)); + ZVAL_RESOURCE(value, settings); + zend_update_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, value TSRMLS_CC); + } + } while (0); +} +/* }}} __construct */ + + + +/* {{{ proto object __destruct() + */ +PHP_METHOD(SixelEncoder, __destruct) +{ + zend_class_entry * _this_ce; + + zval * _this_zval = NULL; + + + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &_this_zval, SixelEncoder_ce_ptr) == FAILURE) { + return; + } + + _this_ce = Z_OBJCE_P(_this_zval); + + + do { + zval *settings = zend_read_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, 1 TSRMLS_CC); + sixel_encode_settings_unref(Z_RESVAL_P(settings)); + efree(settings); + } while (0); +} +/* }}} __destruct */ + + + +/* {{{ proto void sixel_easy_encode_setopt(string opt[, string arg]) + */ +PHP_METHOD(SixelEncoder, sixel_easy_encode_setopt) +{ + zend_class_entry * _this_ce; + + zval * _this_zval = NULL; + const char * opt = NULL; + int opt_len = 0; + const char * arg = NULL; + int arg_len = 0; + + + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &_this_zval, SixelEncoder_ce_ptr, &opt, &opt_len, &arg, &arg_len) == FAILURE) { + return; + } + + _this_ce = Z_OBJCE_P(_this_zval); + + + do { + zval *settings = zend_read_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, 1 TSRMLS_CC); + sixel_easy_encode_setopt(Z_RESVAL_P(settings), *opt, arg); + } while (0); +} +/* }}} sixel_easy_encode_setopt */ + + + +/* {{{ proto void sixel_easy_encode(string filename) + */ +PHP_METHOD(SixelEncoder, sixel_easy_encode) +{ + zend_class_entry * _this_ce; + + zval * _this_zval = NULL; + const char * filename = NULL; + int filename_len = 0; + + + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &_this_zval, SixelEncoder_ce_ptr, &filename, &filename_len) == FAILURE) { + return; + } + + _this_ce = Z_OBJCE_P(_this_zval); + + + do { + zval *settings = zend_read_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, 0 TSRMLS_CC); + int ret = sixel_easy_encode(filename, Z_RESVAL_P(settings), NULL); + if (ret != 0) { + zend_throw_exception_ex(zend_exception_get_default(), 1, + "sixel_easy_encode() failed. %s:%d", __FILE__, __LINE__); + } + } while (0); +} +/* }}} sixel_easy_encode */ + + +static zend_function_entry SixelEncoder_methods[] = { + PHP_ME(SixelEncoder, __construct, NULL, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) + PHP_ME(SixelEncoder, __destruct, NULL, /**/ZEND_ACC_PUBLIC) + PHP_ME(SixelEncoder, sixel_easy_encode_setopt, SixelEncoder__sixel_easy_encode_setopt_args, /**/ZEND_ACC_PUBLIC) + PHP_ME(SixelEncoder, sixel_easy_encode, SixelEncoder__sixel_easy_encode_args, /**/ZEND_ACC_PUBLIC) + { NULL, NULL, NULL } +}; + +/* }}} Methods */ + +static void class_init_SixelEncoder(void) +{ + zend_class_entry ce; + + INIT_CLASS_ENTRY(ce, "SixelEncoder", SixelEncoder_methods); + SixelEncoder_ce_ptr = zend_register_internal_class(&ce); +} + +/* }}} Class SixelEncoder */ + +/* }}} Class definitions*/ + +/* {{{ sixel_functions[] */ +zend_function_entry sixel_functions[] = { + { NULL, NULL, NULL } +}; +/* }}} */ + + +/* {{{ sixel_module_entry + */ +zend_module_entry sixel_module_entry = { + STANDARD_MODULE_HEADER, + "sixel", + sixel_functions, + PHP_MINIT(sixel), /* Replace with NULL if there is nothing to do at php startup */ + PHP_MSHUTDOWN(sixel), /* Replace with NULL if there is nothing to do at php shutdown */ + PHP_RINIT(sixel), /* Replace with NULL if there is nothing to do at request start */ + PHP_RSHUTDOWN(sixel), /* Replace with NULL if there is nothing to do at request end */ + PHP_MINFO(sixel), + PHP_SIXEL_VERSION, + STANDARD_MODULE_PROPERTIES +}; +/* }}} */ + +#ifdef COMPILE_DL_SIXEL +ZEND_GET_MODULE(sixel) +#endif + + +/* {{{ PHP_MINIT_FUNCTION */ +PHP_MINIT_FUNCTION(sixel) +{ + class_init_SixelEncoder(); + + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_MSHUTDOWN_FUNCTION */ +PHP_MSHUTDOWN_FUNCTION(sixel) +{ + + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_RINIT_FUNCTION */ +PHP_RINIT_FUNCTION(sixel) +{ + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_RSHUTDOWN_FUNCTION */ +PHP_RSHUTDOWN_FUNCTION(sixel) +{ + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_MINFO_FUNCTION */ +PHP_MINFO_FUNCTION(sixel) +{ + php_printf("The unknown extension\n"); + php_info_print_table_start(); + php_info_print_table_row(2, "Version",PHP_SIXEL_VERSION " (devel)"); + php_info_print_table_row(2, "Released", "2015-05-11"); + php_info_print_table_row(2, "CVS Revision", "$Id: $"); + php_info_print_table_row(2, "Authors", "Unknown User 'unknown@example.com' (lead)\n"); + php_info_print_table_end(); + /* add your stuff here */ + +} +/* }}} */ + +#endif /* HAVE_SIXEL */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/php/sixel/sixel.dsp b/php/sixel/sixel.dsp new file mode 100644 index 00000000..b5d98fc9 --- /dev/null +++ b/php/sixel/sixel.dsp @@ -0,0 +1,112 @@ +# Microsoft Developer Studio Project File - Name="sixel" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=sixel - Win32 Debug_TS +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "sixel.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "sixel.mak" CFG="sixel - Win32 Debug_TS" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "sixel - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "sixel - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "sixel - Win32 Release_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_TS" +# PROP BASE Intermediate_Dir "Release_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TS" +# PROP Intermediate_Dir "Release_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIXEL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_SIXEL" /D ZTS=1 /D HAVE_SIXEL=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 php4ts.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS\php_sixel.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" + +!ELSEIF "$(CFG)" == "sixel - Win32 Debug_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug_TS" +# PROP BASE Intermediate_Dir "Debug_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_TS" +# PROP Intermediate_Dir "Debug_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIXEL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_SIXEL" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_SIXEL=1 /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 php4ts_debug.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS\php_sixel.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" + +!ENDIF + +# Begin Target + +# Name "sixel - Win32 Release_TS" +# Name "sixel - Win32 Debug_TS" + +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + +# Begin Source File + +SOURCE=./sixel.c +# End Source File + +# End Group + +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" + +# Begin Source File + +SOURCE=.\php_sixel.h +# End Source File +# End Group +# End Target +# End Project diff --git a/php/sixel/sixel.xml b/php/sixel/sixel.xml new file mode 100644 index 00000000..c23a136e --- /dev/null +++ b/php/sixel/sixel.xml @@ -0,0 +1,57 @@ + + + + + +
+ + + + + + + object __construct() + + + + + object __destruct() + + + + + void sixel_easy_encode_setopt(string opt[, string arg]) + + + + + void sixel_easy_encode(string filename) + + + + diff --git a/php/sixel/tests/SixelEncoder____construct.phpt b/php/sixel/tests/SixelEncoder____construct.phpt new file mode 100644 index 00000000..f2008764 --- /dev/null +++ b/php/sixel/tests/SixelEncoder____construct.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::__construct() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file diff --git a/php/sixel/tests/SixelEncoder____destruct.phpt b/php/sixel/tests/SixelEncoder____destruct.phpt new file mode 100644 index 00000000..f597a94a --- /dev/null +++ b/php/sixel/tests/SixelEncoder____destruct.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::__destruct() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file diff --git a/php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt b/php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt new file mode 100644 index 00000000..600dbdad --- /dev/null +++ b/php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::sixel_easy_encode() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file diff --git a/php/sixel/tests/SixelEncoder__sixel_easy_encode_setopt.phpt b/php/sixel/tests/SixelEncoder__sixel_easy_encode_setopt.phpt new file mode 100644 index 00000000..f7f31388 --- /dev/null +++ b/php/sixel/tests/SixelEncoder__sixel_easy_encode_setopt.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::sixel_easy_encode_setopt() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file From 2640a85c5752051e8ed42aa16bd0147b30314741 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 12 May 2015 00:35:35 +0900 Subject: [PATCH 196/451] Fix leaks around GIF loader --- src/fromgif.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/fromgif.c b/src/fromgif.c index 7e3d5204..e4db4b56 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -209,15 +209,23 @@ init_gif_frame( int fuse_palette) { int i; + int ncolors; frame->delay = pg->delay; - frame->ncolors = 2 << (pg->flags & 7); - frame->palette = malloc(frame->ncolors * 3); + ncolors = 2 << (pg->flags & 7); + if (frame->palette == NULL) { + frame->palette = malloc(ncolors * 3); + } else if (frame->ncolors < ncolors) { + free(frame->palette); + frame->palette = malloc(ncolors * 3); + } + frame->ncolors = ncolors; if (frame->palette == NULL) { return (-1); } if (frame->ncolors <= reqcolors && fuse_palette) { frame->pixelformat = PIXELFORMAT_PAL8; + free(frame->pixels); frame->pixels = malloc(frame->width * frame->height); memcpy(frame->pixels, pg->out, frame->width * frame->height); @@ -612,6 +620,7 @@ load_gif(unsigned char *buffer, } end: + sixel_frame_unref(frame); free(g.out); return 0; From da19690fc42447db49268f2b29686fbb6744dcd3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 12 May 2015 23:26:40 +0900 Subject: [PATCH 197/451] Rebuild with automake-1.15 --- Makefile.in | 46 ++++-- aclocal.m4 | 65 ++++---- compile | 2 +- config.guess | 173 ++----------------- config.sub | 36 ++-- configure | 13 +- converters/Makefile.in | 28 +++- depcomp | 2 +- include/Makefile.in | 24 ++- install-sh | 366 +++++++++++++++++++---------------------- missing | 2 +- src/Makefile.in | 24 ++- 12 files changed, 337 insertions(+), 444 deletions(-) diff --git a/Makefile.in b/Makefile.in index 3af7b6c3..ce25e215 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -15,7 +15,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,11 +89,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/config.h.in $(srcdir)/libsixel.pc.in \ - $(srcdir)/package.json.in.in ChangeLog NEWS compile \ - config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -92,6 +97,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -183,6 +190,10 @@ am__define_uniq_tagged_files = \ ETAGS = etags CTAGS = ctags CSCOPE = cscope +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ + ChangeLog NEWS compile config.guess config.sub install-sh \ + ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -389,7 +400,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -645,15 +655,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -689,17 +699,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -880,6 +890,8 @@ uninstall-am: uninstall-pkgconfigDATA mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-pkgconfigDATA +.PRECIOUS: Makefile + all-am: cp package.json.in package.json diff --git a/aclocal.m4 b/aclocal.m4 index 1148e616..b69fb6b8 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -235,7 +235,7 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -247,10 +247,10 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -266,14 +266,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -318,15 +318,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -357,7 +356,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -548,7 +547,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -624,7 +623,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -714,8 +713,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -788,7 +787,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -817,7 +820,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -828,7 +831,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -838,7 +841,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -859,7 +862,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -909,7 +912,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -948,7 +951,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -977,7 +980,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1024,7 +1027,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1043,7 +1046,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1124,7 +1127,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1184,7 +1187,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1212,7 +1215,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1231,7 +1234,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/compile b/compile index 531136b0..a85b723c 100755 --- a/compile +++ b/compile @@ -3,7 +3,7 @@ scriptversion=2012-10-14.11; # UTC -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify diff --git a/config.guess b/config.guess index 9afd6762..6c32c864 100755 --- a/config.guess +++ b/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2013 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2013-11-29' +timestamp='2014-11-04' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -24,12 +24,12 @@ timestamp='2013-11-29' # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # -# Originally written by Per Bothner. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -149,7 +149,7 @@ Linux|GNU|GNU/*) LIBC=gnu #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac @@ -579,8 +579,9 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi @@ -826,7 +827,7 @@ EOF *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -969,10 +970,10 @@ EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or1k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} exit ;; - or32:Linux:*:*) + or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) @@ -1371,154 +1372,6 @@ EOF exit ;; esac -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -68,7 +68,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -283,8 +283,10 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ @@ -296,11 +298,11 @@ case $basic_machine in | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or1k | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ @@ -311,6 +313,7 @@ case $basic_machine in | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) @@ -325,6 +328,9 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none @@ -402,8 +408,10 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ @@ -415,6 +423,7 @@ case $basic_machine in | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ @@ -432,6 +441,7 @@ case $basic_machine in | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -769,6 +779,9 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux @@ -824,6 +837,10 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos @@ -1369,14 +1386,14 @@ case $os in | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1594,9 +1611,6 @@ case $basic_machine in mips*-*) os=-elf ;; - or1k-*) - os=-elf - ;; or32-*) os=-coff ;; diff --git a/configure b/configure index cd9fd618..633e34aa 100755 --- a/configure +++ b/configure @@ -2464,7 +2464,7 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2636,8 +2636,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2656,7 +2656,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2984,8 +2984,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3042,6 +3042,7 @@ END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi + case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 diff --git a/converters/Makefile.in b/converters/Makefile.in index e4c9fcda..ac519068 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -16,7 +16,17 @@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -88,10 +98,6 @@ bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) @WANT_SIXEL2PNG_TRUE@am__append_6 = sixel2png.1 subdir = converters SUBDIRS = -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp $(dist_man_MANS) \ - $(am__dist_bashcompletion_DATA_DIST) \ - $(am__dist_zshcompletion_DATA_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -100,6 +106,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am \ + $(am__dist_bashcompletion_DATA_DIST) \ + $(am__dist_zshcompletion_DATA_DIST) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = @@ -244,6 +253,8 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ @@ -438,7 +449,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign converters/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign converters/Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -980,6 +990,8 @@ uninstall-man: uninstall-man1 uninstall-dist_bashcompletionDATA \ uninstall-dist_zshcompletionDATA uninstall-man uninstall-man1 +.PRECIOUS: Makefile + check: test_impl diff --git a/depcomp b/depcomp index 4ebd5b3a..fc98710e 100755 --- a/depcomp +++ b/depcomp @@ -3,7 +3,7 @@ scriptversion=2013-05-30.07; # UTC -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/include/Makefile.in b/include/Makefile.in index 8f0ecf45..7717ceb0 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -15,7 +15,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,8 +89,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/sixel.h.in $(include_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -89,6 +97,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = sixel.h @@ -160,6 +170,7 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/sixel.h.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ @@ -315,7 +326,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -564,6 +574,8 @@ uninstall-am: uninstall-includeHEADERS ps ps-am tags tags-am uninstall uninstall-am \ uninstall-includeHEADERS +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/install-sh b/install-sh index 377bb868..0b0fdcbb 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-11-20.07; # UTC +scriptversion=2013-12-25.23; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC # This script is compatible with the BSD install script, but was written # from scratch. +tab=' ' nl=' ' -IFS=" "" $nl" +IFS=" $tab$nl" -# set DOITPROG to echo to test this script +# Set DOITPROG to "echo" to test this script. -# Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi +doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -68,17 +64,6 @@ mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - posix_mkdir= # Desired mode of installed file. @@ -97,7 +82,7 @@ dir_arg= dst_arg= copy_on_change=false -no_target_directory= +is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -137,46 +122,57 @@ while test $# -ne 0; do -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; + shift;; -s) stripcmd=$stripprog;; - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; - -T) no_target_directory=true;; + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. @@ -207,6 +203,15 @@ if test $# -eq 0; then exit 0 fi +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 @@ -223,16 +228,16 @@ if test -z "$dir_arg"; then *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -269,41 +274,15 @@ do # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - + dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi @@ -314,74 +293,74 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else @@ -391,53 +370,51 @@ do # directory the slow way, step by step, checking for races as we go. case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac - eval "$initialize_posix_glob" - oIFS=$IFS IFS=/ - $posix_glob set -f + set -f set fnord $dstdir shift - $posix_glob set +f + set +f IFS=$oIFS prefixes= for d do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ done if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi fi fi @@ -472,15 +449,12 @@ do # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - + set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then @@ -493,24 +467,24 @@ do # to itself, or perhaps because mv is so ancient that it does not # support -f. { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 diff --git a/missing b/missing index db98974f..f62bbae3 100755 --- a/missing +++ b/missing @@ -3,7 +3,7 @@ scriptversion=2013-10-28.13; # UTC -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify diff --git a/src/Makefile.in b/src/Makefile.in index 5cad28fd..a38dfe55 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -15,7 +15,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,8 +89,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp $(dist_man_MANS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ @@ -89,6 +97,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = @@ -205,6 +214,8 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ @@ -406,7 +417,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -871,6 +881,8 @@ uninstall-man: uninstall-man5 uninstall-am uninstall-libLTLIBRARIES uninstall-man \ uninstall-man5 +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. From b953bab755c64f6bc6a25fcc70870cc3a535ef6b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 12 May 2015 23:35:34 +0900 Subject: [PATCH 198/451] Add pngsuite background tests --- converters/Makefile.am | 26 +++++++++++++++++++++++++- converters/Makefile.in | 26 +++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 4b6c298b..663c3211 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -81,7 +81,7 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -8 -m ../images/map8-palette.png -Esize ../images/snake.ppm $(WINE) ./img2sixel -7 -m ../images/map16-palette.png -Efast ../images/snake.jpg $(WINE) ./img2sixel -7 -w300 ../images/snake-palette.png - $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B#aB3 ../images/snake.pbm + $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B\#aB3 ../images/snake.pbm $(WINE) ./img2sixel -I -dstucki -thls ../images/snake.ppm $(WINE) ./img2sixel -bvt340color ../images/snake.ppm $(WINE) ./img2sixel -bvt340mono ../images/snake.tga @@ -167,6 +167,30 @@ if HAVE_PNG $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn4a16.png $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a08.png $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a16.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgai4a08.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgai4a16.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgan6a08.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgan6a16.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgbn4a08.png + $(WINE) ./img2sixel ../images/pngsuite/background/bggn4a16.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgwn6a08.png + $(WINE) ./img2sixel ../images/pngsuite/background/bgyn6a16.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgai4a08.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgai4a16.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgan6a08.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgan6a16.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgbn4a08.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bggn4a16.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgwn6a08.png + $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgyn6a16.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgai4a08.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgai4a16.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgan6a08.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgan6a16.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgbn4a08.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bggn4a16.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgwn6a08.png + $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgyn6a16.png endif if HAVE_CURL test ! $$($(WINE) ./img2sixel file:///test) diff --git a/converters/Makefile.in b/converters/Makefile.in index ac519068..254cf4ac 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1038,7 +1038,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -8 -m ../images/map8-palette.png -Esize ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -m ../images/map16-palette.png -Efast ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w300 ../images/snake-palette.png -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B#aB3 ../images/snake.pbm +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B\#aB3 ../images/snake.pbm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -dstucki -thls ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340color ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340mono ../images/snake.tga @@ -1123,6 +1123,30 @@ test_impl: @HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn4a16.png @HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a08.png @HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c16x16+8+8 ../images/pngsuite/basic/basn6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgai4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgai4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgan6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgan6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgbn4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bggn4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgwn6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/pngsuite/background/bgyn6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgai4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgai4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgan6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgan6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgbn4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bggn4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgwn6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -B\#fff ../images/pngsuite/background/bgyn6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgai4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgai4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgan6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgan6a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgbn4a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bggn4a16.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgwn6a08.png +@HAVE_PNG_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w32 -B\#fff ../images/pngsuite/background/bgyn6a16.png @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel file:///test) @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel file:///$$(pwd)/../images/snake.jpg @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png -i unknown.sixel) From 613209f5b4b22b9e04eb7b255b4a3adf8385286e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 14 May 2015 01:12:33 +0900 Subject: [PATCH 199/451] Implement -o(--outfile) option --- converters/img2sixel.c | 7 +++++-- src/easy_encode.c | 41 ++++++++++++++++++++++++++++++++--------- src/easy_encode.h | 1 + src/loader.c | 16 ++++++++++------ 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 53db125e..421b6845 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -89,6 +89,8 @@ void show_help(void) " img2sixel [Options] < imagefile\n" "\n" "Options:\n" + "-o, --outfile specify output file name.\n" + " (default:stdout)\n" "-7, --7bit-mode generate a sixel image for 7bit\n" " terminals or printers (default)\n" "-8, --8bit-mode generate a sixel image for 8bit\n" @@ -283,12 +285,13 @@ main(int argc, char *argv[]) int ret; int exit_code; sixel_encode_settings_t *settings; - char const *optstring = "78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:B:C:DVH"; + char const *optstring = "o:78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:B:C:DVH"; settings = sixel_encode_settings_create(); #if HAVE_GETOPT_LONG struct option long_options[] = { + {"outfile", no_argument, &long_opt, 'o'}, {"7bit-mode", no_argument, &long_opt, '7'}, {"8bit-mode", no_argument, &long_opt, '8'}, {"colors", required_argument, &long_opt, 'p'}, @@ -398,7 +401,7 @@ main(int argc, char *argv[]) " [-f findtype] [-s selecttype] [-c geometory] [-w width]\n" " [-h height] [-r resamplingtype] [-q quality] [-l loopmode]\n" " [-t palettetype] [-n macronumber] [-C score] [-b palette]\n" - " [-E encodepolicy] [-B bgcolor] [filename ...]\n" + " [-E encodepolicy] [-B bgcolor] [-o outfile] [filename ...]\n" "for more details, type: 'img2sixel -H'.\n"); end: diff --git a/src/easy_encode.c b/src/easy_encode.c index ee022fa9..7045ce32 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -56,6 +56,12 @@ #if HAVE_SYS_IOCTL_H # include #endif +#if HAVE_SYS_STAT_H +# include +#endif +#if HAVE_FCNTL_H +# include +#endif #include "easy_encode.h" #include @@ -191,9 +197,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) static int sixel_write_callback(char *data, int size, void *priv) { - /* unused */ (void) priv; - - return fwrite(data, 1, size, stdout); + return write(*(int *)priv, data, size); } @@ -204,8 +208,6 @@ sixel_hex_write_callback(char *data, int size, void *priv) int i; int j; - /* unused */ (void) priv; - for (i = j = 0; i < size; ++i, ++j) { hex[j] = (data[i] >> 4) & 0xf; hex[j] += (hex[j] < 10 ? '0': ('a' - 10)); @@ -213,7 +215,7 @@ sixel_hex_write_callback(char *data, int size, void *priv) hex[j] += (hex[j] < 10 ? '0': ('a' - 10)); } - return fwrite(hex, 1, size * 2, stdout); + return write(*(int *)priv, hex, size * 2); } @@ -732,8 +734,9 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_encode_settings_t *psettings; sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; - sixel_callback_context_t *callback_context = (sixel_callback_context_t *)data; + sixel_callback_context_t *callback_context; + callback_context = (sixel_callback_context_t *)data; psettings = callback_context->settings; /* evaluate -w, -h, and -c option: crop/scale input source */ @@ -788,9 +791,11 @@ load_image_callback(sixel_frame_t *frame, void *data) /* create output context */ if (psettings->fuse_macro || psettings->macro_number >= 0) { /* -u or -n option */ - output = sixel_output_create(sixel_hex_write_callback, stdout); + output = sixel_output_create(sixel_hex_write_callback, + &psettings->outfd); } else { - output = sixel_output_create(sixel_write_callback, stdout); + output = sixel_output_create(sixel_write_callback, + &psettings->outfd); } sixel_output_set_8bit_availability(output, psettings->f8bit); sixel_output_set_palette_type(output, psettings->palette_type); @@ -976,6 +981,20 @@ sixel_easy_encode_setopt( char unit[32]; switch(arg) { + case 'o': + if (*optarg == '\0') { + fprintf(stderr, "Invalid file name.\n"); + goto argerr; + } + if (strcmp(optarg, "-") != 0) { + if (psettings->outfd) { + close(psettings->outfd); + } + psettings->outfd = open(optarg, + O_RDWR|O_CREAT|O_NOCTTY, + S_IREAD|S_IWRITE); + } + break; case '7': psettings->f8bit = 0; break; @@ -1384,6 +1403,7 @@ sixel_encode_settings_create(void) settings->show_version = 0; settings->show_help = 0; settings->bgcolor = NULL; + settings->outfd = STDOUT_FILENO; return settings; } @@ -1395,6 +1415,9 @@ sixel_encode_settings_destroy(sixel_encode_settings_t *settings) if (settings) { free(settings->mapfile); free(settings->bgcolor); + if (settings->outfd) { + close(settings->outfd); + } free(settings); } } diff --git a/src/easy_encode.h b/src/easy_encode.h index fce36719..b092b1c2 100644 --- a/src/easy_encode.h +++ b/src/easy_encode.h @@ -60,6 +60,7 @@ typedef struct sixel_encode_settings { int show_version; int show_help; unsigned char *bgcolor; + int outfd; } sixel_encode_settings_t; #endif /* LIBSIXEL_EASY_ENCODE_H */ diff --git a/src/loader.c b/src/loader.c index 44ec6bff..d38478d3 100644 --- a/src/loader.c +++ b/src/loader.c @@ -166,8 +166,8 @@ open_binary_file(char const *filename) #if HAVE_STAT if (stat(filename, &sb) != 0) { # if HAVE_ERRNO_H - fprintf(stderr, "stat() failed.\n" "reason: %s.\n", - strerror(errno)); + fprintf(stderr, "stat(%s) failed.\n" "reason: %s.\n", + filename, strerror(errno)); # endif /* HAVE_ERRNO_H */ return NULL; } @@ -203,7 +203,8 @@ get_chunk_from_file(char const *filename, chunk_t *pchunk) chunk_init(pchunk, 64 * 1024); if (pchunk->buffer == NULL) { #if HAVE_ERRNO_H - fprintf(stderr, "get_chunk_from_file('%s'): malloc failed.\n" "reason: %s.\n", + fprintf(stderr, "get_chunk_from_file('%s'): malloc failed.\n" + "reason: %s.\n", filename, strerror(errno)); #endif /* HAVE_ERRNO_H */ return (-1); @@ -212,10 +213,12 @@ get_chunk_from_file(char const *filename, chunk_t *pchunk) for (;;) { if (pchunk->max_size - pchunk->size < 4096) { pchunk->max_size *= 2; - pchunk->buffer = (unsigned char *)realloc(pchunk->buffer, pchunk->max_size); + pchunk->buffer = (unsigned char *)realloc(pchunk->buffer, + pchunk->max_size); if (pchunk->buffer == NULL) { #if HAVE_ERRNO_H - fprintf(stderr, "get_chunk_from_file('%s'): relloc failed.\n" "reason: %s.\n", + fprintf(stderr, "get_chunk_from_file('%s'): relloc failed.\n" + "reason: %s.\n", filename, strerror(errno)); #endif /* HAVE_ERRNO_H */ return (-1); @@ -245,7 +248,8 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) chunk_init(pchunk, 1024); if (pchunk->buffer == NULL) { #if HAVE_ERRNO_H - fprintf(stderr, "get_chunk_from_url('%s'): malloc failed.\n" "reason: %s.\n", + fprintf(stderr, "get_chunk_from_url('%s'): malloc failed.\n" + "reason: %s.\n", url, strerror(errno)); #endif /* HAVE_ERRNO_H */ return (-1); From 1110b17328fbb33f7f6f17a855ca2598febc0fc8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 15 May 2015 11:16:29 +0900 Subject: [PATCH 200/451] Don't close stdout/stderr on exit --- src/easy_encode.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 7045ce32..228af19a 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -1415,7 +1415,9 @@ sixel_encode_settings_destroy(sixel_encode_settings_t *settings) if (settings) { free(settings->mapfile); free(settings->bgcolor); - if (settings->outfd) { + if (settings->outfd + && settings->outfd != STDOUT_FILENO + && settings->outfd != STDERR_FILENO) { close(settings->outfd); } free(settings); From e5646a7a86a0c4cb485071320ccb3262b2485a14 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 15 May 2015 11:27:46 +0900 Subject: [PATCH 201/451] Minor fix --- src/easy_encode.c | 8 +++----- src/loader.c | 20 +++++++++----------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 228af19a..75523ca1 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -503,23 +503,23 @@ print_palette(sixel_dither_t *dither) } -#if HAVE_SYS_SELECT_H static int wait_stdin(int usec) { fd_set rfds; struct timeval tv; - int ret; + int ret = 0; +#if HAVE_SYS_SELECT_H tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; FD_ZERO(&rfds); FD_SET(STDIN_FILENO, &rfds); ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); +#endif /* HAVE_SYS_SELECT_H */ return ret; } -#endif /* HAVE_SYS_SELECT_H */ static int @@ -948,12 +948,10 @@ sixel_easy_encode( clearerr(stdin); #endif /* HAVE_FSEEK */ while (cancel_flag && !*cancel_flag) { -#if HAVE_SYS_SELECT_H nret = wait_stdin(1000000); if (nret == (-1)) { goto end; } -#endif /* HAVE_SYS_SELECT_H */ if (nret != 0) { break; } diff --git a/src/loader.c b/src/loader.c index d38478d3..d9210894 100644 --- a/src/loader.c +++ b/src/loader.c @@ -238,20 +238,20 @@ get_chunk_from_file(char const *filename, chunk_t *pchunk) } -# ifdef HAVE_LIBCURL static int get_chunk_from_url(char const *url, chunk_t *pchunk) { +# ifdef HAVE_LIBCURL CURL *curl; CURLcode code; chunk_init(pchunk, 1024); if (pchunk->buffer == NULL) { -#if HAVE_ERRNO_H +# if HAVE_ERRNO_H fprintf(stderr, "get_chunk_from_url('%s'): malloc failed.\n" "reason: %s.\n", url, strerror(errno)); -#endif /* HAVE_ERRNO_H */ +# endif /* HAVE_ERRNO_H */ return (-1); } curl = curl_easy_init(); @@ -272,8 +272,13 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) } curl_easy_cleanup(curl); return 0; -} +# else + fprintf(stderr, "To specify URI schemes, you have to " + "configure this program with --with-libcurl " + "option at compile time.\n"); + return (-1); # endif /* HAVE_LIBCURL */ +} # if HAVE_JPEG @@ -736,14 +741,7 @@ static int get_chunk(char const *filename, chunk_t *pchunk) { if (filename != NULL && strstr(filename, "://")) { -# ifdef HAVE_LIBCURL return get_chunk_from_url(filename, pchunk); -# else - fprintf(stderr, "To specify URI schemes, you have to " - "configure this program with --with-libcurl " - "option at compile time.\n"); - return (-1); -# endif /* HAVE_LIBCURL */ } return get_chunk_from_file(filename, pchunk); } From 93ed52d778ab69a93bc856e30a17d1e08c7c4115 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 15 May 2015 16:57:57 +0900 Subject: [PATCH 202/451] Passes cancel flag to image loader --- include/sixel.h.in | 3 ++- src/easy_encode.c | 20 ++++++++++------ src/loader.c | 57 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 68 insertions(+), 12 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index d16585e0..57aa306b 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -543,6 +543,7 @@ sixel_helper_load_image_file( unsigned char /* in */ *bgcolor, /* background color */ int /* in */ loop_control, /* one of enum loopControl */ sixel_load_image_function /* in */ fn_load, /* callback */ + int const /* in */ *cancel_flag, /* cancel flag */ void /* in/out */ *context); /* private data for callback */ @@ -603,7 +604,7 @@ int sixel_easy_encode( char const /* in */ *filename, sixel_encode_settings_t /* in */ *psettings, - int /* in */ *cancel_flag); + int const /* in */ *cancel_flag); #ifdef __cplusplus } diff --git a/src/easy_encode.c b/src/easy_encode.c index 75523ca1..44f243cb 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -312,7 +312,8 @@ static sixel_dither_t * prepare_specified_palette( char const *mapfile, int reqcolors, - unsigned char *bgcolor) + unsigned char *bgcolor, + int const *cancel_flag) { int ret = (-1); @@ -328,6 +329,7 @@ prepare_specified_palette( bgcolor, LOOP_DISABLE, load_image_callback_for_palette, + cancel_flag, &callback_context); if (ret != 0) { return NULL; @@ -340,7 +342,8 @@ prepare_specified_palette( static sixel_dither_t * prepare_palette(sixel_dither_t *former_dither, sixel_frame_t *frame, - sixel_encode_settings_t *psettings) + sixel_encode_settings_t *psettings, + int const *cancel_flag) { sixel_dither_t *dither; int ret; @@ -362,7 +365,8 @@ prepare_palette(sixel_dither_t *former_dither, } dither = prepare_specified_palette(psettings->mapfile, psettings->reqcolors, - psettings->bgcolor); + psettings->bgcolor, + cancel_flag); } else if (psettings->builtin_palette) { if (former_dither) { return former_dither; @@ -532,7 +536,7 @@ output_sixel_without_macro( sixel_dither_t *dither, sixel_output_t *context, sixel_encode_settings_t *psettings, - int *cancel_flag + int const *cancel_flag ) { int nret = 0; @@ -663,7 +667,7 @@ output_sixel_with_macro( typedef struct sixel_callback_context { sixel_encode_settings_t *settings; - int *cancel_flag; + int const *cancel_flag; } sixel_callback_context_t; @@ -767,7 +771,8 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* prepare dither context */ - dither = prepare_palette(dither, frame, psettings); + dither = prepare_palette(dither, frame, psettings, + callback_context->cancel_flag); if (!dither) { nret = (-1); goto end; @@ -876,7 +881,7 @@ int sixel_easy_encode( char const /* in */ *filename, sixel_encode_settings_t /* in */ *psettings, - int /* in */ *cancel_flag) + int const /* in */ *cancel_flag) { int nret = (-1); int fuse_palette = 1; @@ -937,6 +942,7 @@ sixel_easy_encode( psettings->bgcolor, loop_control, load_image_callback, + cancel_flag, &callback_context); if (nret != 0) { diff --git a/src/loader.c b/src/loader.c index d9210894..79fb6642 100644 --- a/src/loader.c +++ b/src/loader.c @@ -143,6 +143,31 @@ memory_write(void *ptr, # endif +static int +wait_file(int fd, int usec) +{ + fd_set rfds; + struct timeval tv; + int ret = 0; + +#if HAVE_SYS_SELECT_H + tv.tv_sec = usec / 1000000; + tv.tv_usec = usec % 1000000; + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + ret = select(fd + 1, &rfds, NULL, NULL, &tv); +#endif /* HAVE_SYS_SELECT_H */ + if (ret == 0) { + return (1); + } + if (ret < 0) { + return ret; + } + + return (0); +} + + static FILE * open_binary_file(char const *filename) { @@ -190,10 +215,15 @@ open_binary_file(char const *filename) static int -get_chunk_from_file(char const *filename, chunk_t *pchunk) +get_chunk_from_file( + char const *filename, + chunk_t *pchunk, + int const *cancel_flag +) { FILE *f; int n; + int ret; f = open_binary_file(filename); if (!f) { @@ -224,6 +254,19 @@ get_chunk_from_file(char const *filename, chunk_t *pchunk) return (-1); } } + + for (;;) { + if (*cancel_flag) { + return (-1); + } + ret = wait_file(fileno(f), 10000); + if (ret < 0) { + return ret; + } + if (ret == 0) { + break; + } + } n = fread(pchunk->buffer + pchunk->size, 1, 4096, f); if (n <= 0) { break; @@ -738,12 +781,17 @@ load_sixel(unsigned char *buffer, static int -get_chunk(char const *filename, chunk_t *pchunk) +get_chunk( + char const *filename, + chunk_t *pchunk, + int const *cancel_flag +) { if (filename != NULL && strstr(filename, "://")) { return get_chunk_from_url(filename, pchunk); } - return get_chunk_from_file(filename, pchunk); + + return get_chunk_from_file(filename, pchunk, cancel_flag); } @@ -1321,13 +1369,14 @@ sixel_helper_load_image_file( unsigned char /* in */ *bgcolor, /* background color */ int /* in */ loop_control, /* one of enum loopControl */ sixel_load_image_function /* in */ fn_load, /* callback */ + int const /* in */ *cancel_flag, /* cancel flag */ void /* in/out */ *context /* private data */ ) { int ret = (-1); chunk_t chunk; - ret = get_chunk(filename, &chunk); + ret = get_chunk(filename, &chunk, cancel_flag); if (ret != 0) { return ret; } From ffc77382f73ec0168f98a46410fb9b12296f3814 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 17:01:05 +0900 Subject: [PATCH 203/451] Suppress gcc unused-parameter warnings --- src/loader.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/loader.c b/src/loader.c index 79fb6642..2698647c 100644 --- a/src/loader.c +++ b/src/loader.c @@ -146,9 +146,11 @@ memory_write(void *ptr, static int wait_file(int fd, int usec) { +#if HAVE_SYS_SELECT_H fd_set rfds; struct timeval tv; - int ret = 0; +#endif /* HAVE_SYS_SELECT_H */ + int ret = 1; #if HAVE_SYS_SELECT_H tv.tv_sec = usec / 1000000; @@ -316,6 +318,8 @@ get_chunk_from_url(char const *url, chunk_t *pchunk) curl_easy_cleanup(curl); return 0; # else + (void) url; + (void) pchunk; fprintf(stderr, "To specify URI schemes, you have to " "configure this program with --with-libcurl " "option at compile time.\n"); From 1dda30967e4ec401fd8494f9e8e0211e7ab2b9e3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 17:02:37 +0900 Subject: [PATCH 204/451] Minor fixes --- src/loader.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/loader.c b/src/loader.c index 2698647c..626cf665 100644 --- a/src/loader.c +++ b/src/loader.c @@ -158,6 +158,9 @@ wait_file(int fd, int usec) FD_ZERO(&rfds); FD_SET(fd, &rfds); ret = select(fd + 1, &rfds, NULL, NULL, &tv); +#else + (void) fd; + (void) usec; #endif /* HAVE_SYS_SELECT_H */ if (ret == 0) { return (1); From 8b9cda416affd42acd3c69d18c78048f44b6b08f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 17:24:01 +0900 Subject: [PATCH 205/451] Update manpage of img2sixel --- converters/img2sixel.1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 7edb5381..20b4d2aa 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -26,6 +26,9 @@ convert JPEG/PNG images into DEC SIXEL image format. .SH "COMMAND-LINE OPTIONS" \fIimg2sixel\fP has the following command-line options: .TP 5 +.B \-o, \-\-outfile +specify output file name (default:stdout). +.TP 5 .B \-7, \-\-7bit-mode generate a sixel image for 7bit terminals or printers (default). .TP 5 From d4792d835d37c3d63258469ca48ec80fa893f43e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 17:31:36 +0900 Subject: [PATCH 206/451] Update bash completion file --- converters/shell-completion/bash/img2sixel | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/converters/shell-completion/bash/img2sixel b/converters/shell-completion/bash/img2sixel index cdd33396..bd0cb35a 100644 --- a/converters/shell-completion/bash/img2sixel +++ b/converters/shell-completion/bash/img2sixel @@ -104,11 +104,16 @@ _img2sixel() size' -- "$cur" ) ) return 0 ;; + -o|--outfile) + _filedir + return 0 + ;; esac case "$cur" in -*) COMPREPLY=( $( compgen -W ' + -o --outfile \ -7 --7bit-mode \ -8 --8bit-mode \ -p --colors \ From 2b7cd5a271beea20d48e133206cddb753e4f50dc Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 17:34:05 +0900 Subject: [PATCH 207/451] Update zsh completion file --- converters/shell-completion/zsh/_img2sixel | 1 + 1 file changed, 1 insertion(+) diff --git a/converters/shell-completion/zsh/_img2sixel b/converters/shell-completion/zsh/_img2sixel index 6d42ff5f..c73ec417 100644 --- a/converters/shell-completion/zsh/_img2sixel +++ b/converters/shell-completion/zsh/_img2sixel @@ -99,6 +99,7 @@ _encodepolicy() { } _arguments -S -s -A "-*" -S \ + {-o,--outfile}'[specify output file (default: stdout)]':files:_files \ {-7,--7bit-mode}'[generate a sixel image for 7bit terminals (default)]' \ {-8,--8bit-mode}'[generate a sixel image for 8bit terminals]' \ {-p,--colors=}'[specify number of colors to reduce the image to]' \ From 005195235ed5060bed0c7727e7745f4d8e1f6937 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 18:16:54 +0900 Subject: [PATCH 208/451] Suppress warnings in MinGW environment --- src/easy_encode.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 44f243cb..e6655f01 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -510,8 +510,10 @@ print_palette(sixel_dither_t *dither) static int wait_stdin(int usec) { +#if HAVE_SYS_SELECT_H fd_set rfds; struct timeval tv; +#endif /* HAVE_SYS_SELECT_H */ int ret = 0; #if HAVE_SYS_SELECT_H @@ -520,6 +522,8 @@ wait_stdin(int usec) FD_ZERO(&rfds); FD_SET(STDIN_FILENO, &rfds); ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); +#else + (void) usec; #endif /* HAVE_SYS_SELECT_H */ return ret; @@ -995,7 +999,7 @@ sixel_easy_encode_setopt( close(psettings->outfd); } psettings->outfd = open(optarg, - O_RDWR|O_CREAT|O_NOCTTY, + O_RDWR|O_CREAT, S_IREAD|S_IWRITE); } break; From 6d92b7946c5085148729ca273b591e212d9445de Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 16 May 2015 21:08:59 +0900 Subject: [PATCH 209/451] Rename easy encoder/decoder structures and releated APIs --- converters/img2sixel.c | 42 ++- converters/sixel2png.c | 39 ++- include/sixel.h.in | 72 ++---- src/easy_decode.c | 91 +++---- src/easy_decode.h | 6 +- src/easy_encode.c | 570 ++++++++++++++++++++--------------------- src/easy_encode.h | 8 +- 7 files changed, 381 insertions(+), 447 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 421b6845..e06eec86 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -284,10 +284,10 @@ main(int argc, char *argv[]) #endif /* HAVE_GETOPT_LONG */ int ret; int exit_code; - sixel_encode_settings_t *settings; + sixel_encoder_t *encoder; char const *optstring = "o:78p:m:eb:Id:f:s:c:w:h:r:q:il:t:ugvSn:PE:B:C:DVH"; - settings = sixel_encode_settings_create(); + encoder = sixel_encoder_create(); #if HAVE_GETOPT_LONG struct option long_options[] = { @@ -342,26 +342,24 @@ main(int argc, char *argv[]) n = long_opt; } #endif /* HAVE_GETOPT_LONG */ - ret = sixel_easy_encode_setopt(settings, n, optarg); - if (ret != 0) { - goto argerr; + switch (n) { + case 'V': + show_version(); + exit_code = EXIT_SUCCESS; + goto end; + case 'H': + show_help(); + exit_code = EXIT_SUCCESS; + goto end; + default: + ret = sixel_encoder_setopt(encoder, n, optarg); + if (ret != 0) { + goto argerr; + } + break; } } - /* evaluate the option -v,--version */ - if (sixel_encode_settings_has_version(settings)) { - show_version(); - exit_code = EXIT_SUCCESS; - goto end; - } - - /* evaluate the option -h,--help */ - if (sixel_encode_settings_has_help(settings)) { - show_help(); - exit_code = EXIT_SUCCESS; - goto end; - } - /* set signal handler to handle SIGINT/SIGTERM/SIGHUP */ #if HAVE_SIGNAL # if HAVE_DECL_SIGINT @@ -376,14 +374,14 @@ main(int argc, char *argv[]) #endif if (optind == argc) { - ret = sixel_easy_encode(NULL, settings, &signaled); + ret = sixel_encoder_encode(encoder, NULL, &signaled); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; } } else { for (n = optind; n < argc; n++) { - ret = sixel_easy_encode(argv[n], settings, &signaled); + ret = sixel_encoder_encode(encoder, argv[n], &signaled); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; @@ -405,7 +403,7 @@ main(int argc, char *argv[]) "for more details, type: 'img2sixel -H'.\n"); end: - sixel_encode_settings_unref(settings); + sixel_encoder_unref(encoder); return exit_code; } diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 4dddfaa5..a210c2b6 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -103,7 +103,7 @@ int main(int argc, char *argv[]) { int n; - sixel_decode_settings_t *settings; + sixel_decoder_t *decoder; #if HAVE_GETOPT_LONG int long_opt; int option_index; @@ -120,8 +120,8 @@ main(int argc, char *argv[]) {0, 0, 0, 0} }; - settings = sixel_decode_settings_create(); - if (settings == NULL) { + decoder = sixel_decoder_create(); + if (decoder == NULL) { nret = (-1); goto end; } @@ -145,9 +145,18 @@ main(int argc, char *argv[]) } #endif /* HAVE_GETOPT_LONG */ - nret = sixel_easy_decode_setopt(settings, n, optarg); - if (nret != 0) { - goto argerr; + switch (n) { + case 'V': + show_version(); + goto end; + case 'H': + show_help(); + goto end; + default: + nret = sixel_decoder_setopt(decoder, n, optarg); + if (nret != 0) { + goto argerr; + } } if (optind >= argc) { @@ -156,24 +165,14 @@ main(int argc, char *argv[]) } - if (sixel_decode_settings_has_version(settings)) { - show_version(); - goto end; - } - - if (sixel_decode_settings_has_help(settings)) { - show_help(); - goto end; - } - if (optind < argc) { - nret = sixel_easy_decode_setopt(settings, 'i', argv[optind++]); + nret = sixel_decoder_setopt(decoder, 'i', argv[optind++]); if (nret != 0) { goto argerr; } } if (optind < argc) { - nret = sixel_easy_decode_setopt(settings, 'o', argv[optind++]); + nret = sixel_decoder_setopt(decoder, 'o', argv[optind++]); if (nret != 0) { goto argerr; } @@ -183,14 +182,14 @@ main(int argc, char *argv[]) goto argerr; } - nret = sixel_easy_decode(settings); + nret = sixel_decoder_decode(decoder); goto end; argerr: show_help(); end: - sixel_decode_settings_unref(settings); + sixel_decoder_unref(decoder); return nret; } diff --git a/include/sixel.h.in b/include/sixel.h.in index 57aa306b..3bf11c50 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -563,12 +563,12 @@ sixel_helper_write_image_file( #endif -/* easy encode API */ +/* easy encoder API */ #ifndef LIBSIXEL_EASY_ENCODE_H /* handle type of dither context object */ -typedef struct sixel_encode_settings { int dummy; } sixel_encode_settings_t; +typedef struct sixel_encoder { int dummy; } sixel_encoder_t; #endif /* LIBSIXEL_EASY_ENCODE_H */ @@ -576,47 +576,39 @@ typedef struct sixel_encode_settings { int dummy; } sixel_encode_settings_t; extern "C" { #endif -/* create settings object */ -sixel_encode_settings_t * -sixel_encode_settings_create(void); +/* create encoder object */ +sixel_encoder_t * +sixel_encoder_create(void); void -sixel_encode_settings_ref(sixel_encode_settings_t *settings); +sixel_encoder_ref(sixel_encoder_t *encoder); void -sixel_encode_settings_unref(sixel_encode_settings_t *settings); +sixel_encoder_unref(sixel_encoder_t *encoder); -/* get show_version flag */ int -sixel_encode_settings_has_version(sixel_encode_settings_t *settings); +sixel_encoder_setopt( + sixel_encoder_t /* in */ *encoder, + int /* in */ arg, + char /* in */ *optarg); -/* get show_help flag */ int -sixel_encode_settings_has_help(sixel_encode_settings_t *settings); - -int -sixel_easy_encode_setopt( - sixel_encode_settings_t /* in */ *psettings, - int /* in */ arg, - char /* in */ *optarg); - -int -sixel_easy_encode( - char const /* in */ *filename, - sixel_encode_settings_t /* in */ *psettings, - int const /* in */ *cancel_flag); +sixel_encoder_encode( + sixel_encoder_t /* in */ *encoder, + char const /* in */ *filename, + int const /* in */ *cancel_flag); #ifdef __cplusplus } #endif -/* easy encode API */ +/* easy encoder API */ #ifndef LIBSIXEL_EASY_DECODE_H /* handle type of dither context object */ -typedef struct sixel_decode_settings { int dummy; } sixel_decode_settings_t; +typedef struct sixel_decoder { int dummy; } sixel_decoder_t; #endif /* LIBSIXEL_EASY_ENCODE_H */ @@ -624,33 +616,25 @@ typedef struct sixel_decode_settings { int dummy; } sixel_decode_settings_t; extern "C" { #endif -/* create settings object */ -sixel_decode_settings_t * -sixel_decode_settings_create(void); +/* create decoder object */ +sixel_decoder_t * +sixel_decoder_create(void); void -sixel_decode_settings_ref(sixel_decode_settings_t *settings); +sixel_decoder_ref(sixel_decoder_t *decoder); void -sixel_decode_settings_unref(sixel_decode_settings_t *settings); - -/* get show_version flag */ -int -sixel_decode_settings_has_version(sixel_decode_settings_t *settings); - -/* get show_help flag */ -int -sixel_decode_settings_has_help(sixel_decode_settings_t *settings); +sixel_decoder_unref(sixel_decoder_t *decoder); int -sixel_easy_decode_setopt( - sixel_decode_settings_t /* in */ *psettings, - int /* in */ arg, - char /* in */ *optarg); +sixel_decoder_setopt( + sixel_decoder_t /* in */ *decoder, + int /* in */ arg, + char /* in */ *optarg); int -sixel_easy_decode( - sixel_decode_settings_t /* in */ *psettings); +sixel_decoder_decode( + sixel_decoder_t /* in */ *decoder); #ifdef __cplusplus } diff --git a/src/easy_decode.c b/src/easy_decode.c index 1ae39a54..368a31be 100644 --- a/src/easy_decode.c +++ b/src/easy_decode.c @@ -75,8 +75,8 @@ arg_strdup(char const *s) int -sixel_easy_decode( - sixel_decode_settings_t /* in */ *psettings) +sixel_decoder_decode( + sixel_decoder_t /* in */ *decoder) { unsigned char *raw_data; int sx, sy; @@ -90,7 +90,7 @@ sixel_easy_decode( unsigned char *pixels = NULL; int ret = 0; - if (strcmp(psettings->input, "-") == 0) { + if (strcmp(decoder->input, "-") == 0) { /* for windows */ #if defined(O_BINARY) # if HAVE__SETMODE @@ -101,11 +101,11 @@ sixel_easy_decode( #endif /* defined(O_BINARY) */ input_fp = stdin; } else { - input_fp = fopen(psettings->input, "rb"); + input_fp = fopen(decoder->input, "rb"); if (!input_fp) { #if HAVE_ERRNO_H fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", - psettings->input, strerror(errno)); + decoder->input, strerror(errno)); #endif /* HAVE_ERRNO_H */ return (-1); } @@ -153,7 +153,7 @@ sixel_easy_decode( ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, PIXELFORMAT_PAL8, - psettings->output, + decoder->output, FORMAT_PNG); end: @@ -163,26 +163,20 @@ sixel_easy_decode( int -sixel_easy_decode_setopt( - sixel_decode_settings_t /* in */ *settings, - int /* in */ arg, - char /* in */ *optarg +sixel_decoder_setopt( + sixel_decoder_t /* in */ *decoder, + int /* in */ arg, + char /* in */ *optarg ) { switch(arg) { case 'i': - free(settings->input); - settings->input = arg_strdup(optarg); + free(decoder->input); + decoder->input = arg_strdup(optarg); break; case 'o': - free(settings->output); - settings->output = arg_strdup(optarg); - break; - case 'V': - settings->show_version = 1; - break; - case 'H': - settings->show_help = 1; + free(decoder->output); + decoder->output = arg_strdup(optarg); break; case '?': default: @@ -193,69 +187,50 @@ sixel_easy_decode_setopt( } -/* create settings object */ -sixel_decode_settings_t * -sixel_decode_settings_create(void) +/* create decoder object */ +sixel_decoder_t * +sixel_decoder_create(void) { - sixel_decode_settings_t *settings; + sixel_decoder_t *decoder; - settings = malloc(sizeof(sixel_decode_settings_t)); + decoder = malloc(sizeof(sixel_decoder_t)); - settings->ref = 1; - settings->output = arg_strdup("-"); - settings->input = arg_strdup("-"); - settings->show_version = 0; - settings->show_help = 0; + decoder->ref = 1; + decoder->output = arg_strdup("-"); + decoder->input = arg_strdup("-"); - return settings; + return decoder; } void -sixel_decode_settings_destroy(sixel_decode_settings_t *settings) +sixel_decoder_destroy(sixel_decoder_t *decoder) { - if (settings) { - free(settings->input); - free(settings->output); - free(settings); + if (decoder) { + free(decoder->input); + free(decoder->output); + free(decoder); } } void -sixel_decode_settings_ref(sixel_decode_settings_t *settings) +sixel_decoder_ref(sixel_decoder_t *decoder) { /* TODO: be thread safe */ - ++settings->ref; + ++decoder->ref; } void -sixel_decode_settings_unref(sixel_decode_settings_t *settings) +sixel_decoder_unref(sixel_decoder_t *decoder) { /* TODO: be thread safe */ - if (settings != NULL && --settings->ref == 0) { - sixel_decode_settings_destroy(settings); + if (decoder != NULL && --decoder->ref == 0) { + sixel_decoder_destroy(decoder); } } - -/* get show_version flag */ -int -sixel_decode_settings_has_version(sixel_decode_settings_t *settings) -{ - return settings->show_version; -} - - -/* get show_help flag */ -int -sixel_decode_settings_has_help(sixel_decode_settings_t *settings) -{ - return settings->show_help; -} - - /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/easy_decode.h b/src/easy_decode.h index 15e04c3b..eabeb6d2 100644 --- a/src/easy_decode.h +++ b/src/easy_decode.h @@ -23,13 +23,11 @@ #define LIBSIXEL_EASY_DECODE_H /* encode settings object */ -typedef struct sixel_decode_settings { +typedef struct sixel_decoder { unsigned int ref; char *input; char *output; - int show_version; - int show_help; -} sixel_decode_settings_t; +} sixel_decoder_t; #endif /* LIBSIXEL_EASY_DECODE_H */ diff --git a/src/easy_encode.c b/src/easy_encode.c index e6655f01..dd025702 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -342,36 +342,36 @@ prepare_specified_palette( static sixel_dither_t * prepare_palette(sixel_dither_t *former_dither, sixel_frame_t *frame, - sixel_encode_settings_t *psettings, + sixel_encoder_t *encoder, int const *cancel_flag) { sixel_dither_t *dither; int ret; int histogram_colors; - if (psettings->highcolor) { + if (encoder->highcolor) { if (former_dither) { return former_dither; } dither = sixel_dither_create(-1); - } else if (psettings->monochrome) { + } else if (encoder->monochrome) { if (former_dither) { return former_dither; } - dither = prepare_monochrome_palette(psettings->finvert); - } else if (psettings->mapfile) { + dither = prepare_monochrome_palette(encoder->finvert); + } else if (encoder->mapfile) { if (former_dither) { return former_dither; } - dither = prepare_specified_palette(psettings->mapfile, - psettings->reqcolors, - psettings->bgcolor, + dither = prepare_specified_palette(encoder->mapfile, + encoder->reqcolors, + encoder->bgcolor, cancel_flag); - } else if (psettings->builtin_palette) { + } else if (encoder->builtin_palette) { if (former_dither) { return former_dither; } - dither = prepare_builtin_palette(psettings->builtin_palette); + dither = prepare_builtin_palette(encoder->builtin_palette); } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & FORMATTYPE_PALETTE)) { dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (!dither) { @@ -389,7 +389,7 @@ prepare_palette(sixel_dither_t *former_dither, if (former_dither) { sixel_dither_unref(former_dither); } - dither = sixel_dither_create(psettings->reqcolors); + dither = sixel_dither_create(encoder->reqcolors); if (!dither) { return NULL; } @@ -398,16 +398,16 @@ prepare_palette(sixel_dither_t *former_dither, sixel_frame_get_width(frame), sixel_frame_get_height(frame), sixel_frame_get_pixelformat(frame), - psettings->method_for_largest, - psettings->method_for_rep, - psettings->quality_mode); + encoder->method_for_largest, + encoder->method_for_rep, + encoder->quality_mode); if (ret != 0) { sixel_dither_unref(dither); return NULL; } histogram_colors = sixel_dither_get_num_of_histogram_colors(dither); - if (histogram_colors <= psettings->reqcolors) { - psettings->method_for_diffuse = DIFFUSE_NONE; + if (histogram_colors <= encoder->reqcolors) { + encoder->method_for_diffuse = DIFFUSE_NONE; } sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); } @@ -416,31 +416,34 @@ prepare_palette(sixel_dither_t *former_dither, static int -do_resize(sixel_frame_t *frame, sixel_encode_settings_t *psettings) +do_resize( + sixel_frame_t *frame, + sixel_encoder_t *encoder +) { int nret; - if (psettings->percentwidth > 0) { - psettings->pixelwidth = sixel_frame_get_width(frame) * psettings->percentwidth / 100; + if (encoder->percentwidth > 0) { + encoder->pixelwidth = sixel_frame_get_width(frame) * encoder->percentwidth / 100; } - if (psettings->percentheight > 0) { - psettings->pixelheight = sixel_frame_get_height(frame) * psettings->percentheight / 100; + if (encoder->percentheight > 0) { + encoder->pixelheight = sixel_frame_get_height(frame) * encoder->percentheight / 100; } - if (psettings->pixelwidth > 0 && psettings->pixelheight <= 0) { - psettings->pixelheight - = sixel_frame_get_height(frame) * psettings->pixelwidth / sixel_frame_get_width(frame); + if (encoder->pixelwidth > 0 && encoder->pixelheight <= 0) { + encoder->pixelheight + = sixel_frame_get_height(frame) * encoder->pixelwidth / sixel_frame_get_width(frame); } - if (psettings->pixelheight > 0 && psettings->pixelwidth <= 0) { - psettings->pixelwidth - = sixel_frame_get_width(frame) * psettings->pixelheight / sixel_frame_get_height(frame); + if (encoder->pixelheight > 0 && encoder->pixelwidth <= 0) { + encoder->pixelwidth + = sixel_frame_get_width(frame) * encoder->pixelheight / sixel_frame_get_height(frame); } - if (psettings->pixelwidth > 0 && psettings->pixelheight > 0) { + if (encoder->pixelwidth > 0 && encoder->pixelheight > 0) { nret = sixel_frame_resize(frame, - psettings->pixelwidth, - psettings->pixelheight, - psettings->method_for_resampling); + encoder->pixelwidth, + encoder->pixelheight, + encoder->method_for_resampling); if (nret != 0) { return nret; } @@ -451,7 +454,10 @@ do_resize(sixel_frame_t *frame, sixel_encode_settings_t *psettings) static int -do_crop(sixel_frame_t *frame, sixel_encode_settings_t *psettings) +do_crop( + sixel_frame_t *frame, + sixel_encoder_t *encoder +) { int ret; int width; @@ -461,26 +467,26 @@ do_crop(sixel_frame_t *frame, sixel_encode_settings_t *psettings) height = sixel_frame_get_height(frame); /* clipping */ - if (psettings->clipwidth + psettings->clipx > width) { - if (psettings->clipx > width) { - psettings->clipwidth = 0; + if (encoder->clipwidth + encoder->clipx > width) { + if (encoder->clipx > width) { + encoder->clipwidth = 0; } else { - psettings->clipwidth = width - psettings->clipx; + encoder->clipwidth = width - encoder->clipx; } } - if (psettings->clipheight + psettings->clipy > height) { - if (psettings->clipy > height) { - psettings->clipheight = 0; + if (encoder->clipheight + encoder->clipy > height) { + if (encoder->clipy > height) { + encoder->clipheight = 0; } else { - psettings->clipheight = height - psettings->clipy; + encoder->clipheight = height - encoder->clipy; } } - if (psettings->clipwidth > 0 && psettings->clipheight > 0) { + if (encoder->clipwidth > 0 && encoder->clipheight > 0) { ret = sixel_frame_clip(frame, - psettings->clipx, - psettings->clipy, - psettings->clipwidth, - psettings->clipheight); + encoder->clipx, + encoder->clipy, + encoder->clipwidth, + encoder->clipheight); if (ret != 0) { return ret; } @@ -539,7 +545,7 @@ output_sixel_without_macro( int delay, sixel_dither_t *dither, sixel_output_t *context, - sixel_encode_settings_t *psettings, + sixel_encoder_t *encoder, int const *cancel_flag ) { @@ -553,8 +559,8 @@ output_sixel_without_macro( clock_t start; # endif #endif - if (!psettings->mapfile && !psettings->monochrome - && !psettings->highcolor && !psettings->builtin_palette) { + if (!encoder->mapfile && !encoder->monochrome + && !encoder->highcolor && !encoder->builtin_palette) { sixel_dither_set_optimize_palette(dither, 1); } @@ -573,7 +579,7 @@ output_sixel_without_macro( #endif fflush(stdout); #if HAVE_USLEEP - if (!psettings->fignore_delay && delay > 0) { + if (!encoder->fignore_delay && delay > 0) { # if HAVE_CLOCK dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; lag = 0; @@ -615,7 +621,7 @@ output_sixel_with_macro( int loop_count, sixel_dither_t *dither, sixel_output_t *context, - sixel_encode_settings_t *psettings + sixel_encoder_t *encoder ) { int nret = 0; @@ -631,8 +637,8 @@ output_sixel_with_macro( start = clock(); #endif if (loop_count == 0) { - if (psettings->macro_number >= 0) { - printf("\033P%d;0;1!z", psettings->macro_number); + if (encoder->macro_number >= 0) { + printf("\033P%d;0;1!z", encoder->macro_number); } else { printf("\033P%d;0;1!z", frame_no); } @@ -644,11 +650,11 @@ output_sixel_with_macro( printf("\033\\"); } - if (psettings->macro_number < 0) { + if (encoder->macro_number < 0) { fflush(stdout); printf("\033[%d*z", frame_no); #if HAVE_USLEEP - if (delay > 0 && !psettings->fignore_delay) { + if (delay > 0 && !encoder->fignore_delay) { # if HAVE_CLOCK dulation = (clock() - start) * 1000 * 1000 / CLOCKS_PER_SEC - lag; lag = 0; @@ -670,7 +676,7 @@ output_sixel_with_macro( typedef struct sixel_callback_context { - sixel_encode_settings_t *settings; + sixel_encoder_t *encoder; int const *cancel_flag; } sixel_callback_context_t; @@ -739,43 +745,43 @@ static int load_image_callback(sixel_frame_t *frame, void *data) { int nret = SIXEL_FAILED; - sixel_encode_settings_t *psettings; + sixel_encoder_t *encoder; sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; sixel_callback_context_t *callback_context; callback_context = (sixel_callback_context_t *)data; - psettings = callback_context->settings; + encoder = callback_context->encoder; /* evaluate -w, -h, and -c option: crop/scale input source */ - if (psettings->clipfirst) { + if (encoder->clipfirst) { /* clipping */ - nret = do_crop(frame, psettings); + nret = do_crop(frame, encoder); if (nret != 0) { goto end; } /* scaling */ - nret = do_resize(frame, psettings); + nret = do_resize(frame, encoder); if (nret != SIXEL_SUCCESS) { goto end; } } else { /* scaling */ - nret = do_resize(frame, psettings); + nret = do_resize(frame, encoder); if (nret != 0) { goto end; } /* clipping */ - nret = do_crop(frame, psettings); + nret = do_crop(frame, encoder); if (nret != 0) { goto end; } } /* prepare dither context */ - dither = prepare_palette(dither, frame, psettings, + dither = prepare_palette(dither, frame, encoder, callback_context->cancel_flag); if (!dither) { nret = (-1); @@ -783,36 +789,36 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* evaluate -v option: print palette */ - if (psettings->verbose) { + if (encoder->verbose) { if (!(sixel_frame_get_pixelformat(frame) & FORMATTYPE_GRAYSCALE)) { print_palette(dither); } } /* evaluate -d option: set method for diffusion */ - sixel_dither_set_diffusion_type(dither, psettings->method_for_diffuse); + sixel_dither_set_diffusion_type(dither, encoder->method_for_diffuse); /* evaluate -C option: set complexion score */ - if (psettings->complexion > 1) { - sixel_dither_set_complexion_score(dither, psettings->complexion); + if (encoder->complexion > 1) { + sixel_dither_set_complexion_score(dither, encoder->complexion); } /* create output context */ - if (psettings->fuse_macro || psettings->macro_number >= 0) { + if (encoder->fuse_macro || encoder->macro_number >= 0) { /* -u or -n option */ output = sixel_output_create(sixel_hex_write_callback, - &psettings->outfd); + &encoder->outfd); } else { output = sixel_output_create(sixel_write_callback, - &psettings->outfd); + &encoder->outfd); } - sixel_output_set_8bit_availability(output, psettings->f8bit); - sixel_output_set_palette_type(output, psettings->palette_type); + sixel_output_set_8bit_availability(output, encoder->f8bit); + sixel_output_set_palette_type(output, encoder->palette_type); sixel_output_set_penetrate_multiplexer( - output, psettings->penetrate_multiplexer); - sixel_output_set_encode_policy(output, psettings->encode_policy); + output, encoder->penetrate_multiplexer); + sixel_output_set_encode_policy(output, encoder->encode_policy); - if (sixel_frame_get_multiframe(frame) && !psettings->fstatic) { + if (sixel_frame_get_multiframe(frame) && !encoder->fstatic) { scroll_on_demand(frame); } @@ -822,7 +828,7 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* output sixel: junction of multi-frame processing strategy */ - if (psettings->fuse_macro) { /* -u option */ + if (encoder->fuse_macro) { /* -u option */ /* use macro */ nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), sixel_frame_get_width(frame), @@ -832,8 +838,8 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_frame_get_loop_no(frame), dither, output, - psettings); - } else if (psettings->macro_number >= 0) { /* -n option */ + encoder); + } else if (encoder->macro_number >= 0) { /* -n option */ /* use macro */ nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), sixel_frame_get_width(frame), @@ -843,7 +849,7 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_frame_get_loop_no(frame), dither, output, - psettings); + encoder); } else { /* do not use macro */ nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), @@ -853,7 +859,7 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_frame_get_delay(frame), dither, output, - psettings, + encoder, callback_context->cancel_flag); } @@ -882,68 +888,68 @@ load_image_callback(sixel_frame_t *frame, void *data) int -sixel_easy_encode( - char const /* in */ *filename, - sixel_encode_settings_t /* in */ *psettings, - int const /* in */ *cancel_flag) +sixel_encoder_encode( + sixel_encoder_t /* in */ *encoder, + char const /* in */ *filename, + int const /* in */ *cancel_flag) { int nret = (-1); int fuse_palette = 1; int loop_control; sixel_callback_context_t callback_context; - if (psettings == NULL) { - psettings = sixel_encode_settings_create(); + if (encoder == NULL) { + encoder = sixel_encoder_create(); } else { - sixel_encode_settings_ref(psettings); + sixel_encoder_ref(encoder); } - loop_control = psettings->loop_mode; + loop_control = encoder->loop_mode; - if (psettings->reqcolors == (-1)) { - psettings->reqcolors = SIXEL_PALETTE_MAX; + if (encoder->reqcolors == (-1)) { + encoder->reqcolors = SIXEL_PALETTE_MAX; } - if (psettings->reqcolors < 2) { - psettings->reqcolors = 2; + if (encoder->reqcolors < 2) { + encoder->reqcolors = 2; } - if (psettings->palette_type == PALETTETYPE_AUTO) { - psettings->palette_type = PALETTETYPE_RGB; + if (encoder->palette_type == PALETTETYPE_AUTO) { + encoder->palette_type = PALETTETYPE_RGB; } - if (psettings->mapfile) { + if (encoder->mapfile) { fuse_palette = 0; } - if (psettings->monochrome > 0) { + if (encoder->monochrome > 0) { fuse_palette = 0; } - if (psettings->highcolor > 0) { + if (encoder->highcolor > 0) { fuse_palette = 0; } - if (psettings->builtin_palette > 0) { + if (encoder->builtin_palette > 0) { fuse_palette = 0; } - if (psettings->percentwidth > 0 || - psettings->percentheight > 0 || - psettings->pixelwidth > 0 || - psettings->pixelheight > 0) { + if (encoder->percentwidth > 0 || + encoder->percentheight > 0 || + encoder->pixelwidth > 0 || + encoder->pixelheight > 0) { fuse_palette = 0; } reload: - callback_context.settings = psettings; + callback_context.encoder = encoder; callback_context.cancel_flag = cancel_flag; nret = sixel_helper_load_image_file(filename, - psettings->fstatic, + encoder->fstatic, fuse_palette, - psettings->reqcolors, - psettings->bgcolor, + encoder->reqcolors, + encoder->bgcolor, loop_control, load_image_callback, cancel_flag, @@ -953,7 +959,7 @@ sixel_easy_encode( goto end; } - if (psettings->pipe_mode) { + if (encoder->pipe_mode) { #if HAVE_CLEARERR clearerr(stdin); #endif /* HAVE_FSEEK */ @@ -972,17 +978,17 @@ sixel_easy_encode( } end: - sixel_encode_settings_unref(psettings); + sixel_encoder_unref(encoder); return nret; } int -sixel_easy_encode_setopt( - sixel_encode_settings_t /* in */ *psettings, - int /* in */ arg, - char /* in */ *optarg) +sixel_encoder_setopt( + sixel_encoder_t /* in */ *encoder, + int /* in */ arg, + char /* in */ *optarg) { int number; int parsed; @@ -995,44 +1001,44 @@ sixel_easy_encode_setopt( goto argerr; } if (strcmp(optarg, "-") != 0) { - if (psettings->outfd) { - close(psettings->outfd); + if (encoder->outfd) { + close(encoder->outfd); } - psettings->outfd = open(optarg, - O_RDWR|O_CREAT, - S_IREAD|S_IWRITE); + encoder->outfd = open(optarg, + O_RDWR|O_CREAT, + S_IREAD|S_IWRITE); } break; case '7': - psettings->f8bit = 0; + encoder->f8bit = 0; break; case '8': - psettings->f8bit = 1; + encoder->f8bit = 1; break; case 'p': - psettings->reqcolors = atoi(optarg); + encoder->reqcolors = atoi(optarg); break; case 'm': - if (psettings->mapfile) { - free(psettings->mapfile); + if (encoder->mapfile) { + free(encoder->mapfile); } - psettings->mapfile = arg_strdup(optarg); + encoder->mapfile = arg_strdup(optarg); break; case 'e': - psettings->monochrome = 1; + encoder->monochrome = 1; break; case 'I': - psettings->highcolor = 1; + encoder->highcolor = 1; break; case 'b': if (strcmp(optarg, "xterm16") == 0) { - psettings->builtin_palette = BUILTIN_XTERM16; + encoder->builtin_palette = BUILTIN_XTERM16; } else if (strcmp(optarg, "xterm256") == 0) { - psettings->builtin_palette = BUILTIN_XTERM256; + encoder->builtin_palette = BUILTIN_XTERM256; } else if (strcmp(optarg, "vt340mono") == 0) { - psettings->builtin_palette = BUILTIN_VT340_MONO; + encoder->builtin_palette = BUILTIN_VT340_MONO; } else if (strcmp(optarg, "vt340color") == 0) { - psettings->builtin_palette = BUILTIN_VT340_COLOR; + encoder->builtin_palette = BUILTIN_VT340_COLOR; } else { fprintf(stderr, "Cannot parse builtin palette option.\n"); @@ -1042,19 +1048,19 @@ sixel_easy_encode_setopt( case 'd': /* parse --diffusion option */ if (strcmp(optarg, "auto") == 0) { - psettings->method_for_diffuse = DIFFUSE_AUTO; + encoder->method_for_diffuse = DIFFUSE_AUTO; } else if (strcmp(optarg, "none") == 0) { - psettings->method_for_diffuse = DIFFUSE_NONE; + encoder->method_for_diffuse = DIFFUSE_NONE; } else if (strcmp(optarg, "fs") == 0) { - psettings->method_for_diffuse = DIFFUSE_FS; + encoder->method_for_diffuse = DIFFUSE_FS; } else if (strcmp(optarg, "atkinson") == 0) { - psettings->method_for_diffuse = DIFFUSE_ATKINSON; + encoder->method_for_diffuse = DIFFUSE_ATKINSON; } else if (strcmp(optarg, "jajuni") == 0) { - psettings->method_for_diffuse = DIFFUSE_JAJUNI; + encoder->method_for_diffuse = DIFFUSE_JAJUNI; } else if (strcmp(optarg, "stucki") == 0) { - psettings->method_for_diffuse = DIFFUSE_STUCKI; + encoder->method_for_diffuse = DIFFUSE_STUCKI; } else if (strcmp(optarg, "burkes") == 0) { - psettings->method_for_diffuse = DIFFUSE_BURKES; + encoder->method_for_diffuse = DIFFUSE_BURKES; } else { fprintf(stderr, "Diffusion method '%s' is not supported.\n", @@ -1066,11 +1072,11 @@ sixel_easy_encode_setopt( /* parse --find-largest option */ if (optarg) { if (strcmp(optarg, "auto") == 0) { - psettings->method_for_largest = LARGE_AUTO; + encoder->method_for_largest = LARGE_AUTO; } else if (strcmp(optarg, "norm") == 0) { - psettings->method_for_largest = LARGE_NORM; + encoder->method_for_largest = LARGE_NORM; } else if (strcmp(optarg, "lum") == 0) { - psettings->method_for_largest = LARGE_LUM; + encoder->method_for_largest = LARGE_LUM; } else { fprintf(stderr, "Finding method '%s' is not supported.\n", @@ -1082,14 +1088,14 @@ sixel_easy_encode_setopt( case 's': /* parse --select-color option */ if (strcmp(optarg, "auto") == 0) { - psettings->method_for_rep = REP_AUTO; + encoder->method_for_rep = REP_AUTO; } else if (strcmp(optarg, "center") == 0) { - psettings->method_for_rep = REP_CENTER_BOX; + encoder->method_for_rep = REP_CENTER_BOX; } else if (strcmp(optarg, "average") == 0) { - psettings->method_for_rep = REP_AVERAGE_COLORS; + encoder->method_for_rep = REP_AVERAGE_COLORS; } else if ((strcmp(optarg, "histogram") == 0) || (strcmp(optarg, "histgram") == 0)) { - psettings->method_for_rep = REP_AVERAGE_PIXELS; + encoder->method_for_rep = REP_AVERAGE_PIXELS; } else { fprintf(stderr, "Finding method '%s' is not supported.\n", @@ -1099,81 +1105,81 @@ sixel_easy_encode_setopt( break; case 'c': number = sscanf(optarg, "%dx%d+%d+%d", - &psettings->clipwidth, &psettings->clipheight, - &psettings->clipx, &psettings->clipy); + &encoder->clipwidth, &encoder->clipheight, + &encoder->clipx, &encoder->clipy); if (number != 4) { goto argerr; } - if (psettings->clipwidth <= 0 || psettings->clipheight <= 0) { + if (encoder->clipwidth <= 0 || encoder->clipheight <= 0) { goto argerr; } - if (psettings->clipx < 0 || psettings->clipy < 0) { + if (encoder->clipx < 0 || encoder->clipy < 0) { goto argerr; } - psettings->clipfirst = 0; + encoder->clipfirst = 0; break; case 'w': parsed = sscanf(optarg, "%d%2s", &number, unit); if (parsed == 2 && strcmp(unit, "%") == 0) { - psettings->pixelwidth = (-1); - psettings->percentwidth = number; + encoder->pixelwidth = (-1); + encoder->percentwidth = number; } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { - psettings->pixelwidth = number; - psettings->percentwidth = (-1); + encoder->pixelwidth = number; + encoder->percentwidth = (-1); } else if (strcmp(optarg, "auto") == 0) { - psettings->pixelwidth = (-1); - psettings->percentwidth = (-1); + encoder->pixelwidth = (-1); + encoder->percentwidth = (-1); } else { fprintf(stderr, "Cannot parse -w/--width option.\n"); goto argerr; } - if (psettings->clipwidth) { - psettings->clipfirst = 1; + if (encoder->clipwidth) { + encoder->clipfirst = 1; } break; case 'h': parsed = sscanf(optarg, "%d%2s", &number, unit); if (parsed == 2 && strcmp(unit, "%") == 0) { - psettings->pixelheight = (-1); - psettings->percentheight = number; + encoder->pixelheight = (-1); + encoder->percentheight = number; } else if (parsed == 1 || (parsed == 2 && strcmp(unit, "px") == 0)) { - psettings->pixelheight = number; - psettings->percentheight = (-1); + encoder->pixelheight = number; + encoder->percentheight = (-1); } else if (strcmp(optarg, "auto") == 0) { - psettings->pixelheight = (-1); - psettings->percentheight = (-1); + encoder->pixelheight = (-1); + encoder->percentheight = (-1); } else { fprintf(stderr, "Cannot parse -h/--height option.\n"); goto argerr; } - if (psettings->clipheight) { - psettings->clipfirst = 1; + if (encoder->clipheight) { + encoder->clipfirst = 1; } break; case 'r': /* parse --resampling option */ if (strcmp(optarg, "nearest") == 0) { - psettings->method_for_resampling = RES_NEAREST; + encoder->method_for_resampling = RES_NEAREST; } else if (strcmp(optarg, "gaussian") == 0) { - psettings->method_for_resampling = RES_GAUSSIAN; + encoder->method_for_resampling = RES_GAUSSIAN; } else if (strcmp(optarg, "hanning") == 0) { - psettings->method_for_resampling = RES_HANNING; + encoder->method_for_resampling = RES_HANNING; } else if (strcmp(optarg, "hamming") == 0) { - psettings->method_for_resampling = RES_HAMMING; + encoder->method_for_resampling = RES_HAMMING; } else if (strcmp(optarg, "bilinear") == 0) { - psettings->method_for_resampling = RES_BILINEAR; + encoder->method_for_resampling = RES_BILINEAR; } else if (strcmp(optarg, "welsh") == 0) { - psettings->method_for_resampling = RES_WELSH; + encoder->method_for_resampling = RES_WELSH; } else if (strcmp(optarg, "bicubic") == 0) { - psettings->method_for_resampling = RES_BICUBIC; + encoder->method_for_resampling = RES_BICUBIC; } else if (strcmp(optarg, "lanczos2") == 0) { - psettings->method_for_resampling = RES_LANCZOS2; + encoder->method_for_resampling = RES_LANCZOS2; } else if (strcmp(optarg, "lanczos3") == 0) { - psettings->method_for_resampling = RES_LANCZOS3; + encoder->method_for_resampling = RES_LANCZOS3; } else if (strcmp(optarg, "lanczos4") == 0) { - psettings->method_for_resampling = RES_LANCZOS4; + encoder->method_for_resampling = RES_LANCZOS4; } else { fprintf(stderr, "Resampling method '%s' is not supported.\n", @@ -1184,13 +1190,13 @@ sixel_easy_encode_setopt( case 'q': /* parse --quality option */ if (strcmp(optarg, "auto") == 0) { - psettings->quality_mode = QUALITY_AUTO; + encoder->quality_mode = QUALITY_AUTO; } else if (strcmp(optarg, "high") == 0) { - psettings->quality_mode = QUALITY_HIGH; + encoder->quality_mode = QUALITY_HIGH; } else if (strcmp(optarg, "low") == 0) { - psettings->quality_mode = QUALITY_LOW; + encoder->quality_mode = QUALITY_LOW; } else if (strcmp(optarg, "full") == 0) { - psettings->quality_mode = QUALITY_FULL; + encoder->quality_mode = QUALITY_FULL; } else { fprintf(stderr, "Cannot parse quality option.\n"); @@ -1200,11 +1206,11 @@ sixel_easy_encode_setopt( case 'l': /* parse --loop-control option */ if (strcmp(optarg, "auto") == 0) { - psettings->loop_mode = LOOP_AUTO; + encoder->loop_mode = LOOP_AUTO; } else if (strcmp(optarg, "force") == 0) { - psettings->loop_mode = LOOP_FORCE; + encoder->loop_mode = LOOP_FORCE; } else if (strcmp(optarg, "disable") == 0) { - psettings->loop_mode = LOOP_DISABLE; + encoder->loop_mode = LOOP_DISABLE; } else { fprintf(stderr, "Cannot parse loop-control option.\n"); @@ -1214,11 +1220,11 @@ sixel_easy_encode_setopt( case 't': /* parse --palette-type option */ if (strcmp(optarg, "auto") == 0) { - psettings->palette_type = PALETTETYPE_AUTO; + encoder->palette_type = PALETTETYPE_AUTO; } else if (strcmp(optarg, "hls") == 0) { - psettings->palette_type = PALETTETYPE_HLS; + encoder->palette_type = PALETTETYPE_HLS; } else if (strcmp(optarg, "rgb") == 0) { - psettings->palette_type = PALETTETYPE_RGB; + encoder->palette_type = PALETTETYPE_RGB; } else { fprintf(stderr, "Cannot parse palette type option.\n"); @@ -1227,11 +1233,11 @@ sixel_easy_encode_setopt( break; case 'B': /* parse --bgcolor option */ - if (psettings->bgcolor) { - free(psettings->bgcolor); + if (encoder->bgcolor) { + free(encoder->bgcolor); } - if (parse_x_colorspec(optarg, &psettings->bgcolor) == 0) { - psettings->palette_type = PALETTETYPE_AUTO; + if (parse_x_colorspec(optarg, &encoder->bgcolor) == 0) { + encoder->palette_type = PALETTETYPE_AUTO; } else { fprintf(stderr, "Cannot parse bgcolor option.\n"); @@ -1239,36 +1245,36 @@ sixel_easy_encode_setopt( } break; case 'i': - psettings->finvert = 1; + encoder->finvert = 1; break; case 'u': - psettings->fuse_macro = 1; + encoder->fuse_macro = 1; break; case 'n': - psettings->macro_number = atoi(optarg); - if (psettings->macro_number < 0) { + encoder->macro_number = atoi(optarg); + if (encoder->macro_number < 0) { goto argerr; } break; case 'g': - psettings->fignore_delay = 1; + encoder->fignore_delay = 1; break; case 'v': - psettings->verbose = 1; + encoder->verbose = 1; break; case 'S': - psettings->fstatic = 1; + encoder->fstatic = 1; break; case 'P': - psettings->penetrate_multiplexer = 1; + encoder->penetrate_multiplexer = 1; break; case 'E': if (strcmp(optarg, "auto") == 0) { - psettings->encode_policy = ENCODEPOLICY_AUTO; + encoder->encode_policy = ENCODEPOLICY_AUTO; } else if (strcmp(optarg, "fast") == 0) { - psettings->encode_policy = ENCODEPOLICY_FAST; + encoder->encode_policy = ENCODEPOLICY_FAST; } else if (strcmp(optarg, "size") == 0) { - psettings->encode_policy = ENCODEPOLICY_SIZE; + encoder->encode_policy = ENCODEPOLICY_SIZE; } else { fprintf(stderr, "Cannot parse encode policy option.\n"); @@ -1276,21 +1282,15 @@ sixel_easy_encode_setopt( } break; case 'C': - psettings->complexion = atoi(optarg); - if (psettings->complexion < 1) { + encoder->complexion = atoi(optarg); + if (encoder->complexion < 1) { fprintf(stderr, "complexion parameter must be 1 or more.\n"); goto argerr; } break; case 'D': - psettings->pipe_mode = 1; - break; - case 'V': - psettings->show_version = 1; - break; - case 'H': - psettings->show_help = 1; + encoder->pipe_mode = 1; break; case '?': /* unknown option */ default: @@ -1301,57 +1301,57 @@ sixel_easy_encode_setopt( } /* detects arguments conflictions */ - if (psettings->reqcolors != -1 && psettings->mapfile) { + if (encoder->reqcolors != -1 && encoder->mapfile) { fprintf(stderr, "option -p, --colors conflicts " "with -m, --mapfile.\n"); goto argerr; } - if (psettings->mapfile && psettings->monochrome) { + if (encoder->mapfile && encoder->monochrome) { fprintf(stderr, "option -m, --mapfile conflicts " "with -e, --monochrome.\n"); goto argerr; } - if (psettings->monochrome && psettings->reqcolors != (-1)) { + if (encoder->monochrome && encoder->reqcolors != (-1)) { fprintf(stderr, "option -e, --monochrome conflicts" " with -p, --colors.\n"); goto argerr; } - if (psettings->monochrome && psettings->highcolor) { + if (encoder->monochrome && encoder->highcolor) { fprintf(stderr, "option -e, --monochrome conflicts" " with -I, --high-color.\n"); goto argerr; } - if (psettings->reqcolors != (-1) && psettings->highcolor) { + if (encoder->reqcolors != (-1) && encoder->highcolor) { fprintf(stderr, "option -p, --colors conflicts" " with -I, --high-color.\n"); goto argerr; } - if (psettings->mapfile && psettings->highcolor) { + if (encoder->mapfile && encoder->highcolor) { fprintf(stderr, "option -m, --mapfile conflicts" " with -I, --high-color.\n"); goto argerr; } - if (psettings->builtin_palette && psettings->highcolor) { + if (encoder->builtin_palette && encoder->highcolor) { fprintf(stderr, "option -b, --builtin-palette conflicts" " with -I, --high-color.\n"); goto argerr; } - if (psettings->monochrome && psettings->builtin_palette) { + if (encoder->monochrome && encoder->builtin_palette) { fprintf(stderr, "option -e, --monochrome conflicts" " with -b, --builtin-palette.\n"); goto argerr; } - if (psettings->mapfile && psettings->builtin_palette) { + if (encoder->mapfile && encoder->builtin_palette) { fprintf(stderr, "option -m, --mapfile conflicts" " with -b, --builtin-palette.\n"); goto argerr; } - if (psettings->reqcolors != (-1) && psettings->builtin_palette) { + if (encoder->reqcolors != (-1) && encoder->builtin_palette) { fprintf(stderr, "option -p, --colors conflicts" " with -b, --builtin-palette.\n"); goto argerr; } - if (psettings->f8bit && psettings->penetrate_multiplexer) { + if (encoder->f8bit && encoder->penetrate_multiplexer) { fprintf(stderr, "option -8 --8bit-mode conflicts" " with -P, --penetrate.\n"); goto argerr; @@ -1364,108 +1364,90 @@ sixel_easy_encode_setopt( } -/* create settings object */ -sixel_encode_settings_t * -sixel_encode_settings_create(void) +/* create encoder object */ +sixel_encoder_t * +sixel_encoder_create(void) { - sixel_encode_settings_t *settings; + sixel_encoder_t *encoder; - settings = malloc(sizeof(sixel_encode_settings_t)); - if (settings == NULL) { + encoder = malloc(sizeof(sixel_encoder_t)); + if (encoder == NULL) { return NULL; } - settings->ref = 1; - settings->reqcolors = (-1); - settings->mapfile = NULL; - settings->monochrome = 0; - settings->highcolor = 0; - settings->builtin_palette = 0; - settings->method_for_diffuse = DIFFUSE_AUTO; - settings->method_for_largest = LARGE_AUTO; - settings->method_for_rep = REP_AUTO; - settings->quality_mode = QUALITY_AUTO; - settings->method_for_resampling = RES_BILINEAR; - settings->loop_mode = LOOP_AUTO; - settings->palette_type = PALETTETYPE_AUTO; - settings->f8bit = 0; - settings->finvert = 0; - settings->fuse_macro = 0; - settings->fignore_delay = 0; - settings->complexion = 1; - settings->fstatic = 0; - settings->pixelwidth = -1; - settings->pixelheight = -1; - settings->percentwidth = -1; - settings->percentheight = -1; - settings->clipx = 0; - settings->clipy = 0; - settings->clipwidth = 0; - settings->clipheight = 0; - settings->clipfirst = 0; - settings->macro_number = -1; - settings->verbose = 0; - settings->penetrate_multiplexer = 0; - settings->encode_policy = ENCODEPOLICY_AUTO; - settings->pipe_mode = 0; - settings->show_version = 0; - settings->show_help = 0; - settings->bgcolor = NULL; - settings->outfd = STDOUT_FILENO; - - return settings; + encoder->ref = 1; + encoder->reqcolors = (-1); + encoder->mapfile = NULL; + encoder->monochrome = 0; + encoder->highcolor = 0; + encoder->builtin_palette = 0; + encoder->method_for_diffuse = DIFFUSE_AUTO; + encoder->method_for_largest = LARGE_AUTO; + encoder->method_for_rep = REP_AUTO; + encoder->quality_mode = QUALITY_AUTO; + encoder->method_for_resampling = RES_BILINEAR; + encoder->loop_mode = LOOP_AUTO; + encoder->palette_type = PALETTETYPE_AUTO; + encoder->f8bit = 0; + encoder->finvert = 0; + encoder->fuse_macro = 0; + encoder->fignore_delay = 0; + encoder->complexion = 1; + encoder->fstatic = 0; + encoder->pixelwidth = -1; + encoder->pixelheight = -1; + encoder->percentwidth = -1; + encoder->percentheight = -1; + encoder->clipx = 0; + encoder->clipy = 0; + encoder->clipwidth = 0; + encoder->clipheight = 0; + encoder->clipfirst = 0; + encoder->macro_number = -1; + encoder->verbose = 0; + encoder->penetrate_multiplexer = 0; + encoder->encode_policy = ENCODEPOLICY_AUTO; + encoder->pipe_mode = 0; + encoder->bgcolor = NULL; + encoder->outfd = STDOUT_FILENO; + + return encoder; } void -sixel_encode_settings_destroy(sixel_encode_settings_t *settings) +sixel_encoder_destroy(sixel_encoder_t *encoder) { - if (settings) { - free(settings->mapfile); - free(settings->bgcolor); - if (settings->outfd - && settings->outfd != STDOUT_FILENO - && settings->outfd != STDERR_FILENO) { - close(settings->outfd); + if (encoder) { + free(encoder->mapfile); + free(encoder->bgcolor); + if (encoder->outfd + && encoder->outfd != STDOUT_FILENO + && encoder->outfd != STDERR_FILENO) { + close(encoder->outfd); } - free(settings); + free(encoder); } } void -sixel_encode_settings_ref(sixel_encode_settings_t *settings) +sixel_encoder_ref(sixel_encoder_t *encoder) { /* TODO: be thread safe */ - ++settings->ref; + ++encoder->ref; } void -sixel_encode_settings_unref(sixel_encode_settings_t *settings) +sixel_encoder_unref(sixel_encoder_t *encoder) { /* TODO: be thread safe */ - if (settings != NULL && --settings->ref == 0) { - sixel_encode_settings_destroy(settings); + if (encoder != NULL && --encoder->ref == 0) { + sixel_encoder_destroy(encoder); } } - -/* get show_version flag */ -int -sixel_encode_settings_has_version(sixel_encode_settings_t *settings) -{ - return settings->show_version; -} - - -/* get show_help flag */ -int -sixel_encode_settings_has_help(sixel_encode_settings_t *settings) -{ - return settings->show_help; -} - /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/easy_encode.h b/src/easy_encode.h index b092b1c2..437361ce 100644 --- a/src/easy_encode.h +++ b/src/easy_encode.h @@ -22,8 +22,8 @@ #ifndef LIBSIXEL_EASY_ENCODE_H #define LIBSIXEL_EASY_ENCODE_H -/* encode settings object */ -typedef struct sixel_encode_settings { +/* encoder object */ +typedef struct sixel_encoder { unsigned int ref; /* reference counter */ int reqcolors; char *mapfile; @@ -57,11 +57,9 @@ typedef struct sixel_encode_settings { int encode_policy; int pipe_mode; int verbose; - int show_version; - int show_help; unsigned char *bgcolor; int outfd; -} sixel_encode_settings_t; +} sixel_encoder_t; #endif /* LIBSIXEL_EASY_ENCODE_H */ From 017f89898e77a0b3ea7c0a263516a8c2f79a7d75 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 00:09:26 +0900 Subject: [PATCH 210/451] Use sixel_write_callback() instead of printf() to fix broken -n option --- include/sixel.h.in | 2 +- src/easy_encode.c | 43 +++++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 3bf11c50..9b48a097 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -27,7 +27,7 @@ #define LIBSIXEL_VRTSION @PACKAGE_VERSION@ #define LIBSIXEL_ABI_VRTSION @LS_LTVERSION@ -#define SIXEL_OUTPUT_PACKET_SIZE 1024 +#define SIXEL_OUTPUT_PACKET_SIZE 16384 #define SIXEL_PALETTE_MAX 256 /* output character size */ diff --git a/src/easy_encode.c b/src/easy_encode.c index dd025702..4dd0bdce 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -577,7 +577,6 @@ output_sixel_without_macro( #if HAVE_USLEEP && HAVE_CLOCK start = clock(); #endif - fflush(stdout); #if HAVE_USLEEP if (!encoder->fignore_delay && delay > 0) { # if HAVE_CLOCK @@ -626,6 +625,7 @@ output_sixel_with_macro( { int nret = 0; int dulation = 0; + char buffer[256]; #if HAVE_USLEEP int lag = 0; # if HAVE_CLOCK @@ -638,21 +638,22 @@ output_sixel_with_macro( #endif if (loop_count == 0) { if (encoder->macro_number >= 0) { - printf("\033P%d;0;1!z", encoder->macro_number); + sprintf(buffer, "\033P%d;0;1!z", encoder->macro_number); } else { - printf("\033P%d;0;1!z", frame_no); + sprintf(buffer, "\033P%d;0;1!z", frame_no); } + sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); nret = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); if (nret != 0) { goto end; } - printf("\033\\"); + sixel_write_callback("\033\\", 2, &encoder->outfd); } if (encoder->macro_number < 0) { - fflush(stdout); - printf("\033[%d*z", frame_no); + sprintf(buffer, "\033[%d*z", frame_no); + sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); #if HAVE_USLEEP if (delay > 0 && !encoder->fignore_delay) { # if HAVE_CLOCK @@ -682,7 +683,7 @@ typedef struct sixel_callback_context { static void -scroll_on_demand(sixel_frame_t *frame) +scroll_on_demand(sixel_encoder_t *encoder, sixel_frame_t *frame) { #if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY struct winsize size = {0, 0, 0, 0}; @@ -693,6 +694,7 @@ scroll_on_demand(sixel_frame_t *frame) int pixelheight; int cellheight; int scroll; + char buffer[256]; if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); @@ -707,8 +709,7 @@ scroll_on_demand(sixel_frame_t *frame) tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); /* request cursor position report */ - printf("\033[6n"); - fflush(stdout); + sixel_write_callback("\033[6n", 4, &encoder->outfd); if (wait_stdin(1000 * 1000) != (-1)) { /* wait 1 sec */ if (scanf("\033[%d;%dR", &row, &col) == 2) { tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); @@ -716,27 +717,28 @@ scroll_on_demand(sixel_frame_t *frame) cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; scroll = cellheight + row - size.ws_row + 1; if (scroll > 0) { - printf("\033[%dS\033[%dA", scroll, scroll); + sprintf(buffer, "\033[%dS\033[%dA", scroll, scroll); + sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); } - printf("\0337"); + sixel_write_callback("\0337", 2, &encoder->outfd); } else { - printf("\033[H"); + sixel_write_callback("\033[H", 3, &encoder->outfd); } } else { - printf("\033[H"); + sixel_write_callback("\033[H", 3, &encoder->outfd); } } else { - printf("\0338"); + sixel_write_callback("\0338", 2, &encoder->outfd); } } else { - printf("\033[H"); + sixel_write_callback("\033[H", 3, &encoder->outfd); } } else { - printf("\033[H"); + sixel_write_callback("\033[H", 3, &encoder->outfd); } #else (void) frame; - printf("\033[H"); + sixel_write_callback("\033[H", 3, &encoder->outfd); #endif } @@ -819,7 +821,7 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_output_set_encode_policy(output, encoder->encode_policy); if (sixel_frame_get_multiframe(frame) && !encoder->fstatic) { - scroll_on_demand(frame); + scroll_on_demand(encoder, frame); } if (callback_context->cancel_flag && *callback_context->cancel_flag) { @@ -864,8 +866,7 @@ load_image_callback(sixel_frame_t *frame, void *data) } if (callback_context->cancel_flag && *callback_context->cancel_flag) { - printf("\x18\x1b\\"); - fflush(stdout); + sixel_write_callback("\x18\033\\", 3, &encoder->outfd); nret = SIXEL_INTERRUPTED; } @@ -873,8 +874,6 @@ load_image_callback(sixel_frame_t *frame, void *data) goto end; } - fflush(stdout); - end: if (output) { sixel_output_unref(output); From df9d1578afeb35aa24db07c2f8ded63313da5693 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 00:10:53 +0900 Subject: [PATCH 211/451] Wait input data with select() only if input file is a tty device --- converters/Makefile.am | 3 +-- converters/Makefile.in | 3 +-- converters/img2sixel.c | 2 ++ src/loader.c | 22 ++++++++++++---------- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 663c3211..d107dd76 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -214,9 +214,8 @@ endif cat ../images/snake.jpg > sixel.pipe; \ echo -n > sixel.pipe; \ sleep 1; \ + rm -f sixel.pipe; \ fi - rm -f sixel.pipe - sleep 1 grep ^\.B img2sixel.1 | cut -f2 -d " " | grep "^\\\\" | tr -d '\\' | tr -d , > options2.txt grep ' --' shell-completion/bash/img2sixel| grep -v "' "| sed 's/.* \(-.\) .*/\1/' > options3.txt grep '{-' shell-completion/zsh/_img2sixel|cut -f1 -d,|cut -f2 -d'{' > options4.txt diff --git a/converters/Makefile.in b/converters/Makefile.in index 254cf4ac..ed5c48e2 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1165,9 +1165,8 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ cat ../images/snake.jpg > sixel.pipe; \ @WANT_IMG2SIXEL_TRUE@ echo -n > sixel.pipe; \ @WANT_IMG2SIXEL_TRUE@ sleep 1; \ +@WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe; \ @WANT_IMG2SIXEL_TRUE@ fi -@WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe -@WANT_IMG2SIXEL_TRUE@ sleep 1 @WANT_IMG2SIXEL_TRUE@ grep ^\.B img2sixel.1 | cut -f2 -d " " | grep "^\\\\" | tr -d '\\' | tr -d , > options2.txt @WANT_IMG2SIXEL_TRUE@ grep ' --' shell-completion/bash/img2sixel| grep -v "' "| sed 's/.* \(-.\) .*/\1/' > options3.txt @WANT_IMG2SIXEL_TRUE@ grep '{-' shell-completion/zsh/_img2sixel|cut -f1 -d,|cut -f2 -d'{' > options4.txt diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e06eec86..7c6061c2 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -371,6 +371,8 @@ main(int argc, char *argv[]) # if HAVE_DECL_SIGHUP signal(SIGHUP, signal_handler); # endif +#else + (void) signal_handler; #endif if (optind == argc) { diff --git a/src/loader.c b/src/loader.c index 626cf665..dce10629 100644 --- a/src/loader.c +++ b/src/loader.c @@ -260,16 +260,18 @@ get_chunk_from_file( } } - for (;;) { - if (*cancel_flag) { - return (-1); - } - ret = wait_file(fileno(f), 10000); - if (ret < 0) { - return ret; - } - if (ret == 0) { - break; + if (isatty(fileno(f))) { + for (;;) { + if (*cancel_flag) { + return (-1); + } + ret = wait_file(fileno(f), 10000); + if (ret < 0) { + return ret; + } + if (ret == 0) { + break; + } } } n = fread(pchunk->buffer + pchunk->size, 1, 4096, f); From 0d2e7afa92b3fd426a8161f7cc104d2d59384770 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 01:31:02 +0900 Subject: [PATCH 212/451] Add new API sixel_encoder_set_cancel_flag() --- converters/img2sixel.c | 22 ++++++++++++++-------- include/sixel.h.in | 9 +++++++-- src/easy_encode.c | 21 +++++++++++++++------ src/easy_encode.h | 1 + 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e06eec86..db0e3203 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -372,16 +372,21 @@ main(int argc, char *argv[]) signal(SIGHUP, signal_handler); # endif #endif + ret = sixel_encoder_set_cancel_flag(encoder, &signaled); + if (ret != 0) { + exit_code = EXIT_FAILURE; + goto end; + } if (optind == argc) { - ret = sixel_encoder_encode(encoder, NULL, &signaled); + ret = sixel_encoder_encode(encoder, NULL); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; } } else { for (n = optind; n < argc; n++) { - ret = sixel_encoder_encode(encoder, argv[n], &signaled); + ret = sixel_encoder_encode(encoder, argv[n]); if (ret != 0) { exit_code = EXIT_FAILURE; goto end; @@ -395,12 +400,13 @@ main(int argc, char *argv[]) argerr: exit_code = EXIT_FAILURE; - fprintf(stderr, "usage: img2sixel [-78eIiugvSPDVH] [-p colors] [-m file] [-d diffusiontype]\n" - " [-f findtype] [-s selecttype] [-c geometory] [-w width]\n" - " [-h height] [-r resamplingtype] [-q quality] [-l loopmode]\n" - " [-t palettetype] [-n macronumber] [-C score] [-b palette]\n" - " [-E encodepolicy] [-B bgcolor] [-o outfile] [filename ...]\n" - "for more details, type: 'img2sixel -H'.\n"); + fprintf(stderr, + "usage: img2sixel [-78eIiugvSPDVH] [-p colors] [-m file] [-d diffusiontype]\n" + " [-f findtype] [-s selecttype] [-c geometory] [-w width]\n" + " [-h height] [-r resamplingtype] [-q quality] [-l loopmode]\n" + " [-t palettetype] [-n macronumber] [-C score] [-b palette]\n" + " [-E encodepolicy] [-B bgcolor] [-o outfile] [filename ...]\n" + "for more details, type: 'img2sixel -H'.\n"); end: sixel_encoder_unref(encoder); diff --git a/include/sixel.h.in b/include/sixel.h.in index 3bf11c50..11220b1a 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -586,6 +586,12 @@ sixel_encoder_ref(sixel_encoder_t *encoder); void sixel_encoder_unref(sixel_encoder_t *encoder); +int +sixel_encoder_set_cancel_flag( + sixel_encoder_t /* in */ *encoder, + int /* in */ *cancel_flag +); + int sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, @@ -595,8 +601,7 @@ sixel_encoder_setopt( int sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, - char const /* in */ *filename, - int const /* in */ *cancel_flag); + char const /* in */ *filename); #ifdef __cplusplus } diff --git a/src/easy_encode.c b/src/easy_encode.c index dd025702..2ea5205e 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -890,8 +890,7 @@ load_image_callback(sixel_frame_t *frame, void *data) int sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, - char const /* in */ *filename, - int const /* in */ *cancel_flag) + char const /* in */ *filename) { int nret = (-1); int fuse_palette = 1; @@ -943,7 +942,6 @@ sixel_encoder_encode( reload: callback_context.encoder = encoder; - callback_context.cancel_flag = cancel_flag; nret = sixel_helper_load_image_file(filename, encoder->fstatic, @@ -952,7 +950,7 @@ sixel_encoder_encode( encoder->bgcolor, loop_control, load_image_callback, - cancel_flag, + encoder->cancel_flag, &callback_context); if (nret != 0) { @@ -963,7 +961,7 @@ sixel_encoder_encode( #if HAVE_CLEARERR clearerr(stdin); #endif /* HAVE_FSEEK */ - while (cancel_flag && !*cancel_flag) { + while (encoder->cancel_flag && !*encoder->cancel_flag) { nret = wait_stdin(1000000); if (nret == (-1)) { goto end; @@ -972,7 +970,7 @@ sixel_encoder_encode( break; } } - if (cancel_flag && !*cancel_flag) { + if (!encoder->cancel_flag || !*encoder->cancel_flag) { goto reload; } } @@ -1410,6 +1408,7 @@ sixel_encoder_create(void) encoder->pipe_mode = 0; encoder->bgcolor = NULL; encoder->outfd = STDOUT_FILENO; + encoder->cancel_flag = NULL; return encoder; } @@ -1448,6 +1447,16 @@ sixel_encoder_unref(sixel_encoder_t *encoder) } } +int +sixel_encoder_set_cancel_flag( + sixel_encoder_t /* in */ *encoder, + int /* in */ *cancel_flag +) +{ + encoder->cancel_flag = cancel_flag; + return 0; +} + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/easy_encode.h b/src/easy_encode.h index 437361ce..72c5d59f 100644 --- a/src/easy_encode.h +++ b/src/easy_encode.h @@ -59,6 +59,7 @@ typedef struct sixel_encoder { int verbose; unsigned char *bgcolor; int outfd; + int *cancel_flag; } sixel_encoder_t; #endif /* LIBSIXEL_EASY_ENCODE_H */ From 4375904d972a75048da7390435f6cb17c1aab703 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 01:49:10 +0900 Subject: [PATCH 213/451] Add const qualifier to some arguments of sixel_{en,de}coder_setopt() --- include/sixel.h.in | 4 ++-- src/easy_decode.c | 2 +- src/easy_encode.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 11220b1a..72831723 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -596,7 +596,7 @@ int sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, - char /* in */ *optarg); + char const /* in */ *optarg); int sixel_encoder_encode( @@ -635,7 +635,7 @@ int sixel_decoder_setopt( sixel_decoder_t /* in */ *decoder, int /* in */ arg, - char /* in */ *optarg); + char const /* in */ *optarg); int sixel_decoder_decode( diff --git a/src/easy_decode.c b/src/easy_decode.c index 368a31be..aa000b36 100644 --- a/src/easy_decode.c +++ b/src/easy_decode.c @@ -166,7 +166,7 @@ int sixel_decoder_setopt( sixel_decoder_t /* in */ *decoder, int /* in */ arg, - char /* in */ *optarg + char const /* in */ *optarg ) { switch(arg) { diff --git a/src/easy_encode.c b/src/easy_encode.c index 2ea5205e..115b5fcb 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -986,7 +986,7 @@ int sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, - char /* in */ *optarg) + char const /* in */ *optarg) { int number; int parsed; From 334cc61471fd464f0ac5a90d8d2401b97111f6a1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 12:24:09 +0900 Subject: [PATCH 214/451] Drop sixel_callback_context_t --- src/easy_encode.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/src/easy_encode.c b/src/easy_encode.c index 115b5fcb..556be141 100644 --- a/src/easy_encode.c +++ b/src/easy_encode.c @@ -545,8 +545,7 @@ output_sixel_without_macro( int delay, sixel_dither_t *dither, sixel_output_t *context, - sixel_encoder_t *encoder, - int const *cancel_flag + sixel_encoder_t *encoder ) { int nret = 0; @@ -596,7 +595,7 @@ output_sixel_without_macro( memcpy(p, buffer, width * height * depth); - if (cancel_flag && *cancel_flag) { + if (encoder->cancel_flag && *encoder->cancel_flag) { goto end; } @@ -675,12 +674,6 @@ output_sixel_with_macro( } -typedef struct sixel_callback_context { - sixel_encoder_t *encoder; - int const *cancel_flag; -} sixel_callback_context_t; - - static void scroll_on_demand(sixel_frame_t *frame) { @@ -748,10 +741,8 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_encoder_t *encoder; sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; - sixel_callback_context_t *callback_context; - callback_context = (sixel_callback_context_t *)data; - encoder = callback_context->encoder; + encoder = (sixel_encoder_t *)data; /* evaluate -w, -h, and -c option: crop/scale input source */ if (encoder->clipfirst) { @@ -782,7 +773,7 @@ load_image_callback(sixel_frame_t *frame, void *data) /* prepare dither context */ dither = prepare_palette(dither, frame, encoder, - callback_context->cancel_flag); + encoder->cancel_flag); if (!dither) { nret = (-1); goto end; @@ -822,7 +813,7 @@ load_image_callback(sixel_frame_t *frame, void *data) scroll_on_demand(frame); } - if (callback_context->cancel_flag && *callback_context->cancel_flag) { + if (encoder->cancel_flag && *encoder->cancel_flag) { nret = SIXEL_INTERRUPTED; goto end; } @@ -859,11 +850,10 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_frame_get_delay(frame), dither, output, - encoder, - callback_context->cancel_flag); + encoder); } - if (callback_context->cancel_flag && *callback_context->cancel_flag) { + if (encoder->cancel_flag && *encoder->cancel_flag) { printf("\x18\x1b\\"); fflush(stdout); nret = SIXEL_INTERRUPTED; @@ -895,7 +885,6 @@ sixel_encoder_encode( int nret = (-1); int fuse_palette = 1; int loop_control; - sixel_callback_context_t callback_context; if (encoder == NULL) { encoder = sixel_encoder_create(); @@ -941,8 +930,6 @@ sixel_encoder_encode( } reload: - callback_context.encoder = encoder; - nret = sixel_helper_load_image_file(filename, encoder->fstatic, fuse_palette, @@ -951,7 +938,7 @@ sixel_encoder_encode( loop_control, load_image_callback, encoder->cancel_flag, - &callback_context); + (void *)encoder); if (nret != 0) { goto end; From ae76b17801438d3e9d900b63aa722ff43b51496d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 12:38:47 +0900 Subject: [PATCH 215/451] Fix segmentation error when cancel_flag is not set --- src/loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loader.c b/src/loader.c index 626cf665..822af9f7 100644 --- a/src/loader.c +++ b/src/loader.c @@ -261,7 +261,7 @@ get_chunk_from_file( } for (;;) { - if (*cancel_flag) { + if (cancel_flag && *cancel_flag) { return (-1); } ret = wait_file(fileno(f), 10000); From 8d473af801c5e1121bfb293f69054e9f47c7528b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 12:44:43 +0900 Subject: [PATCH 216/451] Update php extension --- php/sixel/package.xml | 6 +- php/sixel/package2.xml | 6 +- php/sixel/php_sixel.h | 12 ++-- php/sixel/sixel.c | 56 +++++++++++-------- php/sixel/sixel.xml | 46 +++++++++------ ..._encode.phpt => SixelEncoder__encode.phpt} | 2 +- ..._setopt.phpt => SixelEncoder__setopt.phpt} | 2 +- 7 files changed, 75 insertions(+), 55 deletions(-) rename php/sixel/tests/{SixelEncoder__sixel_easy_encode.phpt => SixelEncoder__encode.phpt} (75%) rename php/sixel/tests/{SixelEncoder__sixel_easy_encode_setopt.phpt => SixelEncoder__setopt.phpt} (72%) diff --git a/php/sixel/package.xml b/php/sixel/package.xml index 82f9e3a8..cc33dd92 100644 --- a/php/sixel/package.xml +++ b/php/sixel/package.xml @@ -25,7 +25,7 @@ none 0.0.1dev devel unknown - 2015-05-11 + 2015-05-17 @@ -46,8 +46,8 @@ none - - + + diff --git a/php/sixel/package2.xml b/php/sixel/package2.xml index 9ea877c3..aab0e5af 100644 --- a/php/sixel/package2.xml +++ b/php/sixel/package2.xml @@ -23,7 +23,7 @@ none yes - 2015-05-11 + 2015-05-17 0.0.1dev 0.0.1dev @@ -51,8 +51,8 @@ none - - + + diff --git a/php/sixel/php_sixel.h b/php/sixel/php_sixel.h index a0326e28..8061127e 100644 --- a/php/sixel/php_sixel.h +++ b/php/sixel/php_sixel.h @@ -86,23 +86,23 @@ ZEND_END_ARG_INFO() #define SixelEncoder____destruct_args NULL #endif -PHP_METHOD(SixelEncoder, sixel_easy_encode_setopt); +PHP_METHOD(SixelEncoder, setopt); #if (PHP_MAJOR_VERSION >= 5) -ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__sixel_easy_encode_setopt_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__setopt_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_INFO(0, opt) ZEND_ARG_INFO(0, arg) ZEND_END_ARG_INFO() #else /* PHP 4.x */ -#define SixelEncoder__sixel_easy_encode_setopt_args NULL +#define SixelEncoder__setopt_args NULL #endif -PHP_METHOD(SixelEncoder, sixel_easy_encode); +PHP_METHOD(SixelEncoder, encode); #if (PHP_MAJOR_VERSION >= 5) -ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__sixel_easy_encode_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__encode_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() #else /* PHP 4.x */ -#define SixelEncoder__sixel_easy_encode_args NULL +#define SixelEncoder__encode_args NULL #endif #ifdef __cplusplus diff --git a/php/sixel/sixel.c b/php/sixel/sixel.c index 73fcbbea..81339e64 100644 --- a/php/sixel/sixel.c +++ b/php/sixel/sixel.c @@ -36,15 +36,19 @@ PHP_METHOD(SixelEncoder, __construct) do { - sixel_encode_settings_t *settings; - settings = sixel_encode_settings_create(); - if (settings == NULL) { + sixel_encoder_t *encoder; + encoder = sixel_encoder_create(); + if (encoder == NULL) { +#if 0 zend_throw_exception_ex(zend_exception_get_default(), 1, - "sixel_encode_settings_create() failed. %s:%d", __FILE__, __LINE__); + "sixel_encoder_create() failed. %s:%d", + __FILE__, __LINE__); +#endif } else { zval *value = emalloc(sizeof(zval)); - ZVAL_RESOURCE(value, settings); - zend_update_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, value TSRMLS_CC); + ZVAL_RESOURCE(value, (long)encoder); + zend_update_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, value); } } while (0); } @@ -70,18 +74,19 @@ PHP_METHOD(SixelEncoder, __destruct) do { - zval *settings = zend_read_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, 1 TSRMLS_CC); - sixel_encode_settings_unref(Z_RESVAL_P(settings)); - efree(settings); + zval *encoder = zend_read_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, 1); + sixel_encoder_unref((sixel_encoder_t *)Z_RESVAL_P(encoder)); + efree(encoder); } while (0); } /* }}} __destruct */ -/* {{{ proto void sixel_easy_encode_setopt(string opt[, string arg]) +/* {{{ proto void setopt(string opt[, string arg]) */ -PHP_METHOD(SixelEncoder, sixel_easy_encode_setopt) +PHP_METHOD(SixelEncoder, setopt) { zend_class_entry * _this_ce; @@ -101,17 +106,18 @@ PHP_METHOD(SixelEncoder, sixel_easy_encode_setopt) do { - zval *settings = zend_read_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, 1 TSRMLS_CC); - sixel_easy_encode_setopt(Z_RESVAL_P(settings), *opt, arg); + zval *encoder = zend_read_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, 1); + sixel_encoder_setopt((sixel_encoder_t *)Z_RESVAL_P(encoder), *opt, arg); } while (0); } -/* }}} sixel_easy_encode_setopt */ +/* }}} setopt */ -/* {{{ proto void sixel_easy_encode(string filename) +/* {{{ proto void encode(string filename) */ -PHP_METHOD(SixelEncoder, sixel_easy_encode) +PHP_METHOD(SixelEncoder, encode) { zend_class_entry * _this_ce; @@ -129,22 +135,26 @@ PHP_METHOD(SixelEncoder, sixel_easy_encode) do { - zval *settings = zend_read_property(_this_ce, getThis(), "settings", sizeof("settings") - 1, 0 TSRMLS_CC); - int ret = sixel_easy_encode(filename, Z_RESVAL_P(settings), NULL); + zval *encoder = zend_read_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, 1); + int ret = sixel_encoder_encode((sixel_encoder_t *)Z_RESVAL_P(encoder), filename); +#if 0 if (ret != 0) { zend_throw_exception_ex(zend_exception_get_default(), 1, - "sixel_easy_encode() failed. %s:%d", __FILE__, __LINE__); + "sixel_encoder_encode() failed. %s:%d", + __FILE__, __LINE__); } +#endif } while (0); } -/* }}} sixel_easy_encode */ +/* }}} encode */ static zend_function_entry SixelEncoder_methods[] = { PHP_ME(SixelEncoder, __construct, NULL, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) PHP_ME(SixelEncoder, __destruct, NULL, /**/ZEND_ACC_PUBLIC) - PHP_ME(SixelEncoder, sixel_easy_encode_setopt, SixelEncoder__sixel_easy_encode_setopt_args, /**/ZEND_ACC_PUBLIC) - PHP_ME(SixelEncoder, sixel_easy_encode, SixelEncoder__sixel_easy_encode_args, /**/ZEND_ACC_PUBLIC) + PHP_ME(SixelEncoder, setopt, SixelEncoder__setopt_args, /**/ZEND_ACC_PUBLIC) + PHP_ME(SixelEncoder, encode, SixelEncoder__encode_args, /**/ZEND_ACC_PUBLIC) { NULL, NULL, NULL } }; @@ -239,7 +249,7 @@ PHP_MINFO_FUNCTION(sixel) php_printf("The unknown extension\n"); php_info_print_table_start(); php_info_print_table_row(2, "Version",PHP_SIXEL_VERSION " (devel)"); - php_info_print_table_row(2, "Released", "2015-05-11"); + php_info_print_table_row(2, "Released", "2015-05-17"); php_info_print_table_row(2, "CVS Revision", "$Id: $"); php_info_print_table_row(2, "Authors", "Unknown User 'unknown@example.com' (lead)\n"); php_info_print_table_end(); diff --git a/php/sixel/sixel.xml b/php/sixel/sixel.xml index c23a136e..2e119d60 100644 --- a/php/sixel/sixel.xml +++ b/php/sixel/sixel.xml @@ -12,15 +12,19 @@ object __construct() @@ -28,29 +32,35 @@ object __destruct() - - void sixel_easy_encode_setopt(string opt[, string arg]) + + void setopt(string opt[, string arg]) - - void sixel_easy_encode(string filename) + + void encode(string filename) diff --git a/php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt b/php/sixel/tests/SixelEncoder__encode.phpt similarity index 75% rename from php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt rename to php/sixel/tests/SixelEncoder__encode.phpt index 600dbdad..6135484e 100644 --- a/php/sixel/tests/SixelEncoder__sixel_easy_encode.phpt +++ b/php/sixel/tests/SixelEncoder__encode.phpt @@ -1,5 +1,5 @@ --TEST-- -SixelEncoder::sixel_easy_encode() member function +SixelEncoder::encode() member function --SKIPIF-- Date: Sun, 17 May 2015 12:55:48 +0900 Subject: [PATCH 217/451] Update python-ctypes binding --- python/libsixel.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/python/libsixel.py b/python/libsixel.py index fea1ae33..c4db613b 100755 --- a/python/libsixel.py +++ b/python/libsixel.py @@ -8,16 +8,16 @@ def _load(): sixel = CDLL(ctypes.util.find_library("sixel")) - sixel.sixel_encode_settings_create.restype = c_void_p - sixel.sixel_encode_settings_unref.restype = None - sixel.sixel_encode_settings_unref.argtypes = [c_void_p] - sixel.sixel_easy_encode_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_easy_encode.argtypes = [c_char_p, c_void_p, c_void_p] - sixel.sixel_decode_settings_create.restype = c_void_p - sixel.sixel_decode_settings_unref.restype = None - sixel.sixel_decode_settings_unref.argtypes = [c_void_p] - sixel.sixel_easy_decode_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_easy_decode.argtypes = [c_void_p] + sixel.sixel_encoder_create.restype = c_void_p + sixel.sixel_encoder_unref.restype = None + sixel.sixel_encoder_unref.argtypes = [c_void_p] + sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] + sixel.sixel_decoder_create.restype = c_void_p + sixel.sixel_decoder_unref.restype = None + sixel.sixel_decoder_unref.argtypes = [c_void_p] + sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_decoder_decode.argtypes = [c_void_p] return sixel @@ -26,22 +26,22 @@ class EasyEncoder(object): def __init__(self): self._sixel = _load() - self._settings = self._sixel.sixel_encode_settings_create() + self._encoder = self._sixel.sixel_encoder_create() def __del__(self): - self._sixel.sixel_encode_settings_unref(self._settings) + self._sixel.sixel_encoder_unref(self._encoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) - settings = self._settings - result = self._sixel.sixel_easy_encode_setopt(settings, flag, arg) + settings = self._encoder + result = self._sixel.sixel_encoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def encode(self, filename="-"): - result = self._sixel.sixel_easy_encode(filename, self._settings, None) + result = self._sixel.sixel_encoder_encode(self._encoder, filename) if result != 0: raise RuntimeError("Unexpected Error") @@ -65,24 +65,24 @@ class EasyDecoder(object): def __init__(self): self._sixel = _load() - self._settings = self._sixel.sixel_decode_settings_create() + self._decoder = self._sixel.sixel_decoder_create() def __del__(self): - self._sixel.sixel_decode_settings_unref(self._settings) + self._sixel.sixel_decoder_unref(self._decoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) - settings = self._settings - result = self._sixel.sixel_easy_decode_setopt(settings, flag, arg) + settings = self._decoder + result = self._sixel.sixel_decoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def decode(self, infile=None): if infile: self.setopt("i", infile) - result = self._sixel.sixel_easy_decode(self._settings) + result = self._sixel.sixel_decoder_decode(self._decoder) if result != 0: raise RuntimeError("Unexpected Error") @@ -107,7 +107,7 @@ def test(self, infile=None, outfile=None): import sys arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] -# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] EasyEncoder().test(arg1) +# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] # EasyDecoder().test(arg1, arg2) From a95ac8b819bbe74ff55bba1aa6359932d94664f6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 12:55:48 +0900 Subject: [PATCH 218/451] Update python-ctypes binding --- libsixel.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/libsixel.py b/libsixel.py index fea1ae33..c4db613b 100755 --- a/libsixel.py +++ b/libsixel.py @@ -8,16 +8,16 @@ def _load(): sixel = CDLL(ctypes.util.find_library("sixel")) - sixel.sixel_encode_settings_create.restype = c_void_p - sixel.sixel_encode_settings_unref.restype = None - sixel.sixel_encode_settings_unref.argtypes = [c_void_p] - sixel.sixel_easy_encode_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_easy_encode.argtypes = [c_char_p, c_void_p, c_void_p] - sixel.sixel_decode_settings_create.restype = c_void_p - sixel.sixel_decode_settings_unref.restype = None - sixel.sixel_decode_settings_unref.argtypes = [c_void_p] - sixel.sixel_easy_decode_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_easy_decode.argtypes = [c_void_p] + sixel.sixel_encoder_create.restype = c_void_p + sixel.sixel_encoder_unref.restype = None + sixel.sixel_encoder_unref.argtypes = [c_void_p] + sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] + sixel.sixel_decoder_create.restype = c_void_p + sixel.sixel_decoder_unref.restype = None + sixel.sixel_decoder_unref.argtypes = [c_void_p] + sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + sixel.sixel_decoder_decode.argtypes = [c_void_p] return sixel @@ -26,22 +26,22 @@ class EasyEncoder(object): def __init__(self): self._sixel = _load() - self._settings = self._sixel.sixel_encode_settings_create() + self._encoder = self._sixel.sixel_encoder_create() def __del__(self): - self._sixel.sixel_encode_settings_unref(self._settings) + self._sixel.sixel_encoder_unref(self._encoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) - settings = self._settings - result = self._sixel.sixel_easy_encode_setopt(settings, flag, arg) + settings = self._encoder + result = self._sixel.sixel_encoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def encode(self, filename="-"): - result = self._sixel.sixel_easy_encode(filename, self._settings, None) + result = self._sixel.sixel_encoder_encode(self._encoder, filename) if result != 0: raise RuntimeError("Unexpected Error") @@ -65,24 +65,24 @@ class EasyDecoder(object): def __init__(self): self._sixel = _load() - self._settings = self._sixel.sixel_decode_settings_create() + self._decoder = self._sixel.sixel_decoder_create() def __del__(self): - self._sixel.sixel_decode_settings_unref(self._settings) + self._sixel.sixel_decoder_unref(self._decoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) - settings = self._settings - result = self._sixel.sixel_easy_decode_setopt(settings, flag, arg) + settings = self._decoder + result = self._sixel.sixel_decoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def decode(self, infile=None): if infile: self.setopt("i", infile) - result = self._sixel.sixel_easy_decode(self._settings) + result = self._sixel.sixel_decoder_decode(self._decoder) if result != 0: raise RuntimeError("Unexpected Error") @@ -107,7 +107,7 @@ def test(self, infile=None, outfile=None): import sys arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] -# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] EasyEncoder().test(arg1) +# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] # EasyDecoder().test(arg1, arg2) From fa1842f2dabb77e40dd4302ed8651914b2414e9c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 17:14:54 +0900 Subject: [PATCH 219/451] Rename files: easy_encode.c -> encoder.c, easy_decode -> decoder.c --- src/Makefile.am | 8 ++++---- src/Makefile.in | 34 ++++++++++++++++---------------- src/{easy_decode.c => decoder.c} | 2 +- src/{easy_decode.h => decoder.h} | 0 src/{easy_encode.c => encoder.c} | 2 +- src/{easy_encode.h => encoder.h} | 0 6 files changed, 23 insertions(+), 23 deletions(-) rename src/{easy_decode.c => decoder.c} (99%) rename src/{easy_decode.h => decoder.h} (100%) rename src/{easy_encode.c => encoder.c} (99%) rename src/{easy_encode.h => encoder.h} (100%) diff --git a/src/Makefile.am b/src/Makefile.am index e35c12eb..6480fa4e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,10 +23,10 @@ libsixel_la_SOURCES = output.c \ frompnm.h \ fromgif.c \ fromgif.h \ - easy_encode.c \ - easy_encode.h \ - easy_decode.c \ - easy_decode.h \ + encoder.c \ + encoder.h \ + decoder.c \ + decoder.h \ stb_image.h \ writer.c \ stb_image_write.c \ diff --git a/src/Makefile.in b/src/Makefile.in index a38dfe55..9e0ce140 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -141,7 +141,7 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-frame.lo libsixel_la-pixelformat.lo \ libsixel_la-scale.lo libsixel_la-loader.lo \ libsixel_la-frompnm.lo libsixel_la-fromgif.lo \ - libsixel_la-easy_encode.lo libsixel_la-easy_decode.lo \ + libsixel_la-encoder.lo libsixel_la-decoder.lo \ libsixel_la-writer.lo libsixel_la-stb_image_write.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) @@ -375,10 +375,10 @@ libsixel_la_SOURCES = output.c \ frompnm.h \ fromgif.c \ fromgif.h \ - easy_encode.c \ - easy_encode.h \ - easy_decode.c \ - easy_decode.h \ + encoder.c \ + encoder.h \ + decoder.c \ + decoder.h \ stb_image.h \ writer.c \ stb_image_write.c \ @@ -479,9 +479,9 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-decoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_decode.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-easy_encode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-encoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-fromgif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-frompnm.Plo@am__quote@ @@ -593,19 +593,19 @@ libsixel_la-fromgif.lo: fromgif.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-fromgif.lo `test -f 'fromgif.c' || echo '$(srcdir)/'`fromgif.c -libsixel_la-easy_encode.lo: easy_encode.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-easy_encode.lo -MD -MP -MF $(DEPDIR)/libsixel_la-easy_encode.Tpo -c -o libsixel_la-easy_encode.lo `test -f 'easy_encode.c' || echo '$(srcdir)/'`easy_encode.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-easy_encode.Tpo $(DEPDIR)/libsixel_la-easy_encode.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easy_encode.c' object='libsixel_la-easy_encode.lo' libtool=yes @AMDEPBACKSLASH@ +libsixel_la-encoder.lo: encoder.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-encoder.lo -MD -MP -MF $(DEPDIR)/libsixel_la-encoder.Tpo -c -o libsixel_la-encoder.lo `test -f 'encoder.c' || echo '$(srcdir)/'`encoder.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-encoder.Tpo $(DEPDIR)/libsixel_la-encoder.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='encoder.c' object='libsixel_la-encoder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-easy_encode.lo `test -f 'easy_encode.c' || echo '$(srcdir)/'`easy_encode.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-encoder.lo `test -f 'encoder.c' || echo '$(srcdir)/'`encoder.c -libsixel_la-easy_decode.lo: easy_decode.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-easy_decode.lo -MD -MP -MF $(DEPDIR)/libsixel_la-easy_decode.Tpo -c -o libsixel_la-easy_decode.lo `test -f 'easy_decode.c' || echo '$(srcdir)/'`easy_decode.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-easy_decode.Tpo $(DEPDIR)/libsixel_la-easy_decode.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='easy_decode.c' object='libsixel_la-easy_decode.lo' libtool=yes @AMDEPBACKSLASH@ +libsixel_la-decoder.lo: decoder.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-decoder.lo -MD -MP -MF $(DEPDIR)/libsixel_la-decoder.Tpo -c -o libsixel_la-decoder.lo `test -f 'decoder.c' || echo '$(srcdir)/'`decoder.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-decoder.Tpo $(DEPDIR)/libsixel_la-decoder.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='decoder.c' object='libsixel_la-decoder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-easy_decode.lo `test -f 'easy_decode.c' || echo '$(srcdir)/'`easy_decode.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-decoder.lo `test -f 'decoder.c' || echo '$(srcdir)/'`decoder.c libsixel_la-writer.lo: writer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-writer.lo -MD -MP -MF $(DEPDIR)/libsixel_la-writer.Tpo -c -o libsixel_la-writer.lo `test -f 'writer.c' || echo '$(srcdir)/'`writer.c diff --git a/src/easy_decode.c b/src/decoder.c similarity index 99% rename from src/easy_decode.c rename to src/decoder.c index aa000b36..98c37281 100644 --- a/src/easy_decode.c +++ b/src/decoder.c @@ -57,7 +57,7 @@ # include #endif -#include "easy_decode.h" +#include "decoder.h" #include diff --git a/src/easy_decode.h b/src/decoder.h similarity index 100% rename from src/easy_decode.h rename to src/decoder.h diff --git a/src/easy_encode.c b/src/encoder.c similarity index 99% rename from src/easy_encode.c rename to src/encoder.c index 556be141..cc630904 100644 --- a/src/easy_encode.c +++ b/src/encoder.c @@ -63,7 +63,7 @@ # include #endif -#include "easy_encode.h" +#include "encoder.h" #include diff --git a/src/easy_encode.h b/src/encoder.h similarity index 100% rename from src/easy_encode.h rename to src/encoder.h From 1ca0a2b3fabfa7ac3a519d8f7b28452723674372 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 17:31:36 +0900 Subject: [PATCH 220/451] Add test cases for -B and -o option --- converters/Makefile.am | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index d107dd76..4b00e585 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -53,6 +53,9 @@ if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -b invalid_option) test ! $$($(WINE) ./img2sixel -E invalid_option) test ! $$($(WINE) ./img2sixel -B invalid_option) + test ! $$($(WINE) ./img2sixel -B \#00000) + test ! $$($(WINE) ./img2sixel -B \#0000000000000) + test ! $$($(WINE) ./img2sixel -B \#00G) test ! $$($(WINE) ./img2sixel -%) test ! $$($(WINE) ./img2sixel invalid_filename) test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @@ -73,19 +76,19 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -V $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel - $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 < ../images/snake.jpg > snake3.sixel - $(WINE) ./img2sixel -w105% -h100 -djajuni -rnearest < ../images/snake.gif + $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 -o snake3.sixel < ../images/snake.jpg + $(WINE) ./img2sixel -w105% -h100 -djajuni -B\#000000000 -rnearest < ../images/snake.gif $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga $(WINE) ./img2sixel -p300 -8 -scenter -Brgb:0/f/A -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff $(WINE) ./img2sixel -8 -qauto -thls -e ../images/snake.pgm $(WINE) ./img2sixel -8 -m ../images/map8-palette.png -Esize ../images/snake.ppm $(WINE) ./img2sixel -7 -m ../images/map16-palette.png -Efast ../images/snake.jpg $(WINE) ./img2sixel -7 -w300 ../images/snake-palette.png - $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B\#aB3 ../images/snake.pbm - $(WINE) ./img2sixel -I -dstucki -thls ../images/snake.ppm + $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B\#aB3 -B\#aB3 ../images/snake.pbm + $(WINE) ./img2sixel -I -dstucki -thls -B\#a0B030 ../images/snake.ppm $(WINE) ./img2sixel -bvt340color ../images/snake.ppm $(WINE) ./img2sixel -bvt340mono ../images/snake.tga - $(WINE) ./img2sixel -I -8 -dburkes ../images/snake-ascii.ppm + $(WINE) ./img2sixel -I -8 -dburkes -Bffffffffffff ../images/snake-ascii.ppm $(WINE) ./img2sixel -I -C10 -djajuni ../images/snake.png $(WINE) ./img2sixel -I -Eauto ../images/snake-ascii.pgm $(WINE) ./img2sixel -I -datkinson ../images/snake-ascii.pbm @@ -96,9 +99,9 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -c200x200+100+100 -w400 ../images/snake-grayscale.png $(WINE) ./img2sixel -I ../images/snake-grayscale.png $(WINE) ./img2sixel -I ../images/snake-grayscale.jpg - $(WINE) ./img2sixel -m ../images/map8.six ../images/snake.six + $(WINE) ./img2sixel -m ../images/map8.six -m ../images/map8.six ../images/snake.six $(WINE) ./img2sixel -w200 -p8 ../images/snake.six - $(WINE) ./img2sixel -c200x200+100+100 ../images/snake.six + $(WINE) ./img2sixel -c200x200+2000+2000 ../images/snake.six $(WINE) ./img2sixel -bxterm16 ../images/snake.six $(WINE) ./img2sixel -e ../images/snake.six $(WINE) ./img2sixel -I ../images/snake.six From 92500d3c4afd3a9de5ec904768f5d3fc9cac4f9f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 18:20:16 +0900 Subject: [PATCH 221/451] Add __declspec for mingw --- include/sixel.h.in | 145 ++++++++++----------- src/decoder.c | 142 ++++++++++----------- src/dither.c | 38 +++--- src/encoder.c | 305 +++++++++++++++++++++++---------------------- src/frame.c | 46 +++---- src/fromsixel.c | 2 +- src/loader.c | 4 +- src/output.c | 22 ++-- src/pixelformat.c | 4 +- src/quant.c | 6 +- src/scale.c | 2 +- src/tosixel.c | 2 +- src/writer.c | 2 +- 13 files changed, 361 insertions(+), 359 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 72831723..c1065bce 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -24,6 +24,12 @@ #ifndef LIBSIXEL_SIXEL_H #define LIBSIXEL_SIXEL_H +#ifdef _WIN32 +# define SIXELAPI __declspec(dllexport) +#else +# define SIXELAPI +#endif + #define LIBSIXEL_VRTSION @PACKAGE_VERSION@ #define LIBSIXEL_ABI_VRTSION @LS_LTVERSION@ @@ -176,52 +182,52 @@ extern "C" { #endif /* create output context object */ -sixel_output_t * +SIXELAPI sixel_output_t * sixel_output_create( sixel_write_function /* in */ fn_write, /* callback for output sixel */ void /* in */ *priv); /* private data given as 3rd argument of fn_write */ /* destroy output context object */ -void +SIXELAPI void sixel_output_destroy(sixel_output_t /* in */ *output); /* output context */ /* increment reference count of output context object (thread-unsafe) */ -void +SIXELAPI void sixel_output_ref(sixel_output_t /* in */ *output); /* output context */ /* decrement reference count of output context object (thread-unsafe) */ -void +SIXELAPI void sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ -int +SIXELAPI int sixel_output_get_8bit_availability( sixel_output_t /* in */ *output); /* output context */ -void +SIXELAPI void sixel_output_set_8bit_availability( sixel_output_t /* in */ *output, /* output context */ int /* in */ availability); /* 0: do not use 8bit characters 1: use 8bit characters */ -void +SIXELAPI void sixel_output_set_penetrate_multiplexer( sixel_output_t /* in */ *output, /* output context */ int /* in */ penetrate); /* 0: penetrate GNU Screen 1: do not penetrate GNU Screen */ -void +SIXELAPI void sixel_output_set_skip_dcs_envelope( sixel_output_t /* in */ *output, /* output context */ int /* in */ skip); /* 0: output DCS envelope 1: do not output DCS envelope */ -void +SIXELAPI void sixel_output_set_palette_type( sixel_output_t /* in */ *output, /* output context */ int /* in */ palettetype); /* PALETTETYPE_RGB: RGB palette PALETTETYPE_HLS: HLS palette */ -void +SIXELAPI void sixel_output_set_encode_policy( sixel_output_t /* in */ *output, /* output context */ int /* in */ encode_policy); @@ -239,27 +245,27 @@ extern "C" { #endif /* create dither context object */ -sixel_dither_t * +SIXELAPI sixel_dither_t * sixel_dither_create(int /* in */ ncolors); /* number of colors */ /* get built-in dither context object */ -sixel_dither_t * +SIXELAPI sixel_dither_t * sixel_dither_get(int builtin_dither); /* ID of built-in dither object */ /* destroy dither context object */ -void +SIXELAPI void sixel_dither_destroy(sixel_dither_t *dither); /* dither context object */ /* increment reference count of dither context object (thread-unsafe) */ -void +SIXELAPI void sixel_dither_ref(sixel_dither_t *dither); /* dither context object */ /* decrement reference count of dither context object (thread-unsafe) */ -void +SIXELAPI void sixel_dither_unref(sixel_dither_t *dither); /* dither context object */ /* initialize internal palette from specified pixel buffer */ -int +SIXELAPI int sixel_dither_initialize( sixel_dither_t *dither, /* dither context object */ unsigned char /* in */ *data, /* sample image */ @@ -271,59 +277,59 @@ sixel_dither_initialize( int /* in */ quality_mode); /* quality of histogram processing */ /* set diffusion type, choose from enum methodForDiffuse */ -void +SIXELAPI void sixel_dither_set_diffusion_type( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ method_for_diffuse); /* one of enum methodForDiffuse */ /* get number of palette colors */ -int +SIXELAPI int sixel_dither_get_num_of_palette_colors( sixel_dither_t /* in */ *dither); /* dither context object */ /* get number of histogram colors */ -int +SIXELAPI int sixel_dither_get_num_of_histogram_colors( sixel_dither_t /* in */ *dither); /* dither context object */ -@attr_func_deprecated@ int /* typoed! remains for compatibility. */ +SIXELAPI @attr_func_deprecated@ int /* typoed! remains for compatibility. */ sixel_dither_get_num_of_histgram_colors( sixel_dither_t /* in */ *dither); /* dither context object */ /* get palette */ -unsigned char * +SIXELAPI unsigned char * sixel_dither_get_palette( sixel_dither_t /* in */ *dither); /* dither context object */ /* set palette */ -void +SIXELAPI void sixel_dither_set_palette( sixel_dither_t /* in */ *dither, /* dither context object */ unsigned char /* in */ *palette); -void +SIXELAPI void sixel_dither_set_complexion_score( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ score); /* complexion score (>= 1) */ -void +SIXELAPI void sixel_dither_set_body_only( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ bodyonly); /* 0: output palette section(default) 1: do not output palette section */ -void +SIXELAPI void sixel_dither_set_optimize_palette( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ do_opt); /* 0: optimize palette size 1: don't optimize palette size */ /* set pixelformat */ -void +SIXELAPI void sixel_dither_set_pixelformat( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ pixelformat); /* one of enum pixelFormat */ /* set transparent */ -void +SIXELAPI void sixel_dither_set_transparent( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ transparent); /* transparent color index */ @@ -341,7 +347,7 @@ extern "C" { #endif /* convert pixels into sixel format and write it to output context */ -int +SIXELAPI int sixel_encode( unsigned char /* in */ *pixels, /* pixel bytes */ int /* in */ width, /* image width */ @@ -351,7 +357,7 @@ sixel_encode( sixel_output_t /* in */ *context); /* output context */ /* convert sixel data into indexed pixel bytes and palette data */ -int +SIXELAPI int sixel_decode( unsigned char /* in */ *sixels, /* sixel bytes */ int /* in */ size, /* size of sixel bytes */ @@ -373,13 +379,13 @@ extern "C" { #endif /* compute pixel depth from pixelformat */ -int +SIXELAPI int sixel_helper_compute_depth( int /* in */ pixelformat /* one of enum pixelFormat */ ); /* convert pixelFormat into PIXELFORMAT_RGB888 */ -int +SIXELAPI int sixel_helper_normalize_pixelformat( unsigned char /* out */ *dst, /* destination buffer */ int /* out */ *dst_pixelformat, /* converted pixelformat */ @@ -390,7 +396,7 @@ sixel_helper_normalize_pixelformat( ); /* scale image to specified size */ -int +SIXELAPI int sixel_helper_scale_image( unsigned char /* out */ *dst, /* destination buffer */ unsigned char const /* in */ *src, /* source image data */ @@ -442,16 +448,16 @@ typedef struct sixel_frame { int dummy; } sixel_frame_t; extern "C" { #endif -unsigned char * +SIXELAPI unsigned char * sixel_frame_get_pixels(sixel_frame_t *frame); -void +SIXELAPI void sixel_frame_ref(sixel_frame_t *frame); -void +SIXELAPI void sixel_frame_unref(sixel_frame_t *frame); -int +SIXELAPI int sixel_frame_init( sixel_frame_t *frame, unsigned char *pixels, @@ -463,64 +469,63 @@ sixel_frame_init( ); /* get pixels */ -unsigned char * +SIXELAPI unsigned char * sixel_frame_get_pixels(sixel_frame_t /* in */ *frame); /* frame object */ /* get palette */ -unsigned char * +SIXELAPI unsigned char * sixel_frame_get_palette(sixel_frame_t /* in */ *frame); /* frame object */ /* get width */ -int +SIXELAPI int sixel_frame_get_width(sixel_frame_t /* in */ *frame); /* frame object */ /* get height */ -int +SIXELAPI int sixel_frame_get_height(sixel_frame_t /* in */ *frame); /* frame object */ /* get ncolors */ -int +SIXELAPI int sixel_frame_get_ncolors(sixel_frame_t /* in */ *frame); /* frame object */ /* get pixelformat */ -int +SIXELAPI int sixel_frame_get_pixelformat(sixel_frame_t /* in */ *frame); /* frame object */ /* get transparent */ -int +SIXELAPI int sixel_frame_get_transparent(sixel_frame_t /* in */ *frame); /* frame object */ /* get transparent */ -int +SIXELAPI int sixel_frame_get_multiframe(sixel_frame_t /* in */ *frame); /* frame object */ /* get delay */ -int +SIXELAPI int sixel_frame_get_delay(sixel_frame_t /* in */ *frame); /* frame object */ /* get frame no */ -int +SIXELAPI int sixel_frame_get_frame_no(sixel_frame_t /* in */ *frame); /* frame object */ /* get loop no */ -int +SIXELAPI int sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame); /* frame object */ /* strip alpha from RGBA/ARGB formatted pixbuf */ -int -sixel_strip_alpha( +SIXELAPI int +sixel_frame_strip_alpha( sixel_frame_t /* in */ *frame, - unsigned char /* in */ *bgcolor -); + unsigned char /* in */ *bgcolor); -int +SIXELAPI int sixel_frame_resize( sixel_frame_t /* in */ *frame, int /* in */ width, int /* in */ height, int /* in */ method_for_resampling); -int +SIXELAPI int sixel_frame_clip( sixel_frame_t /* in */ *frame, int /* in */ x, @@ -528,13 +533,11 @@ sixel_frame_clip( int /* in */ width, int /* in */ height); - typedef int (* sixel_load_image_function)( sixel_frame_t /* in */ *frame, - void /* in/out */ *context -); + void /* in/out */ *context); -int +SIXELAPI int sixel_helper_load_image_file( char const /* in */ *filename, /* source file name */ int /* in */ fstatic, /* whether to extract static image */ @@ -546,9 +549,8 @@ sixel_helper_load_image_file( int const /* in */ *cancel_flag, /* cancel flag */ void /* in/out */ *context); /* private data for callback */ - /* write image to file */ -int +SIXELAPI int sixel_helper_write_image_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ @@ -577,28 +579,27 @@ extern "C" { #endif /* create encoder object */ -sixel_encoder_t * +SIXELAPI sixel_encoder_t * sixel_encoder_create(void); -void +SIXELAPI void sixel_encoder_ref(sixel_encoder_t *encoder); -void +SIXELAPI void sixel_encoder_unref(sixel_encoder_t *encoder); -int +SIXELAPI int sixel_encoder_set_cancel_flag( sixel_encoder_t /* in */ *encoder, - int /* in */ *cancel_flag -); + int /* in */ *cancel_flag); -int +SIXELAPI int sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, char const /* in */ *optarg); -int +SIXELAPI int sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, char const /* in */ *filename); @@ -622,22 +623,22 @@ extern "C" { #endif /* create decoder object */ -sixel_decoder_t * +SIXELAPI sixel_decoder_t * sixel_decoder_create(void); -void +SIXELAPI void sixel_decoder_ref(sixel_decoder_t *decoder); -void +SIXELAPI void sixel_decoder_unref(sixel_decoder_t *decoder); -int +SIXELAPI int sixel_decoder_setopt( sixel_decoder_t /* in */ *decoder, int /* in */ arg, char const /* in */ *optarg); -int +SIXELAPI int sixel_decoder_decode( sixel_decoder_t /* in */ *decoder); diff --git a/src/decoder.c b/src/decoder.c index 98c37281..452c386f 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -74,7 +74,77 @@ arg_strdup(char const *s) } -int +/* create decoder object */ +SIXELAPI sixel_decoder_t * +sixel_decoder_create(void) +{ + sixel_decoder_t *decoder; + + decoder = malloc(sizeof(sixel_decoder_t)); + + decoder->ref = 1; + decoder->output = arg_strdup("-"); + decoder->input = arg_strdup("-"); + + return decoder; +} + + +SIXELAPI void +sixel_decoder_destroy(sixel_decoder_t *decoder) +{ + if (decoder) { + free(decoder->input); + free(decoder->output); + free(decoder); + } +} + + +SIXELAPI void +sixel_decoder_ref(sixel_decoder_t *decoder) +{ + /* TODO: be thread safe */ + ++decoder->ref; +} + + +SIXELAPI void +sixel_decoder_unref(sixel_decoder_t *decoder) +{ + /* TODO: be thread safe */ + if (decoder != NULL && --decoder->ref == 0) { + sixel_decoder_destroy(decoder); + } +} + + +SIXELAPI int +sixel_decoder_setopt( + sixel_decoder_t /* in */ *decoder, + int /* in */ arg, + char const /* in */ *optarg +) +{ + switch(arg) { + case 'i': + free(decoder->input); + decoder->input = arg_strdup(optarg); + break; + case 'o': + free(decoder->output); + decoder->output = arg_strdup(optarg); + break; + case '?': + default: + return (-1); + } + + return 0; +} + + +SIXELAPI int sixel_decoder_decode( sixel_decoder_t /* in */ *decoder) { @@ -161,76 +231,6 @@ sixel_decoder_decode( return ret; } - -int -sixel_decoder_setopt( - sixel_decoder_t /* in */ *decoder, - int /* in */ arg, - char const /* in */ *optarg -) -{ - switch(arg) { - case 'i': - free(decoder->input); - decoder->input = arg_strdup(optarg); - break; - case 'o': - free(decoder->output); - decoder->output = arg_strdup(optarg); - break; - case '?': - default: - return (-1); - } - - return 0; -} - - -/* create decoder object */ -sixel_decoder_t * -sixel_decoder_create(void) -{ - sixel_decoder_t *decoder; - - decoder = malloc(sizeof(sixel_decoder_t)); - - decoder->ref = 1; - decoder->output = arg_strdup("-"); - decoder->input = arg_strdup("-"); - - return decoder; -} - - -void -sixel_decoder_destroy(sixel_decoder_t *decoder) -{ - if (decoder) { - free(decoder->input); - free(decoder->output); - free(decoder); - } -} - - -void -sixel_decoder_ref(sixel_decoder_t *decoder) -{ - /* TODO: be thread safe */ - ++decoder->ref; -} - - -void -sixel_decoder_unref(sixel_decoder_t *decoder) -{ - /* TODO: be thread safe */ - if (decoder != NULL && --decoder->ref == 0) { - sixel_decoder_destroy(decoder); - } -} - /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/dither.c b/src/dither.c index 93374ede..4e121de6 100644 --- a/src/dither.c +++ b/src/dither.c @@ -36,7 +36,7 @@ #include "dither.h" #include "quant.h" -#include "sixel.h" +#include static const unsigned char pal_mono_dark[] = { @@ -161,7 +161,7 @@ static const unsigned char pal_vt340_color[] = { }; -sixel_dither_t * +SIXELAPI sixel_dither_t * sixel_dither_create(int ncolors) { sixel_dither_t *dither; @@ -211,7 +211,7 @@ sixel_dither_create(int ncolors) } -void +SIXELAPI void sixel_dither_destroy(sixel_dither_t *dither) { if (dither) { @@ -221,7 +221,7 @@ sixel_dither_destroy(sixel_dither_t *dither) } -void +SIXELAPI void sixel_dither_ref(sixel_dither_t *dither) { /* TODO: be thread safe */ @@ -229,7 +229,7 @@ sixel_dither_ref(sixel_dither_t *dither) } -void +SIXELAPI void sixel_dither_unref(sixel_dither_t *dither) { /* TODO: be thread safe */ @@ -239,7 +239,7 @@ sixel_dither_unref(sixel_dither_t *dither) } -sixel_dither_t * +SIXELAPI sixel_dither_t * sixel_dither_get(int builtin_dither) { unsigned char *palette; @@ -328,7 +328,7 @@ sixel_dither_set_quality_mode(sixel_dither_t *dither, int quality_mode) } -int +SIXELAPI int sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, int width, int height, int pixelformat, int method_for_largest, int method_for_rep, @@ -390,7 +390,7 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, } -void +SIXELAPI void sixel_dither_set_diffusion_type(sixel_dither_t *dither, int method_for_diffuse) { if (method_for_diffuse == DIFFUSE_AUTO) { @@ -404,7 +404,7 @@ sixel_dither_set_diffusion_type(sixel_dither_t *dither, int method_for_diffuse) } -int +SIXELAPI int sixel_dither_get_num_of_palette_colors(sixel_dither_t *dither) { return dither->ncolors; @@ -412,7 +412,7 @@ sixel_dither_get_num_of_palette_colors(sixel_dither_t *dither) /* get number of histogram colors */ -int +SIXELAPI int sixel_dither_get_num_of_histogram_colors(sixel_dither_t /* in */ *dither) /* dither context object */ { return dither->origcolors; @@ -420,14 +420,14 @@ sixel_dither_get_num_of_histogram_colors(sixel_dither_t /* in */ *dither) /* di /* typoed: remained for keeping compatibility */ -int +SIXELAPI int sixel_dither_get_num_of_histgram_colors(sixel_dither_t /* in */ *dither) /* dither context object */ { return sixel_dither_get_num_of_histogram_colors(dither); } -unsigned char * +SIXELAPI unsigned char * sixel_dither_get_palette(sixel_dither_t /* in */ *dither) /* dither context object */ { return dither->palette; @@ -435,7 +435,7 @@ sixel_dither_get_palette(sixel_dither_t /* in */ *dither) /* dither context obj /* set palette */ -void +SIXELAPI void sixel_dither_set_palette( sixel_dither_t /* in */ *dither, /* dither context object */ unsigned char /* in */ *palette) @@ -444,7 +444,7 @@ sixel_dither_set_palette( } -void +SIXELAPI void sixel_dither_set_complexion_score(sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ score) /* complexion score (>= 1) */ { @@ -452,7 +452,7 @@ sixel_dither_set_complexion_score(sixel_dither_t /* in */ *dither, /* dither co } -void +SIXELAPI void sixel_dither_set_body_only(sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ bodyonly) /* 0: output palette section 1: do not output palette section */ @@ -461,7 +461,7 @@ sixel_dither_set_body_only(sixel_dither_t /* in */ *dither, /* dither contex } -void +SIXELAPI void sixel_dither_set_optimize_palette( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ do_opt) /* 0: optimize palette size @@ -471,7 +471,7 @@ sixel_dither_set_optimize_palette( } -void +SIXELAPI void sixel_dither_set_pixelformat( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ pixelformat) /* one of enum pixelFormat */ @@ -480,7 +480,7 @@ sixel_dither_set_pixelformat( } -void +SIXELAPI void sixel_dither_set_transparent( sixel_dither_t /* in */ *dither, /* dither context object */ int /* in */ transparent) /* transparent color index */ @@ -489,7 +489,7 @@ sixel_dither_set_transparent( } -unsigned char * +SIXELAPI unsigned char * sixel_dither_apply_palette(sixel_dither_t *dither, unsigned char *pixels, int width, int height) diff --git a/src/encoder.c b/src/encoder.c index cc630904..94c21b14 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -877,99 +877,104 @@ load_image_callback(sixel_frame_t *frame, void *data) } -int -sixel_encoder_encode( - sixel_encoder_t /* in */ *encoder, - char const /* in */ *filename) +/* create encoder object */ +SIXELAPI sixel_encoder_t * +sixel_encoder_create(void) { - int nret = (-1); - int fuse_palette = 1; - int loop_control; + sixel_encoder_t *encoder; + encoder = malloc(sizeof(sixel_encoder_t)); if (encoder == NULL) { - encoder = sixel_encoder_create(); - } else { - sixel_encoder_ref(encoder); - } - - loop_control = encoder->loop_mode; - - if (encoder->reqcolors == (-1)) { - encoder->reqcolors = SIXEL_PALETTE_MAX; - } - - if (encoder->reqcolors < 2) { - encoder->reqcolors = 2; - } - - if (encoder->palette_type == PALETTETYPE_AUTO) { - encoder->palette_type = PALETTETYPE_RGB; + return NULL; } - if (encoder->mapfile) { - fuse_palette = 0; - } + encoder->ref = 1; + encoder->reqcolors = (-1); + encoder->mapfile = NULL; + encoder->monochrome = 0; + encoder->highcolor = 0; + encoder->builtin_palette = 0; + encoder->method_for_diffuse = DIFFUSE_AUTO; + encoder->method_for_largest = LARGE_AUTO; + encoder->method_for_rep = REP_AUTO; + encoder->quality_mode = QUALITY_AUTO; + encoder->method_for_resampling = RES_BILINEAR; + encoder->loop_mode = LOOP_AUTO; + encoder->palette_type = PALETTETYPE_AUTO; + encoder->f8bit = 0; + encoder->finvert = 0; + encoder->fuse_macro = 0; + encoder->fignore_delay = 0; + encoder->complexion = 1; + encoder->fstatic = 0; + encoder->pixelwidth = -1; + encoder->pixelheight = -1; + encoder->percentwidth = -1; + encoder->percentheight = -1; + encoder->clipx = 0; + encoder->clipy = 0; + encoder->clipwidth = 0; + encoder->clipheight = 0; + encoder->clipfirst = 0; + encoder->macro_number = -1; + encoder->verbose = 0; + encoder->penetrate_multiplexer = 0; + encoder->encode_policy = ENCODEPOLICY_AUTO; + encoder->pipe_mode = 0; + encoder->bgcolor = NULL; + encoder->outfd = STDOUT_FILENO; + encoder->cancel_flag = NULL; - if (encoder->monochrome > 0) { - fuse_palette = 0; - } + return encoder; +} - if (encoder->highcolor > 0) { - fuse_palette = 0; - } - if (encoder->builtin_palette > 0) { - fuse_palette = 0; +SIXELAPI void +sixel_encoder_destroy(sixel_encoder_t *encoder) +{ + if (encoder) { + free(encoder->mapfile); + free(encoder->bgcolor); + if (encoder->outfd + && encoder->outfd != STDOUT_FILENO + && encoder->outfd != STDERR_FILENO) { + close(encoder->outfd); + } + free(encoder); } +} - if (encoder->percentwidth > 0 || - encoder->percentheight > 0 || - encoder->pixelwidth > 0 || - encoder->pixelheight > 0) { - fuse_palette = 0; - } -reload: - nret = sixel_helper_load_image_file(filename, - encoder->fstatic, - fuse_palette, - encoder->reqcolors, - encoder->bgcolor, - loop_control, - load_image_callback, - encoder->cancel_flag, - (void *)encoder); +SIXELAPI void +sixel_encoder_ref(sixel_encoder_t *encoder) +{ + /* TODO: be thread safe */ + ++encoder->ref; +} - if (nret != 0) { - goto end; - } - if (encoder->pipe_mode) { -#if HAVE_CLEARERR - clearerr(stdin); -#endif /* HAVE_FSEEK */ - while (encoder->cancel_flag && !*encoder->cancel_flag) { - nret = wait_stdin(1000000); - if (nret == (-1)) { - goto end; - } - if (nret != 0) { - break; - } - } - if (!encoder->cancel_flag || !*encoder->cancel_flag) { - goto reload; - } +SIXELAPI void +sixel_encoder_unref(sixel_encoder_t *encoder) +{ + /* TODO: be thread safe */ + if (encoder != NULL && --encoder->ref == 0) { + sixel_encoder_destroy(encoder); } +} -end: - sixel_encoder_unref(encoder); - return nret; +SIXELAPI int +sixel_encoder_set_cancel_flag( + sixel_encoder_t /* in */ *encoder, + int /* in */ *cancel_flag +) +{ + encoder->cancel_flag = cancel_flag; + return 0; } -int +SIXELAPI int sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, @@ -1349,99 +1354,95 @@ sixel_encoder_setopt( } -/* create encoder object */ -sixel_encoder_t * -sixel_encoder_create(void) +SIXELAPI int +sixel_encoder_encode( + sixel_encoder_t /* in */ *encoder, + char const /* in */ *filename) { - sixel_encoder_t *encoder; + int nret = (-1); + int fuse_palette = 1; + int loop_control; - encoder = malloc(sizeof(sixel_encoder_t)); if (encoder == NULL) { - return NULL; + encoder = sixel_encoder_create(); + } else { + sixel_encoder_ref(encoder); } - encoder->ref = 1; - encoder->reqcolors = (-1); - encoder->mapfile = NULL; - encoder->monochrome = 0; - encoder->highcolor = 0; - encoder->builtin_palette = 0; - encoder->method_for_diffuse = DIFFUSE_AUTO; - encoder->method_for_largest = LARGE_AUTO; - encoder->method_for_rep = REP_AUTO; - encoder->quality_mode = QUALITY_AUTO; - encoder->method_for_resampling = RES_BILINEAR; - encoder->loop_mode = LOOP_AUTO; - encoder->palette_type = PALETTETYPE_AUTO; - encoder->f8bit = 0; - encoder->finvert = 0; - encoder->fuse_macro = 0; - encoder->fignore_delay = 0; - encoder->complexion = 1; - encoder->fstatic = 0; - encoder->pixelwidth = -1; - encoder->pixelheight = -1; - encoder->percentwidth = -1; - encoder->percentheight = -1; - encoder->clipx = 0; - encoder->clipy = 0; - encoder->clipwidth = 0; - encoder->clipheight = 0; - encoder->clipfirst = 0; - encoder->macro_number = -1; - encoder->verbose = 0; - encoder->penetrate_multiplexer = 0; - encoder->encode_policy = ENCODEPOLICY_AUTO; - encoder->pipe_mode = 0; - encoder->bgcolor = NULL; - encoder->outfd = STDOUT_FILENO; - encoder->cancel_flag = NULL; + loop_control = encoder->loop_mode; - return encoder; -} + if (encoder->reqcolors == (-1)) { + encoder->reqcolors = SIXEL_PALETTE_MAX; + } + if (encoder->reqcolors < 2) { + encoder->reqcolors = 2; + } -void -sixel_encoder_destroy(sixel_encoder_t *encoder) -{ - if (encoder) { - free(encoder->mapfile); - free(encoder->bgcolor); - if (encoder->outfd - && encoder->outfd != STDOUT_FILENO - && encoder->outfd != STDERR_FILENO) { - close(encoder->outfd); - } - free(encoder); + if (encoder->palette_type == PALETTETYPE_AUTO) { + encoder->palette_type = PALETTETYPE_RGB; } -} + if (encoder->mapfile) { + fuse_palette = 0; + } -void -sixel_encoder_ref(sixel_encoder_t *encoder) -{ - /* TODO: be thread safe */ - ++encoder->ref; -} + if (encoder->monochrome > 0) { + fuse_palette = 0; + } + if (encoder->highcolor > 0) { + fuse_palette = 0; + } -void -sixel_encoder_unref(sixel_encoder_t *encoder) -{ - /* TODO: be thread safe */ - if (encoder != NULL && --encoder->ref == 0) { - sixel_encoder_destroy(encoder); + if (encoder->builtin_palette > 0) { + fuse_palette = 0; } -} -int -sixel_encoder_set_cancel_flag( - sixel_encoder_t /* in */ *encoder, - int /* in */ *cancel_flag -) -{ - encoder->cancel_flag = cancel_flag; - return 0; + if (encoder->percentwidth > 0 || + encoder->percentheight > 0 || + encoder->pixelwidth > 0 || + encoder->pixelheight > 0) { + fuse_palette = 0; + } + +reload: + nret = sixel_helper_load_image_file(filename, + encoder->fstatic, + fuse_palette, + encoder->reqcolors, + encoder->bgcolor, + loop_control, + load_image_callback, + encoder->cancel_flag, + (void *)encoder); + + if (nret != 0) { + goto end; + } + + if (encoder->pipe_mode) { +#if HAVE_CLEARERR + clearerr(stdin); +#endif /* HAVE_FSEEK */ + while (encoder->cancel_flag && !*encoder->cancel_flag) { + nret = wait_stdin(1000000); + if (nret == (-1)) { + goto end; + } + if (nret != 0) { + break; + } + } + if (!encoder->cancel_flag || !*encoder->cancel_flag) { + goto reload; + } + } + +end: + sixel_encoder_unref(encoder); + + return nret; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/frame.c b/src/frame.c index 14f3a70c..cc9fc2d7 100644 --- a/src/frame.c +++ b/src/frame.c @@ -35,10 +35,10 @@ #endif #include "frame.h" -#include "sixel.h" +#include -sixel_frame_t * +SIXELAPI sixel_frame_t * sixel_frame_create(void) { sixel_frame_t *frame; @@ -64,7 +64,7 @@ sixel_frame_create(void) } -void +SIXELAPI void sixel_frame_destroy(sixel_frame_t *frame) { if (frame) { @@ -75,7 +75,7 @@ sixel_frame_destroy(sixel_frame_t *frame) } -void +SIXELAPI void sixel_frame_ref(sixel_frame_t *frame) { /* TODO: be thread safe */ @@ -83,7 +83,7 @@ sixel_frame_ref(sixel_frame_t *frame) } -void +SIXELAPI void sixel_frame_unref(sixel_frame_t *frame) { /* TODO: be thread safe */ @@ -93,7 +93,7 @@ sixel_frame_unref(sixel_frame_t *frame) } -int +SIXELAPI int sixel_frame_init( sixel_frame_t *frame, unsigned char *pixels, @@ -116,7 +116,7 @@ sixel_frame_init( /* get pixels */ -unsigned char * +SIXELAPI unsigned char * sixel_frame_get_pixels(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->pixels; @@ -124,7 +124,7 @@ sixel_frame_get_pixels(sixel_frame_t /* in */ *frame) /* frame object */ /* get palette */ -unsigned char * +SIXELAPI unsigned char * sixel_frame_get_palette(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->palette; @@ -132,7 +132,7 @@ sixel_frame_get_palette(sixel_frame_t /* in */ *frame) /* frame object */ /* get width */ -int +SIXELAPI int sixel_frame_get_width(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->width; @@ -140,7 +140,7 @@ sixel_frame_get_width(sixel_frame_t /* in */ *frame) /* frame object */ /* get height */ -int +SIXELAPI int sixel_frame_get_height(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->height; @@ -148,7 +148,7 @@ sixel_frame_get_height(sixel_frame_t /* in */ *frame) /* frame object */ /* get ncolors */ -int +SIXELAPI int sixel_frame_get_ncolors(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->ncolors; @@ -156,7 +156,7 @@ sixel_frame_get_ncolors(sixel_frame_t /* in */ *frame) /* frame object */ /* get pixelformat */ -int +SIXELAPI int sixel_frame_get_pixelformat(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->pixelformat; @@ -164,7 +164,7 @@ sixel_frame_get_pixelformat(sixel_frame_t /* in */ *frame) /* frame object */ /* get transparent */ -int +SIXELAPI int sixel_frame_get_transparent(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->transparent; @@ -172,7 +172,7 @@ sixel_frame_get_transparent(sixel_frame_t /* in */ *frame) /* frame object */ /* get transparent */ -int +SIXELAPI int sixel_frame_get_multiframe(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->multiframe; @@ -180,7 +180,7 @@ sixel_frame_get_multiframe(sixel_frame_t /* in */ *frame) /* frame object */ /* get delay */ -int +SIXELAPI int sixel_frame_get_delay(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->delay; @@ -188,7 +188,7 @@ sixel_frame_get_delay(sixel_frame_t /* in */ *frame) /* frame object */ /* get frame no */ -int +SIXELAPI int sixel_frame_get_frame_no(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->frame_no; @@ -196,7 +196,7 @@ sixel_frame_get_frame_no(sixel_frame_t /* in */ *frame) /* frame object */ /* get loop no */ -int +SIXELAPI int sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame) /* frame object */ { return frame->loop_count; @@ -204,7 +204,7 @@ sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame) /* frame object */ /* set palette */ -void +SIXELAPI void sixel_frame_set_palette( sixel_frame_t /* in */ *frame, /* frame object */ unsigned char /* in */ *palette, @@ -215,8 +215,8 @@ sixel_frame_set_palette( } -int -sixel_strip_alpha( +SIXELAPI int +sixel_frame_strip_alpha( sixel_frame_t /* in */ *frame, unsigned char /* in */ *bgcolor ) @@ -263,7 +263,7 @@ sixel_strip_alpha( } -int +SIXELAPI int sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) { unsigned char *normalized_pixels = NULL; @@ -349,7 +349,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) } -int +SIXELAPI int sixel_frame_resize( sixel_frame_t *frame, int width, @@ -430,7 +430,7 @@ clip(unsigned char *pixels, } -int +SIXELAPI int sixel_frame_clip( sixel_frame_t *frame, int x, diff --git a/src/fromsixel.c b/src/fromsixel.c index 143cb430..c81f6463 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -207,7 +207,7 @@ sixel_getparams(unsigned char *p, int *param, int *len) /* convert sixel data into indexed pixel bytes and palette data */ /* TODO: make "free" function as an argument */ -int +SIXELAPI int sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ int /* in */ len, /* size of sixel bytes */ unsigned char /* out */ **pixels, /* decoded pixels */ diff --git a/src/loader.c b/src/loader.c index 822af9f7..79e5137b 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1035,7 +1035,7 @@ load_with_builtin( } } - ret = sixel_strip_alpha(frame, bgcolor); + ret = sixel_frame_strip_alpha(frame, bgcolor); if (ret != 0) { goto error; } @@ -1367,7 +1367,7 @@ load_with_gd( /* load image from file */ -int +SIXELAPI int sixel_helper_load_image_file( char const /* in */ *filename, /* source file name */ int /* in */ fstatic, /* whether to extract static image */ diff --git a/src/output.c b/src/output.c index 9ac0e2e2..fa683dfa 100644 --- a/src/output.c +++ b/src/output.c @@ -23,10 +23,10 @@ #include #include #include "output.h" -#include "sixel.h" +#include -sixel_output_t * +SIXELAPI sixel_output_t * sixel_output_create(sixel_write_function fn_write, void *priv) { sixel_output_t *output; @@ -54,14 +54,14 @@ sixel_output_create(sixel_write_function fn_write, void *priv) } -void +SIXELAPI void sixel_output_destroy(sixel_output_t *output) { free(output); } -void +SIXELAPI void sixel_output_ref(sixel_output_t *output) { /* TODO: be thread-safe */ @@ -69,7 +69,7 @@ sixel_output_ref(sixel_output_t *output) } -void +SIXELAPI void sixel_output_unref(sixel_output_t *output) { /* TODO: be thread-safe */ @@ -79,42 +79,42 @@ sixel_output_unref(sixel_output_t *output) } -int +SIXELAPI int sixel_output_get_8bit_availability(sixel_output_t *output) { return output->has_8bit_control; } -void +SIXELAPI void sixel_output_set_8bit_availability(sixel_output_t *output, int availability) { output->has_8bit_control = availability; } -void +SIXELAPI void sixel_output_set_penetrate_multiplexer(sixel_output_t *output, int penetrate) { output->penetrate_multiplexer = penetrate; } -void +SIXELAPI void sixel_output_set_skip_dcs_envelope(sixel_output_t *output, int skip) { output->skip_dcs_envelope = skip; } -void +SIXELAPI void sixel_output_set_palette_type(sixel_output_t *output, int palettetype) { output->palette_type = palettetype; } -void +SIXELAPI void sixel_output_set_encode_policy(sixel_output_t *output, int encode_policy) { output->encode_policy = encode_policy; diff --git a/src/pixelformat.c b/src/pixelformat.c index 3c097a15..61288e2d 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -106,7 +106,7 @@ get_rgb(unsigned char const *data, } -int +SIXELAPI int sixel_helper_compute_depth(int pixelformat) { int depth = (-1); /* unknown */ @@ -222,7 +222,7 @@ expand_palette(unsigned char *dst, unsigned char const *src, } -int +SIXELAPI int sixel_helper_normalize_pixelformat( unsigned char /* out */ *dst, /* destination buffer */ int /* out */ *dst_pixelformat, /* converted pixelformat */ diff --git a/src/quant.c b/src/quant.c index 796031d6..48089b47 100644 --- a/src/quant.c +++ b/src/quant.c @@ -1086,7 +1086,7 @@ lookup_mono_lightbg(unsigned char const * const pixel, } -unsigned char * +SIXELAPI unsigned char * sixel_quant_make_palette(unsigned char const *data, int length, int pixelformat, @@ -1126,7 +1126,7 @@ sixel_quant_make_palette(unsigned char const *data, } -int +SIXELAPI int sixel_quant_apply_palette(unsigned char *data, int width, int height, @@ -1280,7 +1280,7 @@ sixel_quant_apply_palette(unsigned char *data, } -void +SIXELAPI void sixel_quant_free_palette(unsigned char * data) { free(data); diff --git a/src/scale.c b/src/scale.c index 64ef39aa..7c114726 100644 --- a/src/scale.c +++ b/src/scale.c @@ -303,7 +303,7 @@ scale_with_resampling( } -int +SIXELAPI int sixel_helper_scale_image( unsigned char /* out */ *dst, unsigned char const /* in */ *src, /* source image data */ diff --git a/src/tosixel.c b/src/tosixel.c index b2c9f4cd..fec50bc1 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -1225,7 +1225,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, } -int +SIXELAPI int sixel_encode(unsigned char /* in */ *pixels, /* pixel bytes */ int /* in */ width, /* image width */ int /* in */ height, /* image height */ diff --git a/src/writer.c b/src/writer.c index c93a4006..0285cf55 100644 --- a/src/writer.c +++ b/src/writer.c @@ -222,7 +222,7 @@ write_png_to_file( } -int +SIXELAPI int sixel_helper_write_image_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ From 0ff3af49bdd6d4fd9893c33df32b2d8509999716 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 18:43:38 +0900 Subject: [PATCH 222/451] Strip --with-curl from package.json --- package.json.in.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json.in.in b/package.json.in.in index 35c1781f..6d6d57be 100644 --- a/package.json.in.in +++ b/package.json.in.in @@ -5,5 +5,5 @@ "description": "@PACKAGE_DESCRIPTION@", "keywords": ["terminal", "graphics", "image", "sixel"], "license": "MIT", - "install": "./configure --with-libcurl && make install" + "install": "./configure && make install" } From 4c8944aac1f755ae17e52bc80aabe63e0c8ee10e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 20:52:01 +0900 Subject: [PATCH 223/451] Add tests for invalid permission file --- converters/Makefile.am | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 4b00e585..71c4266b 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -13,7 +13,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe testfile if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel @@ -41,6 +41,11 @@ test: all test_impl test_impl: if WANT_IMG2SIXEL + touch testfile + chmod -r testfile + test ! $$($(WINE) ./img2sixel testfile) + test ! $$($(WINE) ./img2sixel invalid_filename) + test ! $$($(WINE) ./img2sixel .) test ! $$($(WINE) ./img2sixel -d invalid_option) test ! $$($(WINE) ./img2sixel -r invalid_option) test ! $$($(WINE) ./img2sixel -s invalid_option) @@ -57,7 +62,6 @@ if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -B \#0000000000000) test ! $$($(WINE) ./img2sixel -B \#00G) test ! $$($(WINE) ./img2sixel -%) - test ! $$($(WINE) ./img2sixel invalid_filename) test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) test ! $$($(WINE) ./img2sixel -m ../images/map8.png -e ../images/snake.jpg) From 64470ca6544929d2b39508dbf44a2d34a123d416 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 21:46:54 +0900 Subject: [PATCH 224/451] Suppress an unused-parameter gcc warning --- src/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/loader.c b/src/loader.c index 5efb85e7..f0d87e4e 100644 --- a/src/loader.c +++ b/src/loader.c @@ -328,6 +328,7 @@ get_chunk_from_url( # else (void) url; (void) pchunk; + (void) finsecure; fprintf(stderr, "To specify URI schemes, you have to " "configure this program with --with-libcurl " "option at compile time.\n"); From 20d10da8c667a92649f998d4d1058467affc1407 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 21:55:46 +0900 Subject: [PATCH 225/451] Drop a surplus test for -k option --- converters/Makefile.am | 2 -- 1 file changed, 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 12f9eb9a..6a1bead0 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -210,8 +210,6 @@ if HAVE_CURL sleep 1; \ ./img2sixel -k 'https://localhost:4443/snake.sixel'; \ fi -else - ! $(WINE) ./img2sixel -k < ../images/snake.jpg endif if WANT_SIXEL2PNG test ! $$($(WINE) ./sixel2png -i unknown.sixel) From 0fc60f1fffaefb6ae5c3d1339d26b289758645c7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 21:57:04 +0900 Subject: [PATCH 226/451] Minor fix --- converters/Makefile.in | 1 - 1 file changed, 1 deletion(-) diff --git a/converters/Makefile.in b/converters/Makefile.in index c206c61f..e82250df 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1164,7 +1164,6 @@ test_impl: @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ sleep 1; \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ ./img2sixel -k 'https://localhost:4443/snake.sixel'; \ @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ fi -@HAVE_CURL_FALSE@@WANT_IMG2SIXEL_TRUE@ ! $(WINE) ./img2sixel -k < ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png -i unknown.sixel) @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png -% < snake.sixel) @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png -H From 8c03cff90cc2b20817cf9643f877530a7161288c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 17 May 2015 23:07:22 +0900 Subject: [PATCH 227/451] Cleanup --- Makefile.in | 4 +- configure | 1 + configure.ac | 1 + src/fromgif.c | 223 +++++++++++++++++++++++++------------------------- src/fromgif.h | 20 ++--- 5 files changed, 124 insertions(+), 125 deletions(-) diff --git a/Makefile.in b/Makefile.in index ce25e215..54b873a5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub install-sh \ - ltmain.sh missing + ChangeLog NEWS compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/configure b/configure index 633e34aa..f5e682e4 100755 --- a/configure +++ b/configure @@ -13347,6 +13347,7 @@ for ac_header in memory.h \ stdlib.h \ string.h \ unistd.h \ + stdint.h \ sys/unistd.h \ getopt.h \ sys/types.h \ diff --git a/configure.ac b/configure.ac index 4e85923a..b9a1163f 100644 --- a/configure.ac +++ b/configure.ac @@ -155,6 +155,7 @@ AC_CHECK_HEADERS([memory.h \ stdlib.h \ string.h \ unistd.h \ + stdint.h \ sys/unistd.h \ getopt.h \ sys/types.h \ diff --git a/src/fromgif.c b/src/fromgif.c index e4db4b56..0e7c30ca 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -26,56 +26,50 @@ #include "frame.h" #include - -typedef unsigned char stbi_uc; - -#ifdef _MSC_VER -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; +#if HAVE_STDINT_H +# include #else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef signed short int16_t; +typedef unsigned int uint32_t; +typedef signed int int32_t; #endif -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information +/* + * gif_context_t struct and start_xxx functions + * + * gif_context_t structure is our basic context used by all images, so it + * contains all the IO context, plus some basic image information + */ typedef struct { - stbi__uint32 img_x, img_y; + uint32_t img_x, img_y; int img_n, img_out_n; int buflen; - stbi_uc buffer_start[128]; + uint8_t buffer_start[128]; - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original; -} stbi__context; + uint8_t *img_buffer, *img_buffer_end; + uint8_t *img_buffer_original; +} gif_context_t; typedef struct { - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; + int16_t prefix; + uint8_t first; + uint8_t suffix; +} gif_lzw; typedef struct { - int w,h; - stbi_uc *out; // output buffer (always 4 components) + int w, h; + uint8_t *out; /* output buffer (always 4 components) */ int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][3]; - stbi_uc lpal[256][3]; - stbi__gif_lzw codes[4096]; - stbi_uc *color_table; + uint8_t pal[256][3]; + uint8_t lpal[256][3]; + gif_lzw codes[4096]; + uint8_t *color_table; int parse, step; int lflags; int start_x, start_y; @@ -86,21 +80,21 @@ typedef struct int delay; int is_multiframe; int is_terminated; -} stbi__gif; +} gif_t; -// initialize a memory-decode context +/* initialize a memory-decode context */ static void -start_mem(stbi__context *s, stbi_uc const *buffer, int len) +start_mem(gif_context_t *s, uint8_t const *buffer, int len) { - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = (stbi_uc *) buffer+len; + s->img_buffer = s->img_buffer_original = (uint8_t *) buffer; + s->img_buffer_end = (uint8_t *) buffer+len; } -static -stbi_uc get8(stbi__context *s) +static uint8_t +get8(gif_context_t *s) { if (s->img_buffer < s->img_buffer_end) { return *s->img_buffer++; @@ -109,7 +103,8 @@ stbi_uc get8(stbi__context *s) } -static int get16le(stbi__context *s) +static int +get16le(gif_context_t *s) { int z = get8(s); return z + (get8(s) << 8); @@ -117,7 +112,7 @@ static int get16le(stbi__context *s) static int -stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +gif_getn(gif_context_t *s, uint8_t *buffer, int n) { if (s->img_buffer+n <= s->img_buffer_end) { memcpy(buffer, s->img_buffer, n); @@ -129,14 +124,14 @@ stbi__getn(stbi__context *s, stbi_uc *buffer, int n) static void -stbi__skip(stbi__context *s, int n) +gif_skip(gif_context_t *s, int n) { s->img_buffer += n; } static void -stbi__rewind(stbi__context *s) +gif_rewind(gif_context_t *s) { s->img_buffer = s->img_buffer_original; } @@ -144,9 +139,9 @@ stbi__rewind(stbi__context *s) static void gif_parse_colortable( - stbi__context *s, - stbi_uc pal[256][3], - int num_entries) + gif_context_t /* in */ *s, + uint8_t /* in */ pal[256][3], + int /* in */ num_entries) { int i; @@ -159,9 +154,11 @@ gif_parse_colortable( static int -load_gif_header(stbi__context *s, stbi__gif *g) +load_gif_header( + gif_context_t /* in */ *s, + gif_t /* in */ *g) { - stbi_uc version; + uint8_t version; if (get8(s) != 'G') { return (-1); } @@ -202,11 +199,11 @@ load_gif_header(stbi__context *s, stbi__gif *g) int init_gif_frame( - sixel_frame_t *frame, - stbi__gif *pg, - unsigned char *bgcolor, - int reqcolors, - int fuse_palette) + sixel_frame_t /* in */ *frame, + gif_t /* in */ *pg, + unsigned char /* in */ *bgcolor, + int /* in */ reqcolors, + int /* in */ fuse_palette) { int i; int ncolors; @@ -265,7 +262,7 @@ init_gif_frame( } } if (frame->pixels == NULL) { - fprintf(stderr, "stbi_load_from_file failed.\n"); + fprintf(stderr, "init_gif_frame() failed.\n"); return (-1); } frame->multiframe = (pg->loop_count != (-1)); @@ -276,8 +273,8 @@ init_gif_frame( static void out_gif_code( - stbi__gif *g, - stbi__uint16 code + gif_t /* in */ *g, + uint16_t /* in */ code ) { /* recurse to decode the prefixes, since the linked-list is backwards, @@ -308,15 +305,15 @@ out_gif_code( static int process_gif_raster( - stbi__context *s, - stbi__gif *g + gif_context_t /* in */ *s, + gif_t /* in */ *g ) { - stbi_uc lzw_cs; - stbi__int32 len, code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; + uint8_t lzw_cs; + int32_t len, code; + uint32_t first; + int32_t codesize, codemask, avail, oldcode, bits, valid_bits, clear; + gif_lzw *p; lzw_cs = get8(s); clear = 1 << lzw_cs; @@ -327,41 +324,41 @@ process_gif_raster( valid_bits = 0; for (code = 0; code < clear; code++) { g->codes[code].prefix = -1; - g->codes[code].first = (stbi_uc) code; - g->codes[code].suffix = (stbi_uc) code; + g->codes[code].first = (uint8_t) code; + g->codes[code].suffix = (uint8_t) code; } - // support no starting clear code - avail = clear+2; + /* support no starting clear code */ + avail = clear + 2; oldcode = -1; len = 0; for(;;) { if (valid_bits < codesize) { if (len == 0) { - len = get8(s); // start new block + len = get8(s); /* start new block */ if (len == 0) { return SIXEL_SUCCESS; } } --len; - bits |= (stbi__int32) get8(s) << valid_bits; + bits |= (int32_t) get8(s) << valid_bits; valid_bits += 8; } else { - stbi__int32 code = bits & codemask; + int32_t code = bits & codemask; bits >>= codesize; valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code + /* @OPTIMIZE: is there some way we can accelerate the non-clear path? */ + if (code == clear) { /* clear code */ codesize = lzw_cs + 1; codemask = (1 << codesize) - 1; avail = clear + 2; oldcode = -1; first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); + } else if (code == clear + 1) { /* end of stream code */ + gif_skip(s, len); while ((len = get8(s)) > 0) { - stbi__skip(s,len); + gif_skip(s,len); } return SIXEL_SUCCESS; } else if (code <= avail) { @@ -377,7 +374,7 @@ process_gif_raster( "Corrupt GIF\n" "reason: too many codes\n"); return SIXEL_FAILED; } - p->prefix = (stbi__int16) oldcode; + p->prefix = (int16_t) oldcode; p->first = g->codes[oldcode].first; p->suffix = (code == avail) ? p->first : g->codes[code].first; } else if (code == avail) { @@ -386,7 +383,7 @@ process_gif_raster( return SIXEL_FAILED; } - out_gif_code(g, (stbi__uint16) code); + out_gif_code(g, (uint16_t) code); if ((avail & codemask) == 0 && avail <= 0x0FFF) { codesize++; @@ -407,18 +404,18 @@ process_gif_raster( /* this function is ported from stb_image.h */ static int gif_load_next( - stbi__context *s, - stbi__gif *g, - stbi_uc *bgcolor + gif_context_t /* in */ *s, + gif_t /* in */ *g, + uint8_t /* in */ *bgcolor ) { - stbi_uc buffer[256]; + uint8_t buffer[256]; for (;;) { switch (get8(s)) { case 0x2C: /* Image Descriptor */ { - stbi__int32 x, y, w, h; + int32_t x, y, w, h; x = get16le(s); y = get16le(s); @@ -452,9 +449,8 @@ gif_load_next( gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7)); - g->color_table = (stbi_uc *) g->lpal; + g->color_table = (uint8_t *) g->lpal; } else if (g->flags & 0x80) { - /* @OPTIMIZE: stbi__jpeg_reset only the previous transparent */ if (g->transparent >= 0 && (g->eflags & 0x01)) { if (bgcolor) { g->pal[g->transparent][0] = bgcolor[2]; @@ -462,7 +458,7 @@ gif_load_next( g->pal[g->transparent][2] = bgcolor[0]; } } - g->color_table = (stbi_uc *)g->pal; + g->color_table = (uint8_t *)g->pal; } else { fprintf(stderr, "Corrupt GIF.\n" "reason: missing color table.\n"); @@ -472,28 +468,28 @@ gif_load_next( return process_gif_raster(s, g); } - case 0x21: // Comment Extension. + case 0x21: /* Comment Extension. */ { int len; switch (get8(s)) { - case 0x01: // Plain Text Extension + case 0x01: /* Plain Text Extension */ break; - case 0x21: // Comment Extension + case 0x21: /* Comment Extension */ break; - case 0xF9: // Graphic Control Extension - len = get8(s); // block size + case 0xF9: /* Graphic Control Extension */ + len = get8(s); /* block size */ if (len == 4) { g->eflags = get8(s); - g->delay = get16le(s); // delay + g->delay = get16le(s); /* delay */ g->transparent = get8(s); } else { - stbi__skip(s, len); + gif_skip(s, len); break; } break; - case 0xFF: // Application Extension - len = get8(s); // block size - stbi__getn(s, buffer, len); + case 0xFF: /* Application Extension */ + len = get8(s); /* block size */ + gif_getn(s, buffer, len); buffer[len] = 0; if (len == 11 && strcmp((char *)buffer, "NETSCAPE2.0") == 0) { if (get8(s) == 0x03) { @@ -513,12 +509,12 @@ gif_load_next( break; } while ((len = get8(s)) != 0) { - stbi__skip(s, len); + gif_skip(s, len); } break; } - case 0x3B: // gif stream termination code + case 0x3B: /* gif stream termination code */ g->is_terminated = 1; return SIXEL_SUCCESS; @@ -534,19 +530,20 @@ gif_load_next( int -load_gif(unsigned char *buffer, - int size, - unsigned char *bgcolor, - int reqcolors, - int fuse_palette, - int fstatic, - int loop_control, - sixel_load_image_function /* in */ fn_load, /* callback */ - void /* in/out */ *context /* private data for callback */ +load_gif( + unsigned char /* in */ *buffer, + int /* in */ size, + unsigned char /* in */ *bgcolor, + int /* in */ reqcolors, + int /* in */ fuse_palette, + int /* in */ fstatic, + int /* in */ loop_control, + void /* in */ *fn_load, /* callback */ + void /* in */ *context /* private data for callback */ ) { - stbi__context s; - stbi__gif g; + gif_context_t s; + gif_t g; int ret; sixel_frame_t *frame; @@ -562,7 +559,7 @@ load_gif(unsigned char *buffer, } frame->width = g.w, frame->height = g.h, - g.out = (stbi_uc *)malloc(g.w * g.h); + g.out = (uint8_t *)malloc(g.w * g.h); if (g.out == NULL) { goto end; } @@ -573,7 +570,7 @@ load_gif(unsigned char *buffer, frame->frame_no = 0; - stbi__rewind(&s); + gif_rewind(&s); ret = load_gif_header(&s, &g); if (ret != 0) { goto end; @@ -595,7 +592,7 @@ load_gif(unsigned char *buffer, goto end; } - ret = fn_load(frame, context); + ret = ((sixel_load_image_function)fn_load)(frame, context); if (ret != 0) { goto end; } diff --git a/src/fromgif.h b/src/fromgif.h index 9e01f0b9..ee71b8a8 100644 --- a/src/fromgif.h +++ b/src/fromgif.h @@ -27,17 +27,17 @@ extern "C" { #endif /* load gif */ - int -load_gif(unsigned char *buffer, - int size, - unsigned char *bgcolor, - int reqcolors, - int fuse_palette, - int fstatic, - int loop_control, - void /* in */ *fn_load, /* callback */ - void /* in/out */ *context /* private data for callback */ +load_gif( + unsigned char /* in */ *buffer, + int /* in */ size, + unsigned char /* in */ *bgcolor, + int /* in */ reqcolors, + int /* in */ fuse_palette, + int /* in */ fstatic, + int /* in */ loop_control, + void /* in */ *fn_load, /* callback */ + void /* in */ *context /* private data for callback */ ); #ifdef __cplusplus From b1ed37398797a670867372e462f0e687fa3b5ceb Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 18 May 2015 01:52:14 +0900 Subject: [PATCH 228/451] Run unittests on travis --- Makefile.am | 3 ++- Makefile.in | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 61d18bc0..bc38301d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,7 +18,8 @@ unittest: all cd src && $(MAKE) unittest 2>&1 |tee unittest.log test: all - cd converters && $(MAKE) test 2>&1 |tee ../test.log + cd src && $(MAKE) unittest 2>&1 |tee ../test.log + cd converters && $(MAKE) test 2>&1 |tee -a ../test.log winetest: all cd converters && $(MAKE) winetest diff --git a/Makefile.in b/Makefile.in index 64a2b4b9..e48c58bd 100644 --- a/Makefile.in +++ b/Makefile.in @@ -902,7 +902,8 @@ unittest: all cd src && $(MAKE) unittest 2>&1 |tee unittest.log test: all - cd converters && $(MAKE) test 2>&1 |tee ../test.log + cd src && $(MAKE) unittest 2>&1 |tee ../test.log + cd converters && $(MAKE) test 2>&1 |tee -a ../test.log winetest: all cd converters && $(MAKE) winetest From bc99c7c1d4462a12b9a49e2a4f6c4ebce6740dd9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 18 May 2015 02:23:16 +0900 Subject: [PATCH 229/451] Add tests for pixelformat --- Makefile.in | 4 +-- src/Makefile.am | 3 +- src/Makefile.in | 90 ++++++++++++----------------------------------- src/dither.h | 1 + src/encoder.c | 50 ++++++++++++++++++++++++++ src/encoder.h | 5 +++ src/pixelformat.c | 57 ++++++++++++++++++++++++++++++ src/tests.c | 6 ++++ 8 files changed, 146 insertions(+), 70 deletions(-) diff --git a/Makefile.in b/Makefile.in index e48c58bd..2d71ec09 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing + ChangeLog NEWS compile config.guess config.sub install-sh \ + ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/src/Makefile.am b/src/Makefile.am index ca1230a3..33f68368 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,6 +17,7 @@ libsixel_la_SOURCES = output.c \ frame.c \ frame.h \ pixelformat.c \ + pixelformat.h \ scale.c \ loader.c \ frompnm.c \ @@ -47,7 +48,7 @@ libsixel_la_LIBADD = -lm \ $(GD_LIBS) if COND_TESTS -bin_PROGRAMS = tests +noinst_PROGRAMS = tests tests_SOURCES = tests.c tests_CPPFLAGS = -I$(top_builddir)/include/ \ -I$(top_builddir)/src/ $(AM_CPPFLAGS) diff --git a/src/Makefile.in b/src/Makefile.in index 568e5d39..049e0fc1 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -89,7 +89,7 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -@COND_TESTS_TRUE@bin_PROGRAMS = tests$(EXEEXT) +@COND_TESTS_TRUE@noinst_PROGRAMS = tests$(EXEEXT) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ @@ -131,8 +131,7 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(man5dir)" +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man5dir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libsixel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ @@ -154,7 +153,7 @@ am__v_lt_1 = libsixel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libsixel_la_CFLAGS) \ $(CFLAGS) $(libsixel_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(bin_PROGRAMS) +PROGRAMS = $(noinst_PROGRAMS) am__tests_SOURCES_DIST = tests.c @COND_TESTS_TRUE@am_tests_OBJECTS = tests-tests.$(OBJEXT) tests_OBJECTS = $(am_tests_OBJECTS) @@ -380,6 +379,7 @@ libsixel_la_SOURCES = output.c \ frame.c \ frame.h \ pixelformat.c \ + pixelformat.h \ scale.c \ loader.c \ frompnm.c \ @@ -489,49 +489,9 @@ clean-libLTLIBRARIES: libsixel.la: $(libsixel_la_OBJECTS) $(libsixel_la_DEPENDENCIES) $(EXTRA_libsixel_la_DEPENDENCIES) $(AM_V_CCLD)$(libsixel_la_LINK) -rpath $(libdir) $(libsixel_la_OBJECTS) $(libsixel_la_LIBADD) $(LIBS) -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - || test -f $$p1 \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ @@ -840,10 +800,8 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) -install-binPROGRAMS: install-libLTLIBRARIES - installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man5dir)"; do \ + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man5dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -879,8 +837,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool mostlyclean-am +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -906,7 +864,7 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES +install-exec-am: install-libLTLIBRARIES install-html: install-html-am @@ -946,29 +904,27 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ - uninstall-man +uninstall-am: uninstall-libLTLIBRARIES uninstall-man uninstall-man: uninstall-man5 .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ - clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool cscopelist-am ctags ctags-am distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES install-man \ - install-man5 install-pdf install-pdf-am install-ps \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-man5 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ - uninstall-man uninstall-man5 + uninstall-am uninstall-libLTLIBRARIES uninstall-man \ + uninstall-man5 .PRECIOUS: Makefile diff --git a/src/dither.h b/src/dither.h index 964d409f..7574b826 100644 --- a/src/dither.h +++ b/src/dither.h @@ -52,6 +52,7 @@ unsigned char * sixel_dither_apply_palette(sixel_dither_t *dither, unsigned char *pixels, int width, int height); + #if HAVE_TESTS int sixel_dither_tests_main(void); diff --git a/src/encoder.c b/src/encoder.c index 0bb8630c..c5b792bb 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1447,6 +1447,56 @@ sixel_encoder_encode( return nret; } + +#if HAVE_TESTS +static int +test1(void) +{ + sixel_encoder_t *encoder = NULL; + int nret = EXIT_FAILURE; + + encoder = sixel_encoder_create(); + if (encoder == NULL) { + perror(NULL); + goto error; + } + sixel_encoder_ref(encoder); + sixel_encoder_unref(encoder); + nret = EXIT_SUCCESS; + +error: + sixel_encoder_unref(encoder); + return nret; +} + + +int +sixel_encoder_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + perror(NULL); + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/encoder.h b/src/encoder.h index fd8907b1..745524e0 100644 --- a/src/encoder.h +++ b/src/encoder.h @@ -63,6 +63,11 @@ typedef struct sixel_encoder { int *cancel_flag; } sixel_encoder_t; +#if HAVE_TESTS +int +sixel_encoder_tests_main(void); +#endif + #endif /* LIBSIXEL_EASY_ENCODE_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/pixelformat.c b/src/pixelformat.c index 61288e2d..0218c73e 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -23,6 +23,7 @@ #include "sixel.h" #include +#include #include @@ -271,6 +272,62 @@ sixel_helper_normalize_pixelformat( return 0; } + +#if HAVE_TESTS +static int +test1(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + unsigned char src_rgb888[] = { 0x46, 0xf3, 0xe5 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src_rgb888, + PIXELFORMAT_RGB888, + 1, + 1); + if (ret != 0) { + perror(NULL); + goto error; + } + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +int +sixel_pixelformat_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + perror(NULL); + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/tests.c b/src/tests.c index c163543f..d7a28ea2 100644 --- a/src/tests.c +++ b/src/tests.c @@ -33,6 +33,7 @@ #include "dither.h" #include "quant.h" +#include "pixelformat.h" #include #if HAVE_TESTS @@ -49,6 +50,11 @@ main(int argc, char *argv[]) if (nret != EXIT_SUCCESS) { goto error; } + + nret = sixel_pixelformat_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } puts("done."); error: return nret; From 1c30b9e9dad8227a97a04ad1b0efb08610f104a6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 18 May 2015 04:42:12 +0900 Subject: [PATCH 230/451] Add more tests for pixelformat.c --- src/pixelformat.c | 274 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 265 insertions(+), 9 deletions(-) diff --git a/src/pixelformat.c b/src/pixelformat.c index 0218c73e..1c82b247 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -36,8 +36,10 @@ get_rgb(unsigned char const *data, unsigned char *b) { unsigned int pixels = 0; +#if SWAP_BYTES unsigned int low; unsigned int high; +#endif int count = 0; while (count < depth) { @@ -46,11 +48,13 @@ get_rgb(unsigned char const *data, } /* TODO: we should swap bytes (only necessary on LSByte first hardware?) */ +#if SWAP_BYTES if (depth == 2) { low = pixels & 0xff; high = (pixels >> 8) & 0xff; pixels = (low << 8) | high; } +#endif switch (pixelformat) { case PIXELFORMAT_RGB555: @@ -64,9 +68,9 @@ get_rgb(unsigned char const *data, *b = ((pixels >> 0) & 0x1f) << 3; break; case PIXELFORMAT_RGB888: - *r = (pixels >> 0) & 0xff; + *r = (pixels >> 16) & 0xff; *g = (pixels >> 8) & 0xff; - *b = (pixels >> 16) & 0xff; + *b = (pixels >> 0) & 0xff; break; case PIXELFORMAT_BGR555: *r = ((pixels >> 0) & 0x1f) << 3; @@ -79,9 +83,9 @@ get_rgb(unsigned char const *data, *b = ((pixels >> 11) & 0x1f) << 3; break; case PIXELFORMAT_BGR888: - *r = (pixels >> 16) & 0xff; + *r = (pixels >> 0) & 0xff; *g = (pixels >> 8) & 0xff; - *b = (pixels >> 0) & 0xff; + *b = (pixels >> 16) & 0xff; break; case PIXELFORMAT_RGBA8888: *r = (pixels >> 24) & 0xff; @@ -279,24 +283,269 @@ test1(void) { unsigned char dst[3]; int dst_pixelformat = PIXELFORMAT_RGB888; - unsigned char src_rgb888[] = { 0x46, 0xf3, 0xe5 }; + int src_pixelformat = PIXELFORMAT_RGB888; + unsigned char src[] = { 0x46, 0xf3, 0xe5 }; int ret = 0; int nret = EXIT_FAILURE; ret = sixel_helper_normalize_pixelformat(dst, &dst_pixelformat, - src_rgb888, - PIXELFORMAT_RGB888, + src, + src_pixelformat, 1, 1); if (ret != 0) { - perror(NULL); goto error; } - nret = EXIT_SUCCESS; + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if ((dst[0] << 16 | dst[1] << 8 | dst[2]) != (src[0] << 16 | src[1] << 8 | src[2])) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test1"); + return nret; +} + + +static int +test2(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_RGB555; + unsigned char src[] = { 0x47, 0x9c }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if ((dst[0] >> 3 << 10 | dst[1] >> 3 << 5 | dst[2] >> 3) != (src[0] << 8 | src[1])) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test2"); + return nret; +} + + +static int +test3(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_RGB565; + unsigned char src[] = { 0x47, 0x9c }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if ((dst[0] >> 3 << 11 | dst[1] >> 2 << 5 | dst[2] >> 3) != (src[0] << 8 | src[1])) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test3"); + return nret; +} + + +static int +test4(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_BGR888; + unsigned char src[] = { 0x46, 0xf3, 0xe5 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if ((dst[2] << 16 | dst[1] << 8 | dst[0]) != (src[0] << 16 | src[1] << 8 | src[2])) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test4"); + return nret; +} + + +static int +test5(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_BGR555; + unsigned char src[] = { 0x23, 0xc8 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if ((dst[2] >> 3 << 10 | dst[1] >> 3 << 5 | dst[0] >> 3) != (src[0] << 8 | src[1])) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test5"); + return nret; +} + + +static int +test6(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_BGR565; + unsigned char src[] = { 0x47, 0x88 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if ((dst[2] >> 3 << 11 | dst[1] >> 2 << 5 | dst[0] >> 3) != (src[0] << 8 | src[1])) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test6"); + return nret; +} + + +static int +test7(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_AG88; + unsigned char src[] = { 0x47, 0x88 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if (dst[0] != src[1]) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test7"); + return nret; +} + + +static int +test8(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_GA88; + unsigned char src[] = { 0x47, 0x88 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if (dst[0] != src[0]) { + goto error; + } + return EXIT_SUCCESS; error: + perror("test8"); return nret; } @@ -310,6 +559,13 @@ sixel_pixelformat_tests_main(void) static testcase const testcases[] = { test1, + test2, + test3, + test4, + test5, + test6, + test7, + test8, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From f1431e10612134100976da76b647482975abca35 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 18 May 2015 09:08:14 +0900 Subject: [PATCH 231/451] Add missing header file pixelformat.h --- src/pixelformat.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/pixelformat.h diff --git a/src/pixelformat.h b/src/pixelformat.h new file mode 100644 index 00000000..60c7ecf6 --- /dev/null +++ b/src/pixelformat.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_PIXELFORMAT_H +#define LIBSIXEL_PIXELFORMAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if HAVE_TESTS +int +sixel_pixelformat_tests_main(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_PIXELFORMAT_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 4ca493015730e2e910f45116267bdf8174e0f5a4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 19 May 2015 01:48:04 +0900 Subject: [PATCH 232/451] Add more tests for pixelformat.c --- src/pixelformat.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/src/pixelformat.c b/src/pixelformat.c index 1c82b247..4979b9f5 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -21,11 +21,11 @@ #include "config.h" -#include "sixel.h" #include #include #include +#include static void get_rgb(unsigned char const *data, @@ -550,6 +550,86 @@ test8(void) } +static int +test9(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_RGBA8888; + unsigned char src[] = { 0x46, 0xf3, 0xe5, 0xf0 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if (dst[0] != src[0]) { + goto error; + } + if (dst[1] != src[1]) { + goto error; + } + if (dst[2] != src[2]) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test8"); + return nret; +} + + +static int +test10(void) +{ + unsigned char dst[3]; + int dst_pixelformat = PIXELFORMAT_RGB888; + int src_pixelformat = PIXELFORMAT_ARGB8888; + unsigned char src[] = { 0x46, 0xf3, 0xe5, 0xf0 }; + int ret = 0; + + int nret = EXIT_FAILURE; + + ret = sixel_helper_normalize_pixelformat(dst, + &dst_pixelformat, + src, + src_pixelformat, + 1, + 1); + if (ret != 0) { + goto error; + } + if (dst_pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + if (dst[0] != src[1]) { + goto error; + } + if (dst[1] != src[2]) { + goto error; + } + if (dst[2] != src[3]) { + goto error; + } + return EXIT_SUCCESS; + +error: + perror("test8"); + return nret; +} + + int sixel_pixelformat_tests_main(void) { @@ -566,6 +646,8 @@ sixel_pixelformat_tests_main(void) test6, test7, test8, + test9, + test10, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From ba4c078cd88f3883d730043e85175c93f70687d4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 19 May 2015 19:57:09 +0900 Subject: [PATCH 233/451] Add initial test of frame.c --- src/dither.h | 2 +- src/frame.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/frame.h | 5 +++++ src/tests.c | 11 +++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/dither.h b/src/dither.h index 7574b826..8a23c1a3 100644 --- a/src/dither.h +++ b/src/dither.h @@ -55,7 +55,7 @@ sixel_dither_apply_palette(sixel_dither_t *dither, #if HAVE_TESTS int -sixel_dither_tests_main(void); +sixel_frame_tests_main(void); #endif #ifdef __cplusplus diff --git a/src/frame.c b/src/frame.c index cc9fc2d7..43c14c81 100644 --- a/src/frame.c +++ b/src/frame.c @@ -482,6 +482,55 @@ sixel_frame_clip( } +#if HAVE_TESTS +static int +test1(void) +{ + sixel_frame_t *frame = NULL; + int nret = EXIT_FAILURE; + + frame = sixel_frame_create(); + if (frame == NULL) { + perror(NULL); + goto error; + } + sixel_frame_ref(frame); + sixel_frame_unref(frame); + nret = EXIT_SUCCESS; + +error: + sixel_frame_unref(frame); + return nret; +} + + +int +sixel_frame_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + perror(NULL); + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/frame.h b/src/frame.h index 7cb19880..e3d7fa93 100644 --- a/src/frame.h +++ b/src/frame.h @@ -42,6 +42,11 @@ typedef struct sixel_frame { sixel_frame_t * sixel_frame_create(void); +#if HAVE_TESTS +int +sixel_dither_tests_main(void); +#endif + #ifdef __cplusplus } #endif diff --git a/src/tests.c b/src/tests.c index d7a28ea2..be245590 100644 --- a/src/tests.c +++ b/src/tests.c @@ -33,6 +33,7 @@ #include "dither.h" #include "quant.h" +#include "frame.h" #include "pixelformat.h" #include @@ -51,10 +52,20 @@ main(int argc, char *argv[]) goto error; } + puts("done."); + nret = sixel_pixelformat_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } + + puts("done."); + + nret = sixel_frame_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + puts("done."); error: return nret; From 815cad806ba1c576b90dd704130161b39654fa4c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 20 May 2015 01:34:04 +0900 Subject: [PATCH 234/451] Add more tests for frame.c --- converters/Makefile.in | 23 +++++++++++------ src/frame.c | 58 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/converters/Makefile.in b/converters/Makefile.in index e82250df..91d9755e 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -998,6 +998,11 @@ check: test_impl test: all test_impl test_impl: +@WANT_IMG2SIXEL_TRUE@ touch testfile +@WANT_IMG2SIXEL_TRUE@ chmod -r testfile +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel testfile) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel invalid_filename) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel .) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -d invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -r invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -s invalid_option) @@ -1010,8 +1015,10 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -b invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -E invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B invalid_option) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#00000) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#0000000000000) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#00G) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -%) -@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel invalid_filename) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -e ../images/snake.jpg) @@ -1030,19 +1037,19 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -V @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 < ../images/snake.jpg > snake3.sixel -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -djajuni -rnearest < ../images/snake.gif +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 -o snake3.sixel < ../images/snake.jpg +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -djajuni -B\#000000000 -rnearest < ../images/snake.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p300 -8 -scenter -Brgb:0/f/A -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -8 -qauto -thls -e ../images/snake.pgm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -8 -m ../images/map8-palette.png -Esize ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -m ../images/map16-palette.png -Efast ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w300 ../images/snake-palette.png -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B\#aB3 ../images/snake.pbm -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -dstucki -thls ../images/snake.ppm +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -w100 -h100 -bxterm16 -B\#aB3 -B\#aB3 ../images/snake.pbm +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -dstucki -thls -B\#a0B030 ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340color ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340mono ../images/snake.tga -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -8 -dburkes ../images/snake-ascii.ppm +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -8 -dburkes -Bffffffffffff ../images/snake-ascii.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -C10 -djajuni ../images/snake.png @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -Eauto ../images/snake-ascii.pgm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -datkinson ../images/snake-ascii.pbm @@ -1053,9 +1060,9 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c200x200+100+100 -w400 ../images/snake-grayscale.png @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I ../images/snake-grayscale.png @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I ../images/snake-grayscale.jpg -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -m ../images/map8.six ../images/snake.six +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -m ../images/map8.six -m ../images/map8.six ../images/snake.six @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w200 -p8 ../images/snake.six -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c200x200+100+100 ../images/snake.six +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -c200x200+2000+2000 ../images/snake.six @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bxterm16 ../images/snake.six @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -e ../images/snake.six @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I ../images/snake.six diff --git a/src/frame.c b/src/frame.c index 43c14c81..612b85d3 100644 --- a/src/frame.c +++ b/src/frame.c @@ -504,6 +504,63 @@ test1(void) } +static int +test2(void) +{ + sixel_frame_t *frame = NULL; + int nret = EXIT_FAILURE; + unsigned char *pixels = malloc(4); + unsigned char *bgcolor = malloc(3); + int ret; + + pixels[0] = 0x43; + pixels[1] = 0x89; + pixels[2] = 0x97; + pixels[3] = 0x32; + + memset(bgcolor, 0x10, 3); + + frame = sixel_frame_create(); + if (frame == NULL) { + perror(NULL); + goto error; + } + + ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); + if (ret != 0) { + perror(NULL); + goto error; + } + + ret = sixel_frame_strip_alpha(frame, bgcolor); + if (ret != 0) { + perror(NULL); + goto error; + } + + if (frame->pixels[0] != (0x43 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { + perror(NULL); + goto error; + } + + if (frame->pixels[1] != (0x89 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { + perror(NULL); + goto error; + } + + if (frame->pixels[2] != (0x97 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { + perror(NULL); + goto error; + } + + nret = EXIT_SUCCESS; + +error: + sixel_frame_unref(frame); + return nret; +} + + int sixel_frame_tests_main(void) { @@ -513,6 +570,7 @@ sixel_frame_tests_main(void) static testcase const testcases[] = { test1, + test2, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From 6c6aa95aa5fae4d913ee7b15434ed87c2181c96e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 20 May 2015 01:42:23 +0900 Subject: [PATCH 235/451] sixel2png: Add test of specifing invalid output file name --- converters/Makefile.am | 1 + converters/Makefile.in | 1 + 2 files changed, 2 insertions(+) diff --git a/converters/Makefile.am b/converters/Makefile.am index 9b0392bb..434110c8 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -221,6 +221,7 @@ endif if WANT_SIXEL2PNG test ! $$($(WINE) ./sixel2png -i unknown.sixel) test ! $$($(WINE) ./sixel2png -% < snake.sixel) + test ! $$($(WINE) ./sixel2png invalid_filename < snake.sixel) $(WINE) ./sixel2png -H $(WINE) ./sixel2png -V $(WINE) ./sixel2png < snake.sixel > snake1.png diff --git a/converters/Makefile.in b/converters/Makefile.in index 91d9755e..23455c79 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1173,6 +1173,7 @@ test_impl: @HAVE_CURL_TRUE@@WANT_IMG2SIXEL_TRUE@ fi @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png -i unknown.sixel) @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png -% < snake.sixel) +@WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ test ! $$($(WINE) ./sixel2png invalid_filename < snake.sixel) @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png -H @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png -V @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png < snake.sixel > snake1.png From 5f0fd6aacff8fcfb7b515af70ba7f137627bba95 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 20 May 2015 01:52:55 +0900 Subject: [PATCH 236/451] Add initial tests for writer.c --- src/Makefile.am | 4 +++- src/Makefile.in | 4 +++- src/tests.c | 8 ++++++++ src/writer.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/writer.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 src/writer.h diff --git a/src/Makefile.am b/src/Makefile.am index 33f68368..0b849517 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,7 +6,8 @@ endif CLEANFILES = *.gcno *.gcda *.gcov *.log lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c \ +libsixel_la_SOURCES = \ + output.c \ output.h \ fromsixel.c \ tosixel.c \ @@ -30,6 +31,7 @@ libsixel_la_SOURCES = output.c \ decoder.h \ stb_image.h \ writer.c \ + writer.h \ stb_image_write.c \ stb_image_write.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ diff --git a/src/Makefile.in b/src/Makefile.in index 049e0fc1..52b7699f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -368,7 +368,8 @@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage CLEANFILES = *.gcno *.gcda *.gcov *.log lib_LTLIBRARIES = libsixel.la -libsixel_la_SOURCES = output.c \ +libsixel_la_SOURCES = \ + output.c \ output.h \ fromsixel.c \ tosixel.c \ @@ -392,6 +393,7 @@ libsixel_la_SOURCES = output.c \ decoder.h \ stb_image.h \ writer.c \ + writer.h \ stb_image_write.c \ stb_image_write.h diff --git a/src/tests.c b/src/tests.c index be245590..a461b0b1 100644 --- a/src/tests.c +++ b/src/tests.c @@ -35,6 +35,7 @@ #include "quant.h" #include "frame.h" #include "pixelformat.h" +#include "writer.h" #include #if HAVE_TESTS @@ -67,6 +68,13 @@ main(int argc, char *argv[]) } puts("done."); + + nret = sixel_writer_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("done."); error: return nret; } diff --git a/src/writer.c b/src/writer.c index 0285cf55..e36bd1b2 100644 --- a/src/writer.c +++ b/src/writer.c @@ -259,6 +259,55 @@ sixel_helper_write_image_file( } +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + int ret; + unsigned char pixels[] = {0xff, 0xff, 0xff}; + + ret = sixel_helper_write_image_file( + pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); + + if (ret != (-1)) { + perror(NULL); + goto error; + } + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +int +sixel_writer_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + perror(NULL); + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/writer.h b/src/writer.h new file mode 100644 index 00000000..07f03530 --- /dev/null +++ b/src/writer.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_WRITER_H +#define LIBSIXEL_WRITER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if HAVE_TESTS +int +sixel_writer_tests_main(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_WRITER_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 724dfb1e16aae5506ee702729084bfd34c066a9f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 20 May 2015 01:57:51 +0900 Subject: [PATCH 237/451] Add more test cases for writer.c --- src/Makefile.am | 2 +- src/Makefile.in | 2 +- src/writer.c | 22 ++++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 0b849517..5b1ce872 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,7 +3,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.log +CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ diff --git a/src/Makefile.in b/src/Makefile.in index 52b7699f..b08fb3d7 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -366,7 +366,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.log +CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ output.c \ diff --git a/src/writer.c b/src/writer.c index e36bd1b2..38296015 100644 --- a/src/writer.c +++ b/src/writer.c @@ -281,6 +281,27 @@ test1(void) } +static int +test2(void) +{ + int nret = EXIT_FAILURE; + int ret; + unsigned char pixels[] = {0xff, 0xff, 0xff}; + + ret = sixel_helper_write_image_file( + pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); + + if (ret != (-1)) { + perror(NULL); + goto error; + } + nret = EXIT_SUCCESS; + +error: + return nret; +} + + int sixel_writer_tests_main(void) { @@ -290,6 +311,7 @@ sixel_writer_tests_main(void) static testcase const testcases[] = { test1, + test2, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From cff5c9cb1ca2f4152ad851a6dfab99e4426d24db Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 20 May 2015 02:14:05 +0900 Subject: [PATCH 238/451] Fix broken -B option test --- converters/Makefile.am | 6 +++--- converters/Makefile.in | 6 +++--- src/encoder.c | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 434110c8..da9d0d62 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -58,8 +58,8 @@ if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -b invalid_option) test ! $$($(WINE) ./img2sixel -E invalid_option) test ! $$($(WINE) ./img2sixel -B invalid_option) - test ! $$($(WINE) ./img2sixel -B \#00000) - test ! $$($(WINE) ./img2sixel -B \#0000000000000) + test ! $$($(WINE) ./img2sixel -B \#ffff ../images/map8.png) + test ! $$($(WINE) ./img2sixel -B \#0000000000000 ../images/map8.png) test ! $$($(WINE) ./img2sixel -B \#00G) test ! $$($(WINE) ./img2sixel -%) test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @@ -92,7 +92,7 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -I -dstucki -thls -B\#a0B030 ../images/snake.ppm $(WINE) ./img2sixel -bvt340color ../images/snake.ppm $(WINE) ./img2sixel -bvt340mono ../images/snake.tga - $(WINE) ./img2sixel -I -8 -dburkes -Bffffffffffff ../images/snake-ascii.ppm + $(WINE) ./img2sixel -I -8 -dburkes -B\#ffffffffffff ../images/snake-ascii.ppm $(WINE) ./img2sixel -I -C10 -djajuni ../images/snake.png $(WINE) ./img2sixel -I -Eauto ../images/snake-ascii.pgm $(WINE) ./img2sixel -I -datkinson ../images/snake-ascii.pbm diff --git a/converters/Makefile.in b/converters/Makefile.in index 23455c79..9d3225b1 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1015,10 +1015,10 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -b invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -E invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B invalid_option) -@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#00000) -@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#0000000000000) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#0000000000000 ../images/map8.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#00G) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -%) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B ) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -e ../images/snake.jpg) @@ -1049,7 +1049,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -dstucki -thls -B\#a0B030 ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340color ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340mono ../images/snake.tga -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -8 -dburkes -Bffffffffffff ../images/snake-ascii.ppm +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -8 -dburkes -B\#ffffffffffff ../images/snake-ascii.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -C10 -djajuni ../images/snake.png @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -Eauto ../images/snake-ascii.pgm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -datkinson ../images/snake-ascii.pbm diff --git a/src/encoder.c b/src/encoder.c index c5b792bb..ba5af43a 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -177,6 +177,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[2] = (unsigned char)(p[8] << 4 | p[9]); break; default: +printf("%ld --- \n", endptr - p); ret = (-1); goto end; } From b722fcede1a0eafa18c720a926e8330c128d9ce4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 20 May 2015 03:01:07 +0900 Subject: [PATCH 239/451] Strip extra debug code --- src/encoder.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index ba5af43a..c5b792bb 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -177,7 +177,6 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[2] = (unsigned char)(p[8] << 4 | p[9]); break; default: -printf("%ld --- \n", endptr - p); ret = (-1); goto end; } From 143809154f0f11bb85300e52b05a1506ba355456 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 21 May 2015 01:35:50 +0900 Subject: [PATCH 240/451] Add initial tests for quant.c --- src/quant.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/quant.h | 5 +++++ src/tests.c | 7 +++++++ src/writer.c | 2 +- 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/quant.c b/src/quant.c index 48089b47..c798da73 100644 --- a/src/quant.c +++ b/src/quant.c @@ -1286,6 +1286,52 @@ sixel_quant_free_palette(unsigned char * data) free(data); } + +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + int ret = 0; + + if (ret != 0) { + goto error; + } + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +int +sixel_quant_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + perror(NULL); + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/quant.h b/src/quant.h index 3e04d121..cc0fbc3a 100644 --- a/src/quant.h +++ b/src/quant.h @@ -54,6 +54,11 @@ sixel_quant_apply_palette(unsigned char *data, void sixel_quant_free_palette(unsigned char * data); +#if HAVE_TESTS +int +sixel_quant_tests_main(void); +#endif + #ifdef __cplusplus } #endif diff --git a/src/tests.c b/src/tests.c index a461b0b1..c2e4d12e 100644 --- a/src/tests.c +++ b/src/tests.c @@ -75,6 +75,13 @@ main(int argc, char *argv[]) } puts("done."); + + nret = sixel_quant_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("done."); error: return nret; } diff --git a/src/writer.c b/src/writer.c index 38296015..c50cd391 100644 --- a/src/writer.c +++ b/src/writer.c @@ -291,7 +291,7 @@ test2(void) ret = sixel_helper_write_image_file( pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); - if (ret != (-1)) { + if (ret != 0) { perror(NULL); goto error; } From 81ecd37a9681eb620da90d9c3cbd6ca77f0c8505 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 21 May 2015 01:44:34 +0900 Subject: [PATCH 241/451] Drop unused function sixel_frame_set_palette() --- src/frame.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/frame.c b/src/frame.c index cc9fc2d7..c0e1e321 100644 --- a/src/frame.c +++ b/src/frame.c @@ -203,18 +203,6 @@ sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame) /* frame object */ } -/* set palette */ -SIXELAPI void -sixel_frame_set_palette( - sixel_frame_t /* in */ *frame, /* frame object */ - unsigned char /* in */ *palette, - int /* in */ ncolors) -{ - frame->palette = palette; - frame->ncolors = ncolors; -} - - SIXELAPI int sixel_frame_strip_alpha( sixel_frame_t /* in */ *frame, From d21644c664ccc930853cc2702c1701aeb3879c1c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 21 May 2015 01:51:09 +0900 Subject: [PATCH 242/451] Add more tests for frame.c --- Makefile.in | 4 +- converters/Makefile.in | 2 +- src/frame.c | 131 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in index 2d71ec09..e48c58bd 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub install-sh \ - ltmain.sh missing + ChangeLog NEWS compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/converters/Makefile.in b/converters/Makefile.in index 9d3225b1..df9692c2 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1015,10 +1015,10 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -b invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -E invalid_option) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B invalid_option) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#ffff ../images/map8.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#0000000000000 ../images/map8.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#00G) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -%) -@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B ) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -e ../images/snake.jpg) diff --git a/src/frame.c b/src/frame.c index 612b85d3..4148aeba 100644 --- a/src/frame.c +++ b/src/frame.c @@ -538,6 +538,11 @@ test2(void) goto error; } + if (frame->pixelformat != PIXELFORMAT_RGB888) { + perror(NULL); + goto error; + } + if (frame->pixels[0] != (0x43 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { perror(NULL); goto error; @@ -561,6 +566,130 @@ test2(void) } +static int +test3(void) +{ + sixel_frame_t *frame = NULL; + int nret = EXIT_FAILURE; + unsigned char *pixels = malloc(4); + unsigned char *bgcolor = malloc(3); + int ret; + + pixels[0] = 0x43; + pixels[1] = 0x89; + pixels[2] = 0x97; + pixels[3] = 0x32; + + memset(bgcolor, 0x10, 3); + + frame = sixel_frame_create(); + if (frame == NULL) { + perror(NULL); + goto error; + } + + ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); + if (ret != 0) { + perror(NULL); + goto error; + } + + ret = sixel_frame_strip_alpha(frame, NULL); + if (ret != 0) { + perror(NULL); + goto error; + } + + if (frame->pixelformat != PIXELFORMAT_RGB888) { + perror(NULL); + goto error; + } + + if (frame->pixels[0] != 0x43) { + perror(NULL); + goto error; + } + + if (frame->pixels[1] != 0x89) { + perror(NULL); + goto error; + } + + if (frame->pixels[2] != 0x97) { + perror(NULL); + goto error; + } + + nret = EXIT_SUCCESS; + +error: + sixel_frame_unref(frame); + return nret; +} + + +static int +test4(void) +{ + sixel_frame_t *frame = NULL; + int nret = EXIT_FAILURE; + unsigned char *pixels = malloc(4); + unsigned char *bgcolor = malloc(3); + int ret; + + pixels[0] = 0x43; + pixels[1] = 0x89; + pixels[2] = 0x97; + pixels[3] = 0x32; + + memset(bgcolor, 0x10, 3); + + frame = sixel_frame_create(); + if (frame == NULL) { + perror(NULL); + goto error; + } + + ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_ARGB8888, NULL, 0); + if (ret != 0) { + perror(NULL); + goto error; + } + + ret = sixel_frame_strip_alpha(frame, NULL); + if (ret != 0) { + perror(NULL); + goto error; + } + + if (frame->pixelformat != PIXELFORMAT_RGB888) { + perror(NULL); + goto error; + } + + if (frame->pixels[0] != 0x89) { + perror(NULL); + goto error; + } + + if (frame->pixels[1] != 0x97) { + perror(NULL); + goto error; + } + + if (frame->pixels[2] != 0x32) { + perror(NULL); + goto error; + } + + nret = EXIT_SUCCESS; + +error: + sixel_frame_unref(frame); + return nret; +} + + int sixel_frame_tests_main(void) { @@ -571,6 +700,8 @@ sixel_frame_tests_main(void) static testcase const testcases[] = { test1, test2, + test3, + test4, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From f505095af6de1007091164bde1bdbc3002e55558 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 24 May 2015 20:49:23 +0900 Subject: [PATCH 243/451] Add 'testfile' to CLEANFILES --- Makefile.in | 4 ++-- converters/Makefile.am | 2 +- converters/Makefile.in | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.in b/Makefile.in index 54b873a5..ce25e215 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing + ChangeLog NEWS compile config.guess config.sub install-sh \ + ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/converters/Makefile.am b/converters/Makefile.am index 6a1bead0..647664e6 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -13,7 +13,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py server.key server.crt +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py server.key server.crt testfile if WANT_IMG2SIXEL bin_PROGRAMS += img2sixel diff --git a/converters/Makefile.in b/converters/Makefile.in index e82250df..ae23eec4 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -424,7 +424,7 @@ dist_man_MANS = $(am__append_2) $(am__append_6) dist_bashcompletion_DATA = $(am__append_3) dist_zshcompletion_DATA = $(am__append_4) @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py server.key server.crt +CLEANFILES = *.gcno *.gcda *.gcov *.png *.sixel *.txt *.pipe server.py server.key server.crt testfile @WANT_IMG2SIXEL_TRUE@img2sixel_SOURCES = img2sixel.c malloc_stub.c malloc_stub.h @WANT_IMG2SIXEL_TRUE@img2sixel_CPPFLAGS = -I$(top_builddir)/include/ $(AM_CPPFLAGS) @WANT_IMG2SIXEL_TRUE@img2sixel_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) From 2fef52a0fd92dc88cd153f707d7d782dab2985b5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 25 May 2015 00:25:49 +0900 Subject: [PATCH 244/451] Add more tests for frame.c --- src/frame.c | 155 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 122 insertions(+), 33 deletions(-) diff --git a/src/frame.c b/src/frame.c index abc01893..07e60f44 100644 --- a/src/frame.c +++ b/src/frame.c @@ -259,6 +259,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) int nret = 0; unsigned char *dst; unsigned char *src; + unsigned char *p; switch (frame->pixelformat) { case PIXELFORMAT_PAL1: @@ -278,10 +279,10 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) free(normalized_pixels); return nret; } - for (; src != dst + size; ++src) { - *dst++ = *(frame->palette + *src * 3 + 0); - *dst++ = *(frame->palette + *src * 3 + 1); - *dst++ = *(frame->palette + *src * 3 + 2); + for (p = src; dst < src; ++p) { + *dst++ = *(frame->palette + *p * 3 + 0); + *dst++ = *(frame->palette + *p * 3 + 1); + *dst++ = *(frame->palette + *p * 3 + 2); } free(frame->pixels); frame->pixels = normalized_pixels; @@ -479,7 +480,6 @@ test1(void) frame = sixel_frame_create(); if (frame == NULL) { - perror(NULL); goto error; } sixel_frame_ref(frame); @@ -487,6 +487,7 @@ test1(void) nret = EXIT_SUCCESS; error: + perror(NULL); sixel_frame_unref(frame); return nret; } @@ -510,45 +511,39 @@ test2(void) frame = sixel_frame_create(); if (frame == NULL) { - perror(NULL); goto error; } ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); if (ret != 0) { - perror(NULL); goto error; } ret = sixel_frame_strip_alpha(frame, bgcolor); if (ret != 0) { - perror(NULL); goto error; } if (frame->pixelformat != PIXELFORMAT_RGB888) { - perror(NULL); goto error; } if (frame->pixels[0] != (0x43 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { - perror(NULL); goto error; } if (frame->pixels[1] != (0x89 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { - perror(NULL); goto error; } if (frame->pixels[2] != (0x97 * 0x32 + 0x10 * (0xff - 0x32)) >> 8) { - perror(NULL); goto error; } nret = EXIT_SUCCESS; error: + perror(NULL); sixel_frame_unref(frame); return nret; } @@ -560,7 +555,6 @@ test3(void) sixel_frame_t *frame = NULL; int nret = EXIT_FAILURE; unsigned char *pixels = malloc(4); - unsigned char *bgcolor = malloc(3); int ret; pixels[0] = 0x43; @@ -568,49 +562,41 @@ test3(void) pixels[2] = 0x97; pixels[3] = 0x32; - memset(bgcolor, 0x10, 3); - frame = sixel_frame_create(); if (frame == NULL) { - perror(NULL); goto error; } ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); if (ret != 0) { - perror(NULL); goto error; } ret = sixel_frame_strip_alpha(frame, NULL); if (ret != 0) { - perror(NULL); goto error; } if (frame->pixelformat != PIXELFORMAT_RGB888) { - perror(NULL); goto error; } if (frame->pixels[0] != 0x43) { - perror(NULL); goto error; } if (frame->pixels[1] != 0x89) { - perror(NULL); goto error; } if (frame->pixels[2] != 0x97) { - perror(NULL); goto error; } nret = EXIT_SUCCESS; error: + perror(NULL); sixel_frame_unref(frame); return nret; } @@ -622,7 +608,6 @@ test4(void) sixel_frame_t *frame = NULL; int nret = EXIT_FAILURE; unsigned char *pixels = malloc(4); - unsigned char *bgcolor = malloc(3); int ret; pixels[0] = 0x43; @@ -630,49 +615,151 @@ test4(void) pixels[2] = 0x97; pixels[3] = 0x32; - memset(bgcolor, 0x10, 3); - frame = sixel_frame_create(); if (frame == NULL) { - perror(NULL); goto error; } ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_ARGB8888, NULL, 0); if (ret != 0) { - perror(NULL); goto error; } ret = sixel_frame_strip_alpha(frame, NULL); if (ret != 0) { - perror(NULL); goto error; } if (frame->pixelformat != PIXELFORMAT_RGB888) { - perror(NULL); goto error; } if (frame->pixels[0] != 0x89) { - perror(NULL); goto error; } if (frame->pixels[1] != 0x97) { - perror(NULL); goto error; } if (frame->pixels[2] != 0x32) { - perror(NULL); goto error; } nret = EXIT_SUCCESS; error: + perror(NULL); + sixel_frame_unref(frame); + return nret; +} + + +static int +test5(void) +{ + sixel_frame_t *frame = NULL; + int nret = EXIT_FAILURE; + unsigned char *pixels = malloc(1); + unsigned char *palette = malloc(3); + int ret; + + palette[0] = 0x43; + palette[1] = 0x89; + palette[2] = 0x97; + + pixels[0] = 0; + + frame = sixel_frame_create(); + if (frame == NULL) { + goto error; + } + + ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL8, palette, 1); + if (ret != 0) { + goto error; + } + + ret = sixel_frame_convert_to_rgb888(frame); + if (ret != 0) { + goto error; + } + + if (frame->pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + + if (frame->pixels[0] != 0x43) { + goto error; + } + + if (frame->pixels[1] != 0x89) { + goto error; + } + + if (frame->pixels[2] != 0x97) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + perror(NULL); + sixel_frame_unref(frame); + return nret; +} + + +static int +test6(void) +{ + sixel_frame_t *frame = NULL; + int nret = EXIT_FAILURE; + unsigned char *pixels = malloc(6); + unsigned char *palette = malloc(3); + int ret; + + palette[0] = 0x43; + palette[1] = 0x89; + palette[2] = 0x97; + + pixels[0] = 0; + + frame = sixel_frame_create(); + if (frame == NULL) { + goto error; + } + + ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL1, palette, 1); + if (ret != 0) { + goto error; + } + + ret = sixel_frame_convert_to_rgb888(frame); + if (ret != 0) { + goto error; + } + + if (frame->pixelformat != PIXELFORMAT_RGB888) { + goto error; + } + + if (frame->pixels[0] != 0x43) { + goto error; + } + + if (frame->pixels[1] != 0x89) { + goto error; + } + + if (frame->pixels[2] != 0x97) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + perror(NULL); sixel_frame_unref(frame); return nret; } @@ -690,12 +777,13 @@ sixel_frame_tests_main(void) test2, test3, test4, + test5, + test6, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { nret = testcases[i](); if (nret != EXIT_SUCCESS) { - perror(NULL); goto error; } } @@ -703,6 +791,7 @@ sixel_frame_tests_main(void) nret = EXIT_SUCCESS; error: + perror(NULL); return nret; } #endif /* HAVE_TESTS */ From 6054f88f91834f04932dcbf0d2a85d7699c778ca Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 26 May 2015 12:04:44 +0900 Subject: [PATCH 245/451] Add more tests for quant.c and encoder.c --- Makefile.in | 4 ++-- converters/Makefile.am | 4 ++-- converters/Makefile.in | 4 ++-- src/dither.c | 4 ---- src/encoder.c | 2 -- src/frame.c | 7 ------- src/pixelformat.c | 1 - src/quant.c | 8 +++++--- src/tests.c | 8 ++++++++ src/writer.c | 3 --- 10 files changed, 19 insertions(+), 26 deletions(-) diff --git a/Makefile.in b/Makefile.in index e48c58bd..2d71ec09 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing + ChangeLog NEWS compile config.guess config.sub install-sh \ + ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/converters/Makefile.am b/converters/Makefile.am index 5db1d5ec..a9b78cda 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -80,8 +80,8 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -V $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel - $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 -o snake3.sixel < ../images/snake.jpg - $(WINE) ./img2sixel -w105% -h100 -djajuni -B\#000000000 -rnearest < ../images/snake.gif + $(WINE) ./img2sixel -w2100 -h2100 -djajuni -bxterm256 -o snake3.sixel < ../images/snake.jpg + $(WINE) ./img2sixel -w105% -h100 -B\#000000000 -rnearest < ../images/snake.gif $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga $(WINE) ./img2sixel -p300 -8 -scenter -Brgb:0/f/A -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff $(WINE) ./img2sixel -8 -qauto -thls -e ../images/snake.pgm diff --git a/converters/Makefile.in b/converters/Makefile.in index 33f73553..7f7f3b13 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1037,8 +1037,8 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -V @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -bxterm256 -o snake3.sixel < ../images/snake.jpg -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -djajuni -B\#000000000 -rnearest < ../images/snake.gif +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -djajuni -bxterm256 -o snake3.sixel < ../images/snake.jpg +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -B\#000000000 -rnearest < ../images/snake.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -p300 -8 -scenter -Brgb:0/f/A -h100 -qfull -rhanning -dstucki -thls ../images/snake.tiff @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -8 -qauto -thls -e ../images/snake.pgm diff --git a/src/dither.c b/src/dither.c index e75177f6..5f2b5253 100644 --- a/src/dither.c +++ b/src/dither.c @@ -576,7 +576,6 @@ test1(void) dither = sixel_dither_create(0); if (dither == NULL) { - perror(NULL); goto error; } sixel_dither_ref(dither); @@ -597,13 +596,11 @@ test2(void) dither = sixel_dither_create(INT_MAX); if (dither == NULL) { - perror(NULL); goto error; } sixel_dither_set_body_only(dither, 1); colors = sixel_dither_get_num_of_histogram_colors(dither); if (colors != -1) { - perror(NULL); goto error; } nret = EXIT_SUCCESS; @@ -629,7 +626,6 @@ sixel_dither_tests_main(void) for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { nret = testcases[i](); if (nret != EXIT_SUCCESS) { - perror(NULL); goto error; } } diff --git a/src/encoder.c b/src/encoder.c index c5b792bb..c9ac921c 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1457,7 +1457,6 @@ test1(void) encoder = sixel_encoder_create(); if (encoder == NULL) { - perror(NULL); goto error; } sixel_encoder_ref(encoder); @@ -1484,7 +1483,6 @@ sixel_encoder_tests_main(void) for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { nret = testcases[i](); if (nret != EXIT_SUCCESS) { - perror(NULL); goto error; } } diff --git a/src/frame.c b/src/frame.c index 07e60f44..d9da84d1 100644 --- a/src/frame.c +++ b/src/frame.c @@ -487,7 +487,6 @@ test1(void) nret = EXIT_SUCCESS; error: - perror(NULL); sixel_frame_unref(frame); return nret; } @@ -543,7 +542,6 @@ test2(void) nret = EXIT_SUCCESS; error: - perror(NULL); sixel_frame_unref(frame); return nret; } @@ -596,7 +594,6 @@ test3(void) nret = EXIT_SUCCESS; error: - perror(NULL); sixel_frame_unref(frame); return nret; } @@ -649,7 +646,6 @@ test4(void) nret = EXIT_SUCCESS; error: - perror(NULL); sixel_frame_unref(frame); return nret; } @@ -704,7 +700,6 @@ test5(void) nret = EXIT_SUCCESS; error: - perror(NULL); sixel_frame_unref(frame); return nret; } @@ -759,7 +754,6 @@ test6(void) nret = EXIT_SUCCESS; error: - perror(NULL); sixel_frame_unref(frame); return nret; } @@ -791,7 +785,6 @@ sixel_frame_tests_main(void) nret = EXIT_SUCCESS; error: - perror(NULL); return nret; } #endif /* HAVE_TESTS */ diff --git a/src/pixelformat.c b/src/pixelformat.c index 4979b9f5..eb945560 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -653,7 +653,6 @@ sixel_pixelformat_tests_main(void) for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { nret = testcases[i](); if (nret != EXIT_SUCCESS) { - perror(NULL); goto error; } } diff --git a/src/quant.c b/src/quant.c index c798da73..1a365f84 100644 --- a/src/quant.c +++ b/src/quant.c @@ -1292,9 +1292,12 @@ static int test1(void) { int nret = EXIT_FAILURE; - int ret = 0; + sample minval[1] = { 1 }; + sample maxval[1] = { 2 }; + unsigned int retval; - if (ret != 0) { + retval = largestByLuminosity(minval, maxval, 1); + if (retval != 0) { goto error; } nret = EXIT_SUCCESS; @@ -1318,7 +1321,6 @@ sixel_quant_tests_main(void) for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { nret = testcases[i](); if (nret != EXIT_SUCCESS) { - perror(NULL); goto error; } } diff --git a/src/tests.c b/src/tests.c index c2e4d12e..75727c6c 100644 --- a/src/tests.c +++ b/src/tests.c @@ -36,6 +36,7 @@ #include "frame.h" #include "pixelformat.h" #include "writer.h" +#include "encoder.h" #include #if HAVE_TESTS @@ -82,6 +83,13 @@ main(int argc, char *argv[]) } puts("done."); + + nret = sixel_encoder_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("done."); error: return nret; } diff --git a/src/writer.c b/src/writer.c index c50cd391..a1870a6b 100644 --- a/src/writer.c +++ b/src/writer.c @@ -271,7 +271,6 @@ test1(void) pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); if (ret != (-1)) { - perror(NULL); goto error; } nret = EXIT_SUCCESS; @@ -292,7 +291,6 @@ test2(void) pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); if (ret != 0) { - perror(NULL); goto error; } nret = EXIT_SUCCESS; @@ -317,7 +315,6 @@ sixel_writer_tests_main(void) for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { nret = testcases[i](); if (nret != EXIT_SUCCESS) { - perror(NULL); goto error; } } From 5f1427a32602edeab215cf1eeaadf4438082cbfc Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 26 May 2015 21:10:30 +0900 Subject: [PATCH 246/451] Update OpenGL example: add on-demand scrolling feature --- examples/opengl/Makefile.in | 43 ++-- examples/opengl/aclocal.m4 | 65 ++++--- examples/opengl/compile | 2 +- examples/opengl/config.guess | 173 ++--------------- examples/opengl/config.h.in | 12 ++ examples/opengl/config.sub | 36 ++-- examples/opengl/configure | 27 ++- examples/opengl/configure.ac | 2 +- examples/opengl/depcomp | 2 +- examples/opengl/install-sh | 366 ++++++++++++++++------------------- examples/opengl/main.c | 88 ++++++++- examples/opengl/missing | 2 +- 12 files changed, 392 insertions(+), 426 deletions(-) diff --git a/examples/opengl/Makefile.in b/examples/opengl/Makefile.in index 9c9b06c9..6b623c81 100644 --- a/examples/opengl/Makefile.in +++ b/examples/opengl/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -15,7 +15,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -80,14 +90,12 @@ build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = demo$(EXEEXT) subdir = . -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/config.h.in depcomp compile config.guess config.sub \ - install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -164,6 +172,8 @@ ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in compile \ + config.guess config.sub depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -311,7 +321,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -543,15 +552,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -587,17 +596,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -778,6 +787,8 @@ uninstall-am: uninstall-binPROGRAMS mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/examples/opengl/aclocal.m4 b/examples/opengl/aclocal.m4 index 1f91f85b..76221896 100644 --- a/examples/opengl/aclocal.m4 +++ b/examples/opengl/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -235,7 +235,7 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -247,10 +247,10 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -266,14 +266,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -318,15 +318,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -357,7 +356,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -548,7 +547,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -624,7 +623,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -714,8 +713,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -788,7 +787,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -817,7 +820,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -828,7 +831,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -838,7 +841,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -859,7 +862,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -909,7 +912,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -948,7 +951,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -977,7 +980,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1024,7 +1027,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1043,7 +1046,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1124,7 +1127,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1184,7 +1187,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1212,7 +1215,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1231,7 +1234,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/examples/opengl/compile b/examples/opengl/compile index 531136b0..a85b723c 100755 --- a/examples/opengl/compile +++ b/examples/opengl/compile @@ -3,7 +3,7 @@ scriptversion=2012-10-14.11; # UTC -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify diff --git a/examples/opengl/config.guess b/examples/opengl/config.guess index 9afd6762..6c32c864 100755 --- a/examples/opengl/config.guess +++ b/examples/opengl/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2013 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2013-11-29' +timestamp='2014-11-04' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -24,12 +24,12 @@ timestamp='2013-11-29' # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # -# Originally written by Per Bothner. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -149,7 +149,7 @@ Linux|GNU|GNU/*) LIBC=gnu #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac @@ -579,8 +579,9 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi @@ -826,7 +827,7 @@ EOF *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -969,10 +970,10 @@ EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or1k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} exit ;; - or32:Linux:*:*) + or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) @@ -1371,154 +1372,6 @@ EOF exit ;; esac -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 < header file. */ +#undef HAVE_FCNTL_H + /* whether GLX is available */ #undef HAVE_GLX @@ -40,12 +43,21 @@ /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMIOS_H + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H diff --git a/examples/opengl/config.sub b/examples/opengl/config.sub index 61cb4bc2..7ffe3737 100755 --- a/examples/opengl/config.sub +++ b/examples/opengl/config.sub @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2013 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2013-10-01' +timestamp='2014-12-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ timestamp='2013-10-01' # of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -68,7 +68,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -283,8 +283,10 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ @@ -296,11 +298,11 @@ case $basic_machine in | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or1k | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ @@ -311,6 +313,7 @@ case $basic_machine in | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) @@ -325,6 +328,9 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none @@ -402,8 +408,10 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ @@ -415,6 +423,7 @@ case $basic_machine in | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ @@ -432,6 +441,7 @@ case $basic_machine in | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -769,6 +779,9 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux @@ -824,6 +837,10 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos @@ -1369,14 +1386,14 @@ case $os in | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1594,9 +1611,6 @@ case $basic_machine in mips*-*) os=-elf ;; - or1k-*) - os=-elf - ;; or32-*) os=-coff ;; diff --git a/examples/opengl/configure b/examples/opengl/configure index e4bfe30f..e93b21be 100755 --- a/examples/opengl/configure +++ b/examples/opengl/configure @@ -2247,7 +2247,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.14' +am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2448,8 +2448,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2468,7 +2468,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2796,8 +2796,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -2856,6 +2856,7 @@ END fi + ac_config_headers="$ac_config_headers config.h" @@ -5428,7 +5429,19 @@ fi # Checks for header files. -#AC_CHECK_HEADERS([memory.h stdlib.h unistd.h]) +for ac_header in sys/select.h termios.h fcntl.h sys/ioctl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" diff --git a/examples/opengl/configure.ac b/examples/opengl/configure.ac index 9dafacb1..bdef8709 100644 --- a/examples/opengl/configure.ac +++ b/examples/opengl/configure.ac @@ -70,7 +70,7 @@ AC_SUBST(GL_CFLAGS) AC_SUBST(GL_LIBS) # Checks for header files. -#AC_CHECK_HEADERS([memory.h stdlib.h unistd.h]) +AC_CHECK_HEADERS([sys/select.h termios.h fcntl.h sys/ioctl.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T diff --git a/examples/opengl/depcomp b/examples/opengl/depcomp index 4ebd5b3a..fc98710e 100755 --- a/examples/opengl/depcomp +++ b/examples/opengl/depcomp @@ -3,7 +3,7 @@ scriptversion=2013-05-30.07; # UTC -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/examples/opengl/install-sh b/examples/opengl/install-sh index 377bb868..0b0fdcbb 100755 --- a/examples/opengl/install-sh +++ b/examples/opengl/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-11-20.07; # UTC +scriptversion=2013-12-25.23; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC # This script is compatible with the BSD install script, but was written # from scratch. +tab=' ' nl=' ' -IFS=" "" $nl" +IFS=" $tab$nl" -# set DOITPROG to echo to test this script +# Set DOITPROG to "echo" to test this script. -# Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi +doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -68,17 +64,6 @@ mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - posix_mkdir= # Desired mode of installed file. @@ -97,7 +82,7 @@ dir_arg= dst_arg= copy_on_change=false -no_target_directory= +is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -137,46 +122,57 @@ while test $# -ne 0; do -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; + shift;; -s) stripcmd=$stripprog;; - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; - -T) no_target_directory=true;; + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. @@ -207,6 +203,15 @@ if test $# -eq 0; then exit 0 fi +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 @@ -223,16 +228,16 @@ if test -z "$dir_arg"; then *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -269,41 +274,15 @@ do # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - + dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi @@ -314,74 +293,74 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else @@ -391,53 +370,51 @@ do # directory the slow way, step by step, checking for races as we go. case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac - eval "$initialize_posix_glob" - oIFS=$IFS IFS=/ - $posix_glob set -f + set -f set fnord $dstdir shift - $posix_glob set +f + set +f IFS=$oIFS prefixes= for d do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ done if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi fi fi @@ -472,15 +449,12 @@ do # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - + set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then @@ -493,24 +467,24 @@ do # to itself, or perhaps because mv is so ancient that it does not # support -f. { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 diff --git a/examples/opengl/main.c b/examples/opengl/main.c index 6554b53f..d5a4902b 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -36,6 +36,16 @@ #include #include #include +#if HAVE_TERMIOS_H +# include +#endif +#if HAVE_SYS_IOCTL_H +# include +#endif +#if HAVE_SYS_SELECT_H +#include +#endif + #ifndef M_PI # define M_PI 3.1415926535897932386 @@ -340,6 +350,80 @@ output_sixel(unsigned char *pixbuf, int width, int height, return 0; } +static int +wait_stdin(int usec) +{ +#if HAVE_SYS_SELECT_H + fd_set rfds; + struct timeval tv; +#endif /* HAVE_SYS_SELECT_H */ + int ret = 0; + +#if HAVE_SYS_SELECT_H + tv.tv_sec = usec / 1000000; + tv.tv_usec = usec % 1000000; + FD_ZERO(&rfds); + FD_SET(STDIN_FILENO, &rfds); + ret = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv); +#else + (void) usec; +#endif /* HAVE_SYS_SELECT_H */ + + return ret; +} + +static void +scroll_on_demand(int pixelheight) +{ +#if HAVE_SYS_IOCTL_H + struct winsize size = {0, 0, 0, 0}; +#endif +#if HAVE_TERMIOS_H + struct termios old_termios; + struct termios new_termios; +#endif + int row = 0; + int col = 0; + int cellheight; + int scroll; + +#if HAVE_SYS_IOCTL_H + ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); + if (size.ws_ypixel <= 0) { + printf("\033[H\0337"); + return; + } +# if HAVE_TERMIOS_H + /* set the terminal to cbreak mode */ + tcgetattr(STDIN_FILENO, &old_termios); + memcpy(&new_termios, &old_termios, sizeof(old_termios)); + new_termios.c_lflag &= ~(ECHO | ICANON); + new_termios.c_cc[VMIN] = 1; + new_termios.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + + /* request cursor position report */ + printf("\033[6n"); + if (wait_stdin(1000 * 1000) != (-1)) { /* wait 1 sec */ + if (scanf("\033[%d;%dR", &row, &col) == 2) { + cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; + scroll = cellheight + row - size.ws_row; + printf("\033[%dS\033[%dA", scroll, scroll); + printf("\0337"); + } else { + printf("\033[H\0337"); + } + } + + tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); +# else + printf("\033[H\0337"); +# endif /* HAVE_TERMIOS_H */ +#else + printf("\033[H\0337"); +#endif /* HAVE_SYS_IOCTL_H */ +} + int main(int argc, char** argv) { unsigned char *pixbuf; @@ -356,6 +440,8 @@ int main(int argc, char** argv) if (setup(width, height) != 0) return (-1); + scroll_on_demand(height); + glShadeModel(GL_SMOOTH); glClearColor(0, 0, 0, 0); glClearDepth(1); @@ -395,7 +481,7 @@ int main(int argc, char** argv) if (signaled) break; - printf("\e[3;3H"); + printf("\0338"); #if USE_OSMESA pixbuf = pbuffer; #else diff --git a/examples/opengl/missing b/examples/opengl/missing index db98974f..f62bbae3 100755 --- a/examples/opengl/missing +++ b/examples/opengl/missing @@ -3,7 +3,7 @@ scriptversion=2013-10-28.13; # UTC -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify From 5cd4c37c3cb7bc7dbb1f9f77a454bc5ed587a673 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 26 May 2015 22:20:49 +0900 Subject: [PATCH 247/451] Aggregate a sixel_dither_t instance to encoder object --- src/encoder.c | 9 ++++++++- src/encoder.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index c9ac921c..0afa03f0 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -776,12 +776,17 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* prepare dither context */ - dither = prepare_palette(dither, frame, encoder); + dither = prepare_palette(encoder->dither_cache, frame, encoder); if (!dither) { nret = (-1); goto end; } + if (encoder->dither_cache != NULL) { + encoder->dither_cache = dither; + sixel_dither_ref(dither); + } + /* evaluate -v option: print palette */ if (encoder->verbose) { if (!(sixel_frame_get_pixelformat(frame) & FORMATTYPE_GRAYSCALE)) { @@ -925,6 +930,7 @@ sixel_encoder_create(void) encoder->outfd = STDOUT_FILENO; encoder->finsecure = 0; encoder->cancel_flag = NULL; + encoder->dither_cache = NULL; return encoder; } @@ -936,6 +942,7 @@ sixel_encoder_destroy(sixel_encoder_t *encoder) if (encoder) { free(encoder->mapfile); free(encoder->bgcolor); + sixel_dither_unref(encoder->dither_cache); if (encoder->outfd && encoder->outfd != STDOUT_FILENO && encoder->outfd != STDERR_FILENO) { diff --git a/src/encoder.h b/src/encoder.h index 745524e0..2ae1eb1f 100644 --- a/src/encoder.h +++ b/src/encoder.h @@ -61,6 +61,7 @@ typedef struct sixel_encoder { int outfd; int finsecure; int *cancel_flag; + void *dither_cache; } sixel_encoder_t; #if HAVE_TESTS From 6b5e1e104e651750500cff3c6f37fdfca4bba55a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 10:02:12 +0900 Subject: [PATCH 248/451] Update python modules --- python/libsixel/__init__.py | 28 ++++++++++ python/libsixel/decoder.py | 56 +++++++++++++++++++ python/{libsixel.py => libsixel/encoder.py} | 62 ++++++++------------- 3 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 python/libsixel/__init__.py create mode 100644 python/libsixel/decoder.py rename python/{libsixel.py => libsixel/encoder.py} (55%) diff --git a/python/libsixel/__init__.py b/python/libsixel/__init__.py new file mode 100644 index 00000000..4fc878e4 --- /dev/null +++ b/python/libsixel/__init__.py @@ -0,0 +1,28 @@ +# +# Copyright (c) 2014,2015 Hayaki Saito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +import ctypes +from ctypes.util import find_library + +if not find_library('sixel'): + raise ImportError("libsixel not found.") + +_sixel = ctypes.cdll.LoadLibrary(find_library('sixel')) diff --git a/python/libsixel/decoder.py b/python/libsixel/decoder.py new file mode 100644 index 00000000..475e0cc0 --- /dev/null +++ b/python/libsixel/decoder.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# +from . import _sixel + +class Decoder(object): + + def __init__(self): + from ctypes import c_void_p, c_int, c_char_p + + _sixel.sixel_decoder_create.restype = c_void_p + _sixel.sixel_decoder_unref.restype = None + _sixel.sixel_decoder_unref.argtypes = [c_void_p] + _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + _sixel.sixel_decoder_decode.argtypes = [c_void_p] + self._decoder = _sixel.sixel_decoder_create() + + def __del__(self): + _sixel.sixel_decoder_unref(self._decoder) + + def setopt(self, flag, arg=None): + flag = ord(flag) + if arg: + arg = str(arg) + settings = self._decoder + result = _sixel.sixel_decoder_setopt(settings, flag, arg) + if result != 0: + raise RuntimeError("Invalid option was set.") + + def decode(self, infile=None): + if infile: + self.setopt("i", infile) + result = _sixel.sixel_decoder_decode(self._decoder) + if result != 0: + raise RuntimeError("Unexpected Error") + + def test(self, infile=None, outfile=None): + import threading + + if infile: + self.setopt("i", infile) + if outfile: + self.setopt("o", outfile) + t = threading.Thread(target=self.decode) + t.daemon = True + t.start() + try: + while t.is_alive(): + t.join(1) + except KeyboardInterrupt as e: + print "\033\\\033[Jcanceled." + + +if __name__ == '__main__': + import sys + arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] + Decoder().test(arg1, arg2) diff --git a/python/libsixel.py b/python/libsixel/encoder.py similarity index 55% rename from python/libsixel.py rename to python/libsixel/encoder.py index c4db613b..9171088d 100755 --- a/python/libsixel.py +++ b/python/libsixel/encoder.py @@ -1,47 +1,33 @@ #!/usr/bin/env python # -# This code is in public domain -# - -from ctypes import * -import ctypes.util - -def _load(): - sixel = CDLL(ctypes.util.find_library("sixel")) - sixel.sixel_encoder_create.restype = c_void_p - sixel.sixel_encoder_unref.restype = None - sixel.sixel_encoder_unref.argtypes = [c_void_p] - sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] - sixel.sixel_decoder_create.restype = c_void_p - sixel.sixel_decoder_unref.restype = None - sixel.sixel_decoder_unref.argtypes = [c_void_p] - sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_decoder_decode.argtypes = [c_void_p] - - return sixel +from . import _sixel - -class EasyEncoder(object): +class Encoder(object): def __init__(self): - self._sixel = _load() - self._encoder = self._sixel.sixel_encoder_create() + from ctypes import c_void_p, c_int, c_char_p + + _sixel.sixel_encoder_create.restype = c_void_p + _sixel.sixel_encoder_unref.restype = None + _sixel.sixel_encoder_unref.argtypes = [c_void_p] + _sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + _sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] + self._encoder = _sixel.sixel_encoder_create() def __del__(self): - self._sixel.sixel_encoder_unref(self._encoder) + _sixel.sixel_encoder_unref(self._encoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) settings = self._encoder - result = self._sixel.sixel_encoder_setopt(settings, flag, arg) + result = _sixel.sixel_encoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def encode(self, filename="-"): - result = self._sixel.sixel_encoder_encode(self._encoder, filename) + result = _sixel.sixel_encoder_encode(self._encoder, filename) if result != 0: raise RuntimeError("Unexpected Error") @@ -61,28 +47,32 @@ def test(self, filename): print "\033\\\033[Jcanceled." -class EasyDecoder(object): +class Decoder(object): def __init__(self): - self._sixel = _load() - self._decoder = self._sixel.sixel_decoder_create() + _sixel.sixel_decoder_create.restype = c_void_p + _sixel.sixel_decoder_unref.restype = None + _sixel.sixel_decoder_unref.argtypes = [c_void_p] + _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + _sixel.sixel_decoder_decode.argtypes = [c_void_p] + self._decoder = _sixel.sixel_decoder_create() def __del__(self): - self._sixel.sixel_decoder_unref(self._decoder) + _sixel.sixel_decoder_unref(self._decoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) settings = self._decoder - result = self._sixel.sixel_decoder_setopt(settings, flag, arg) + result = _sixel.sixel_decoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def decode(self, infile=None): if infile: self.setopt("i", infile) - result = self._sixel.sixel_decoder_decode(self._decoder) + result = _sixel.sixel_decoder_decode(self._decoder) if result != 0: raise RuntimeError("Unexpected Error") @@ -105,9 +95,5 @@ def test(self, infile=None, outfile=None): if __name__ == '__main__': import sys - arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] - EasyEncoder().test(arg1) -# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] -# EasyDecoder().test(arg1, arg2) - + Encoder().test(arg1) From 4eb36f885df843eb6eb7910bfe18440890a8ee82 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 10:02:12 +0900 Subject: [PATCH 249/451] Update python modules --- libsixel/__init__.py | 28 ++++++++++++++ libsixel/decoder.py | 56 +++++++++++++++++++++++++++ libsixel.py => libsixel/encoder.py | 62 ++++++++++++------------------ 3 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 libsixel/__init__.py create mode 100644 libsixel/decoder.py rename libsixel.py => libsixel/encoder.py (55%) diff --git a/libsixel/__init__.py b/libsixel/__init__.py new file mode 100644 index 00000000..4fc878e4 --- /dev/null +++ b/libsixel/__init__.py @@ -0,0 +1,28 @@ +# +# Copyright (c) 2014,2015 Hayaki Saito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +import ctypes +from ctypes.util import find_library + +if not find_library('sixel'): + raise ImportError("libsixel not found.") + +_sixel = ctypes.cdll.LoadLibrary(find_library('sixel')) diff --git a/libsixel/decoder.py b/libsixel/decoder.py new file mode 100644 index 00000000..475e0cc0 --- /dev/null +++ b/libsixel/decoder.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# +from . import _sixel + +class Decoder(object): + + def __init__(self): + from ctypes import c_void_p, c_int, c_char_p + + _sixel.sixel_decoder_create.restype = c_void_p + _sixel.sixel_decoder_unref.restype = None + _sixel.sixel_decoder_unref.argtypes = [c_void_p] + _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + _sixel.sixel_decoder_decode.argtypes = [c_void_p] + self._decoder = _sixel.sixel_decoder_create() + + def __del__(self): + _sixel.sixel_decoder_unref(self._decoder) + + def setopt(self, flag, arg=None): + flag = ord(flag) + if arg: + arg = str(arg) + settings = self._decoder + result = _sixel.sixel_decoder_setopt(settings, flag, arg) + if result != 0: + raise RuntimeError("Invalid option was set.") + + def decode(self, infile=None): + if infile: + self.setopt("i", infile) + result = _sixel.sixel_decoder_decode(self._decoder) + if result != 0: + raise RuntimeError("Unexpected Error") + + def test(self, infile=None, outfile=None): + import threading + + if infile: + self.setopt("i", infile) + if outfile: + self.setopt("o", outfile) + t = threading.Thread(target=self.decode) + t.daemon = True + t.start() + try: + while t.is_alive(): + t.join(1) + except KeyboardInterrupt as e: + print "\033\\\033[Jcanceled." + + +if __name__ == '__main__': + import sys + arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] + Decoder().test(arg1, arg2) diff --git a/libsixel.py b/libsixel/encoder.py similarity index 55% rename from libsixel.py rename to libsixel/encoder.py index c4db613b..9171088d 100755 --- a/libsixel.py +++ b/libsixel/encoder.py @@ -1,47 +1,33 @@ #!/usr/bin/env python # -# This code is in public domain -# - -from ctypes import * -import ctypes.util - -def _load(): - sixel = CDLL(ctypes.util.find_library("sixel")) - sixel.sixel_encoder_create.restype = c_void_p - sixel.sixel_encoder_unref.restype = None - sixel.sixel_encoder_unref.argtypes = [c_void_p] - sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] - sixel.sixel_decoder_create.restype = c_void_p - sixel.sixel_decoder_unref.restype = None - sixel.sixel_decoder_unref.argtypes = [c_void_p] - sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - sixel.sixel_decoder_decode.argtypes = [c_void_p] - - return sixel +from . import _sixel - -class EasyEncoder(object): +class Encoder(object): def __init__(self): - self._sixel = _load() - self._encoder = self._sixel.sixel_encoder_create() + from ctypes import c_void_p, c_int, c_char_p + + _sixel.sixel_encoder_create.restype = c_void_p + _sixel.sixel_encoder_unref.restype = None + _sixel.sixel_encoder_unref.argtypes = [c_void_p] + _sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + _sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] + self._encoder = _sixel.sixel_encoder_create() def __del__(self): - self._sixel.sixel_encoder_unref(self._encoder) + _sixel.sixel_encoder_unref(self._encoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) settings = self._encoder - result = self._sixel.sixel_encoder_setopt(settings, flag, arg) + result = _sixel.sixel_encoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def encode(self, filename="-"): - result = self._sixel.sixel_encoder_encode(self._encoder, filename) + result = _sixel.sixel_encoder_encode(self._encoder, filename) if result != 0: raise RuntimeError("Unexpected Error") @@ -61,28 +47,32 @@ def test(self, filename): print "\033\\\033[Jcanceled." -class EasyDecoder(object): +class Decoder(object): def __init__(self): - self._sixel = _load() - self._decoder = self._sixel.sixel_decoder_create() + _sixel.sixel_decoder_create.restype = c_void_p + _sixel.sixel_decoder_unref.restype = None + _sixel.sixel_decoder_unref.argtypes = [c_void_p] + _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + _sixel.sixel_decoder_decode.argtypes = [c_void_p] + self._decoder = _sixel.sixel_decoder_create() def __del__(self): - self._sixel.sixel_decoder_unref(self._decoder) + _sixel.sixel_decoder_unref(self._decoder) def setopt(self, flag, arg=None): flag = ord(flag) if arg: arg = str(arg) settings = self._decoder - result = self._sixel.sixel_decoder_setopt(settings, flag, arg) + result = _sixel.sixel_decoder_setopt(settings, flag, arg) if result != 0: raise RuntimeError("Invalid option was set.") def decode(self, infile=None): if infile: self.setopt("i", infile) - result = self._sixel.sixel_decoder_decode(self._decoder) + result = _sixel.sixel_decoder_decode(self._decoder) if result != 0: raise RuntimeError("Unexpected Error") @@ -105,9 +95,5 @@ def test(self, infile=None, outfile=None): if __name__ == '__main__': import sys - arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] - EasyEncoder().test(arg1) -# arg2 = "-" if len(sys.argv) < 3 else sys.argv[2] -# EasyDecoder().test(arg1, arg2) - + Encoder().test(arg1) From 28bdacdfce820c889e9a586ca1a81ea9b1194258 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 13:57:55 +0900 Subject: [PATCH 250/451] Build and install python bindings by 'make install' --- Makefile.am | 2 +- Makefile.in | 13 +- aclocal.m4 | 235 +++++++++++++++++++++++++++++++ configure | 309 ++++++++++++++++++++++++++++++++++++++++- configure.ac | 20 ++- converters/Makefile.in | 9 ++ include/Makefile.in | 9 ++ src/Makefile.in | 9 ++ 8 files changed, 600 insertions(+), 6 deletions(-) diff --git a/Makefile.am b/Makefile.am index bc38301d..e323a9b7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = include src converters +SUBDIRS = include src converters python DIST_SUBDIRS = $(SUBDIRS) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} diff --git a/Makefile.in b/Makefile.in index 2d71ec09..998fd2fa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -193,7 +193,7 @@ CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ ChangeLog NEWS compile config.guess config.sub install-sh \ - ltmain.sh missing + ltmain.sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -311,6 +311,11 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -364,9 +369,13 @@ pdfdir = @pdfdir@ # pkgconfig pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -376,7 +385,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ -SUBDIRS = include src converters +SUBDIRS = include src converters python DIST_SUBDIRS = $(SUBDIRS) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} pkgconfig_DATA = libsixel.pc diff --git a/aclocal.m4 b/aclocal.m4 index b69fb6b8..af4a41ae 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1027,6 +1027,241 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# --------------------------------------------------------------------------- +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. +# +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. +# +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). +# +# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. +AC_DEFUN([AM_PATH_PYTHON], + [ + dnl Find a Python interpreter. Python versions prior to 2.0 are not + dnl supported. (2.0 was released on October 16, 2000). + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], +[python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl + python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) + + AC_ARG_VAR([PYTHON], [the Python interpreter]) + + m4_if([$1],[],[ + dnl No version check is needed. + # Find any Python interpreter. + if test -z "$PYTHON"; then + AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) + fi + am_display_PYTHON=python + ], [ + dnl A version check is needed. + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + AC_MSG_CHECKING([whether $PYTHON version is >= $1]) + AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([Python interpreter is too old])]) + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + AC_CACHE_CHECK([for a Python interpreter with version >= $1], + [am_cv_pathless_PYTHON],[ + for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do + test "$am_cv_pathless_PYTHON" = none && break + AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) + done]) + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + ]) + + if test "$PYTHON" = :; then + dnl Run any user-specified action, or abort. + m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) + else + + dnl Query Python for its version number. Getting [:3] seems to be + dnl the best way to do this; it's what "site.py" does in the standard + dnl library. + + AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], + [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) + AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST([PYTHON_PREFIX], ['${prefix}']) + AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], + [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) + AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) + + # Just factor out some code duplication. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behavior + dnl is more consistent with lispdir.m4 for example. + dnl Query distutils for this directory. + AC_CACHE_CHECK([for $am_display_PYTHON script directory], + [am_cv_python_pythondir], + [if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + ]) + AC_SUBST([pythondir], [$am_cv_python_pythondir]) + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + + AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) + dnl Query distutils for this directory. + AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], + [am_cv_python_pyexecdir], + [if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + ]) + AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + + AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) + + dnl Run any user-specified action. + $2 + fi + +]) + + +# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# --------------------------------------------------------------------------- +# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +# Run ACTION-IF-FALSE otherwise. +# This test uses sys.hexversion instead of the string equivalent (first +# word of sys.version), in order to cope with versions such as 2.2c1. +# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). +AC_DEFUN([AM_PYTHON_CHECK_VERSION], + [prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] +sys.exit(sys.hexversion < minverhex)" + AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) + # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation diff --git a/configure b/configure index 8d3ff76d..e36545e1 100755 --- a/configure +++ b/configure @@ -640,6 +640,17 @@ HAVE_PNG_FALSE HAVE_PNG_TRUE HAVE_JPEG_FALSE HAVE_JPEG_TRUE +HAVE_PYTHON_FALSE +HAVE_PYTHON_TRUE +pkgpyexecdir +pyexecdir +pkgpythondir +pythondir +PYTHON_PLATFORM +PYTHON_EXEC_PREFIX +PYTHON_PREFIX +PYTHON_VERSION +PYTHON LIBPNG_LIBS LIBPNG_CFLAGS LIBJPEG_LIBS @@ -812,6 +823,7 @@ with_png with_pkgconfigdir with_bashcompletiondir with_zshcompletiondir +enable_python enable_debug enable_gcov enable_tests @@ -838,7 +850,8 @@ LIBCURL_LIBS LIBJPEG_CFLAGS LIBJPEG_LIBS LIBPNG_CFLAGS -LIBPNG_LIBS' +LIBPNG_LIBS +PYTHON' # Initialize some variables set by options. @@ -1470,6 +1483,7 @@ Optional Features: --disable-libtool-lock avoid locking (might break parallel builds) --disable-img2sixel whether to build img2sixel (default: yes) --disable-sixel2png whether to build sixel2png (default: yes) + --enable-sixel2png Python bindings (default: yes) --enable-debug Use debug macro and specific CFLAGS --enable-gcov Use gcov --enable-tests Build tests @@ -1529,6 +1543,7 @@ Some influential environment variables: LIBPNG_CFLAGS C compiler flags for LIBPNG, overriding pkg-config LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config + PYTHON the Python interpreter Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -12321,6 +12336,14 @@ fi $as_echo "$as_me: zsh-completion directory is ${zshcompletiondir}" >&6;} +# Check whether --enable-python was given. +if test "${enable_python+set}" = set; then : + enableval=$enable_python; +else + enable_python=yes +fi + + # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; @@ -15086,6 +15109,282 @@ fi +have_python=no +if test x$enable_python != xno; then + + + + + + + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 2.3" >&5 +$as_echo_n "checking whether $PYTHON version is >= 2.3... " >&6; } + prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] +sys.exit(sys.hexversion < minverhex)" + if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 + ($PYTHON -c "$prog") >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "Python interpreter is too old" "$LINENO" 5 +fi + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.3" >&5 +$as_echo_n "checking for a Python interpreter with version >= 2.3... " >&6; } +if ${am_cv_pathless_PYTHON+:} false; then : + $as_echo_n "(cached) " >&6 +else + + for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do + test "$am_cv_pathless_PYTHON" = none && break + prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] +sys.exit(sys.hexversion < minverhex)" + if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 + ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then : + break +fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 +$as_echo "$am_cv_pathless_PYTHON" >&6; } + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. +set dummy $am_cv_pathless_PYTHON; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PYTHON+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +$as_echo "$PYTHON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + + + if test "$PYTHON" = :; then + have_python=no + else + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 +$as_echo_n "checking for $am_display_PYTHON version... " >&6; } +if ${am_cv_python_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 +$as_echo "$am_cv_python_version" >&6; } + PYTHON_VERSION=$am_cv_python_version + + + + PYTHON_PREFIX='${prefix}' + + PYTHON_EXEC_PREFIX='${exec_prefix}' + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 +$as_echo_n "checking for $am_display_PYTHON platform... " >&6; } +if ${am_cv_python_platform+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 +$as_echo "$am_cv_python_platform" >&6; } + PYTHON_PLATFORM=$am_cv_python_platform + + + # Just factor out some code duplication. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[:3] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 +$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } +if ${am_cv_python_pythondir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 +$as_echo "$am_cv_python_pythondir" >&6; } + pythondir=$am_cv_python_pythondir + + + + pkgpythondir=\${pythondir}/$PACKAGE + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 +$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } +if ${am_cv_python_pyexecdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 +$as_echo "$am_cv_python_pyexecdir" >&6; } + pyexecdir=$am_cv_python_pyexecdir + + + + pkgpyexecdir=\${pyexecdir}/$PACKAGE + + + have_python=yes + fi + + + if test x$enable_python = xyes -a x$have_python = xno; then + as_fn_error $? "python is not available" "$LINENO" 5 + fi +fi + if test x$have_python = xyes; then + HAVE_PYTHON_TRUE= + HAVE_PYTHON_FALSE='#' +else + HAVE_PYTHON_TRUE='#' + HAVE_PYTHON_FALSE= +fi + + touch aclocal.m4 Makefile.in */Makefile.in configure config.h.in @@ -15116,7 +15415,7 @@ else fi -ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h src/Makefile include/Makefile converters/Makefile" +ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h src/Makefile include/Makefile converters/Makefile python/Makefile" cat >confcache <<\_ACEOF @@ -15280,6 +15579,10 @@ if test -z "${HAVE_GETOPT_LONG_TRUE}" && test -z "${HAVE_GETOPT_LONG_FALSE}"; th as_fn_error $? "conditional \"HAVE_GETOPT_LONG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then + as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${HAVE_JPEG_TRUE}" && test -z "${HAVE_JPEG_FALSE}"; then as_fn_error $? "conditional \"HAVE_JPEG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -16177,6 +16480,7 @@ do "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "converters/Makefile") CONFIG_FILES="$CONFIG_FILES converters/Makefile" ;; + "python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac @@ -17457,6 +17761,7 @@ echo " pkg-config dir : $pkgconfigdir" echo " Bash completion dir : $bashcompletiondir" echo " Zsh completion dir : $zshcompletiondir" #echo " WIC integration : $have_wic" +echo " python bindings : $have_python" echo " gcov integration : $enable_gcov" echo " debugging : $enable_debug" echo " tests : $enable_tests" diff --git a/configure.ac b/configure.ac index 055f2d37..4a7e789d 100644 --- a/configure.ac +++ b/configure.ac @@ -104,6 +104,12 @@ AC_ARG_WITH(zshcompletiondir, AC_MSG_NOTICE([zsh-completion directory is ${zshcompletiondir}]) AC_SUBST(zshcompletiondir) +AC_ARG_ENABLE([python], + [AS_HELP_STRING([--enable-sixel2png], + [Python bindings (default: yes)])], + [], + [enable_python=yes]) + AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [Use debug macro and specific CFLAGS])], @@ -524,6 +530,15 @@ fi AC_SUBST(LIBPNG_CFLAGS) AC_SUBST(LIBPNG_LIBS) +have_python=no +if test x$enable_python != xno; then + AM_PATH_PYTHON([2.3], [have_python=yes], [have_python=no]) + if test x$enable_python = xyes -a x$have_python = xno; then + AC_MSG_ERROR([python is not available]) + fi +fi +AM_CONDITIONAL([HAVE_PYTHON], [test x$have_python = xyes]) + AC_DEFUN([LS_UPDATE_TIMESTAMP], [ touch aclocal.m4 Makefile.in */Makefile.in configure config.h.in ]) @@ -539,7 +554,9 @@ AC_CONFIG_FILES([Makefile include/sixel.h src/Makefile include/Makefile - converters/Makefile]) + converters/Makefile + python/Makefile + ]) AC_OUTPUT @@ -553,6 +570,7 @@ echo " pkg-config dir : $pkgconfigdir" echo " Bash completion dir : $bashcompletiondir" echo " Zsh completion dir : $zshcompletiondir" #echo " WIC integration : $have_wic" +echo " python bindings : $have_python" echo " gcov integration : $enable_gcov" echo " debugging : $enable_debug" echo " tests : $enable_tests" diff --git a/converters/Makefile.in b/converters/Makefile.in index 7f7f3b13..2322619e 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -356,6 +356,11 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -407,9 +412,13 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/include/Makefile.in b/include/Makefile.in index 7717ceb0..b3acb75a 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -247,6 +247,11 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -298,9 +303,13 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/src/Makefile.in b/src/Makefile.in index b08fb3d7..dc3efee5 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -302,6 +302,11 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -353,9 +358,13 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ From e0c25c0a6fae0e549468508dee58e5da8ba362c7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:01:23 +0900 Subject: [PATCH 251/451] Add license blocks to python modules --- python/libsixel/__init__.py | 1 + python/libsixel/decoder.py | 20 ++++++++++++++++++++ python/libsixel/encoder.py | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/python/libsixel/__init__.py b/python/libsixel/__init__.py index 4fc878e4..bb41d78f 100644 --- a/python/libsixel/__init__.py +++ b/python/libsixel/__init__.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # Copyright (c) 2014,2015 Hayaki Saito # diff --git a/python/libsixel/decoder.py b/python/libsixel/decoder.py index 475e0cc0..b15d4848 100644 --- a/python/libsixel/decoder.py +++ b/python/libsixel/decoder.py @@ -1,5 +1,25 @@ #!/usr/bin/env python # +# Copyright (c) 2014,2015 Hayaki Saito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + from . import _sixel class Decoder(object): diff --git a/python/libsixel/encoder.py b/python/libsixel/encoder.py index 9171088d..ee7a9ff2 100755 --- a/python/libsixel/encoder.py +++ b/python/libsixel/encoder.py @@ -1,5 +1,25 @@ #!/usr/bin/env python # +# Copyright (c) 2014,2015 Hayaki Saito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + from . import _sixel class Encoder(object): From d607a0d91c46570a77098d6d6244252570cb8722 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:01:23 +0900 Subject: [PATCH 252/451] Add license blocks to python modules --- libsixel/__init__.py | 1 + libsixel/decoder.py | 20 ++++++++++++++++++++ libsixel/encoder.py | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/libsixel/__init__.py b/libsixel/__init__.py index 4fc878e4..bb41d78f 100644 --- a/libsixel/__init__.py +++ b/libsixel/__init__.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # Copyright (c) 2014,2015 Hayaki Saito # diff --git a/libsixel/decoder.py b/libsixel/decoder.py index 475e0cc0..b15d4848 100644 --- a/libsixel/decoder.py +++ b/libsixel/decoder.py @@ -1,5 +1,25 @@ #!/usr/bin/env python # +# Copyright (c) 2014,2015 Hayaki Saito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + from . import _sixel class Decoder(object): diff --git a/libsixel/encoder.py b/libsixel/encoder.py index 9171088d..ee7a9ff2 100755 --- a/libsixel/encoder.py +++ b/libsixel/encoder.py @@ -1,5 +1,25 @@ #!/usr/bin/env python # +# Copyright (c) 2014,2015 Hayaki Saito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + from . import _sixel class Encoder(object): From 2c36ed0f94ee6a6f9cfb422d0736554e723ec819 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:12:43 +0900 Subject: [PATCH 253/451] Add README.rst for python bindings --- python/README.rst | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 python/README.rst diff --git a/python/README.rst b/python/README.rst new file mode 100644 index 00000000..df849b9a --- /dev/null +++ b/python/README.rst @@ -0,0 +1,55 @@ +libsixel-python +=============== + +What is this? +------------- + +This module is a python wrapper of libsixel. + +libsixel: https://github.com/saitoha/libsixel + +Install +------- + +Example 1. Install into the python prefixed by '/usr/local' :: + + $ git clone https://github.com/saitoha/libsixel.git + $ cd libsixel + $ ./configure --enable-python --prefix=/usr/local + $ make install + +Example 2. Install into only current active python :: + + $ git clone https://github.com/saitoha/libsixel.git + $ cd libsixel + $ ./configure --disable-python + $ make install # install libsixel + + $ git clone https://github.com/saitoha/libsixel.git + $ cd libsixel/python + $ python setup.py install # install python module + + +Code Example +------------ + +encoder + +:: + from libsixel.encoder import Encoder + + encoder = Encoder() + encoder.setopt("w", "300") + encoder.setopt("p", "16") + encoder.encode("test.png") + + +decoder + +:: + from libsixel.decoder import Decoder + + decoder = Decoder() + decoder.setopt("i", "test.six") + decoder.setopt("o", "test.png") + decoder.decode() From 304835292e77a9d590ec123bdf93d4206cfe8966 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:12:43 +0900 Subject: [PATCH 254/451] Add README.rst for python bindings --- README.rst | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 README.rst diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..df849b9a --- /dev/null +++ b/README.rst @@ -0,0 +1,55 @@ +libsixel-python +=============== + +What is this? +------------- + +This module is a python wrapper of libsixel. + +libsixel: https://github.com/saitoha/libsixel + +Install +------- + +Example 1. Install into the python prefixed by '/usr/local' :: + + $ git clone https://github.com/saitoha/libsixel.git + $ cd libsixel + $ ./configure --enable-python --prefix=/usr/local + $ make install + +Example 2. Install into only current active python :: + + $ git clone https://github.com/saitoha/libsixel.git + $ cd libsixel + $ ./configure --disable-python + $ make install # install libsixel + + $ git clone https://github.com/saitoha/libsixel.git + $ cd libsixel/python + $ python setup.py install # install python module + + +Code Example +------------ + +encoder + +:: + from libsixel.encoder import Encoder + + encoder = Encoder() + encoder.setopt("w", "300") + encoder.setopt("p", "16") + encoder.encode("test.png") + + +decoder + +:: + from libsixel.decoder import Decoder + + decoder = Decoder() + decoder.setopt("i", "test.six") + decoder.setopt("o", "test.png") + decoder.decode() From 8ce12fbd2d84c0d2b4c31b6ab8421dfe2c72e16d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:14:31 +0900 Subject: [PATCH 255/451] Add setup.py for python bindings --- python/setup.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 python/setup.py diff --git a/python/setup.py b/python/setup.py new file mode 100644 index 00000000..d2d34c7c --- /dev/null +++ b/python/setup.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages +__version__ = '0.1.0' +__license__ = 'MIT' +__author__ = 'Hayaki Saito' + +import inspect +import os + +filename = inspect.getfile(inspect.currentframe()) +dirpath = os.path.abspath(os.path.dirname(filename)) +long_description = open(os.path.join(dirpath, "README.rst")).read() + +setup(name = 'libsixel-python', + version = __version__, + description = 'libsixel binding for Python', + long_description = long_description, + py_modules = ['libsixel'], + classifiers = ['Development Status :: 4 - Beta', + 'Topic :: Terminals', + 'Environment :: Console', + 'Intended Audience :: End Users/Desktop', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python' + ], + keywords = 'skk japanese terminal', + author = __author__, + author_email = 'saitoha@me.com', + url = 'https://github.com/saitoha/libsixel', + license = __license__, + packages = find_packages(exclude=[]), + zip_safe = False, + include_package_data = False, + install_requires = [] + ) From 53158897dbeb139fe74db913e6a8787efaa89fab Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:14:31 +0900 Subject: [PATCH 256/451] Add setup.py for python bindings --- setup.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 setup.py diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..d2d34c7c --- /dev/null +++ b/setup.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages +__version__ = '0.1.0' +__license__ = 'MIT' +__author__ = 'Hayaki Saito' + +import inspect +import os + +filename = inspect.getfile(inspect.currentframe()) +dirpath = os.path.abspath(os.path.dirname(filename)) +long_description = open(os.path.join(dirpath, "README.rst")).read() + +setup(name = 'libsixel-python', + version = __version__, + description = 'libsixel binding for Python', + long_description = long_description, + py_modules = ['libsixel'], + classifiers = ['Development Status :: 4 - Beta', + 'Topic :: Terminals', + 'Environment :: Console', + 'Intended Audience :: End Users/Desktop', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python' + ], + keywords = 'skk japanese terminal', + author = __author__, + author_email = 'saitoha@me.com', + url = 'https://github.com/saitoha/libsixel', + license = __license__, + packages = find_packages(exclude=[]), + zip_safe = False, + include_package_data = False, + install_requires = [] + ) From d6063c61928b85d77e8eaac7041e0214a636cb00 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:26:14 +0900 Subject: [PATCH 257/451] Add py-compile, distributed under special exception to the GNU General Public License --- py-compile | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100755 py-compile diff --git a/py-compile b/py-compile new file mode 100755 index 00000000..bc203914 --- /dev/null +++ b/py-compile @@ -0,0 +1,170 @@ +#!/bin/sh +# py-compile - Compile a Python program + +scriptversion=2011-06-08.12; # UTC + +# Copyright (C) 2000-2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +if [ -z "$PYTHON" ]; then + PYTHON=python +fi + +me=py-compile + +usage_error () +{ + echo "$me: $*" >&2 + echo "Try '$me --help' for more information." >&2 + exit 1 +} + +basedir= +destdir= +while test $# -ne 0; do + case "$1" in + --basedir) + if test $# -lt 2; then + usage_error "option '--basedir' requires an argument" + else + basedir=$2 + fi + shift + ;; + --destdir) + if test $# -lt 2; then + usage_error "option '--destdir' requires an argument" + else + destdir=$2 + fi + shift + ;; + -h|--help) + cat <<\EOF +Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." + +Byte compile some python scripts FILES. Use --destdir to specify any +leading directory path to the FILES that you don't want to include in the +byte compiled file. Specify --basedir for any additional path information you +do want to be shown in the byte compiled file. + +Example: + py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py + +Report bugs to . +EOF + exit $? + ;; + -v|--version) + echo "$me $scriptversion" + exit $? + ;; + --) + shift + break + ;; + -*) + usage_error "unrecognized option '$1'" + ;; + *) + break + ;; + esac + shift +done + +files=$* +if test -z "$files"; then + usage_error "no files given" +fi + +# if basedir was given, then it should be prepended to filenames before +# byte compilation. +if [ -z "$basedir" ]; then + pathtrans="path = file" +else + pathtrans="path = os.path.join('$basedir', file)" +fi + +# if destdir was given, then it needs to be prepended to the filename to +# byte compile but not go into the compiled file. +if [ -z "$destdir" ]; then + filetrans="filepath = path" +else + filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" +fi + +$PYTHON -c " +import sys, os, py_compile, imp + +files = '''$files''' + +sys.stdout.write('Byte-compiling python modules...\n') +for file in files.split(): + $pathtrans + $filetrans + if not os.path.exists(filepath) or not (len(filepath) >= 3 + and filepath[-3:] == '.py'): + continue + sys.stdout.write(file) + sys.stdout.flush() + if hasattr(imp, 'get_tag'): + py_compile.compile(filepath, imp.cache_from_source(filepath), path) + else: + py_compile.compile(filepath, filepath + 'c', path) +sys.stdout.write('\n')" || exit $? + +# this will fail for python < 1.5, but that doesn't matter ... +$PYTHON -O -c " +import sys, os, py_compile, imp + +# pypy does not use .pyo optimization +if hasattr(sys, 'pypy_translation_info'): + sys.exit(0) + +files = '''$files''' +sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') +for file in files.split(): + $pathtrans + $filetrans + if not os.path.exists(filepath) or not (len(filepath) >= 3 + and filepath[-3:] == '.py'): + continue + sys.stdout.write(file) + sys.stdout.flush() + if hasattr(imp, 'get_tag'): + py_compile.compile(filepath, imp.cache_from_source(filepath, False), path) + else: + py_compile.compile(filepath, filepath + 'o', path) +sys.stdout.write('\n')" 2>/dev/null || : + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: From d9c4108fbc832b28a0e192087dcaf80e2bcc61d1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:33:51 +0900 Subject: [PATCH 258/451] Remove a trivial sample file --- sample1.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100755 sample1.py diff --git a/sample1.py b/sample1.py deleted file mode 100755 index e017de38..00000000 --- a/sample1.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python -# -# This code is in public domain -# - -import ctypes -import ctypes.util - -dllpath = ctypes.util.find_library("sixel") -sixel = ctypes.CDLL(dllpath) -sixel.sixel_easy_encode("-", None, None) From 6835c4dfc714294d1f7d0a0f5526aadc2bfbebe3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:33:51 +0900 Subject: [PATCH 259/451] Remove a trivial sample file --- python/sample1.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100755 python/sample1.py diff --git a/python/sample1.py b/python/sample1.py deleted file mode 100755 index e017de38..00000000 --- a/python/sample1.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python -# -# This code is in public domain -# - -import ctypes -import ctypes.util - -dllpath = ctypes.util.find_library("sixel") -sixel = ctypes.CDLL(dllpath) -sixel.sixel_easy_encode("-", None, None) From f4c21050fe1d22a48ef7416c26efc4496731377e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:34:34 +0900 Subject: [PATCH 260/451] Add python/Makefile.am python/Makefile.in --- Makefile.am | 16 ++ Makefile.in | 568 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 584 insertions(+) create mode 100644 Makefile.am create mode 100644 Makefile.in diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..3ffc1e20 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,16 @@ + +CLEANFILES=libsixel/*.pyc + +clean-local: + -rm -rf libsixel_python.egg-info build dist + +if HAVE_PYTHON +libsixeldir = $(pythondir)/libsixel +libsixel_PYTHON = \ + libsixel/__init__.py \ + libsixel/encoder.py \ + libsixel/decoder.py +endif + +EXTRA_DIST = \ + setup.py diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..832c4ff5 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,568 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = python +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__libsixel_PYTHON_DIST) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__libsixel_PYTHON_DIST = libsixel/__init__.py libsixel/encoder.py \ + libsixel/decoder.py +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) +am__installdirs = "$(DESTDIR)$(libsixeldir)" +am__pep3147_tweak = \ + sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|' +py_compile = $(top_srcdir)/py-compile +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/py-compile +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CPPFLAGS = @AM_CPPFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LS_LTVERSION = @LS_LTVERSION@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_DESCRIPTION = @PACKAGE_DESCRIPTION@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +attr_func_deprecated = @attr_func_deprecated@ +attr_var_deprecated = @attr_var_deprecated@ +bashcompletiondir = @bashcompletiondir@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +zshcompletiondir = @zshcompletiondir@ +CLEANFILES = libsixel/*.pyc +@HAVE_PYTHON_TRUE@libsixeldir = $(pythondir)/libsixel +@HAVE_PYTHON_TRUE@libsixel_PYTHON = \ +@HAVE_PYTHON_TRUE@ libsixel/__init__.py \ +@HAVE_PYTHON_TRUE@ libsixel/encoder.py \ +@HAVE_PYTHON_TRUE@ libsixel/decoder.py + +EXTRA_DIST = \ + setup.py + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign python/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign python/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-libsixelPYTHON: $(libsixel_PYTHON) + @$(NORMAL_INSTALL) + @list='$(libsixel_PYTHON)'; dlist=; list2=; test -n "$(libsixeldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libsixeldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libsixeldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ + if test -f $$b$$p; then \ + $(am__strip_dir) \ + dlist="$$dlist $$f"; \ + list2="$$list2 $$b$$p"; \ + else :; fi; \ + done; \ + for file in $$list2; do echo $$file; done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(libsixeldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(libsixeldir)" || exit $$?; \ + done || exit $$?; \ + if test -n "$$dlist"; then \ + $(am__py_compile) --destdir "$(DESTDIR)" \ + --basedir "$(libsixeldir)" $$dlist; \ + else :; fi + +uninstall-libsixelPYTHON: + @$(NORMAL_UNINSTALL) + @list='$(libsixel_PYTHON)'; test -n "$(libsixeldir)" || list=; \ + py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$py_files" || exit 0; \ + dir='$(DESTDIR)$(libsixeldir)'; \ + pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ + pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ + py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ + echo "$$py_files_pep3147";\ + pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ + pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ + st=0; \ + for files in \ + "$$py_files" \ + "$$pyc_files" \ + "$$pyo_files" \ + "$$pyc_files_pep3147" \ + "$$pyo_files_pep3147" \ + ; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done; \ + exit $$st +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: + for dir in "$(DESTDIR)$(libsixeldir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-libsixelPYTHON + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libsixelPYTHON + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libsixelPYTHON install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-libsixelPYTHON + +.PRECIOUS: Makefile + + +clean-local: + -rm -rf libsixel_python.egg-info build dist + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: From f66e412be3f90003d10ca9e26f97ded801ef2478 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:34:34 +0900 Subject: [PATCH 261/451] Add python/Makefile.am python/Makefile.in --- python/Makefile.am | 16 ++ python/Makefile.in | 568 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 584 insertions(+) create mode 100644 python/Makefile.am create mode 100644 python/Makefile.in diff --git a/python/Makefile.am b/python/Makefile.am new file mode 100644 index 00000000..3ffc1e20 --- /dev/null +++ b/python/Makefile.am @@ -0,0 +1,16 @@ + +CLEANFILES=libsixel/*.pyc + +clean-local: + -rm -rf libsixel_python.egg-info build dist + +if HAVE_PYTHON +libsixeldir = $(pythondir)/libsixel +libsixel_PYTHON = \ + libsixel/__init__.py \ + libsixel/encoder.py \ + libsixel/decoder.py +endif + +EXTRA_DIST = \ + setup.py diff --git a/python/Makefile.in b/python/Makefile.in new file mode 100644 index 00000000..832c4ff5 --- /dev/null +++ b/python/Makefile.in @@ -0,0 +1,568 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = python +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__libsixel_PYTHON_DIST) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__libsixel_PYTHON_DIST = libsixel/__init__.py libsixel/encoder.py \ + libsixel/decoder.py +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) +am__installdirs = "$(DESTDIR)$(libsixeldir)" +am__pep3147_tweak = \ + sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|' +py_compile = $(top_srcdir)/py-compile +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/py-compile +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CPPFLAGS = @AM_CPPFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LS_LTVERSION = @LS_LTVERSION@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_DESCRIPTION = @PACKAGE_DESCRIPTION@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +attr_func_deprecated = @attr_func_deprecated@ +attr_var_deprecated = @attr_var_deprecated@ +bashcompletiondir = @bashcompletiondir@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +zshcompletiondir = @zshcompletiondir@ +CLEANFILES = libsixel/*.pyc +@HAVE_PYTHON_TRUE@libsixeldir = $(pythondir)/libsixel +@HAVE_PYTHON_TRUE@libsixel_PYTHON = \ +@HAVE_PYTHON_TRUE@ libsixel/__init__.py \ +@HAVE_PYTHON_TRUE@ libsixel/encoder.py \ +@HAVE_PYTHON_TRUE@ libsixel/decoder.py + +EXTRA_DIST = \ + setup.py + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign python/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign python/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-libsixelPYTHON: $(libsixel_PYTHON) + @$(NORMAL_INSTALL) + @list='$(libsixel_PYTHON)'; dlist=; list2=; test -n "$(libsixeldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libsixeldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libsixeldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ + if test -f $$b$$p; then \ + $(am__strip_dir) \ + dlist="$$dlist $$f"; \ + list2="$$list2 $$b$$p"; \ + else :; fi; \ + done; \ + for file in $$list2; do echo $$file; done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(libsixeldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(libsixeldir)" || exit $$?; \ + done || exit $$?; \ + if test -n "$$dlist"; then \ + $(am__py_compile) --destdir "$(DESTDIR)" \ + --basedir "$(libsixeldir)" $$dlist; \ + else :; fi + +uninstall-libsixelPYTHON: + @$(NORMAL_UNINSTALL) + @list='$(libsixel_PYTHON)'; test -n "$(libsixeldir)" || list=; \ + py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$py_files" || exit 0; \ + dir='$(DESTDIR)$(libsixeldir)'; \ + pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ + pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ + py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ + echo "$$py_files_pep3147";\ + pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ + pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ + st=0; \ + for files in \ + "$$py_files" \ + "$$pyc_files" \ + "$$pyo_files" \ + "$$pyc_files_pep3147" \ + "$$pyo_files_pep3147" \ + ; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done; \ + exit $$st +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: + for dir in "$(DESTDIR)$(libsixeldir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-libsixelPYTHON + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libsixelPYTHON + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libsixelPYTHON install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-libsixelPYTHON + +.PRECIOUS: Makefile + + +clean-local: + -rm -rf libsixel_python.egg-info build dist + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: From 682e57c8bc72b75e8e8b8a0937124689b6ad7052 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:40:15 +0900 Subject: [PATCH 262/451] Fix syntax errors of README.rst --- README.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index df849b9a..487f030d 100644 --- a/README.rst +++ b/README.rst @@ -33,9 +33,8 @@ Example 2. Install into only current active python :: Code Example ------------ -encoder +encoder :: -:: from libsixel.encoder import Encoder encoder = Encoder() @@ -44,9 +43,8 @@ encoder encoder.encode("test.png") -decoder +decoder :: -:: from libsixel.decoder import Decoder decoder = Decoder() From 9fb4868723f1661fd93f7fdb927ba9f4d95b2746 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:40:15 +0900 Subject: [PATCH 263/451] Fix syntax errors of README.rst --- python/README.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/python/README.rst b/python/README.rst index df849b9a..487f030d 100644 --- a/python/README.rst +++ b/python/README.rst @@ -33,9 +33,8 @@ Example 2. Install into only current active python :: Code Example ------------ -encoder +encoder :: -:: from libsixel.encoder import Encoder encoder = Encoder() @@ -44,9 +43,8 @@ encoder encoder.encode("test.png") -decoder +decoder :: -:: from libsixel.decoder import Decoder decoder = Decoder() From 0d4a20b902f6a7bae5ed5e489dbf058fc86e64f4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:43:55 +0900 Subject: [PATCH 264/451] Add src/tests to CLEANFILES --- src/Makefile.am | 2 +- src/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 5b1ce872..bded1f28 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,7 +3,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* +CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* test lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ diff --git a/src/Makefile.in b/src/Makefile.in index dc3efee5..95aced37 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -375,7 +375,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* +CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* test lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ output.c \ From 88267eae2f881be1adc5d5e281e6722a7f5a7f70 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:48:12 +0900 Subject: [PATCH 265/451] Add test-output.png to CLEANFILES --- Makefile.am | 2 +- Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index e323a9b7..5942775c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -7,7 +7,7 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} pkgconfigdir = @pkgconfigdir@ pkgconfig_DATA = libsixel.pc -CLEANFILES = valgrind.log test.log unittest.log +CLEANFILES = valgrind.log test.log unittest.log test-output.png all-am: cp package.json.in package.json diff --git a/Makefile.in b/Makefile.in index 998fd2fa..e49156f1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -389,7 +389,7 @@ SUBDIRS = include src converters python DIST_SUBDIRS = $(SUBDIRS) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} pkgconfig_DATA = libsixel.pc -CLEANFILES = valgrind.log test.log unittest.log +CLEANFILES = valgrind.log test.log unittest.log test-output.png all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive From 5b7f808718a6f6658b0b53c771277c9401a9f0bc Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:52:18 +0900 Subject: [PATCH 266/451] Update README of python bindings --- python/README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/README.rst b/python/README.rst index 487f030d..50f5b612 100644 --- a/python/README.rst +++ b/python/README.rst @@ -15,6 +15,7 @@ Example 1. Install into the python prefixed by '/usr/local' :: $ git clone https://github.com/saitoha/libsixel.git $ cd libsixel + $ git checkout develop # now available only develop branch $ ./configure --enable-python --prefix=/usr/local $ make install @@ -22,11 +23,10 @@ Example 2. Install into only current active python :: $ git clone https://github.com/saitoha/libsixel.git $ cd libsixel + $ git checkout develop # now available only develop branch $ ./configure --disable-python $ make install # install libsixel - - $ git clone https://github.com/saitoha/libsixel.git - $ cd libsixel/python + $ cd python $ python setup.py install # install python module From bda663290c56b9720b794dbb0b17c3bb578da357 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 14:52:18 +0900 Subject: [PATCH 267/451] Update README of python bindings --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 487f030d..50f5b612 100644 --- a/README.rst +++ b/README.rst @@ -15,6 +15,7 @@ Example 1. Install into the python prefixed by '/usr/local' :: $ git clone https://github.com/saitoha/libsixel.git $ cd libsixel + $ git checkout develop # now available only develop branch $ ./configure --enable-python --prefix=/usr/local $ make install @@ -22,11 +23,10 @@ Example 2. Install into only current active python :: $ git clone https://github.com/saitoha/libsixel.git $ cd libsixel + $ git checkout develop # now available only develop branch $ ./configure --disable-python $ make install # install libsixel - - $ git clone https://github.com/saitoha/libsixel.git - $ cd libsixel/python + $ cd python $ python setup.py install # install python module From f17d3fc93c0ab2d384368b956de9a1b2eaea92c4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 16:23:07 +0900 Subject: [PATCH 268/451] Show python package path after ./configure is succeeded --- configure | 7 ++++++- configure.ac | 7 ++++++- python/README.rst | 2 +- src/Makefile.am | 2 +- src/Makefile.in | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/configure b/configure index e36545e1..44caad3c 100755 --- a/configure +++ b/configure @@ -15384,6 +15384,11 @@ else HAVE_PYTHON_FALSE= fi +if test x$have_python = xyes; then + message_python="$have_python: $pythondir" +else + message_python=$have_python +fi @@ -17761,7 +17766,7 @@ echo " pkg-config dir : $pkgconfigdir" echo " Bash completion dir : $bashcompletiondir" echo " Zsh completion dir : $zshcompletiondir" #echo " WIC integration : $have_wic" -echo " python bindings : $have_python" +echo " python bindings : $message_python" echo " gcov integration : $enable_gcov" echo " debugging : $enable_debug" echo " tests : $enable_tests" diff --git a/configure.ac b/configure.ac index 4a7e789d..6a375919 100644 --- a/configure.ac +++ b/configure.ac @@ -538,6 +538,11 @@ if test x$enable_python != xno; then fi fi AM_CONDITIONAL([HAVE_PYTHON], [test x$have_python = xyes]) +if test x$have_python = xyes; then + message_python="$have_python: $pythondir" +else + message_python=$have_python +fi AC_DEFUN([LS_UPDATE_TIMESTAMP], [ touch aclocal.m4 Makefile.in */Makefile.in configure config.h.in @@ -570,7 +575,7 @@ echo " pkg-config dir : $pkgconfigdir" echo " Bash completion dir : $bashcompletiondir" echo " Zsh completion dir : $zshcompletiondir" #echo " WIC integration : $have_wic" -echo " python bindings : $have_python" +echo " python bindings : $message_python" echo " gcov integration : $enable_gcov" echo " debugging : $enable_debug" echo " tests : $enable_tests" diff --git a/python/README.rst b/python/README.rst index 50f5b612..941cef2e 100644 --- a/python/README.rst +++ b/python/README.rst @@ -11,7 +11,7 @@ libsixel: https://github.com/saitoha/libsixel Install ------- -Example 1. Install into the python prefixed by '/usr/local' :: +Example 1. Install into the python prefixed with '/usr/local' :: $ git clone https://github.com/saitoha/libsixel.git $ cd libsixel diff --git a/src/Makefile.am b/src/Makefile.am index bded1f28..4c5bd6e7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,7 +3,7 @@ if COND_GCOV MAYBE_COVERAGE = --coverage endif -CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* test +CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* tests lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ diff --git a/src/Makefile.in b/src/Makefile.in index 95aced37..0c3f290a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -375,7 +375,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ @COND_GCOV_TRUE@MAYBE_COVERAGE = --coverage -CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* test +CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* tests lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ output.c \ From 9c9a5047f57c5392457df875405904490e86d724 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 27 May 2015 16:23:07 +0900 Subject: [PATCH 269/451] Show python package path after ./configure is succeeded --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 50f5b612..941cef2e 100644 --- a/README.rst +++ b/README.rst @@ -11,7 +11,7 @@ libsixel: https://github.com/saitoha/libsixel Install ------- -Example 1. Install into the python prefixed by '/usr/local' :: +Example 1. Install into the python prefixed with '/usr/local' :: $ git clone https://github.com/saitoha/libsixel.git $ cd libsixel From 6265b08ee8b9d5d6a4fbf16e699e04f4d4f1250c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 28 May 2015 11:55:31 +0900 Subject: [PATCH 270/451] Don't close STDOUT with -o option --- src/encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index 0afa03f0..4f7550c8 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -999,7 +999,7 @@ sixel_encoder_setopt( goto argerr; } if (strcmp(optarg, "-") != 0) { - if (encoder->outfd) { + if (encoder->outfd && encoder->outfd != STDOUT_FILENO) { close(encoder->outfd); } encoder->outfd = open(optarg, From 86242e8e8d63370329f2ed9aca93f261c9e4de63 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 29 May 2015 00:27:36 +0900 Subject: [PATCH 271/451] Add a helper tool libsixel-config --- Makefile.am | 2 +- Makefile.in | 2 +- configure | 4 +++- configure.ac | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 5942775c..b0947d85 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = include src converters python +SUBDIRS = include src converters tools python DIST_SUBDIRS = $(SUBDIRS) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} diff --git a/Makefile.in b/Makefile.in index e49156f1..d966ad45 100644 --- a/Makefile.in +++ b/Makefile.in @@ -385,7 +385,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zshcompletiondir = @zshcompletiondir@ -SUBDIRS = include src converters python +SUBDIRS = include src converters tools python DIST_SUBDIRS = $(SUBDIRS) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} pkgconfig_DATA = libsixel.pc diff --git a/configure b/configure index 44caad3c..262bef71 100755 --- a/configure +++ b/configure @@ -15420,7 +15420,7 @@ else fi -ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h src/Makefile include/Makefile converters/Makefile python/Makefile" +ac_config_files="$ac_config_files Makefile libsixel.pc package.json.in include/sixel.h src/Makefile include/Makefile converters/Makefile tools/Makefile tools/libsixel-config python/Makefile" cat >confcache <<\_ACEOF @@ -16485,6 +16485,8 @@ do "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "converters/Makefile") CONFIG_FILES="$CONFIG_FILES converters/Makefile" ;; + "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; + "tools/libsixel-config") CONFIG_FILES="$CONFIG_FILES tools/libsixel-config" ;; "python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; diff --git a/configure.ac b/configure.ac index 6a375919..f0eda232 100644 --- a/configure.ac +++ b/configure.ac @@ -560,6 +560,8 @@ AC_CONFIG_FILES([Makefile src/Makefile include/Makefile converters/Makefile + tools/Makefile + tools/libsixel-config python/Makefile ]) From 2f4f331dada93f5de18a743edaba8a82c755ca05 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 29 May 2015 00:33:13 +0900 Subject: [PATCH 272/451] Initial commit of libsixel perl interface --- perl/Build.PL | 23 + perl/MANIFEST | 11 + perl/MANIFEST.SKIP | 4 + perl/META.yml | 24 + perl/Makefile.PL | 34 + perl/README | 13 + perl/images/egret.jpg | Bin 0 -> 18986 bytes perl/images/egret.six | 7 + perl/lib/Image/Sixel.pm | 28 + perl/lib/Image/Sixel.xs | 183 + perl/lib/Image/Sixel/Decoder.pm | 4 + perl/lib/Image/Sixel/Encoder.pm | 4 + perl/lib/Image/ppport.h | 7258 +++++++++++++++++++++++++++++++ perl/t/sixel.t | 62 + 14 files changed, 7655 insertions(+) create mode 100644 perl/Build.PL create mode 100644 perl/MANIFEST create mode 100644 perl/MANIFEST.SKIP create mode 100644 perl/META.yml create mode 100644 perl/Makefile.PL create mode 100644 perl/README create mode 100644 perl/images/egret.jpg create mode 100644 perl/images/egret.six create mode 100644 perl/lib/Image/Sixel.pm create mode 100644 perl/lib/Image/Sixel.xs create mode 100644 perl/lib/Image/Sixel/Decoder.pm create mode 100644 perl/lib/Image/Sixel/Encoder.pm create mode 100644 perl/lib/Image/ppport.h create mode 100644 perl/t/sixel.t diff --git a/perl/Build.PL b/perl/Build.PL new file mode 100644 index 00000000..68a5229e --- /dev/null +++ b/perl/Build.PL @@ -0,0 +1,23 @@ +use Module::Build; + +my $builder = Module::Build->new ( + module_name => 'Image::Sixel', + license => 'mit', + dist_abstract => 'libsixel binding for Perl', + + requires => { + }, + + build_requires => { + 'Test::More' => 0, + }, + + script_files => [ + ], + + extra_compiler_flags => scalar `pkg-config libsixel --cflags` . ' -Wall -Wextra', + extra_linker_flags => scalar `pkg-config libsixel --libs`, + create_makefile_pl => 'passthrough', +); + +$builder->create_build_script(); diff --git a/perl/MANIFEST b/perl/MANIFEST new file mode 100644 index 00000000..0e34dd5d --- /dev/null +++ b/perl/MANIFEST @@ -0,0 +1,11 @@ +Build.PL +lib/Image/Sixel.xs +lib/Image/Sixel.pm +lib/Image/Sixel/Encoder.pm +lib/Image/Sixel/Decoder.pm +t/sixel.t +Makefile.PL +MANIFEST This list of files +MANIFEST.SKIP +META.yml +README diff --git a/perl/MANIFEST.SKIP b/perl/MANIFEST.SKIP new file mode 100644 index 00000000..576aba7b --- /dev/null +++ b/perl/MANIFEST.SKIP @@ -0,0 +1,4 @@ +^Makefile$ +ppport.h$ +egret.*$ +egret1.*$ diff --git a/perl/META.yml b/perl/META.yml new file mode 100644 index 00000000..bcca4ae1 --- /dev/null +++ b/perl/META.yml @@ -0,0 +1,24 @@ +--- +abstract: 'libsixel binding for Perl' +author: + - unknown +build_requires: + ExtUtils::CBuilder: 0 + Test::More: 0 +dynamic_config: 0 +generated_by: 'Module::Build version 0.4003, CPAN::Meta::Converter version 2.120921' +license: mit +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: 1.4 +name: Image-Sixel +provides: + Image::Sixel: + file: lib/Image/Sixel.pm + version: 0.0_1 + Image::Sixel::Encoder: + file: lib/Image/Sixel/Encoder.pm + version: 0 +resources: + license: http://opensource.org/licenses/mit-license.php +version: 0.0_1 diff --git a/perl/Makefile.PL b/perl/Makefile.PL new file mode 100644 index 00000000..04026199 --- /dev/null +++ b/perl/Makefile.PL @@ -0,0 +1,34 @@ +# Note: this file was auto-generated by Module::Build::Compat version 0.4003 + + unless (eval "use Module::Build::Compat 0.02; 1" ) { + print "This module requires Module::Build to install itself.\n"; + + require ExtUtils::MakeMaker; + my $yn = ExtUtils::MakeMaker::prompt + (' Install Module::Build now from CPAN?', 'y'); + + unless ($yn =~ /^y/i) { + die " *** Cannot install without Module::Build. Exiting ...\n"; + } + + require Cwd; + require File::Spec; + require CPAN; + + # Save this 'cause CPAN will chdir all over the place. + my $cwd = Cwd::cwd(); + + CPAN::Shell->install('Module::Build::Compat'); + CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate + or die "Couldn't install Module::Build, giving up.\n"; + + chdir $cwd or die "Cannot chdir() back to $cwd: $!"; + } + eval "use Module::Build::Compat 0.02; 1" or die $@; + + Module::Build::Compat->run_build_pl(args => \@ARGV); + my $build_script = 'Build'; + $build_script .= '.com' if $^O eq 'VMS'; + exit(0) unless(-e $build_script); # cpantesters convention + require Module::Build; + Module::Build::Compat->write_makefile(build_class => 'Module::Build'); diff --git a/perl/README b/perl/README new file mode 100644 index 00000000..94820e89 --- /dev/null +++ b/perl/README @@ -0,0 +1,13 @@ + +How to Build +============ + +$ perl Build.PL +$ ./Build + + +Install +======= + +$ ./Build test +$ ./Build install diff --git a/perl/images/egret.jpg b/perl/images/egret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb87c099057f832f99042efdab612676fdfa6704 GIT binary patch literal 18986 zcmb5VWmH?;6E_+PrIZ3K#l5AtYbf3p4M9q932wpNrHac#kYELhdvJFP5Zv9pw73Pk z{NH!obwA&8KAfDj&zhONXOCp|{2pc>RspY+-m$Q{(oN&?Eqpttj;I8*jS8!C&XCT#8?mA09pV5 z`%&2c$@~9aSWmDY<$Z?tI4b)J@Z<^B6C7;Z$NL#J4mJRQ^@JE3=k3$i{2$d#U2sVl zzsCN4CQw28?h~YAOmOXpOvcRh8~m8uJWEJJv(vq@>X8c7|7Gz1arhsVM;?zu{KQy~ z901t3Palc@-wz&#h;iQXKYdLi@KK$V(bVPlr`U?GV~?Z-Asr9%0D{Nw9%Uc~NCR$N zKICFMs-Mu(>7F=^l1fB1JR2Yj4~bP`Y0hOE!?k7ZWeI0y`_C#i+^!U;kOb?tnBM7NN`Ut zbHPu`{#Dw%eevhr1U_?TH0zdgqr%AyvsC>MmYL{Ys_am2>? zqRGMYQ^r)sRQ*%tk2VzPJNKuVvz=zePDj32qT-!eo9|DXLdC zsDmgB;_PzR60-)>xn)x|+2XToVnJ9bGFw8KTiC+H1u0BIU-SI4)Pb2>Pe?z?))40q zGQS;z5q+z&?UAqMz!t+7`tAA^|6M5>`F18#Q;R5Ki`wXel3b2ZxH=c1lryTffuSh=1eJ*zVB8OM0&%xTjRcY+}7LG|A<0=T2jiMrW#}XD8 zTt_hu@Pu>qB2*CX)E)n5-CcV!!FDe#=U#&&gc1V7y=%AwT#i zm4J#xsEJj-%~+QHEC*#1h3qJaY~^kuj(|RQ)~B~{bS!Uv(yK9U@-c3#H)8l$Pw*+R zUv)ph3d{UI)`q7cYe4`txyiGM}>AIoLcJ3_N8rS%Uw&4f#MS^nEmk@U=nw ze~-(PHU9dPomhoCLNTF25jSy*Q2`dKaz-}u`GE0@vRL@-hfgN6sj~&Lmy}7LY*g%l zZ%AZ?448j_WrZ!_@pznOTn-0NFz_AE&veSP(|~ zB}aJ6EKCuX6gvw?to-GZ;4fldgm9VozIrgY00=(L6aWIhlZ7~EX32l?G9bgig`P6T zzH9k1Mr!RBA6l%ObGiSC?%?U$x#!V+`KD$S0wHF&tlO`?wgDQM}z)T#SP6d-%GN&7^s zS#dxKE`iZIEc{+f=##GcZtrFlqD)LQcjuIO_yF2saOdu9- z^Xs){F|U&P*d(5sp5o>7s*Da$>V5%uGWD2z)&r8i>cHcSpU|I^gub4lup<0mC5ab`{UO;j0t z3r{-x$|2aY;)0N4a|qrvhBWqU7b7w;f` zg&y~J`$Cr45^a^M9~x$r2EUC~q5sXMva}Zy1Ie-NRl+;I@R{us;DF8T5sfb@Ed-JY zaQYqZa4~UyUy=#q`>>w3bcAA;BTe~Co?uCS;nLZDizOo)RZeqC7T(!TgZxZlLMZuy zE*VJM@wO&JYzHntsg?9Z$CBpMcdEB3@B?ZPWEE1e41SFduTg;z(J}X7<`-DpxnedzSg$rc@@z9$xk}HkBUc~u4 zG=!uK$9979G(iKUcQIvaD_?z|Ku11(y|fBCh5<*U zXKN0IVdnV4U@n(BrmC5~?Veuxz&vAi#nR0|+WI}%_-HSiVYKa~#c}rBZ3NSdm5g-J zIYV$@&pur%cJRvwfHjYDP)-c1-j(1%de&X%y1vc>pr&XWyv2n2>TOKTFhr0Tcv^b< zY@*dGbK`pb&suagm@2?f|L$e%2E%vyDVw;&XfYnx zM%Ql{LXZ4o7|2I$t2OrYj^DHHE|2W{+|}kas|R0_jE1p&026=0k0omTh9_kLcv5ac z@Rkqo#3y9Xd}y1tH+jL)1R|hp`_XeD$yT02j-A+ZNfHg=QyZ-BgO^Tl3zDLhIV~_` zR-oukq3zNTD{Z0n@m;Qn7f%jELz{5hi%l(zI?IKWRbo9BwV%#5gjM`+mn^2T+*o*HAj-$cO6%)oAnKmtc*Vw9K?gxvO^sV7IK;4QX?*l?df64` zt%u>Qd;olF76dV8%u5^A?RK-gtjuv^#B#c|pdqD}(snTAfuxdkI5FIbk z#OnB7W^GR}KCvBhfm0^XlbVMr9f`J1SVlAlYN6^zJMpD+vGk z-GTen(Ox-zp z`2AMw^bnIZ*T98U7V#X{e+M&@y&4ANvzv)oiQ|0f`GIYGWe))F=5RemALHtpMj8F& zwgJRwqe8)nmSgL;%jyd_hCZkT=I_|t6kqjq<#6RRGaBYS|31-RPtlGwiSC+}c6OO- zELhp8gq4h~Elx^2=AOony?1dZF1SmfAo2c2_HME@Vl7B!Z$n5w%~<=6I5|g6D{Mw# zEq&}B&(8Vd=7nFV`84u=IIm*3Ij1(r{FF%i-~m9ks%Ip{pE;5Pn*l1`@{U6pChxnp zW5THJmi^Vpy=8#x9M1h@O!vwg_Qbn;hPBbi^*qp>nd7XfpkL7HDAR2rNU9~ z?dmzJ36lE?VxJ1HOweGHKa{!UXJhM61Ir~>f7p)g))w8&ul|Pa*3C2Yd z8B(oXS6F`kfhh7zx~6oW)0q^De8Pl_Lo$o?W&Hi2bIafXuba&rpYlL&GI5bRBsNkH zlvx@dMZ%|C-^T_14R*K5aqE@qN!H$*os85B-^O1^BCX|z(EV^2r0vzFZMPfR<}nv} z3&c(97_>Iq#@6A*5~VtQkwi%QW7FEqshd;P)Qw8ik+y?c_d3$&D|nD+;n6+%gm2^h z&%S7T*q_?xKw`heDt&Mmn)P3xT;ABmU2wx6L-1XP3T;0|UD_V`#f3AR|Km|>#SiQ{ z>jUc|>?(HajSxVjPTa|Q7d=cT;>gI!{Ne#%67-B8Mk>5Kd(%9peYAFz0epYG3BMh= zC##FFDhAcbJJ=v~w$l4may8On(V$RJj222x1e(nZUp7GQF-CTZ*UU#|_ zdk^DvHr%;HH{HBhhd|$3o^rLp6pxv*$D65Efhdq^i?vO4_iTbd zC#~Lq2|eFm7_N1lj6w+4xdn#NOF<1&=G9{m+HPBuCvp;T*Lw4`%UzR@dZywg0UyIu z*eSUCD8HNcq*~!d{{8-@`d=_td|{>lrBBMmjdHqzVtw;S#eJw`&WVV>`7}(a{x%rQ1oC z093W~&*f=n`(&E6WZ`-5ma5%0@08;$gkHtK%YU&0X6D5? z`pluvv}*tKV3BQ}zDz zKt$sQBAffl5_q=Q(*`tk_z4?DzbfwRoU*H#IJEJ(QM$#X(frSdIBZ0});4!o8Fp^t z&Yxn(BKRfR7aYxeA{%~etrJ#1CM!IqZrBbDUqML?go=dm!8xXb;w%57aUH1{oP+zw zQT};+4q+YSF~2cgNdnF!aiNn$OCo9)JBAt(uIT(ZL-w!A+Q=h9O!_ml5++TbP7Jli z#zgqNt+pIeS^)9v?9%t$Q@FHB#^56L`aA1A_2XS_Nqk)8E`z07qcvO9N-s2yZhqbf zcUNQ51q)FmHSV-R21ZxH6IwdG38>fyT;zdWu$w6_%1@lDY34XGANa>zqxfR)I4LJ0nBF5 zk+S?_-DS1W;1jTo)NVn^kuiil0L*FqooG{1``>>uPS9{PW>i)D-o#tkUwQ@q76+Y& z5>(n|A~ROEmbaL#`?fEtz&{O-hh5r&c?|3J?PBI>sl!U(W9#u-m0O0B&9NB_w1L@8 zyg6NEzG-EYiF&z94y5i}#p&@AWz{1HLmm1+8*OEsCRJ6=?I`j_z8H>pm^U4xnNO!w zp5Aef*20l;%mU-ecd0Lc#yD~UsTc^FT zTg!HKJp)AV+7U#Z&Cy%9wXN0dO8dbvyb6;qt*Ep-c$a;uefZJBI?qn5inZ7pBi~W1 zPL)ea`+#p=Z)5UYP(r!>{Y+AR|L&FTy<|AG+C~@XWd}vwKKP| zLJIk~^ji(6T;iW;LoaG}`zDn{kLzts31*jvMa}Xu`se!cpXqn>*^8KLfAn`EL#6L=IA5L ze<{|yDf`J7AML@7hA{qZ{O|gbU)jH#hMiEchd+<7cAG&uIVyw?xR53~=o4ZJoJkXn zECGy-n7TR2g?H36yxx@Y`)&bjHQ5#{FK>bkiVLV>aB{K@hj?{lWQ?qIfIWLc`YmQH z^l@4RIyxZ)+sLVRE2B5h|4LPKEgkt^ne(ns4!nmv02)?icl;;w)5jQm9IIQJE9ypA zAl5534*>kD_{?17dYZK2p?8m(ASMT~c;Vg_+)VMJ#hPShzqvx5@-ZW>k`VPX{@ycv zEbV|EQ++0h(Yn@zqD&$u;NfuBfVjFdX}3{7k%O{tWJH8{LmVqSWso7>dsW2fdG)Oh zIO~VYuF#dxF!_4*?C+Q}g>*kRf(O71iFAnXg_YWrSRh5ts-d;+%t0D!s8!29G1$yh zk>nEZ+Ddi98kNO3?5qOu0EjF6L4B??hvBK3Pvg--K(;fqJP-HfiFi(GkIaS-vt3}c ztTiViO5F<6(2Xh>JuKNj5pmR}zZm4WKF`HbTJnA;5&UPMb!Xz}0no)@^)?J_(BpBv za|`itS&bQE4=g#`h|^2wadU3J_EfQNZBaFxe}99LXzc5O8ve=tH|+V>J|QXnOgTVQ zn3kN|Zpu60zl(PSDwN9q#%nM55ABpLkQWmQ`w3 zhDYAscjo+-_)oRg86la#E%mjaYZ+wWS3hraYO!&$+?eWgBv0U;uAX0cm7c+4u|{h+ z;>E_XGRO=k?#mnhV`ttyguqP)FZO_#rwyF;y_;o1Evm=+63(D6xt;u$J%$5MhH746 zN}3J8;m{$t_8L6n@v;`MhDM^(&VjkknuH zE8pJdqt?EuIR9{}x9Ss}0G@d!vd1_w)Q$yBw(n0+*3M@0DCpA`iwZ+>DCFieqDD-S&@=`w4EbXQcKNU5~> z_;CvZu`7y8u%kF+yNlBUs()-`tsMvD271eoF6Iku;Z6;-#{27#I6bSOe(6=c<&xT3 z0b9y&Ihf3rNHWamqILCbrdgQy-Aa8Cp#x2h#g6jjqOj8OUV!Iz(F&TYQOg#|r&5v^HZtQBDiRYk32qEDI)4PNIjK z(Frs$3Pz66QjUuYn2KJlY1cN9JHWq4P3t#zyIacaR2B7N}Vn06a(D`$pgE-AI;1yk(7G9n)%}z z#KlSg@;%AB->JyD@R|!?y`p^y7BS9{FoFf0It09=cbw`7_p53^Wc|uWJZ_kj#(`+S zBlY9c7b}+Ti2oiPTHO6!heWy?QW#6w7J^@(7;f?v?*?eqRJyX!`91k#>rExLlsaQf zKJzhlLa`Y=B`7%TFC}Q`E{3eh_EZcNgIKwdnJ^lR@}Iu@eU!q`87P_JQ99+^@*3(> z)m*7I{v6qGMs3{jmjh&bHH-wxHBYC4X`PMFRoV*o)#jH1?Xpc4@6O{O;U0bYcblmUhLEyLL03xWl@x4)_igdiF`X5-^ z+2sot1mWtfIIdz5q$@An?!J(f^Hj=KEbwhCZ$Js^sh95Y%Kn(k>eb1}<@_&sJ&}oD za?)@KDsctjd)>NIUg&!Xt)2YQKP}~PJ^xN@^}j8#a@rgTOHFh7C-dI<&?tP{UBBn1 z-9F6Tu{IQ%J?bsr-H7HaX_=_%@OMk}S58g#<+Pm^*7X*=KxiaR6X;cf&Pp7TH-=Ec za0l2q-B7eTgP`_q(}|-e>k%+O7Y6e( zEr?bf6?UrZ+#xmEj$DyVQs04w_1DbbHDbhV=Og3wF%c?-Qx@Ba{(>Epr8~(p_p0gS z&`Uee%FV&x=Axr@+;+wOiSsq@TtLdymYpMPQ}w=U@&^2uHft^O0=5>XH56NCtaPVV ziY}Ni{lUzw>L0Ds%Ep#+D^lyS|Ni^7(FTv9Q`JzSMCnCK?M-^jyxY zktA!}+Uc%j-Flp!z~)F^gcmxP{~M;sY2W59?jl2-$ne%!1FyBvLj3`N$=(zAa~0R- zyM{Zx()QhH7ent^9O}a3T_T8zYwJjtl*-##XAIPr4N`mnNDuVt-#h@AyWSHagKdJW z`g@AF?|q!4Wk+&QAs=%(DA8JRK$yn1>%!RIODPSBEiNKe*Fj{i6W*J*-)=)`1A441-0AZd8q;ahJ&o!mb zKBBpHiR?atr;E#@dqTeHTE!7*bW#d-!_oH3vo`#e8eMT3u}lr=;wr6o{sox#?_Vgp zmgSzhZbhAM-q9Fz9V_v!>M>6#y;jd%A3JGwlR=PKOl(EkS>-YZ?YT=CsQ>k>W3uFa z_V<*W!fvC8yqbZn>75gy0QVA)%Ufo}< zhGC$U@UrxfY;uD48yY-1H9KQtF?w)Yy|>}z(|?v~s7sd~02(SpRTl-tDVH&pj{k-w zwGB@v&}u&ibPWoXC~Y-PmRe$@ye;#G&~ZYUi6^S!lBG;-Eicwlj_N!vz-XkO3>|r} zekm9K`q1x5>E+#%CY`08Hu{>4@zAv^Z{8gN+;eK@ zA&80*YV%AKWmiz6n8%2=hP^wNdY;vlGcKx9<^x%HJUZn3=e>-wxsq@}0VVxC^h_(` zqPPN5J_jLo1MGz`_LcSf*1~hD2E1~k7+NVhwZLJW+BrF{m`hljtV4`)W51M>V4=k& z7?CK{=o-tdV=;d&IqZ=AjB*jO(DwB;;#4rjH!(qBJ&-#I)F2)0v3+<$nBqRd!dzLm zS<6Vp%z|KS?N2Uo`9pK+p)Iec#BaMpw#D>JxzevTegm(KASNh_d7lR1-kk6*SllD8 z>7To){|bC&j2K!kFh36o%s12#I8tEYMrhxrikaNnXB(*dwPiB5^b-0Ws0sNSj}|oU zA}60gnv|qv6qUff@0J~=ShwUp*4=`>jy+r4{c#(2B5Ic5K9rfdcZrRpO`NjUmPlA! zkAS%wS*0yatguPzzCFlp-jYQDf9s~EoMLd*I8sMsC= zIk>U698#OJMmu3k+BmZlPfB2MCdp*5#K;Mb_UZxUA1IIAk6AXbf7%jMt_mr9whSX2 zk%35aB>4AbC1_}LDrT;S(G@ElzF?>l)OGNmx;4a2dLYtb_Xh-oF zX41B_X9CA4+%O1d%sX(xP|EpGdVhG|3OavwJ8)_fW%S4PAcF(LA(2>OJOZ~0TB(*4 z&Y3|ghD?k^*@}1{?Qd`08m1xl_tJbkn!%E2@(dNcBEz{;17jxtRwvl0sw2cj6$%S_ z3?F{t4*8tcFU-zLl<$_qr>)b_f6VVk`{0OI!O~om(#3E0-o`E$LyJ=aS}u9#7^o1@ z`xY683`6IltUWca9}VRJ@K5ll!FonDgGp*@&s&v>9gNG4zOM8SDx8W4hdFnkaJkgO zq402NkvpV%EHFDA+)L~irp7A(R!dPiQx(3fyd}*4Rnp2FkdfWWpZ%?*aq#`ErV~?Z zgi}LL>OA-B)Gc%>lb=7n$hrMhsOj_;;$QUuyU}0dsbG5C=Y^gAa89QomIr`LwX^P> z;SQJVc|f|F9e?jMH&E2z0pQ2VTba#%1*{oDfV3mph1=#ekZ#c$z2fUBnH;ecMS^dB z%r{BfZy_<1U@(loboA2Ij3*(>FTEb}+ghl0rJ&r9v0g;W7&9heXQLBv%xz*9njA0&Q|C*HF(M0QC=mibPecblb{5?u)JXTNjda(gcah{^R{) zj&U`o*14Ihx>XkNbdb`e76-_??(uJ{W`qLBwT+k_`Kza0s6KUPQr@Gpvght@^SQedA_ zUg7%CvygV1fS;(sZ;Afi8-t}>a37kRu~vqzA?j2$aIlIu@6g2@LjY|(GukP!iFa?+ zF`sS?Pd{MC(<2(cf;u^4Y1lhLS`2;VmFZ&GNGq7|_f}-47(YWS8CAds`DGry~+>P?dH>ekaNz&A#E+b(BVr zw*E0OaaAoYVLI#DPv7cQH%C#9eUOhPPC5e<9H$o8Dw*((ub z6}@$J?1-=V>lKrqB;b)*)58KP((-n3(jvzqtLZ4;3+eALbLrV?-LnaVo>|SE=NVtd zvuN($aT4>#QR&e(YdZ)*s01eUlY=|rl3WF-C>GDm0AzkHXTLu4qn3+M@}P0)?g5~F z+F*Rh`R8u%(epGmC~T(SHOIh&9{>)d#+-8tZL(3vg+9n%aWQlr$nl|U!XiZW;tSO} z2VQw6f~a$cyFpX7o}4}Z=o0UVWr4^x&8PC}$4HsPEYvWV$eCo>}SH%+zE72h4 zDIfAeo>ss4_O4%^0aDYV*-WUoz8}cZe$dn&f`~NG$OpyiSNoBysf0 zxZKbz6`wT9YG!S9P4a+*dg9{{%ZCHttn$$dBkvUyMhzh>08Q}y~KtUrIRYfZ}+ zaks5%eOq65b9Seuppe@y%IgwLIkAuqP6uya7&AF!k15bGl_E(dx9*fYfL{ z@(Nw7_lJt)#m1BPu{1B;VckR{q#Ro)&aH`5e81aL>p*?~nbll3z*e`RX}{D%JNP*z z=9^kYDOsAOdt}c<=nAg|%icin=EL{QZg(h8suOWaUR0V8qPGss1 zo^^|hCR+_|=`6l7`4q3eYZzU37%lcswt@@AqS=WQdo24_0(Bk!Gz|T-$R?9$w2|kv z3=J{~cCy?k+DWAKuEg*>dyF1?pa$HjEjtEJDK(GYk|6bC{@Mtn;-8s?g{W-}bP9>XskuAij@6MSxP^DQ@6-})AYXLm0_HmISq-Kz;waebiDq}RW2TJ* zJNEPL`w#oa{a68VwR+Hl&x@<_Uy}9=v>c>(fa(;cOS&a0G4?*?8;133q$}UFJ$N%}3UY%Q>l0&7cTuiKeD=?k;i4_W!D z)8&G@6Id|sybD>|jJjt(YebJnoFDTDlx|g|x+a{uAA^4z_H!SmP851Zy?x4_FQPc_ z(#3!d5~OuQu`OCk-hi~ItokNzqdIw|Bp^}m^8=qDQsoO7` znla9QjnwNIaoBnM;2cEacDPecTHD{Mbb*+Y+9-2)8#l&Hmo)uOgGc--e^aG502oL} z_LK?3iLHoibGLh;+7M@iqY&2&yRP#0EXuxo;~XBq6ya@=IB;*SH6^$5on7R%ln`$M z#oRxnV-cmf;wK!gN@jbfYzS*Y7W%%E;}dMb*aLz{Uz&Pi_w8HF9w~ixOVvH*-9QAX zk&tBR7lKKGmA!WYm^PXN#EH%K(ezmYeHFXTXrR$Jysb{wS4{PJw=jHXQh}E@P*GIm zRDmZo)J~}0^0B^yjv)P2->I40c4HTA-!@NOo!HM+%6uYfSqs~WQNL-N=!*6XL$u|t zUb_!SZG>3GBlIjHg3OUXdgd7*k=A(5q|Su-MsCTJ+UdR!uE=0tb1$<6MR-bts%@cXW4mP&B_$Pi z2S)mT^U6H!wp5EZ#mRqTX&6FO$k-M<5kTo|s z4*LP1vqyTJJHm8vWwv0f;V(5~! zToQ8ZZc19v>yq0LBEuxhp%A8HbT3hxOg;n2^hPUGRWrkmgzc_Qp@&>YBhC2dFTI-9 zZ2@%N5HmaXctYOY%ii}v)hR7PYa@CljWb=m8i(E@loKvc-sY|ZFq3q57k5rGowrX) zn3d^Sj21ysew;*nKKJs<=yp#CuJ`HCN7k_#g`wjz=@_-nt)jI#_c=oWHp__}Rl%|- z*K-x=1YdgXn1x7}?hOQ3!a<3f>ADmO@)4>t5|*#~mlF7up5mLjD)B5&OffC#45g%WIvUZwm#P6ZbiU}! z3%*j#hO6rS*^coexAS5t?jVy?v&ph0JGtfqtB$7xh)E6`#u+0j&U|P6cK_8Pe{X{2 z>jL^~TtBThXw+XQqt$uzz_tN1=J`NTg(>FK_ox3b24G~EXNqa^>ESrIir)_@D^YmU zgZ3*n{^X&KjLU)M-iwx1VGELFK`_{Nuy5&HL%$5qYgvkIkr$c6n`ykl2c2Y8+NwcpGQkcA!?(&{B92qSoc2q-Zkc$pDshJ<`%t{*9%p)>{@^e?OEYXP1h#ryKq{EVCV@1qC5a>viB6BrO zoZ{u0zP&G$OZwZ3Q|axvKkPn_rH4j3X~I$1nHT|IM{Wlhf%nEZdmyqYV8MR(2mDw6 z%1`>nadsj%abMlytJdI3w0g1K=xVer6mqtR=CNx+a6t81D)-Z^{p{VWhM<@HK9;;k zGaUEUQ;&TX2m!cC{%OFlXDvdt(3bnL_&o>~K2y7)x3FfKcXmB(2{~M=16pOA6r}C2 z%ulBmr4|R3zV+LMva|crySsJ<(B}RjDI&>rEUEbg-@hzuqq!lR@Ehwtj0=>x9H?~~ zqhqAf_UF*X=yk=ZI2Lbv`t?p9I_X!^Zj8B~@VfgnRC^3u&Tb6C7bY)RCbOY2tkB#V zmueLopDH-K8k6hkyt9>;y34Iu1>2sCbMY)qS4CyQC!$9kkd?q8x_Yv| zEG6Y4-NjXQ-Mim(#7jxqF)HXlC#FoVVK}D{ipNRyb z{FSoTn`lg(2?Dk zjuk8G$9_kw^kRc3g;2ZsekRODH==`Lrz!4SVaxc(;!~Fq+X}QgkpoK@*R_U$NDzT> z@eNCm!T{7@fB4D{lT?in3)o%|q=@rs$dKwK>04iN3K+gHov&ir!}k2A;y=s=>fxRd z6xLWso)>sLEn4~{ElR>ZAf4iVuOM}LJH8nc;vC-H#^jR`A#VkwZS$F$O@zPnjI~ud zv=E7NEE#d1*Jh46ft;JG9=gxHPGAKgA-_H9hNEP07mITN?FnQ1a#UH{=nLT!Oo^7bFX*`ia zF?nVWPMdGR``|}bR%EN(?|Of^%b+3>awi@Dk02m?=TmDI2WifQ@~<8JO-6)S75XV^ z4YSpy9rO2`k3cxwl!JkgpE|0M2Pm4NUANVc?!R8*6*87k^#U5Rhyb3Ol#QRY%BGEW zR_9DSR;sMt8; z0%~`CRriE9Mn?!p-x-`-iC7i7)j(em=fu)_ae`Rv%lL~c*Qi;n+H>oP{k}ds8toSB zJOBW`UQn}^kCM$QzUoZE@Dl=VqMrK@eEW|li;`4GiBbcL;0*wfDFgVyxXZ@DCO0Nr z@dT@;{tLzDS6I+?8LZ!MA>t1|a7fADV0{Up&kWqUdYg4AH8P@6saJ_+S~(3O(CL?J zOU5Wy>YW$|i}}FrzOGil*e$zH#f*noX69oGZ;J;nw1tU@T*tt7-Z;OC_brgc9K2Kg z7e^eV22F`u4d;iflVR>o4bQy|1UXvm{Qiae7!4#x=C*L7Xqxs{G(S#|FAscoY(`HH zZfG{7oGA)e>}f->Q&zSu-5?7|9h)mwh|I~&8xT^71L(R^2wGmC?CEcrI8&U+52`Q$ z-f9u;IoKghF^@W+zf2S8roWJOjM2>INeP*Yw^puSbp7!YK1V^gz;M zG+YV(&mBcB+Snvs1&c4z3S{M~ZZ2D&KV#w)rqtJNobCp{l$o;Bha{dMm z>^+MS5OXx@Ev6sJ@f>E?`I)RFY}Z$iB(t{X?y-S_iO-@*z3BbZ_sQ06v0|51lH@_& zdIKlm8q%DL){@Xakw`nSYINUvH?nXkY*NZ9(_P=j&TsDNKG0{5 z5Hv-%lj1y~492E@)tN&5n)*%VKRiI@C!D9B#~vX?=C3IM(}SW|wdwi&bb1l4IaD&8? zhB|hS#7$A2k_(I|LhTJ%?QVeBf6Rtuka>2hVMmp7^_w=vtz#d#z-;GSC;=zij80u9 zyHp`l2wPh$H^lP~28YP0CwE^aajARdr1Vx#dVhdN@SHQlje;rh;;`;xuj&o&r|jPr zF_vxd5gJaG6h?W(u6`_IC1Qu1Y}0&@Wdk1yx{NMhSfqmo%$GEq%yYpAV3S(ox-vLU zS0~RQbYWPqLW7h}qG5wN$j3%Wzc#rzzE0h^A$);?L)K$^bSCHGf6|p7{#{A!Dnr)i zj}8c!mTw@2EQiy<>d%X5nUDWn-VssRt_Uh2Ja2wcYc7dQE2rv|5@tn*ihoz&GU_c) zP#>qV8b{aH<|=b7(J1qzhEzQOW(Q}%@ki}VdH zw$#W`81J1&PCR0(D+SztqH}KDlf5rZP<0dIaOGsYEc$q=&`2=l+X==nTh>B;UA}h) z^&Nbhz3?!trsL&PLAyd)bD1_ynWElR=1!fRQ0sV1G`)`EzBvzM3742o?039m3HC2i zb4<5rHXLGh_h55}^7iGyqq}5&t|4V;W0w&!W0#Ilu`t+#ALkLZLVVWpScAwCwE_v) zeQYmqczh`tO{?xMN-7ay;IVX}X@C3xC}NG}%*0u`hw;+IX1Nz_u~=k$lk1()3e2=k z*;7SF_lseY^TwAjqkoN6+V@es+8*W^p3a?`PSHx27*cm7g9F*EwR08?=ISxo0S7&V zq=9R@|^*e|GfiM`m1<|A1$kDuLxfrM4oH=sxWKBxdwPGo*khOzPns}S56gWi%ry_ z<6wiwng*XMtp$uuVyWMCc36M~lF6gyEZ};I{qAZM+Dq!a6pGs|2jIht{rSu}FZgXH zC8h%F(Tq7W$K*(V1cw%}GpgJDmVwGQe|3MvSYq*Ed0~Y-;t8Sc;{V}PgyOIO8F9wA z@>pJlSX@$LWxjeP_!z?R+>u&;FTQ2Fbj1K+KFm=)(j~FSA%7UY%qy0pSsSgFagwLJ z?EL3?$LJW_^hx<7u;DunzkK>ZkvfdgJXWghO_O6&I!Z(qLTgfK;nf&p&Nh%SSZ1}l zL0=MHpfaG+Mv_fpM8n%K)IR`^k@4rNZ#x|QBpiI)deCa{$6iY_HplMd>*sH_E3TV` z_OGBTMtwBLE2G)$EQf8ek#R>zmDn-XIV7Af)hP>`ox52%_w2Db#fduwYiY`-%e6=c1@9Q-*_l)`Enx1I&G1wxp=j-m!NofMp`+He) zQBlSTThh-WpCI;Oio*hnO$tg$n|~?U<8wgRaoV_Uj}X}V4_FZmo1SkD`2Gi~e|w1w z5YU1A2k4o#E5w%h)Y2P)UoFHuX@f79#i&b2pa?Jn07w`<@&U?8u)e=~1!z}(x+p_} z^*o+M_QNx0tnhX~_Jvaiv(canI}g&Z?E&z3Htu#DA#Hz4qTGqxU?o~{l`?Ef6!cTst5|g%6bg6hUuVbDvwPnV4&?8AbfQIM@ zKarS=WS&QGF2fGMAOIi%fB+!w9l!=1zyM_;I~5Qu6uJ;npsR^!&LyBJ0DuO-FU&wT zAO->eVz3(!F?tX%U?u_v0s!(PeZ{{5>D8 z{ts$-y`RzGnO= znxvPJP>rQ;uI7@8UqCZk$?e$bf~c=9hEYj+oA;y!xT9wAOX$pC>W!1wqgZuDiFJE< zBN)G_v|Yg>fkxxhZF4U&()fO5V@snT=AJn{m8IlkEHUr*XQbmu&n7P~L80e3^7g+& zDW$&Bze9Yuq_>iaeg-nOt))a9^5(wv=1-pOBT4n7l3%He{OuqnZS!?9x^~^S(|(B2 z$}6*v`tUMxSHCiTf6${BC4P6YmP)^itLsM6X)WD+xBmbmB&92KytfGFnzlsTlG#=G z9jY9Q&(FD*SjLw(t#@E~`6VRfPj+FM$*A4!D?8;Ix>ea(%b8WW>(I=r&DFIzx8%O3 z(D2PaxY4C8q}|E+o@R$m^J)`+mK)cJ^my?&<4N`E#3ZK{UQCMaj@P=i)Z=U9ywSWQ z+&s~!5kAbqZ+(q&y^eXk{X#1n>{>8`rf+Fb8a>bnY})Jqem<5W!qyim)?ENS3a%ny*6)oSoZa?>KerkR1;O0iS{<{_YGtxI+ zYH_dCo2Qv2`vwW8x!H>`-UZtgyBAJj|FH+m>H5*u^T_sdB}SEMJeH z(mrxfbrZE74lz&yE4tsRPoDwlDAfSu+e9p z(8DI5@p95%Ql-FhG4-CDDBa`-`u^?@p04V$q(G%lm7sx`-&VFHcj&?zN#+Y)cbj3jdV$RocVDk z{{Sj}R!OP1&*}Jb#Fg?wE3$X@H_MOV_tcsHYUA z`C`eHCaE>#6&Y6B9N8a6Z$9hjVJC5*h+E5Jc*#6!*~;GLxaG4<4y)!#_yIWNxljau zD6&d@Nj$FN#0(h#03rZZF)$9}M4^DjA%KPe7Ea0_U|K0XwlhU028oo6;>t`40a()j z5HJ82Z~zMc5CafCqF@3BOClR&SU0%4fb0Y?1TscIA7A)csr{eY>{0&!?_tT0?4|zz z>U@Ff`zxwiFKIY-qD@9I&lM*8CGfx0)N+)U^c3WsJL+1UzPl)+g=OvF{{X3LCwuKj zrX`o6@^0(E)){MK%Ey(rzmd}%o2%ThCZ3DUYCc0#T}~L}P5P#730f}E-Hu(&;U{R} z$34J#iXqk5z!aFT4Q))l2LN%jFkO74ROnDpU9}c+3>0JJb3y1 zR8{>=5{l@IUSAb!$T`=Ilx<>fw#Gj9%pOgtlVYXO(UYdwr9J79Ii&tBo**f7*|Qv% z;{JWhlk-pYGLzqC{S1tx+Vk`|Go>r+{F&1x*JVZ-C4Fj$uQx0mZ@qaKO+AkMsXxmv zlR0LWHtMJ=mnFE_&n}jCJXaYblQe1}9F5eOQJJ1cS46372W}~KObl^M0RCT*52kIvtXR1tv7E-20VwZGoaMoyDmnzQ474YmIOv~U<;llb)0c)#g;$Mt_h?Be;OYr0+ zOb)dF0LaoZ-^}HVi&NPYbt&(@%%zib*3ZQpt0!hYdt2Dc0VD(rso^ta^6vC{JGxhpl=mfoi;n_i!x4r;cf$+J$!HFfqPQ<8h7 z3wP$ql8*Z{{F#)SPrLOJB3InTcAttmZ=0!<(snc> z43{-Cn?5&EUSW~AJ6%z#oN~g~Ug)UtGsc@nDV=(#)TQKcy{yL7aF`f#Q`?{yYW{AK z52wrk^Gm5Qb^st!=m-D%?>`G0_uNHZ)sOX&`fe_tFayzx z%FMKpEAxOGlx>atOzMy2Ucb-)K)Cc?jNc#S05r>g_iN;8zmL!W3QuqKcan(...) + ok 3 - output file exists + 1..3 +ok 3 - decoder +1..3 +;31;25;22#11;2;31;25;19#12;2;28;28;19#13;2;44;38;31#14;2;31;30;27#15;2;47;38;31#16;2;28;28;22#17;2;25;25;20#18;2;47;38;35#19;2;41;38;31#20;2;44;42;36#21;2;47;49;28#22;2;35;25;22#23;2;49;47;38#24;2;41;35;31#25;2;42;41;28#26;2;38;27;17#27;2;41;31;28#28;2;44;35;28#29;2;31;22;19#30;2;38;28;25#31;2;41;31;25#32;2;35;28;25#33;2;38;31;28#34;2;38;35;28#35;2;35;33;30#36;2;38;35;22#37;2;44;44;41#38;2;53;53;53#39;2;63;66;63#40;2;74;74;69#41;2;78;82;78#42;2;82;82;85#43;2;93;93;91#44;2;97;97;94#45;2;93;96;96#46;2;89;89;89#47;2;85;85;88#48;2;78;77;77#49;2;63;63;60#50;2;61;58;56#51;2;56;55;49#52;2;56;55;55#53;2;75;75;75#54;2;71;66;63#55;2;58;60;55#56;2;50;50;50#57;2;33;31;17#58;2;50;49;45#59;2;69;69;69#60;2;94;94;97#61;2;91;94;97#62;2;69;72;66#63;2;49;49;44#64;2;22;20;17#65;2;88;91;94#66;2;89;85;74#67;2;88;91;97#68;2;91;89;97#69;2;66;69;66#70;2;39;38;35#71;2;83;88;89#72;2;72;75;75#73;2;63;63;63#74;2;47;47;47#75;2;85;88;91#76;2;28;22;16#77;2;72;72;72#78;2;88;88;94#79;2;35;31;22#80;2;78;82;82#81;2;66;66;66#82;2;25;19;16#83;2;24;25;25#84;2;85;85;91#85;2;82;82;88#86;2;35;41;35#87;2;82;85;88#88;2;80;83;86#89;2;85;88;94#90;2;20;25;20#91;2;52;55;50#92;2;64;64;55#93;2;78;82;85#94;2;82;85;91#95;2;78;78;85#96;2;16;19;16#97;2;17;19;17#98;2;75;78;82#99;2;75;75;82#100;2;72;75;78#101;2;72;72;78#102;2;69;72;72#103;2;69;72;75#104;2;19;19;13#105;2;19;16;9#106;2;24;14;8#107;2;66;69;72#108;2;66;71;75#109;2;22;19;13#110;2;19;19;9#111;2;69;67;75#112;2;66;66;72#113;2;69;72;78#114;2;66;69;69#115;2;69;69;72#116;2;53;56;60#117;2;78;78;88#118;2;66;66;69#119;2;63;66;69#120;2;75;78;78#121;2;63;66;66#122;2;72;72;75#123;2;78;78;82#124;2;31;28;14#125;2;60;63;63#126;2;60;63;66#127;2;56;60;63#128;2;56;56;60#129;2;53;53;56#130;2;50;53;56#131;2;75;78;85#132;2;60;60;63#133;2;75;75;78#134;2;72;75;82#135;2;61;64;69#136;2;47;49;53#137;2;19;16;13#138;2;25;19;13#139;2;75;78;75#140;2;56;60;60#141;2;58;60;66#142;2;50;53;53#143;2;63;63;66#144;2;47;47;50#145;2;44;47;47#146;2;75;75;85#147;2;72;69;78#148;2;60;63;60#149;2;53;56;56#150;2;17;14;13#151;2;69;67;69#152;2;47;50;50#153;2;13;9;0#154;2;83;60;44#155;2;67;55;44#156;2;66;50;30#157;2;39;36;20#158;2;89;72;49#159;2;78;63;22#160;2;85;71;35#161;2;69;56;19#162;2;60;53;22#163;2;60;52;11#164;2;44;42;19#165;2;50;50;53#166;2;25;17;20#167;2;31;22;22#168;2;25;25;11#169;2;28;27;8#170;2;24;25;16#171;2;25;17;5#172;2;25;13;6#173;2;42;33;17#174;2;82;56;30#175;2;80;60;9#176;2;56;42;19#177;2;56;49;38#178;2;44;41;8#179;2;17;22;6#180;2;35;30;8#181;2;28;19;13#182;2;22;16;14#183;2;11;16;8#184;2;16;16;6#185;2;86;61;20#186;2;39;25;3#187;2;33;16;5#188;2;35;20;9#189;2;44;28;25#190;2;88;58;8#191;2;17;17;3#192;2;16;13;3#193;2;16;13;9#194;2;25;13;0#195;2;44;33;6#196;2;16;16;9#197;2;78;50;20#198;2;19;13;6#199;2;77;50;11#200;2;71;52;8#201;2;30;17;3#202;2;13;9;3#203;2;3;3;2#204;2;9;6;2#205;2;35;17;5#206;2;67;44;17#207;2;31;25;8#208;2;16;19;6#209;2;19;6;3#210;2;78;45;5#211;2;78;52;6#212;2;61;42;6#213;2;5;5;14#214;2;19;16;17#215;2;13;13;3#216;2;49;31;13#217;2;8;11;2#218;2;11;6;8#219;2;66;33;3#220;2;25;6;2#221;2;33;8;3#222;2;71;44;8#223;2;53;31;9#224;2;58;31;6#225;2;50;56;56#226;2;14;13;14#227;2;53;24;6#228;2;49;28;2#229;2;55;22;2#230;2;49;22;3#231;2;47;17;2#232;2;42;20;0#233;2;16;6;3#234;2;39;14;3#235;2;39;19;8#236;2;49;20;3#237;2;11;9;9#238;2;41;14;0#239;2;13;13;9#240;2;9;9;3#241;2;11;13;14#242;2;13;9;6#243;2;42;25;5#244;2;8;11;6#245;2;16;19;9#246;2;13;13;6#247;2;45;20;3#248;2;35;16;3#249;2;44;17;0#250;2;69;72;69#251;2;69;75;78#252;2;9;9;6#253;2;78;85;85#1_O_W?WcGcWCYcQcAc?O_?OC???O?g?IScE{A}A|A^_NOfGRDHVHeHRCBGBC@!4?BCJ?BC@A#5!6?_#4???_?_?o?o?o?o?o?oKocWcW_}_}guxukNNNDNNDNNDFfBBP`@f!6v!11FBBP?C!8@!11?BB!5?@BB@#6!34?_?o?_O_?o?sgsgSgug}h}i|y~}~}~}~}!4~^n^b^J~B~@J?V?@?@A@#8?__GocWcY_wcYsIsGmWeOmGvGuHuKzCyDKa?i?a?cC?GCOGS?kQGSIOKaCYCQcgC#6!29?@?@?@?@O@Q`HQdIT@Ul@~DzVj~j~V!14~}!7~}z}z}!12~|z|~}~}n}~}|y}}[B_?O_?O#4!20?BFLFXFJ\v^~~t~~t~~t~z~v\z|v|~V~~V~~V~tkS[SKSSGOgW_wgO{~vV~nz}juzmzuzmjV~Tj~|zVlzTlJPhntZntz[tzlv|j|vlv~^v~^v~z^z~z~z^~^~V~nz~$#0^n^F~FZFZFjDJDJT@RdJRDR@JRdJPBD@JPBD@@A@?@?@#3!6?_?o?OgOcWewuxm{zs~{z}|!6~^~~~N~NvJ~B~JvJnJvNrNZfZf^@^@VHEHR#5oO_Oo?oO_WgOkomYkW!6G!11w{{m~z!8}!11~{{!5~}{{}!34~^~N~^n^~N~JVJVjVHV@U@TAD?@?@?@?@#7!4?_O_[_s?{?}s~g~}~}|}~^^vNZfZd^FZDJDJV@F@NPFGVHEHBCJDIR@^@VHVJRnVjNfJnRLvJtNrLZDZLZVZn^~F~VjVnRnVn^vn^~n~^!8~}~}~}~}n}l]ulYti}hQ}?yCgS?S?g#5!14?@!7?@C@C@!12?ACA?@?@O@?@AD@@BSJTATj?jTjTnZvJ~n~^!8~{wqwewsaG_#11??I??I??I?C?GaCAGA?g??g??G#5??@a@_`ahAdADADAD#11???g?OC?SGCOCGCOCG?iS?ACgQCgQCgCOIcOICaGCQGASAGQG?_G?_G?C_C?C?C_???g?OC$#2???_?_?o?_O_OgOgYkISkig}skIsE{oiOg?w?{?{_]omWvkyugUXEkjSfWbWFHEP#12!18?O?OGC?K?CGCOCG#10!17?_Oi?oI_OaOGOK?C#3Q#13!154?_?o?_O_W_?o?_?o?o?o?o_[_SgSgOgO_O_O_O?_?_?_?O!4_??_O_?w?gSgOkOgO_GO_?O?_#9!91?_gSilISnSiSiOcGs?O?_#10!43?_?IQHaJQHAOIOaWAOi??G!24?A?_AQ#3!6?@A#5!25?_$#3!520?d?D?D?D?B!6?@?@?@?@?@O_#5!11?OC-#2s~s~s~t}|zu|v|z~z~z~z}zv~]~n~U~nU~F~VnZm^vMrNRDRCIOBC@A?@A?@#12!7?_O??_?O_??C?GA#5!18?__?oO_o_OoGoKvxmzs~y\vy^t~m^j!10~}~~}!4~^~n^vZVlZf\bNPnRnRnRnVhVJVjVjTnVxVkVzNrNrNrNrnVz^vJ~B~B~B^bZBZd]B[BUhFGQL_HAHACABABAA#7!8?_?_W_SgSiSgvWv}t~{~|}!6~nVNfZB\ASJ??A?@#15!11?o?_#7!9?A?@A??@!9?@??@A??@A?CHAHA?FOBS@U?CJ?jAJQdJsBkZd]`^lv\z^!13~}~}|zulQlQlOjCqHqLOiC?cO!7?_O#5!34?@A?DGODgAGS`IsJ{B{Js^lvz!9~|!4~n{{AOeGQcQKOdOCG_OGC!9?g?bB_B_B@A@#11!9?A???cHCODGAG`?GAOC_GQdGCPAG@QCI_CGCOA?@??T?G@??A???@??CP?H_SG?c?Q?@$#1I?H?H?I@ACHAGAC?C?C?C@CG?@???@??@!6?@??@!6?@#5!18?_OC?aG?P_GC`C_#12!22?O?O#10!5?GA??A??A#4!18?@??@#9!4?_?O_GcgQcWa[omOkOkOkOgUgsgSgSiOgEgRgCoKoKoKoKOgC_Gs?{?{?{_[c{#6cY`{b{hUwvlq^u|u|z|{|{||!8~^~^f^jVjTjVGfG@I?B?A@#8!6?OgO?CSalJ_VlPmOMPeGTAHQDA@?@?@I@IPEHeH?CG??A??D?D?D?DGQdI_H_JOcZ?QcOCX?C#6!40?@?@ACHQlQlQnSzLuLqnTz~Zn!7~^n!34~}|vGqDgQ`SBGC#4!20?A!4?OBB|nXvlZlrnYnzv^mvz~tZ~|v}z~T~[{[{[{{{u|~u|n~~|~|~~~Zuznyv|v[~u|nz^vlYvhAs@Slzt^zvzn|~m~~i~v}^n|~n~]n~zm~u^jv~Z~l~}~$#0@?A?A#3!20?_?O?g?Og?w?gOcO_GoKokiKzsn{z]|^m|N}VjVl^nVNJfZFHFHAJ?BA`CBCHAGA@A?A@A?A@?@A?@A@?@!5?@#14!7?_??_??O_O#13!140?_W_g?O_SgQkPmpmXvi|uly|}N}^}t}tmxuXu|zu|~|}~y~y~y~yvkYt]s^smXczcXexewj{j}h~zs~S|slYsJ{RcY`]_QGaC_#9!82?GqDiQD[bgUpJsB{BsJ_QGC#11!31?@???Ic?AG@C#10?A???B?B?A?GA?HAO??A#3!13?A?@#10!8?QG?cA#5!10?O!6?_O??O?_O$#10!46?O!6?_?_O?o?gSgQ_OgOCG_GS_U_CRGOG#3!440?@#5!34?cHQg$#16!47?_#4!23?O???KO_oCOZ{zu|v|}|~|}|~|}~}\^}LmNMNnNvNq?CPCH?D?GD?I?@?C-#3osgQSwQWESRoQDQQcATaORcbSBSB_R?VcZcv[rczQtJpWeOlRkRKbLQdID?@I@?A`I@IP???@#9!28?_O_?O?OgOcO_#6?G_?COCG??CA?iC#9o_WcycZsjSjsjSzSzSi\yD}JuLuF|Juj@MPlPidLpIuOdIpEhIrEhUPvCjSfKrElQDM@IJ@NCRKJ@ECL#7!21?_?O_SgUgTiSzkV{j}l~~}!6~^n~F~JVlRIDITA@?@#15!6?_G?Gs?kQcY_VCRCJOFoFGeGQcO_Wc?SA??o_O?o_O#8!9?@???@?@!8?O?O?O_O_#19!18?_O?_O!4?oO_?O#9!64?zCrSjcWfGUpUgvGv?SaGPG#4!13?T??~~TMDJE|yVn\j^vl]nznVzlZulZulZulZuj\uj\uZt^n~^~^~^~^}^~]~^|v}~t~z~}z^xsYpj~Yn~v]nz^u~Ynl~u\vz|m~\vz^u~\~zu~^~V|Z~~$#2NJVLjFLfXbKJDy@lBXaLJcJOJoJgVGvGBCB?BCJ?@??CA?@A#5??_??_??o??o?o?o?sAPgS?ACHasYpmo|!5{}{~~z~~z~|b[ju[Je^SjkfQlZlV}dZuXeztztyTyTrJ^dZDZcJSjSJSjCjCJTADI@CHAH?A?@?C@?ACP?Q?D?HQCGPAT?HQ@I?JSBGRCHQDiPaDOc?BGB?CG@A?@?@!4?@A#8!38?_O?W?cGAC`Q_?GCQcITaH?A?@#18!7?_?g?k_cG_G_O?_??_?_?O_gw!4?_??_#7!28?@A?I?AChAk@lAlJuLzEZl^Fn~Nn!4~NnN^ne\zUlYtilYdzeHsHUgDiPCaOH_S??_?O?G_#5!34?PA?S`MhVGvG~j\vmv!13~i~~??ipysxADgOaS_GQ`OCOgCQcHQcHQcHQcHSaGSaGcG_O?_?_?_?_?_?_?_!10?_CIdIS?cO?G_OC_H?dO???aGCAP?aGC_??_!4?_?_$#16???_??_?_G?C_?g?O_?O_?O?_??O?_G??_!7?GC???C??A!8?AG??I#12?C!5?A!33?_#14!7?G?QCHaH?ACI@gD?GC?A#6!14?_?_?o?o?o?w?sGSyomOiCY_MoHeGpEgS_KoCgcGo?gO_Go?gO_[ocYowcosypyo~}~}!4~}|!11~^~n^jVhViTjCRgBS@Q??@#13!9?_?O_OgSgTitylYti\u~|^u~vJ~RlZD^?z?ZOfWFWfXVlZN^FZnJTF~N^n^N^N!9~}~~~}~}!8~n~n~m\nT~|zU|R}Q|QsHqCxcQ_W??O#6!7?O_?XaChQdITQdYCXuJuhVyTmz\nu^j~~^~n~v^!29~CzKjSIdWbG#11!64?@??@?A!10?@??@??AG@?I?C?@C?A!5?@???@!7?Q?H!10?H?A?CH???GAc$#10!10?_?G???G?G?CG?G?G_CGC?_W?OG_GO?k?oIcPiOkPKr[QlIDyLEdITL??C?CA@C!4?@!479?@?C$#17!14?C??C!5?C?C!8?G!4?C?A??@G#4!9?O??o?OC_?Y@wcAh{xyu\JcMPNA!5B@B??C??C?A[bSHbSH?JCRGDA?A?@-#3~Oq@ugRokRg?vgQgRsApQcX_Z_X_Qs@titjSjDa@a?`?@?@?JQDI@?@?AC?@A!4?@#9!11?_?O?_?OgCgQgSgSgSgSiSgVg]isJ{RkYlyT}sj[yUxuGokOi}Wv]|^}^~N}\~]|^~N~ExEhUHATAT?TASAS`SHATASBSjCjSjCjSjCjU`MPm@mPm@mP#5A???@#7!12?_!8?_O??O?OKoDyCxExe|i\v}t~|~}!9~^vnPKaLOBGQ??@#15!7?OgCgTa[`]?n?PAD?ADA?oC?S?C?H?O`CO_CAgACOC@G?O@??C!19?C#8?dG`I_ITi#7???i?IOAS?tItItItlAQx\Kmzx|GidOIut~z}tmxfzexehV`]hUwDiWa\?i?PGCa@OCO#9!28?~?~?iU?lJoESqeOjS`KPI_H#4!13?H?~~T!4?~~~`^uXf}hVylVylZulZulZulZulZulZuZe|jUzuLyVyVi\uj]j|^uz|m^zmvz\}nvz]nv|zn|vZn}v^l~uv|mzv]zn|vZ}nz\}vz^l~Z~~$#10?i?sGQgCQgOeGOcPkAxGcXcQcXcYcHqGSISjSYL]PMYjUxIz_C_@sAY?H?CG?DA@#4!32?@?A#6!22?A!6?_?_?_?o?_?_?_?o?wExUhu|i|i~i|j|j]ju|i|i{jSzSjSzSjSzSh]pmP}PmP}Pm|~~~}!12~^!8~^n~~n~nrNyDzExEXATaG@I?A?@#8!9?_GOe@OA_C_D?Qc?C@A??@#18!8?_?OgCgy|[wx^Nz^j~Z]u~M]zN^z\V|Znz]U~m]oqhsAxCq@GC@gAPGA!5?G#19!26?AOlCAaPCCAvOIdPG#5!67?T_HQ_CXaLOnSj]rmt^u!13~u~??i!4~???]_HeW@UgDQgDQcHQcHQcHQcHQcHQcHcXAShCHqDgDgTaHS`SA_HCAP_CPGCa@OGC`OGACOAGcO@G_???GAPCG`COAGc@OCa@GC_Q#11?c$#16?DGA@C?H?C@G?BGA?GCAGA?L?E?DGAKA@!8?@?C??C#5?ShYsIx?|siyU|q|Yv}T}}u~z~~~|~^~m~^~nVzVlVjVjVjVjSjTgV`TJsBkRdQDi@JSbDhEHvLQnT@fG@A?@???@A?@A!4?@!21?@#13!89?GqLoNwVg~lY~z}|~~}nVzVi\b]@~?ViT?A@?C!7?`??@#21!11?_#13`?@?NLQJ|EzL}vz}V|mv|!5~r~Yv]t^tiT~~~T~tn|j~ItItItIOl?A_P??A#6??DOIc@I?C@IPEWCXEXUg]`UhFyTf\a~T~mvz\}nzn!28~?~?~?Hu?SJ_H?H#11!111?Q?H$#2??DG?@C?@?CP??@C???C??A???A?@#4!8?_O_KoCOGEOC!5?CcA?P@_?G?CG?i@@H?C???A???@#14!42?@#20!167?_A?_??_!6?_??_??_??_!6?_$#17!7?A??A??C???@??@#12!23?_?_#14!16?_#21!235?_-#3yDiOMOlQcRkPmObChUGQlOLQKOHA?AS?P?DGDGCG??A!5?A#9!9?_?_?_?o?kOiSiSiTiti|j|j[ZuLynYTi|YsnWviLuLrJuHv@~@lJTiVgViTiTjTmRlUhVkRiDYbEHAJTaDIPADGA?A_O??CG?CO?cO?C?_CO?CO?OG?O?G?O?G?O@GAHAGAD?D#7_GCOGC_S?s?s?s?cWasGqGsGqLSiLyTmXvi\u~|zu|y~~}~}!4~^~^nnZdZcHaGQDOD#15!11?OkPM?NOBGCI@!8?A@???@??@!6?@?A@?A@@??P??PI_COG_O#13?bNY~Vj~ny^uz|n}j~~lZ~~ze!4~y~yvm|j~iTmTzT?i?T?G?A#6!4?Ag???@?@??DG@QdIcJOfGVgTipEhU|Yd]b\uZl~v\nvz~V!20~?~?~?TgDQ?C#4!23?S@?S??~~jvNxvI|Ze|jUlzUlzUlzUlZulZulZulZulZulZulZulZuZe|jVkZvi~V|u|}~m^~U|}~\lvz~U|nuzlZulZtmtN}i^uxnyt~V|nuz\~mvz|n~~$#10DIDm@nALBkBE@NSJU`ELAfQdBjCTjDiFCB_?A?B?AC?C@E#6!35?_??_???_??_??_?O_GoGsGs?{?{QsiTgVgTiTiSiOkQgUgQkOyc[xu|si\ytm|yv|~|NnvRrVzjnZJfRr^ZjnZjn~fv^nvv^nvv^nuv|u|v|y~y^vznvz^j~J~J~J~Zf\JvLvJvLqjTqDiPeGTaH?ACHAD??@?@#8!4?_?_OOcYCRCPD?gA?Q?A?@??@#18!6?_O_Gsapcw^}vnn|~v[}n|vm~z}l~~l|v}|t}|tumvmin~mt^jnvNn^[od?gS?OD_HCAO@S#8??Qc??CX#7!4?D?DGPAS?TiPiCGiTTiifrp||~CTR~~~}~}~~yv}lYtZsnWvgViTMxUhAdY`[aHcQ?GaOGC?g#9!20?~?~?TiEWhcZ_]`UkPaLOd?QGCA#11!77?P??HA@?A!18?@$#5?_O!5?O???O??_???_!4?O??_?O?O???E?DGCLACAC?Da?Q_ggw{{~u\~Z}^~N~RnTjTjTiTITASASBcHQDOdITADJOFGDQ@AC?@AGA?A!13?@??@??@?D?@#19!16?O?GcG_CO?cOGcG_CO?cO??G?_?G?_?G?_?G#13!68?_GqKqlQlyl~|~}~~}~~~nRmPnOfGTIPE?@??O!8?O!7?A!7?GO?P#19!53?aT?i?TOKKAA?zgC#5!68?i?PaCZ_^`]hRm\qnY~lvz|!8~j}~j~~??SGoEGtAcXAShQChQChQChQcHQcHQcHQcHQcHQcHQcHQcHcXASgRcGT?gAHA@??_?_???_QGC?hAOHCQcHQcIPIo?T_HEODI?gAOHCa?PGCAO$#12?O??_???G!5?GO??_???_?_?_GOg?gA?A??A?@!4?A#5!106?G!8?G#21!122?_??O?A?G`?OAG!4?Q??Q?G??G??G??G?C$#16???@#4O?O_??Og?_???GO?OG?G?CQ?C???g{Wpwooqoxxxwxy\|l^VVFBB?HA?C@#20!223?G!12?C!8?A??A!6?O!4?O??O?_$#16!18?@!11?@-#4O?PAGqSApG_ADgS_@??GJ!4?_AO??AGn~~}~~^N^KFBbB?G??G!6?@#6!13?_O?_W_Cy@QGdAGtAhSiT_ItK}hUxulyd~kZu|}~\NelV|]ned~~EvmlvT^nmz^Znzmh^evZp|KyViVlSe\rFYfTjTnTjRmRlTiUjSkXeYn\tM{TmYjqMt[C^mQlQlQlRmOnQlQLQeGRcAHA?A@A?@A!4?@A#13!13?Ok?gSgSgSgti\y|}hVzmznzv~~~^tf\js@?A@#20?_?GA_C_C?O!9?@!18?C???_G@c?@?_?O??G#8!13?A???@A#7!8?@?@ChAGAtAY@laUZHl|RZW||RrnbVJb^BjBbf@JePzuLyc\sJSjQdI_ShU_SIP_COAhOCg#9!18?~?~?Zc?ZcgN_~?|A{@}@{?Qk@W@G?G#4!4?@?C@G?BbALZulZulZulZulZulZulZlrm\rmTzUlzUlzA@BA@BA@B}tZe|J|Rmt[vj^vYf|J}RntmZtnYvj\vZe\ze\ju\e[tYvjuNzUzVlZvi^bLRiRHv^$#3i@G@aDGTA??@ADGPcHODOdG@?CGAGQCO#11???@#9!20?hAgRCrCz?~?~OnYTjlYfIz?}hfYxvI|UjTiZtIr@UhEHQDY?RcHA@?A_HQgA`?@I??PG@Q?I_?PC?cOC@Q?PG??AA@!4?A@!15?A?@?A?A?@??A??A?@??@??@??@#8!47?A?@A?B?B?B??A@A@SgCPCOCG#18???_?W_SI{}|}^^Vvx^z\z~nunz~^z~\~u}l~u|n|~u~z]~|v~\~z|n}^v{Yz{}U^Nf~E?PegcQ@OD?@#19!16?_??_??_O?G@cAOH_cQAGcfAAkCOK_SG_S?[?WcOGC#5!51?cHQcHU_^?~A|B}@}B~lR}f}v~v!4~}~z}v~{[|qcHQcHQcHQcHQcHQcHQcQKPaKPiChQChQC|}{|}{|}{@IcXAsAkPIbGS_GcWAs@kOIPcIOdGSaGcXaCXaSHaXbIdGSHoChCgQcGT_[qkTGuG_$#10DOeG?Ga?GCIS_?ACGACa?AOEgBO`C_HA#19!78?_O!5?OGO??g?O?G_?O??_???OC_G?cI?@??D_A@?A??D?A?A?A??@?A?@?C@A?@??A?@A?@??@?I@A?@#15!76?I?A?@A@??_?g?C!7?O!8?@???A!16?@??A@???G_?W???G#6!50?G?OG_S?gS_[?YcPiCHqDZaJsjSlYt^jUh^jtm^zn|UnzV!18~?~?~?Ql?Q@O#11!90?@#10!46?C$#5?i?_T?@gCaP_GQ`GQshOcWdgTWcKqLocO!5?_o_rw{[{~v~~v!5~U{VkzKzC~?~?nOdICQD?T?D?CO?C!7?C!20?O!5?O!23?C#7?oCgOGOgW_Kw_WgSgOgSkOkOgSgOgOcWcO_Go?gOcSKo?_w_OkQlQlQkPnOlQlqlXvkZ|u|~|}|~}|!4~}|!13~lR}TjSjSjSIT_C??A#21!27?A???H?C?_C?a?G?Q?H?OA?H?C`?AG?a??AO#13!5?CA@@?_??p~eXVZl}ny~}~~|~~~}|!8~]~}ZU|VlItcYOL_CQ??c#11!216?_$#12?C?S!5?PCGO??A??A???AOA?@?@??@#5!140?@!7?@!7?A-hQCOIO`QcGqCxCOdZeWvGvi\a\itYlYtOwk}v~n|!5~v^jvZvlRmPmPnPmPeXAl?dI?AC@?@#19!18?G??O??_???O?G?cAPCgAS?IOCO?gS`IsApCgQcHSaGT_DWaChSaHO!19?@???@#13!59?_OGOgCOoSiPiTiTiTi~y|u~|!4~|~}~~~^nZdYlUHF?@???C@@#21_???O!4?C@?A?GA_G@?AG@c#15!5?OOG!5?_?Gc!5?CG?CG??G??O#19!23?I??aGC@_?C@_QGDO?iAPH__O?Nd?IdSHcQ@kRCiPC_O#9!46?~?~?Zc?zChIShRItITITaKpCRk?T_P?O?G#4!8?O??C_p~mP~UhvmXvYf{jV{juZu\zUlJELJM???O??T?_NNzsnTyvLyvI|Ze\ze|Zt}tz|u\julZulZtm\rmTzlUzlUzUlZulZlr]tjSJoiSHun$QcxjskYcZuLxEylY?ODGaG?AS?OAcOc?nFR@G?OA#9!5?G_SGcGQkPmPmOmPmXe|QNY`TkXa]_^_NOjCZdITaDIPEHQ@Oi?HQ?@o@?@Q?G?c?PC_?O?A?@Q@G??GCA@!4?@?A?@!5?@#7??CiTj}jU|A|iTzuhU|q~syS~SwU|qnYt]tI|iTyTi\mZuLydZu\qnYti~ytMzv}l^}!19~^nvnVznNjTmTiTiTiT?DAH?A#8!4?A?@#18???_OcWdQhuw~]~~Pym}^n|vl~i^~j]NT~v\^vM~|V}Z~ululjfR}h^r^E\QH~m^|nyvvzvzZVEeABP?Oc#7!22?A?CHaGAL?qIdTTkeU^Nn~OYytOjcQHsQ?gPCiXfLzsj]hvH}hUhUGvGqDwDoGaPCI`SA?gA_C?GC#5!13?cHQCOAS`AK`ITiTi\rMzkR~i^m~n~v!8~n~~j^M?Pm?hUGPeGdWBSgBSHcHaChQsxqsp~~~n~~i~^ooCJOiDGqDGtAcXaCXAcI@ICAHaSHQcHQcIPaKPiCQhCQhChQcHQcQK`ISjsNPHcHO$#10CGAC@ACG?@?A?@A?cHa?T?T_HaDG@A@I#6!33?o?SiPa[`]_^onSzcYti\ytmxul}fT~el~]N}~mlvvZXkiR\jntlzmlUb]sBxKyVlZui\ti]yf\zUi\ujTiS@ShA|ATiCHUhAL?JCj?jEhALOdI`ItATiDiTaPcHqDYcHaLOdIT?DIpCG@Q_@#15!56?A!9?I#23!13?_?_!5?_!9?O?G??C?G_O_c#21??O#13!9?C_pXh[k~nZ!18~t~~\tzyU\r{QlDoIi?PG_?O??_#6?D?I?QHcI@kRCiPEGqCJS`UGu@UhUhvGvLyFyNv\mzt]j|~V|^z~vz!9~?~?~?Ql?jS`IS_S?_?_#3!26?O#22!101?C?A$#3?@!5?@#5!100?A!13?@#20!149?_??c@O??OAGA?T_?O?OG??_??O??_???HQHAC?c@Q_C?HA@Q?@_AO@?G??C_?G?C_A#11!258?a#10O$#12!5?@#15!284?_-#5iT?TIPcQcHQlQlQ?~@}DyLqnO~Y|^l~y~~y~~}~~^~n^vlZvItITiDIPATAOD?A?A#7!14?_???_O?gOcGS?OcGq_g#19CODGQ_HOCgAWaSHcPKPaKOjSIpEPiTAcHeOTAYDqDoJOm@O#13!69?_OGCaGCQGCQgA|?}PiSjszl]zulZulz!12~nZtJuLRKB#20!4?Ga?GAODOc?A_RG@I?@G?C?A@?_???O?CA?H?P_H?GCA?Q?C?CAO?GAO@c?H?C??_G?C_OA#19!23?c@GaOCA_OC@C?I_CBOK_QHCQ?g@bOsRIodKAp#9!48?dIPeHuIYcHrCiTGqTdIjShEOi@}@M_O?Og?_?_#4!6?A!19?FDAFDAFD??OC?OD?OD?Q?CO?~}Tze\julZulZtmZEDJVynVzluLzUlZulYvmXvmXvmXvmXvluLzUlZulQHqLQ_ny$Ti~itmZlZulQlQl~?S@QC_H?i?dA?A?D??D??@#9??_?O_GQcGtItiTytm|i\niVxnOnOfGVGbCHQdGA?@_@???@!4?@!5?DOh?O@?A?H?C#7!17?G??_W?OG?g?_G?GC_?Omlz}|~|~T}T}z}|!6~tn\zV}T~tn\z~}|~|~|~|~|z}|z~~}|z}!4~^!4~^!6~^nvz\vzlvzlV|A~@mTjSJCQ`CHQcHQC#18!12?OcIsHqkr{!4~v\^b|nynZ~t^Kdkdh{fljFly_TXqYN]q|ne|kXsncIlrH^j}z|nzv|n}Y^uuzz^VFvqQJHp?C@#7!22?GAoCHaGQ@T?Z_KbRLdQhlVV}KlJGtDIQpM}~~~}|z}lZu|zmXeXuH}hUh}?y@}?yDWaGcQHOdO#5!14?@?PaCGPAcH?Y`SjUxnT}@}p^n~nV~^~^!6~|!19~wy|wy|wy~~nz~ny~ny~l~zn~?@iCXaSHQcHQcIPcxysgDOgCQHqChQcHQdGPeGPeGPeGPeGQHqChQcHQluLOdIOD$#10!17?i?g@QCOD#14???_O#6!28?_?OgCOlOnWvgv[zulYv|~]^}~^n}VnZvi~nZvLYFQniul\uezR|f\juZmrm\rnSjtMxeTi\BuHfiTdYDyFoNPm@QC@A?A?i@i@C@A!6?IOaCg@i?IOaC?@A?A?A?A?AC@AC??@AC@!4?_!4?_#15!64?_S!8?_?Q?SA??O_O?UGAC@_?@??O?ACA?Q`OGC_?@!8?@_?H?C_GO#6!56?A?c?IO`K?@???@AC@QcHACPeXeHu@UhU@~D}@~Dyf\vZlunYn!8~YtmXuHsdISGrCgRCi?S#10!128?_GT$#21!280?G!7?O!27?O!4?C#13!12?_GHLcsM~z}!19~Z}vTlJxULrkyitCZoK_QGcQ?g??O#11!204?A$#23!283?Q?OA??Q?W?CHAcHc?`G?O?A?A?O@O?C_-#5{k{k{k{s~zl}Z|v\~~|~~|~~|!9~nVj\e\jQlRm?I?CG@A#19!14?_?GS??G_CO?aT#7?iSHcYCiCy@{RsiTypiXeXuh}lzu{sm{Z_G?S?_?G?gOOi_OGO`GS__Og?QHcAC`IOOiOsGOtkaTga[Sa!45~^nvP\nhdU}RJkUVgIdOn?^dYdIDOdIPAC@A#8cG`I#18!6?o?GsAsGdys~]~~V~\tm|Z~U~n}zNVIfJmh@csPPlWlZK|v]Qv[IIty\wl\kYNxyh\zv^}vMnz}fz~fyz\\vXZ~G?_yNA@OG!5?G#7!15?@I!4?@AC@cIDoEIjTCqHlSURjNffuyxsq!12~}|~|ZulYtiTytiTydWfGqDgQHeOISpCo#9!17?@!8?@??@#22!6?G??cA??O#4!14?OE?gA?gAOC!17?DO?d?Q?@@@?@@?@N^ItnWwOnvZluZlugQdYdYdJoEWaTIS`]_?iTrEGrHU`]`UWBOGpm\i}$BRBRBRBJ?CQ@cAGa??A??A??A#14!9?OGCA@#6!8?oIsA{a\qlqlYtm|z~Yv\~fbznuVRj~XG}TjuZdzTzD}BkJTiDITeXeHU@QCHBIPBcITeHuDZcjU@iCPNOfGUbKRM@UHsA[`YC@m@CJ?fGAPGAT?bG#13!45?_OGa?OAG_?cO@g?ToIdO~_YdYtynYtm|z}|Zv]t!6~N~vJ|JvYDJ?@#21!4?_?O?C?H?O@C??@!36?G_@G#13_!13?c?ez^D_x{nv!5~v!15~}t~~~zm|ymPsiLoS?iXCq?h_CO?G#6??@CA@!12?@A?AcHQdITiDITiDYfWvLyVluXntjMzN!17~}~~mXvGrMw~?}?vGQcH??cIP?O??_#3!12?@#22!57?@!7?C!9?t!7?_???G#26!5?PAC$#9!35?_O_WaSlQkP~tNpB{@\aLQLQdIPAC?dGA?O?CO@GgC?C_@#19!16?C!11?@???TaXaHYcRS@mDPM_fGU`GRK`UhcAX`YCpm@Sj?vGAPKaTGbGT!48?Ka?SQG@GcQ@gADOI#20!37?_??g?AG@A_?_!4?OGC?C?A?@??A!6?G_C??O??@_@O_OCOA@O_C!4?P?C@OC?OD?a??c??OC??OCA#19!28?CO?@OI@OAH`S?aHCQAHgCoOWHCAHK#5!64?PeGvKpE?~?~GvlZuv~ZPk~nn~^!12~mx~V|~V|nz!17~yn~Y~l~}}}~}}~}o_tIOfFnOGcQHcQHUlYdYdYoJxf\itj]`^ITiCXvGS@]`U@f[jTI???@$!69?G!8?A#24!134?@#15!53?A#23!9?_?oGO@SiOJcGQdQcR??@g?bCPICA?A?@_?C?A#25!22?@#11!230?C#10!13?G_?C!5?_?_$#15!278?_?O_O?SI?Ic?A??_A??@G?`c???E?AA@_?CCA!6?O??G??G?C?aGA#11!251?aG??G???CaC?_P-#5~~~}~~}!15~^~n~N~vJnj]tMzDYdYCXaHC@#7!9?_O?Og?sGQk?wCyCwcYoWskYskynynynyry|~}|~~}~|~}|~}!8~|agTQkaXTRKtRGicT}{|\[Nfvu~~mfrYMFbzz~vrz{keut||kv~V~n~^n~~n~^n~~n^~^~n~^~n~^n~~n~v\rf\z~Tnv\uj\uLrKuGza[bHUhAGQ`ChAHQ?@?AC#8!6?a??@#18O?o?ShCRkr{~}m~|^|j~|zn\vyl|ny~mz}lxXbQ[LI{l}|ftJIyzk]vYvrn|fk\l|Z~m\[h{v~z^z~U~L|m}v\t^mVr@@@_?EA?APG!4?@?@?C#19!17?OC`?C?A_DOI_Ca@OAtOGK?gCEA`_??C#6!13?CG??@aKPA?cHQcHqDjTItJuHuHulZ}V!17~ZulYtn[zExExEgTiCWaHQH?cPAOA#14?A#4!12?Sk???k#22!16?_?_?_?_???c?c?CG#10!17?A#22!5?@?_!8?A?O???@@?O#26!8?A$#4???@??@#9!15?_?O?o?GsOS`IPCYDYDZELQRGUH?@?@?@?@???@!5?@!5?@#19!40?\AgdPKagcRGcVPIg@AAA`oOGH??POGD_wWCC?GGCBPPGIAAP!52?@??@!5?@#25!35?O#20?A_AO??COaGDQ??@!4?A?_???O!5?G!5?O_GC?CO?G@_O???@_@?@???_C?h?Q?@??AG?O?C?A?@?_C@#7!31?CGOdGAgDOJwCidGIdrr^Rxx[]Nvzz!13~zv~~}\rm|~ZulZuLySitIsHuHuHQc@g#5!17?cHQdIObCxExExViTxfLsluvZm|n|~|~~^~^~^~^~~^jRj^nRV!15~^~]~^~^~||X|XlXdzjvkqmXui\qmXui|iTyTjUzUHUHvGvITiThEhCzEwEgDiShSJs@gP_$#6!34?_?__?___Ocguhu~}~}~}~]n~nU~JvlR}FyDzEYdJfIRdJQDODODODGDA?@A??@?A?@A?@!8?A?TAGAPCAG_AG_CPA?@??A!10?@!9?A?@???A#8!57?_??_?_#21!39?C?A!7?OC?PC?O!8?O!15?A!5?c?O??O?G?C#13!15?G{{}]~Xx}|mv!4~}~}~z!17~nzYvjYt\QidSBXSIt?IC?_CA?`??GC#22!78?A?OA??G!9?_?_?_?_??_??S_O?g#4!17?@!5?!5AQaQCSGRLPeHTaLPeHTATgDiShCgUHuGVGtiDiShExChEwFiPISbSHuEGVl~$#19!67?@??@??C?@???@!7?C#13!43?_??G!5?GC_O?C!4?C???G!5?G?g?O?_O??O?_O??O_?_?O?_?O?_O??O?GaKWaC?iOGaHSaHqKrHuC\a[UhU\uL]zU|ul~}~|z!6~\~~}n~N~jUzkRKB?@@#23!13?A!7?ACShA_PA?@AOIs@C?B??_G???OA?A!4?A?A#24!84?O#11!168?_#10???_???O!4?A?O!4?C_AG???OC$#15!277?@?CAGC`Ac@A!5?s@C?@?@?G???OA?A!4?aCA!8?_AO@G_A_@g?A#11!243?O!6?O??@??_AG@_GQ-#5~tJ}Tj]dZ}TzmtZ|nVj\jUj[b]`]pExEpCZ_JSaT?O?O#7!6?_?Ga[AlA\aLyTj[jsZ}T}zn^~]~~}!33~mMM~}mevp|srT[QqX|[]n~vrrXx\{UuRz~hlsunSqZh{mRxWm~nV|m^jv]j|nV|U~^unnZv~Ti\vlYtmrmT~n^qlRkZdYdZsJ{ALiDiTIDQGpI_ACOd?T#15!13?O??O?_?O?O???_??G?_??G!8?_!7?A@?A?A!4?Q??A?A@A@@??GGC!6?GDA?@?G??O?OA???G!4?A#19!38?OA_CQ?_G?c@?I?CIHCCA?L@GCFB#6!24?@I?OcHqChUgQdITiTiTiTi^t~v!8~n~n~n~n~ZulZulZvkRkRkRkRgQDY?D?WaG_#14?_#22???CH?AS_Di?iO_NOJOI?o?o!5?o?o???I?I?ACG@iSgDA!4CA?OOGCCA?OOGCCA??__O??@???A??C??_@!4?C?@???A??CA$#9?Is@iS`Yc@iCPIcAOGCASHCBK@M@MHEHA__OO`O_O_O_Oo?o#19!64?PpO?@POGEAHKA`lCCAB`??GGKCEAA@HGC?CQAH?AHCCA@GCE@#8!41?_?_?_??@sQCYCa@WdQCODW_?O?_?o?o?o?O?O_?@#18?GcBOHqCxas~~^~vt^Zn~q^un|uj^I^yn~Y~l~{un{v[zm~xcY|xm[ukYuzUtQztn~tzvRw|}}vvivf~n|FJP_f~r~|`_O?CaOGCA@G?D??@??_?_#7!17?O?h?QC`I?ID?iPSqJxlQq]bXW{^n~n~~^~~~^!13~}t~nZuLzUhVlYtiTiTiTiT_I?G#5!8?O?O?O?O?cHQcHQcGRkRkRkRkVlWcVi^f\v^~^~~~zu~|j^yT~TlZoNsdd^N~N~n~n^N~N~n~d~d~lzf]TjVi|hZypkZedrjWxVmDrYpkZuHNitj[qlOl?Z_zCISiDyPiOmOLsHSjGl?ISA$#6!17?_O_?_O_O_O_?o?oKZCNcILInNnNnN~N~~^~v\b|Q|a\qDiSbSJc@i@CO_?`??@!35?`???@?G?A?GA?H#20!129?GA_C??D?HOAGS_T??O!6?G!4?C??A@_??P_GOCGC`A`!4?IC?CA?@?G?@?G!5?A!6?A#9!148?_?_O_#4!19?AC?_?IO_!4?O?O_!4?O?O?O?O?O_???O?Q_@GPcH?CO`Cg@_C`GPcHU?DISADAL?n?ICRCi@ICI@M?fAHcBS`OmP`kT~$#13!118?G!5?_???a?_?O??C?a?_@g?c??Q?H?OhC_Q@OcA`O?OgAP_SG`SAOgAh?_HOOcG?iTaGQdIPKPi?O_LQkRCYDYCJsAH_P_PGsaGdIdYdZnI~I~N~N~N~n~n^~}nvZknULjELJ#21!8?O??_???@!4?D??d?Q???O?G_?O!17?AO!4?_!6?C#25!5?GC?@??C#22!151?A@G#11!59?A???G??A???G??A!4?O!6?A?Oc??_P??O?C?@??_A!6?_$#23!271?_!8?@??@?@?@?CGDAC?@?@_??G?C!6?G#13!7?OG!4?ookUW?G??[^n~z\nvz|}v~y~~}~~^~^!16~nl^QllZUtZsytTi`CoAOl?_Sa_?_O?O??_???_#10!139?A!6?A!11?_GO_O??P?G??S_@_O_OGO?Og?Q?PCIPi$#13!305?G-#5~A\aLQdIPiDqDwBsAdGRcHQDODQcIPaCjT??A?CHO?O_#7!5?`GCaGTa?hU?zUhvlY|vlZ~~vnv~u~u!30~^~n!4~v\nz]v|nvzz\n~znv|nzUlZulZul~u^z\ujSjSze\juHu\ivYlvYlvYluZlZu|Vm^nq|VlylR}d]tYvlYvi|A|aLqDYdRkJyszkRIcH_GOID?Qc@S#15!12?CHcAOG?O_O??GAOcPI_?G_!7?@??OC#20!15?G???_?G???GO!6?A#15!5?_G@CO?dI`?G?@_OG?DAo?G?A#7!25?O_CGQ???g@QcH?sOCPi@UgRkRkYtj]dYdYntvz|]nv|^u~~z!13~}|~|zulZtiVkZtI~?|AsAH?G#5!16?cHQcHQcHQk@}@}DY|j}tZ]lzTM~ZN~~~j^juLzdZM|ULxJyPvl?~TiU|vl?lZci~aRqnUprl?~QU|rh{h[YVepjzEHjPe\_^a[aXcXeHwSBwDqMGel_EhUlQHeXaTgPC?A@?G@$#9?|a\qLIteTiDyFsB!10?@!6?A?@#8!73?_?O#13!4?GaOC`GAOGC?aO?COGAOChQcHQcHQ?H_CaHSjSjCXaSHuHaTGdQGdQGdQHcQcHAgP?OLA??@A?@??A@!4?DA@?@O@G_OgA_C@?A?sJcZCJs_ZcJsJuhVlyd^u\vl~zuIxNa\aD#20!12?A?G?C!4?CO?A#13!17?G#15??A@G@?O?O#13?G!4?C??B!9?G[SNA@___o{M~V^|V~^}^}!19~n^zvl~~^QmlZuJJdYeTihVkRkRdIS`YdYdOI?CA`OGA_H??C#6!13?@A?ACHQcITgRcIt?~A|J|u~v!16~ZulZulZulR}@}@ydAS@Ic@QCiP?cO#4!9?O_??@_A_@aGQ!4?hAGQ!4?T?T_HO`AGQ???hAGO@S_CGPAOCOC?G@?C??AHA@COA@gCAG@OA?QH?Q??dO?CG_CAqHgScASIv$#6!5?_O?G?OG??GG|YvkZulynykZtm\zSg~}|~zun~n^!5~]vz\vi\~Uh~ChUGQdAGQc??GOG?H?H#19!47?C#8!53?_???gQCOk?Y`GcGQdGO?{A[aKqDICPS@ICPk@OQCrc@YcHOI_HUgQDY_HaGQ#18???PC_TaLIn~~v|nZmt^~v\~v~z~}t}znnxnz~~v}z^}v~~l~}vzv}^{uvy~dnnzu~~~|y~~{~^v}zn~YtQbbo{]NVNI@@?_??G??@?@#19!26?_DO???s?I`G?S!16?G#22!85?_???_??_???S_SHqCICpAgQCSCK??~?iT!4?~QcZ??GGC?GGC?~?l??CCAAA@_GGC??_?C??A??@?C?A??CA!5?`P??O#26!9?A?G$#20!249?O#21!18?@G!5?OC??G@C_@G??Q?@?C?@!4?C?A??C@!4?@#20!12?C#25!7?O#8!5?_?_?_?_#11!186?C???C!8?A??@_??C??_OS??A??@?C?A??CA@wCAG`O??UH???GcOASG???qDgItIp$#13!269?A#23!25?@#10!256?HA?aW_X_[_O_W_Ho???@oC?CG??_ChQ?AH_@APk@COAP?_CG-#5S@QCHQcHQDODQCPe?CHAC@CHQdI?HA?ACG@A#7!10?_??OiDgQdYdYdYtJ{jUlY|V!43~\vmZ|n^~nZ}Vl~U~~v~}Z|nu\jtmZtmZsnTyVmxVlYvi\juZ{z]tnZnvLyvLyvLzu\zu\zu\ju|nz]tj]jsZvkZuj[vlYehUhSjcZScZAkRGcRGb?IODODODO_!5?O#15O@C?A?APG?aG?T?`CO_??I_CPG?C?OCaWaS?O_O?O_!4?_!13?_G??G_?I?OAcG@g?dA`?@C_A?OG??_I@O?c#8!5?QCOdGPGPGPGP#7!5?O?OdGPAS@S`CHQcHQcHaHsBGjT?~?zUlZulZulZtmZun|V~\~~~vn!9~u~un~~~i~i~iTmTzUhUhUoDyChAHD#5!16?cHQcHQcJShA|ItiTzA\Ge^Hc}Lmurzn~lZulZulQnydtn|bRqnYvmLbcWMJmjmBaxPIXR?}d]FLzmraXGi}IpGCKbOhSRcjCQhUgR_IpB}?[BsJTS`iSAPMpAx?_O?I?dRGc$#9jShQcHQccIjgcJiH#8!96?aGO_?O_?O_?_O?_!51?CGaCHaSHAOC`IS`SJcGRcHSbGQ`WE`QHSJ_JPcXAcRGcPKOd?iAgAgALOaSgDi??OcGO_#18A??CO@_FMjBA~~t^zmuzzunx\f[j~f[nvmN~z~]^n|~}n~\~m~v~~^v~~R^ut~n|Zu}V~Y|]xoo[W^NV^C?_?C#19!43?OCAG_S?i#6!35?H?HO???T?T?TiPiChUhUhNyDzU|uy!16~ZulZulZsjU|AtITiCxAtG_QH?Q@GC#4!14?IOAS_HOD?PaCPcOC@S@cPAgCAg?@Y@Ga?PCOa?S?TAPGaCbOHCP?hCO@?GT?GC?A`GA?i@S?@G??G?CODI?_OAKbGZ?Tn$#6?iChQcHQHoCQHoCO~zu|z}zulYt~u|~|zv}|!10~^~~nTyVlYdYdYdIsBShQdAg#13!45?@CA!4?C@GA?H??G?@cAOHaSIPcIPcJOiDgPEgQdGTaSHcBC`IOcOGqDGqDGqCHa?@!24?C@OGCa?OC_I?cPGcRGeOnOnOlQlQlQn\jVyDn}jZtn\kv~Xf}IwOOg[#21!18?@??@??C?@??A?@??A?@#13!23?CMIBd!4_z^T}j~Z!5~lznYvmvmvmvm!5~n~nYvm|j}j]zulZulZuLqHsV?iT?~ChQcHQcHQcIPcHOAg?a???GO#22!71?C_AP?cQ@_O@GCO?QcHQcHQlODY???GGC!4?OOIA@_O??WGCC?_C~??__O??GGCv@@?GCaPOGCA_G?O#10?AgU?AcAw?W?S@s???@iSaPE_ALQ_PCIO?O?Ci?O$#20!257?C!7?@C?H?A??@??G??G?O???_?O???O?_?O?G!6?c?H!5?@!8?@#11!189?C!6?G?@_O??O?C?A_C!5?O!4?C!5?CaP?GCA_GASAhC?@_GP??@cA_G??i?S?@K_?\?_?DMPdG_CR_Ti$#25!258?@#13!18?A#25!41?A#10!194?_G!14?P!8?C??@!4?_#26!16?C??C#22??@!6?I#26??_!5?AG?_-#6om|{}{|}|}|}|}|}!8~z~z~z~z!11~|~u|ZmtnTyVlyTmPnOdY`ICPA?A#8!11?O??O??O???_QGCQG!16?OCQ?L_JShATgATgA_O??_!7?_!14?O!28?@A@?QGDa?HaODAOHeOdIOiCRGCRgCQdOGj?Hs?TgAgAGacICOdG_DQcOdW`Y`IOh?O_#25!13?G!9?_#13!35?_???__owM}Jtw~Nvz~|~|~i~h~j^zvm\zV{V{VkZsJ~j^yvm|j^}n]zUlZe\rlSzd\qMXsIt[c^c\aSIPCA@?aPAK`GA?A!5?A#6!4?CG???A?A_???T?T?TiSATgVgVkPmP~iV}!17~n}l~m|m~iTmPmPiTIPeHAS@a@?O@#4!13?S_L?T?cAo?HCGA?A_@G?aGQ??hOCGPA@S?@?GA?K`Q?D_AC@C?QHCOA?C?POG_[?OCW@Ca@O?gAH?C?A@__P?@oD@GaCPmP$#9A@AA@@A?A@A@A@A@#5!8?C?C?C?C#7!11?A?HAcPIOiDgQDiPmOnYd]tzm|~l!11~n~~n~~n~~~^lvzlv!16~nzl~q^sjU|iV|iV|Vj^tZf|Uj\uj\uj\u~luz\}vLzuLzUlzlRn\qn\qnYlr]tjU~lv}Zlv~}|}~lvy\~u\ny|nuXnYtnSzktzkTylQlbSjsI|iToDOdO@O`EGQCG?HA#15!8?C@G?PK?O@G_G?C?S@AG`C?hAsBGRGaDOLaSGdQChC?QC?T?AOC?T?Cg@?g?PcIOI?HC?C?o?SA??OGC?A?A?@?A#7!9?A?A?A?A_?S_DGPAS_@O`ChQcXaKOiCWaKpcItGaZ_Za\jtmz|}~\m|r]v|~|!5~|!4~zv~~~|~|^~~~i~i~iTj|iVgVgRmPm?Tg@#5!17?O@Q?PAP?TiPmPmTidkXSsji\[}NkzmZulR}TjUxVkj[QV_kItBXSgU`^hUYDePqKVlEljcMLajZujUhZ_M`NoKPb[_YDcPId\a\aCB?B_B_?cGWCjAT?sAhQlSM@M?M?I_C?G??G$LO?@?A?@#27!60?O#13!59?GC_ICWAhSaHSAHSaH?QHCa@GqCHaChQCQkOaLOaLOdQK`ISh?QG@cQG!22?@??A??A@?GAS?SA@A?ALQlQLYdYhQdZqlQlYf]d]tnUzmU~krulye\So_??o_#20!5?_A!4?C?G_??_??_??_??_??_??`??_!4?@??_??@???G??@#8!12?S?S?S_CGPaCg@g@gPcHS#19!19?A@?A?@?A@?A@#22!97?OA?aH?S?a@_QCPcHQk@iShEgR?B?_IAP?GCaA@???@?_OGC@_?O??R?_O!6?CBO???B???A@??A#26!6?G_C???G@??@!12?O?_O!4?O$#18!250?@?A?HACPAbNZ~jE\v]z~U\H{VkvXyfQ\jVYlZUz^lz^i~\nz]i~ZV}~V}mZTNt]uJ^BE@?_GF?_#11!182?_G?P??Ca?@?W???_OGC@_?O??O?_O??C???C?O??oA?_GAHC_QGcOAG??@?O_\_ACOaCo?X?kAhOC?A@??C?J_SbGbIP$#25!312?_?O??@#10!194?G???O_C_SGCA@???GA?A!4?K?_GS`O_??K?GOKO_O_G?_@G_PaKaSJ?AKPaIP?ICcAP?SAhOgOM_Z?COIODOc?e$#3!590?_-#6~~v|z!39~^|vZ}tj]tj]d^_^_ITgT?T?O_#8!19?AHC??A!23?aP_K@IcPIC`ICQHCaHc?GaO?CO?_?GAO??_?O@cOGA!24?`???@GAC?HC_QG@C?QGCA?CPGA?aO@CQ@OgPaSHaKOcRCaODyA_]?Si?TCxEpcISgTiShQcOCg?_?_#18S?G??@BEDBA@@ADJ\ANADBIDBALBEBMDAFIBEDANAFHFDA@??_?OGA_?_?O??A#7!21?O?OCOd?IOAs@ShAcGtAkPmA[`ITgTATgVkZkZc~gvwt^y~l~vY~v|~}!6~^~n~~n~n~N~~~Zv]tjUn^i^i^itInYdYdIdYdGTaGaG??_#5!13?dIT_TItOdYcZCjTiJuqZ]}~v!4~u|zulYdZmxflQt]tIdQzaLBohEpIUGf_XSGuKPkOSGon]lbItA{@mIDI@MPC?I@_PGD?@OA`??OC@ADGCIH?GC@AS@CQH?EOH?A?@_O$??GAC#7!39?_AGc@IS`IS`Y_^_^tiVi|i^nYn~~v~~n!12~|uz~~l~v!21~\m^r}tZmtz]tzluz\uZ~v\m~zl~Z}v\j^uZ|n}Znv|mztzU|iv|]vz|n]znv|^u~Z|]~~~}v|z~uz^lv}z~lvz|~zmv|~\n}zl}nVm\ju\rmZkzSLy?l[@uhCwaG??G?O_#15!7?@?AOCAPAGCA_?G`A?O_G_QCAL?DAcDacDAc@C`AD_DC@AD?D?E?aP_GCQ?CAo@SAO#8G!4?CG@IO?O_DGPASg@iOIOaCi@i?IOd#6!53?_?O??O?O?o???cG`IShO_T_T_TItOdYdYtYdYvi\v\v~~^!13~Yti^itInYdZcZCiT_HC_@#4!13?O_???O_I_I`?c?W?cBOGC`GA?R_HC?RC?i@CA?@?S?G@A?P?_CO_?I`?S?C?AgAC?GChA?_G_AP_CC@Q?g?Ag?C`G?a@?GS?A?D?QH$#27!64?A?_?DO??G??O#28!17?O?G#13!43?@??A?C@?_C_HCA!6?PCIChATGA`GCAO`COGA_H?cA!41?@???Ha?DOB_HAPFGrExEZdJViTjUlZmzTnZ|Mhvr|^}sWwwl]u\go__oowWoOWwoOwwOowWoowwwoowooWg[uzL~jtL]j\nf~~|~zv}tn~n^yvm|jV}Tntn\jTmPnOnOn|J}jU|ZvI|RmP|b]tiVi|iVgRcRcZ?VGFI_D?Q?Gd?GA?@#22!77?_O??S?HC_@?G!4?HACHQdICPEWAL?@?OOG?C_OGC!4?`OGCAa@?_A@?a@???G#26!7?O?_??_???A!4?C??C!11?A??g??_$#25!270?C!7?O?G???G???G???G!8?G!5?A#10!200?CA@?@A???@AS?C!4?OG?G?C?OGO_Q?`As?[?SIpI@cOCOALAp?TGhSAXA_HS@Q_GCApAgS@iS@_AW?c?WdA?HChOi?c$#20!296?G!7?G?C?@#11!200?G?C?OGCAoG?`OGCA_@?_AP?i@C!4?S?G@a?`??COI@YdgOgEwAoAhOaSLqIsGTaPoGs@AS@GQLoEpJSeWtiUhUiTlQ-#6!41~nz]v|j~uzmTzmPmTiTiTiCj?hAGQ???OcGqCO??O_#8!38?C@OC_Q@G_DOA`GC?Q@GCaP?A?@??AG@a??@#13!5?@??C??@???@??C??@???@#8!12?@!8?C!4?@??C?@?@?A?C?A@?CA?@I?QDGQC`Y?CY?lQMqOlAkQdISHuGtIPi_Ip?PCOCOCOcG_?_?_?_?cG!4?Oc?_?_?_?_!8?_?_?_?_?_?_?_?_?S?S?S?S?diCQDgDQdODoD_HAgQcG`IOA#6!53?cHQ??dGPASj??QcGPeGtASiT?TiTiTjSntYtJsnTyn~|}!14~ZulZc~?~?~?}@IsASH_CQ#4!13?Qc???IOACG?QC@cQ_L?aH?A?@GAOb??@?A??@S@SGC?Oa??GCQDG@aOD_?@_O?CAP?G?Ca??GACa?OCH_?Xa?D?c?Q_G?QC???@$#7!41?OC`GAS?HCPiCPmPiTiTiTzSnU|Vl~Z}fZuLzn~~n^~^!36~z}nz^l}v^yn|]vz~l}vz\m~|~}~~|v}\~~}!5~}~~z~~}~~~}~~z~~}~~~}!12~}!8~z!4~}~~z~}~}~|~z~|}~z|~}t~lyulzYd}zc~OkpChAO@cGO_!4?_#15!7?A?@??A@?CPGAOD?H?A`ICa??S@C?S?GAPGCa?GaOHCA?GC?T?GC?QG@#7!9?O?O_?O?_GAgAGQcODG@QCOd?TiSzcXeGtASiT?TiTydYtiTyt]zl~uz}|~}v!17~Zul~~Yvm|jS~~lZvmXvI|jTi~iTiTiSjOIdIsJOiDO?A@#5!14?cHQcZ?~?~?~@mtBxhuUZhl~~iVi~iVmTzUlZSzUtn\Hc}LJkA_ZQSGSa[BkRCICXfGVgEXeH?A`OHCHSaP_G_O?K??I?S?D?PG?cAO@G?C?O?G??_?SA?CO?Q?H?C?@$#27!64?O??_??c@G?@!8?_#13!147?@??C?@?@?A@?HEOlQHQdJuHvITmT^tM~mxnynzlYvZmV|Ny^uZt]tz\nZj]z]j]v\mvz\~v\nUz\~Uz^i^uZ~Lv]~j~j~j~j~ITjLyFyLQlQLqLQlQdYdYdI|iTjCZeXvI|jTi~iTiDYdITiDI`CQ?HC@A?@G#22!88?O?GCA?H_CQ??TgT?TgPiCh??jCh??_aQ@__QOHC?a@??@!4?@!6?@#26!4?G?A!6?A??A_??_!17?@??@!4?G_$#18!291?@?@!14?@!4?@#11!192?O@??O?HC?_H?aH?_O?H?Oa?O_@O_O?u_Og?iSaHcG`W?KODY@]_^_|ITeY`LiTmXaKyCycJsA@COJilHudYdYdyTmtY~tM$#10!517?S?S_[AcOcGCWeGSgEGaG@E@u@?HSAPCAdQ@i?S`I?IA__G@SaO?PaT_@PCJOAHsAHcO?Q?G@QcG@iPIc?Ip$#26!524?_-#6kzul!4~}~}~}~}!30~}z|}~t~]z|~iTylQ|itIOtIxAX_IsAgQcGOdIc!4?T!16?`!4?O?s#8!24?A!95?C@?CA@?ACxFy?EwFgAtIt?ZCjIsI?vGVGrKrKpMoItIoIoAcGt?TgPIOiOIOiOIS_S?S_Cg?Y_Y?Y_Y?Y_Y_ISg@yTiXATAPc#6!72?O?OcGPiCOcPcHuGRk@iTiTiSjOeXfWvgVwfXuhuxU|yvy|v!8~i^yV}Ti\jsnOnOnONQL@BOCgOAO#4!10?O_G`I?AS@CHOCHA`C@AC?Q?I@?O_SA?D_C?GAXCI@QC@AO?H?cOC@AO?`GQ@_?O@?O!11?hAC?`O?GAS?G?S??@??C?@aG@QC@AB$#5RCHQ!4?@?@?@?@#7!30?@CA@?I?`CA?TiDQlATItnAtE|A^tJtVlZvnWTZ|~u~i!16~]!4~n~J!24~|!95~z}~z|}~|zEwD}xFwAtItIoCw?t?Tg?O_#15!15?A!11?A!5?A@??A!6?@#7!15?_G_GQgQcHQgAgQcWbSiXa\aXa\_\a\itYluz]tzmztZmr}tZmtzu!25~n~nZvmTznZmZuHvkR}TiTiTjSnXeWfGVgFWeHUHEhADGDA#27G#5!8?T_Dg@iTaSJONOmOnoLay{niRf|Mn!4~lZuLzd]t]tn|JMjugZeTShIx?zCitSiD?BgTIPI`S?_?O_?gO?Ca?Q???_?C?C!9?@!14?GA?@!10?A#3???OB?@`Ahs$#27!66?G???c???G!5?A_?A?H#13!158?@???TG???N_BS?J_VGfGvKrKrMpNtItNtN|XvI~iVmtnTntlTntj^h}j^xV~d^d~c^d~d^d^tjV}DiTe\a\eHVlZulV|VlZf[jTe\a\e\a^a\aTIdQHC`ICPCIcPK@IcPICH#22!91?_?@???_OC??PCG?`O!4?QcHqCI@A!4?__O?F!4?A?C???@#26!4?G!8?@C?@C?@!7?A$#10!498?O!6?_?g?Oo?x?gC?_SITG@gOAOI`SAhCIdAG`HCc?I?JSGbGQ@_CY@iCgASaSHQcIPiCQCOhQCHaS_HaT_I@UgCO`IS??cG?G$#11!501?O!4?O?I?C?AC@O?I@_A_SA_K`SAg?Q_OGOe[aXQlPloItGvGuLyD}DyVli\julZtmTzlQlQlQc\a\a\a^`}hUzlYtiLsYcYsSG-#6Vn^j]r]tn|n\v\vl!4~j^zV|V|V|~|~n^!5~n!9~}!5~}~~|~~u~|yT}ju\ytmXukPiTiPaCGO_?`CGO_!4?S?S?S_CgA`A_?_?a?a!46?_?_?_?_?O_O?_C?C_?_?_?_?_?O?S?TiO?O?O?O_!5?O?S_?_?_?_?_?_!5?o?o?O???_#8!8?A@A?C@QHCAGTArCxItGTaKbGTa\cZcXQdQdISpEHqTiTIpU`mPmdYdiCzCheXcjSjcZcjSjcRwBcRsRgDSjOdASG_#19!5?Q#6!40?_?_?_?_?S_S?S_S?S_S?S_S_LoDiT_TITaKPmTiTiTcXe\i|A{@}@}tI|Rm\rm|u~~n!4~z!8~T~Tj\jUhUjUHQdIPcGCBOI@S#4!8?OcG@I_IOcGDOHCP?D?AC_AGHcGP??@c?AG@C_SI?AD?Q@Ac?@O_C@G?S!24?GCOd?A?@?@?@!12?A@#3?A?@a@$#5gO_S`K`IOAOaGaGQ!4?S_CgAgAgA?A?O_!5?O#7!9?@!5?@??A??H?ADi@CGaDIPeHQkTiTmTzVi^nYzVnZ~v^~j~j~j^zV|]|^~^~\~\!46~^~^~^~^~n^n~^z~z^~^~^~^~^~nvj|iTnzn^j~f^~~^~~n^j^~^~^~^~^~^!5~N~N~n~~~^!8~|}|~z}luz|vi{KxEtItiXqWsiW_Y_WaKOkOc?GOcG???_CG?O??O?O?O?O?O??O??O??O??Og?gOg?GQ_IOcYShaShqDwdguHuhUhvI|zu\j}l^|^u|nzv}z~}~|}~~~|}~~~|}^~^~^~^~j^j~j^j~j^j~j^j^qNyTi^iti\rmPiTiTiZeXaTA|B}@}@ItAkPaKPAH??O#5!4?C!8?i?iSaShUhOhudYPmIvrwld{ij~~~j~j^iXu]DNphWciJAbIvGpKpGS`Q?BCiBGAHOcOI@??_G_G?cO?G?A@??A?@!32?A$#27!67?O@!6?@A!4?G?_D?OC?_?C?G_!92?G?A???C?_C?G???_???_#13!46?@?A???A?C@CB?DA@CBC`I@IPjEhQDiTiTI`]@mPIdITjCjUHeZCjSJcZCjSJCFSJCJcDY`CJ?hATJULyFYDHuHUhUGtACHaS@Q_A_HAOCG@C?@?A@???A@???A@#22!89?C??G?c?P?GCAOA@S???S?S_DA@__OCCABO?cO???A#26??A??C?O!11?A??@??@??@$#11!492?O??A@O?cOG??AC_?O`O?H?i@WcGqdQI`SgpYcGqKOkOe[`]`]`\a\zUlZtmZ|vm~T~i~Ti~iVylZeXfWfWvktkZsnTzmZuZulZuj\ivxn]Xe$#10!502?cGoGPIDGE_Qc?ScQPCG@cOI@CDOQD_I@IPaK?Y_SaGaChQcIPcAGP?i?T?iT?TgDQcPaGAWdGQGQcIOiCPcHcHQcHS_SGCO_CW-#6GfKbM@JU`YdZdNyN~N~nT~Tntnlzn~n~HVlJ~JUh^vnV~VnV~n~n~n^~v!11~}~~~mz\mzTmZsZcZcIcGRcIcHQCOdG@I?IOASi?ICI_IcG@ACG??O?O?O?O_!8?i?i?I_IOI?I?I?I?i?I?I?i?iCiOiSgTqgPeGtIgAgaGagAgUhUhQtQoLa\A\a\qCoDoDy@eWAWaWAWa[`MOl?lOlQkXiSgSiTgDiOaS#8!12?@?CAG@CHADADAPeHU`[aTIdGVChDYaKhBQkBgWdAiHSM@iEXCePIeHSEPiQHSdITgDiQKBgTGcQ@i#19!5?CE??G#6!20?G???O?O_???_?g?iOiCiOiCgTiCZcXa\_LQl?|A{A|A|ItItJshQtYdytJulQ|QdyTityT}XvuZjvp~zxvz~z~z~z!4~n~n^tnTyTnONiDY`IChA?C@???@C??A#4!5?QcHAcO@OCAP?A@CO_GH??G?@G?G?h?CO_P?C??GC_A?gCA??@I??@!27?@!8?O_?O??_#3o?o?o?o?o?Oo?OsG$#5vGrKpmSh]dYcYoDo?o?Oi?iOIOQCO?O?ugQs?shU_GOg?gOg?O?O?O_?G#27!11?@???@?a!7?O??_?A?G!5?G!19?_!62?G@?C?@!4?@?G??O?_!5?A?G???G?_?H?_?@?C?`?AO#13!46?A@!4?@?GA?C@ASGD??DA?HCA@?S@GA@GC@GA@GC@C?B?D?B?D?@CA?@???CHSLqCQ`?GF?CbS?COG???@C?C#9!78?G?C?K?CCGC?C?C?C#5!4?O?O_IOiDiOn_Twd]srQ||z{u~|uyj~h\un\jlZedRbyLysImX_YdATaSJcRKaPCQ?Q?HACI`Ga@?G?C@??GAC?C#29!58?g$#9?O?O?O_#7!65?OC?PCiPcJcJcZTZtkRtZulzfYv}t~tn|jT~tzt^tZv}\zv~~n~n~n~n^!8~T~T~t^tnt~t~t~t~T~t~t~T~TzTnTjViLVmXvItV|VTu\R|UhUhUkIdNqLa\a\aLzLyFyD}Pf\fSf\f[bYpMQ|AnQlReTjVjTiVyTn\j!12~}~z|v}zu|y|y|mXuh[a\itYugrSy`[pAsgR{QdYsPsipiSpcyPisPsipiShugYoiSyOlqwTiuZl}PujqLzhW~vo~z[j~znv~~~}z~z!5~v~~~n~n^~~~^~V~TnTzTnTzViTzcZe\a^qlQ~A|B|A|AtItIsJUlIdYDIsHQlAlYDiTIDi@eG@cOGA??A#22!23?O?A??@GC?A?AH?AG@S?SaHOaS??OOGGCA?@?@?C#26??G!9?_???_!8?_$#11!491?G?C??@?_?CA@??aOH_OGaPKAHQLHESgtQcXUWFSjSzKuhQtiti\j]tj\vlulZu~lzV~i~TynyVylzU|zT~j}T~j^un\j^D~J}F|J~D~mN~FJt$#10!495?_?GCO_W_IT?CaSBcOCaPcC_Q_HA?GRC_BOhOA?p@Sg?PISaS`ISaGQHQcH?QCg?T?iDODgDQCgACi?S@i?C?H?aS?I?C@GAC?I?@!4?A-#5~|i~Y|j}Ti\u`YtYDYtiTGsjchuleteEXQlyPMxIPmPMtGugTiDoDyCxa\?Y_ISg?GO#30???_#7???A???G?BCHATgDoLqExAtKRlQf\juLqLVi^dyDYvhUlZvj^rujvYvxvlV|VlvlZeXf]tjUhV|V\R|V|B{D^tJTiTaXATALA|AtIdRCJ?DIODQCHQdI`CQ@?~@}@eHAHUHe@IdYdITiDiTIdHEgVGfGaL_DIPCJ?jCRHbCRC~TmT~SntI^hvn~~nn^n~n^n^}~~~}~|!6~}~~~|}~y~|~|]v|mz[nyvz~v!4~}~}~z}|~z}~z~|~}~~i|~v~|~}z|~}z~~}~~z~}!10~n^zVlZ~nZuH^rmTnTzD}@~@}@~@}@~@}@eXAcHuHeXaDi@IPIDGbSHADOAGC@?AdOA@G??ItAGaOCA@#5!13?Oc!4?hAgA\aTIOnYtjuLzUn|n}!7~ulZvmXf[lZEhToDDkEd?U`YmPEpGOcQHOCO??_CQ?O@G?g?_C#26_?A#3!12?g?g?g?GO!24?TgT?TgPiChUGQdY_ItA|OfY|$#9?AT?dA#6S@iTaHU`IdYdITiTJSJUHQHIXpEhQDiPEpMPmPItHViTiNyDzE\a^d^tjV~vn^~~^~~~|~|~uz{Zu|iVyLqKxA|GrkQdWaSHqLqgS_QCYdGShQcGO_CGS?CGCGQgAgQGQcXeW`IShUgAgAgAgA{@Y_IOiTi\e|i|q|A|ItYkzs~ytnylzulYt]zl}~?}@}Xe|UhuH}tYdYtiTyTitYewVgvWe\q^ytmzs~Szku[zkz?i?i?iOAS_CGO???O?O?O?O_#8@???@?A!6?@???A@?D?A?A`GAPCbODGC?G!4?@?@?C@A?C@?C?A?@??TA?G???@#6!23?O_CgQc?OcHu_KPiOiCy@}?}@}?}@}?}@}Xe|ZuHuXe\yT}tmtyv[ju|yn|vz}~|Yn|}v~~tI|v\nz|}!13~nZ!4~U|V|a\itnOdISHqChOAO@#22!7?HQcGPeWb?__S?AG_QPOG#26!7?A!5?_?C@G#29!78?aG$#22!12?GC??_!4?a??O???O??G_C??C_?C_??_?A!4?O!7?_!8?_#27!8?A?@C?_!5?A?@?C?A???G!8?@?G@_??A!4?C?G@?G`?A!20?_C!4?A_??c!39?O?_??O!13?O@!4?P!19?P??@?G`?Q!4?O?_???_#13!66?A??CA?@C??@??C?@#4!144?QCHAgCQG@gApGC@?_GC@AH?c?I@iS@?Hc?cAOA@I?HO?_D$#11!490?O?AG_Q??GE`WC@?oG?hAlOE@IO_?QcHlIseTUSZQLoLqnYvi\ulZlZU~T~Q~tni~T~j~U~l~Y~t~i~T~~T~i~TiRi}iTiTzUhvlYd^tI|ALOdA$#10!493?@!7?A_OM@AsCO?AhOc@IUh?QAO@H?g@_CaLQGOdGTaHQcQc@?A?D?A?T?i?S?h?Q?d?I?T?i??i?T?i?C?@?AC-#5!11~Vmvm^j|l}mzl\|z|l]}UrZxl}mzl|neU~l|neuj\t]~mVvlttzhcyCPAOhQCG_#30?_#27!5?A???C!5?C?O??@?A?G!5?O!5?G?@?S!4?G?C?OC!22?A??A!5?G!35?@???A??G??A!5?A?@!8?G!21?C???G!7?@??A!10?C#6!43?_?_?_?_!15?_?_?_?_?_???OdW@qCgOGQcY`M`GQdYtJ{jSzkR{jS~lynyvY|mz~|~}|z}|~|~lvz}Z{~|v~z}|~t!4~|~~|~~}z!22~n^}~ZvJuH}@~?}@s?iPIC_CO??A#22!7?HQcZ?u???OOG??PCOGC#26!4?A??A??Q?C!5?O!6?O??C#3!16?S?S???@???T?T?TiPCPCPChA!5?dGPeWbKpEgU_SHQgQcGtAsJcXvG$#22!11?gPGP_S?Q?PCOa?C?Q_@GGcCQ?PCOAOOh?OAOOHS_I`?P_GOAG?CQ@?g?C??_#7!12?@?A??I@QHAlRk?HCPeHUhEHaTIcRCzC~@jUlReTiZejSjSJcHU?I`UHQdITaLqLqNoLqLOfGTaCRcRK@i@Q@GCA?AGC?D?HC??c?GCA??C?A?C??C??@??@??@??AO??G??A?@AC@ACAC@!5?@A?AHA?AHCA@?i@QdATiDYdYcYfGRmTjTnYvItIzn^znznznzv^~^~^~^!25~^~^~^~^!15~^~^~^~^~^~~~nYf}LzVnvlZd]p]vlYdIsBSjCRkBSj?QDODGdAPC?A?@AC@A?A?QGC@cB?AG?C@A?I!4?A??A??@C#5!22?O_@?cGsHu@}?~@}J~Tmtz^zn~~|!7~ulZc~Hi^yFetjeGjaPGfWf?OG`?OH??_PGcRGAHe?AO@?C#29!20?_??@?A???g??iS??g??g?O!6?_G#10!8?@A?D??@A#29!4?OA$#6!17?A?@??A?A?A?@?@C?A?@??A??H??A??H??A!4?G?AGACQHCzE|jUlZv^~^!5~|~~}z|~~t}hulQkQ~szeXuhUxe\itZkrCy?iShQkPiPcHOjSjsZuh~t]hulYti\qLqLoLqLonWvi\rkZkr}T}l}vz|~|vz~y~uz~~Z~vz|~~z~|~z}~z~|}~v}~|}~~|n||u~~|~}|z}tz|z}!5~}|~|u|~|uz|}zT}lQ|iTydYdYdWtkPiSiOdGtIpCO_COCOCOCG_?_?_?_#4!199?T_Dg@AOGaODaO??OHcASGe?cPICA???c??OG?cAO`GT#10!39?cHOAc$#4!30?_#31!179?A#11!279?G??OC?GCaO??sG`GOHc?g@IcRGc@EOlPlIKbIpA|jU~lYvi\ju~lzVj}HnyumXu~iVi~?@mzEzmRUlZun|ZYVeXf[rMxVh]hugVlYtI|JsJcGv$#10!492?C@!4?@GfGA@SAd?QHEO_PGcRGoHAcAO`GSAgASh?QdGTaSH?QCg?@AODGOcH-#5^VNZvL]W^W^]nEV]?^?^_^A|B^aTKrLQkZcJKJCjSzTMXmXuB~dZtiD|lZvnT}}rWLdw[h{?{?yCgS_S_S?S_#7!4?@??A?A?@???A@?A@?C@C?@GACR?J_RGE@QHA@A?@A?A@?A??HC?Q@GCA@?A??A@?C@A?@?A?C@#5!19?O?O?O?O?O?OCOcOk?kOcOCOcOcGSgC_GO_GOg?gOg?g?g?g?gO?O?O?O?O???O_#7A??@?@?A@A@A@A@A@QBG`QHEhQNsNsNsNsLzD~D^lzMrnR~Rnrn^j~jVjZfZnZnZnZvLzd^tjVyTnTjTnt~JvJVlZd^t^tnTzFyLzE|A|B}@}?~@ITbJQDRK`ISa?`GCASC_HC??@#9??kOk?kOKOcSgCgSGS_S?S_S_CgSgCgSgCK{k[[[sK[CKCKCKC{K{SkoS!9?CKC[?KcKOK?KgCKC#32???C???C?CKKCSK{#11!9?A???A@??@_?Q@G?ShACaCiPChCPI_J_]_[b[`[cYcZlvYnylZulYvlZb}HVyamTrmO~QlYsJgZeXdZmPnQ~PnYdZATBTIdRCjOJCBOHBaHA?A@$#4___??_`b_B_@?`_@[_{?[_[?{?[gQKQl?CGcOCgS_?gOCOcG??OcGO?A#6!5?@?CbOIDBU@zB}DzVi^j^j~j^!4~}~}|~|~}~}~|}~|}~z}z~}v{zk~s^kvx}lu|}|~}|~|}~|~~uz~l}vz|}~|}~|}~z}|~}~|~z}!19~n~n~n~n~n~nznZnR~RnZnznZnZvjVz^vn^vnV~VnV~V~V~V~Vn~n~n~n~n~~~n^|~~}~{~|}|}|}|}|{l{t]luxUkoJoJoJoJqCy?Y_QC`KOk?kOKO_S?SgScWcOcOcOcGqCY_ISgDiOiSiOI?sGsgQcY_I_IOiCwDqCxA|A{@}@~?}ti[slykr]tj\~]vz|jz^uz~~}~~RnR~RnrnZhVzVjvj^j~j]j^zVjVzVjVzrBBbbbBrbzrzrzrzBpBHBLj|vn~^m|~|bPbbRA@_`A@?B?@A@qC?ICCgOG?o?G#4?AKCKCKCYKISHCI?KStKKSLKS[gUk_SiOgPCpC?I_I_I_S@SaG@Q_#3!13?S?S_CGPaKOl?lOdIsPcX_YcPkOk?kOdYc|i{itYkzSnsz{nu{\u|yl}~$#10?GOCGO???_?_OG!8?_??_??_?_?O_#11O?_O!5?_#30!33?@#27!13?@!6?@!13?@!35?@!101?A!10?A??A!5?@!12?_???O#7!105?A!10?@#31!13?O???G#5!10?A?A?A?AGO?_PA?AWaW?kPIRMp]rSzQx}LzzDrrRfRbBrBb@qxrwrxdrtHczs\?IAaOb?q@_@?@AH?DAGAGaPCOD#26?@???A?@#29!21?@!4?A??A?@?A??A!31?DO$#3???_?A#22?C?C???OG?b?B?B?@A??@A@???B?BOB_R?JCA@a@A@{?I?ADy?QcGOi?@GCaOA_?AC?@#31!361?_O!16?_O???_???_!5?_#10!23?@_??GOAG_?a@A?OH?P?CaOAGcPCO@SBGaG@QcHCQGdODQcHQdGQcG@aG@S?G?@!7?C??C???A?@?A$#11!15?_???_#22!448?OGG?G_O?G_O?@A?B?A???_Q???q`??@#26!4?A???O-#4VNs?O_@ObLPK_]_YDS?z?}@Qk@yClRGS?@G?@c??Q?g?HC_J?`A?PC@iO_GAC??O#6!4?GC@aHCHaLA|AtIvItjUl~n~n~n~n~n~n!4~v~v~v~v!20~v!12~v~~~n~n~N~N~n~n^rnZvnzmXv^v^vnVnZnJ}JuLqNyTiNyDyF{JtITiTiDiRM`^@}DYfGVgRcREPjEpFgVGVGVpE|A~ITi^a^jUh^i\vN~N~n~n^~n~n!4~|vz|}~~~}^}n}v}~u\zt]jszSzsjUxvg^uXu|qkP}tylux]titiTjSjsZc~I|Rkq\ulYvyluxuxUx}tyv{zu|u|yt}tz}v|^z}~\z~|!5~|!11~TiT~DyD}DzLyFyLYfItItJdITZD]djli[{x\^[~K]NENEFEFfX|[\BNDHB?@!4?ENFEFAFFHBIDJCIL?G#31@#37_#20_#12O#4A?O!6?_!7?O?o?_GOG!7?_A_@yEtTjmTxCpHk_N_Y_T_T_T_I?O_?O#3!9?xASG@qCwBkPeGtAt?YcQgISiShEgQLOd}~Z}n|^ze\jv}\v}Znt~~|~~$goA[`]OcO_?_#22??@C#26!6?O??A!8?_!10?_#22@?@!6?@MGBoA\_DgC?O?GC?aH??_??O?C#5!49?G!12?G???O?O?o?o?O?O_KOcGOCPeG_G_GOgOcOs@sHqLoDiToDyDwBsItiTiTyTkp]_}@YdWvgRKZkxmCpMwV?v_vgKXA|?diT_\_ShU_TaGo?o?O?O_?O?O#7!4?AGCA@???@_@O@G@?HaCI`SJCjCJShEGV_HeHALRm@IDQHE`ITITiSjSJcZ?tAkRLaHQdGDQHEHEhE@IDGBCHAHADI@IC@GA_C@?aC?A!5?A#9!11?iTi?yDy@yCqDwDqdGTItIsITICY`ISAT!9?o?oW?w_GCA?AG?IUCNEMDNC??O!4?O!8?IC!4G?O??!5O??__???_#11???_??_o?iDA?qLCwOQCX?ICPiC@IcQH_^_^_^_^_^_^dYvLulZulZulZCtjUsLyB{RmXvI|IudZcTtaTjUxVlqnY@?c@OA_CXaSG@aG@cOI#29??A$#5??@BM@M?C??B?@?@?A@C?@?C@??@??d?@U?T?RGD_C@RCQIcM]HvKrmS`VsLxa^iVz~nvry\Squ\Q|AlIpGtIShQ?O?O?O?O?O?O!4?G?G?G?G#22!98?_!4?C_!4?OG???g?G??A_???O#5!164?O_!4?O!4_?O?O!4?__!5?G!8?@?C!6?@A?AH?GGGLGGCKDWCID?DBEFFF\MN^!5N^YY\NxxNnxHWWuG@wTapaLaZCGc?_G!4?A?CA?Q#29!41?G??G??G$#10??G_??_JGQkO^_Y_AhA?B?g@QC@Q??A`I_QaS?bODOCCq?O?o?SGaGO#7!361?`!6?`!8?O!4?O?O?G#4O!5?O#30??@!9?@#2OO#3!5O#33_#10?_?_!4?_#6??D?_?C#26!12?G!5?@!9?O$#11!10?A???C?w?{?{?Eg?wCgQkOIsGDGiGSiGjQg?HCO??_#33!365?ABEA?B?A@?@?@?@??_!4?O#16_!6?OO#43___??_?___#46_#47_#41_#16O#40__#49_#50_#51_#2!7?_?__#32!4?A?A!5?A#10!8?P???@EG@?A_O???i?O@CO?D?I?I?I?T_IDGaHQcHQcHQcAG?`I?@C!8?@??@A?@$#31!421?_??_?o?_W?G?A?A#3_!6?OOO#41_#35G!6?O#22?A??A???A!7?@!8?D???CAO?EEDF@FEF?WCK#30?O$#4!423?O#36!5?_?O#32???_#2?_#10_#14?_O!7?O!6?OOO?O!9?_?_!7?_#3??O$#24!441?_#37_#19G#39_#34G!7?O#48!7?_#1!13?_$#38!443?_#40?_#31?@#44???_??_$#42!447?_#33???OO$#45!452?_-#3~|~~|}|y~sz{QkqKoCg?GO_?g?g?g?GO#5!4?@???A??C??CB?@A@QGAEGraWMZe\huhUjVn^zvm^~{uZh_qkZu_vGtQdWdAdWDGtAoCOdGt?TgT?TgT?TgPi?gOcWaWqCOCOCOCOCOCOCOCOCOcHShU_}@}@{@iSPEWdY`YcQgQcZcYD]xe\yd]huXe|ivy\}v{~y|}|v}z|}vz}]zb[tZzVt{ri}j|{ZzQ~]kfYzktqx{zYlhudYtYDwCyDy@kOdY@KpAS?Sg?gO?O_??_GO#7???@!6?@???@??A!4?C@A!4?@??@!5?C?I?CA?@???A@??H?D!4?@#5!14?_?_?_?_!21?O_CGO?_CgQGT_?S_?S_GO_HAD??OAAo?@DTT@@C!4?@#37C#60O!5?o??WWGKG??CC??GA!7?_??O!6?CEAE?C??CCC?S??GggWGG_?_oo?__??_#6@#20O#66_#11@!4?@A@CCK`Y?dIOI@IcXeGvGeXCzCzCzCzC~TmtZulZTulQlZQuhVyTmTzTmXviTmXvI|jTmTyV?Q?cPGCAhSa@GOA`GC?QHC$#4?A??A@?D?A???A?@?@A??@A@A?A@??AC@?D???@?g@??@Q_OGCg??d?o?CPaOCHaCGO_#6!9?@?CQHCRcHVGvIlYfYlYfYvI|NznYvI~iVi~iVi~iVmT~VnZf\fLznznznznznznznznznZujUh^@}@}B}TjmXfYd]dZlVlZcZdY`EXaDY`UHeXATGDa@GB?DA@AG@CA@GC@?CGAGC?GA@C@??A@C?D?@Q?D?BGDA@C@QCHQdIdYDzDyD}RnYd]rM|j~jV~Vn~n^nN^fNnN~Mn^nN~Nm^~~}~~|^~~~Z}|!4~}~~}~~^~~z~t~z|~}~~~|}~~u~y!4~}!14~^~^~^~^!21~n^zvHeXATGDaHU`ITaHUdIodOlQDX?KHAI?A??A@#35A??A??@#36@#20?A#61O??O??!4_Woo_OsOoUY}cue[e?iMy}wqsWowowwG[?__gGGI?O??_???O#58?C???G#10C??A??@??@??CAG?I?dO?@cO?@A?P??P?aCX?rChCQ?iPIcHQc??OG?_C@$!6?A??HCBkPKQC??HaCOC?h?SAh??aGaHUgACPCi?i?HCq?TiDOk?u!5?O?O#9!16?C#22!79?_!13?_!32?`?S`A_C_GAGS@S?A_Cg?_@W_COAGCA?c?Q?G???_A!9?_#9!13?Oo?O_Oo?oO_Oo?oO#5_!6?_???_!12?_#9!71?eXExAdqGUhITiHU`ITEWiQliC[BEC?GGCE@C?BB?@@??B#58?A#55A#10@#48A#33@#24@#37@#52@#40@#42@#43@@#67??_?_?_#68_!6?_?_#67!5?_#43!4?@@@#41@!7?A#62A#1@!6?A???C???G?OO?_G_#26!12?_#3!26?_HADACh?UgDiPiCiPeGTiPeGtASiPiDg~l~Zmvz|Uj\}vn|]vz~luz~~$#11!12?@?@_JyTuTiLyTUTiTUtj[vWugV{zCyTzSlQ_DY?OgA@H?GC?_#4!347?__?OOO!6?C?C?A#12A???@@#59?A#53!40?@#54@#55@#56@#37@!5?A#3@??A??A!4?AI?G?CCGA?_$#26!47?G?_?C??O#22?@?GD@_??A@EHSgO_CGP_?AH_CQH???G!7?O??_#19!311?@??G?A?A#16G#41O!8?C#34!50?@#14@#0@@!6?A???C#57@#35G#14C#43?_#69?_#23_#22A#0?_$#13!411?_#51_#40_#66_#44!5_!4owgWWW[!4KCEUQEEEA!4B@B@D@B@@B@DD@D@B@B@@D@B!6AEAE!7CGgGGGOOOo_?_#31!6?C$#3!416?G!4?C!4?AA???@#46!47?A#51??A!5?C!7?O$#52!416?O#54O#10G#7A@#49G#48G#46G!4?C!5?A#2!48?@#20A#5@???@@A?A?@?D?KA_@?G?O`Pa?cQ?_I@COA$#24!419?G#63G#14??C!9?@#24!51?A!4?C#17C#39G#65?O#47O$#43!419?O#51!5?C#45!5_?o___??OW_GG[K?KKG??WGW?WY?O??CKGAG?GC?s_wWWO_ooo?O_OoSO???_#48G#64???G$#39!426?C#4!59?@!4?@@?@?C?BA?@E?U\iWaPS@GITcOIdWcXeGvGeX?aCG?Q?h!8?I??_O??G$#9!486?A?@???A!5?C?GGOO$#42!486?C#12@!6?A???O??O$#40!487?C#46??G-#3~nVv^NvV~^^~^^~NlvlFZflVQnD~UN|nolololodycxaSg_g?@O_#5!4?@?CA@CbIQC{HViFqgzeJVm\j~~}l~~ulytmXvkzuJ|uwi{r[rkR{b]pnWfXuhUwqlQ|a\itYdzSzdYtjSzcZsjSz[j{vWn{yTmxulyTm|ZuzkZsju\j}|fz~|~}z|~~|}~~}~|!12~^n^~~~^~^~^~^!19~^m^!5~{}~~}!4~|~zm|YTqlitZW`Mpm_nOMtYcZcXaKoDW`Y_ISgSgSgSgS_S?S_S?S_S?S_S_CgOg?gOGO?O?O?O?O?O?O?O?O?_CHsH_Q?cOCOCgOcGOC_S_COcOc?S?c?S_S?S_GOg?g?O?OeAIO@@D??A@G@C?AA#38C#4?@#61?G??__G?wAsl???A!4?a_aaA???A@qrrzu~V}LEZFMOFiDAeDID]dYLuJ]tErVvARFJrQReBFReEaUeAeUaQEAEAMEMojUUWs?g?Oo_O__???_#11@???@??@D@AFN?siOGs?wOooOooOoGqHeXEXEYDS@gATI!5?_!10?_PC_GAOH?cAOHCA#76??S??C?G$#2?O_G?O?g??_??_?_O??O_?O?G?O??_#11??CQCQCQCI?PAShASD??cHUg?vGpIpKoGoDwA?_?G#6!11?@Q??HQDIPeGRCHsAHFTBKbKRkB[`MOfWeHUhFLQlA\aTIdYCjCYdISjCZcJSjCbSBGfOBDiPEHQDiPAcHCRcJSHaS@AGC?A?@CA??A@??@?A#4!12?_O_???_?_?_?_!19?_O_#6!5?@!8?A?CPAdIDQDIcB]`MPNOnPIdZcZe\rNyf]d^tjVjVjVjVj^j~j^j~j^j~j^j^zVnV~Vnvn~n~n~n~n~n~n~n~nQ[B_I?UGdQCRCiPEHQDiPIDQCRcIPIcRRJBBJbZVNV^V^l~nH\dFAAADH@CAA?B@?@#24?A#16?@#45__???@A???_okK[MrrPVPXpvRRp}HGGCH#67?_@?@??@!9?@?@!9?@??C?@?@??C??C??C??C!4?C!4?O??C#72?@#60OGG??_#10@!6?KHG??ySoC@g?hI@CqIiCdMII@NIHrLUXExExDy@iS`It??wCw?G@U`IT_S_G$#29??G?_?G??_??_??O?GOg?W?gCOg?gO?O#4!11?@??A?D?A?@Cj?UIpGQJODgA@c?T_DO?O_#22!97?O!61?@!6?A@??@!10?_G?O??c?O??O??_#9!64?lBwU@uHdYHjgjPEhQdiPM`YhjGJPm`ZGk?KgcGC?_?_?_!6?G?_GA??ADC@??@?@#41??A#33@#70@#56@#71?@#78!31?_?_?O?oO?O?OO?_?_??_!8?G!7?G!8?OG!9?__??_?_#24@??A#16A!9?O??_#14?_#6??O#29!27?C@G??C?@?@?AG!5?@?A$#1!5?_#10!10?A?A?C?A?@?A?@?A?J?J?J?JODICGATHQy}HUgRSG_C?C_?C!4?OG#79!300?_#31O?O??_#33!5?A!5?__?OO#35_!7?C#68!41?QwCW_NGDiLHiDi?YCqHS`IxKgGsKoOKkcWSg_GwGgGwGgGCgSgG_Wo#44??@@BAAEA?CC?G?O#4BAB???A??C???G??Q@SJD?TAG??cG?_???_$#1!24?_#22!40?@?A??OGFCHSgPaS#19!304?O!8?C???A#3C#60___oOw?O?G?_O!6?O__OKCCGCCKGkkC?CCC???G#65!4?_?_??O_O?_O!12?G_?_??G?gO?O?O?O?O??_OgOoO_?G???_HG#73@#43O_?WCOG?_oO?_#80_#49_#9C#17O$#14!385?_O?OO?GOGG#43_??O!8?A#45!71?!17@FCGG??S?CC??G?O?O??_#38O#74??_#29A$#4!388?CC??A#52_#16O#70O#44___OOWGkCsK[U]UmD|JQ^NBPB`?GG?G!5?G#74!71?@#75A#46G!4?G#53G#5@??AA@?L@IGAcO?C??_!6?@!4?C$#7!388?GG??C#41?_#55?O!7?A#59!101?A#2@@?AAC!5?O!8?_$#10!390?_??O???G#37G#54G!9?@#64!96?@#56A#77?C#14@@#1?C#3CC@C?G!4?OO!7?@?@A@C@E?DAC???_?_?_?iOAS_?z~EzE^tuh]ti^i^t^mz^v|nu~Z|nuz|~~j~~z~v~$#2!391?_!9?AA#58!107?C#35C???G?O??_$#17!396?G#48O!4?C#68!108?_#50?G#20G#22A??C!4?AG$#1!399?C!4?@#48!110?O#76???A$#46!400?G!5?A-#1xacpSw`aP_T_Pg`a_`S@?_PGO_I??O?_?COI?cOA??O???_#10?FADiCPD?G`?Q!4?Q@I@aTGDA??_#6!13?@??A@?A?D!6?@A?@A?TA?J?DOGA@GAPAGDAODQC`I?@AGAS?HC?A?A?HCA?@??A@?A?A???@C?DA??A#4!17?_OgCgSgCWaTIsYcJsJkCZCjSJcZSJcjSj[BcjKBkRKjcSeOf?vcsGSgCgSGS#6!11?A??C?A?@?@??AHSASHQDiPIDQHePIDqDyDY`UHeHUjEhUJeXEhVHeXEhQLa[B{B{B{BsJuJuZuJuLA@!5?P??A@??A?@?A??A@?H?CA_@?C@?C??C???@?D?A#42O#56G#60_??_???o?AA@?@!6?@!7?A?@#78G!6?_#75!10?_??_O___o_osoWWuM[USYGOSSOQOSOOWWWSOY{wswaoq_i_eaaUaqqoisogOO_G!8?A!7?A#43?@!4?B?CGCKO?Wo??_?_#16???O#76!5?C#1_#22O#29??O!20?@#76!23?A$#2EWPIhAYSgVgTiCYSYSGqkQcQcPOhU_QHO_?_!4?_#11!10?TAk?ntIVkZviTgS_SG_?_OGC??_#4!82?O#22O#10!39?_?O??O?_!6?_!6?O?O?O???O?_#22@GG?G@!9?S!7?X?SGAHGS?A?@?@C!18?C_???G_O???S??_#9!32?pMoNoNPiEx?UgBxEgUhUhTgU_FyHUgu@WO?AWQLAL?VAE@EB#80G#45__O?__GpW{{wy[^}}\OO?BIAEFFDDA?@?@@@!5B@?@?@@#78??W?G_WIG@C@?DE@?O?G??OC@@C!4?@@?@!6?@?A?Q!14?_?OOS^SMYE!5?@A??@!8?G??_O_?_?_#82C??G$#3?DICADCHEGAICRCHCI`KRKAdJCdQhNcUjYdSzIls^ilu~Z^vgTy?xAwO?O_#5!5?@IPiDIDIdQrJyKZUv!8~}~~|}~|~y!6~}|~}|~i|~s~ynv|}v|m|vy|nylz]t~}|v|j~uz~|~|~uz|~}~~|}~|~|nn~}z~y|~~|!17~^nVzVjVzf\itJCZcJsAxCjSJCJcJcZSjCBkZCRkRKrCRJWfO~?YJvjVzVjvjj!7~e~jt|urj||!4}z|uj|julyTmtyluXmtyHYDydUHeXuh?xUHsXexUguXexUlq\b{B{B{B{JsHsHcHsHqKoNoNomCxE|gV{CxUhShUgUhUw@sHUHy?AG@C@QD?I??@?@#43??G?C#61O!4?_??DCa_?@_ni}{TwWgwwg{e}^M]MKCC[cIFADIC@D@LDHDD??@?B??C@#85!11?_?_#61??@!30?A?@OD@@AGBACD@ba@@A`@QAOCa_G#10@!4?A@A?A?@!9?DAA_FOj?RCqSiDA{@}?}@uHsGsIShSd$#29!16?@?A??@G??I?C??H?C@I@CPAH?TAH?c?GOg#4!4?A?ACG@cGTiC_C?O?aOGd?ODOCg#22!121?@!4?@A!4?_O#14!154?_!5?_???g?W???@??@?@#53?@#65!15?_?_O!9?__O_???_O_o_yOAoQ?AOOEWMGG@AG@B?J@EBIAIDLAJKECCAJD@EJATHLHTTHXThHHLIDBITMhMd@__@_?w?_?wGoGGG???KeC[koWO#14@?@@@!6?O?_???_$#26!70?O#22???GC?B_@G#11!128?O?_O???O???O_???_??_??G#31!136?A?@!5?A#83_#2?O???CC?A#81?A#43!24?O?O#68?_o_OO?W_WoWkWCYCIcA?E??FGA??A!5?@?C@G?G@GAHCA?AAHC?A@?CGC?C?IOCG?SC?DOGDA@E@Ag?I_?wE|SkDa?A?C!6?_#41?@#49@#47A??C??G??O#11@?@AB@FBFBNB@A@C@_@C@c@C@?Q@A!6?C!5?A?GOcGQgDgQcGQcGTaG$#4!368?CGOC?G#19?G!9?@#59C#67!35?G???C??A#84!16?__?!11_?_?!7_#60!34?@#67O?OGsSO{}{QWg#60@!7?O#0A!7?O$#79!369?@A?B#16_#10?O!6?G#17??A#44!131?@??A!4?G???OO?_#37O$#7!369?_?G#33_#20??_#70_!9?@#45!135?C???G#4?B?A@A@AC?M???C_?U?W@C?C!4?G$#36!369?C#34_#24_!5?O?G?C!5?A#70!134?@#46O_?_???_#1C#54O$#3!371?O#35!4?OC!6?A#37C#53!137?A#38A??C!7?_$#49!379?_#46_!8?A#24!135?A!5?G$#44!381?__oOOWGk[]EMD@AA?@?@?A?C@??D@???A?@#2!110?A!5?G?G?G__!5?G?_??O$#38!381?O!8?@#69!135?C#6?C!6?G$#0!381?G!6?@#3!140?C!4?C???OsGWOO?gCoIGi?}Gy@iTg{@}@~@}HqJuJtjSjQnZvlVyVlZvlZvi\v~|!6~$#5!529?@??CC??S?GGO_?g???G???O$#40!529?G!4?_$#51!530?G-#2_pQpSr_psq_xcQpwL@T?E\QLWHMCNGE@sGqSGC`Q_@_O_OC_?O_???_#4!7?A?HOa?HOcQwOgsoopgdWRKo!4O_O_O_O_!8?oo#6!7?@!6?@!16?@#4!6?ooOoOoOoOoOoOoOoOoOg_gcgsgSgsWsgSgSgSgSgUgRSidItQLqtItqTigUpUGsIPDiA@LAI?lACAT?LA{PmQpSgpShuOdySpI`MPItB{?{?kOKOaOaS_#6!12?A?@?A??A?@?a??A@OAK`QG?@GD?AH?C@GA@GC@GA@GC@GAPCi@Ci@SaLAdIDQdIDG!10?_???_?O!5?_???CE@A#33@#47G!5?@#69?@#61g__CSWMMdeNgOyT^FJ!4B@@@?@?@FABBAD@B??ACAC?A?@#85!7?_#88?_O_ooowoow?KGCIO!4?AC?C?O!4?q_oowwGsGoGOO?O__?_???___??O#85???_#78CAD?A?C?A!4?!4GKGKKkYSOGA`_?___??`?`?O_?_???_#91C#3CE?AAI@LDIlZ]JcXEHEHUhEhuhUlQlQlZE\jULzLrm|r}tz|!8~$#1VMDMBKVMJLNEJLMFa]i~x_cqfa@xorw}AtG_boWcS{QeXAoG???O#5!15?C?A@?DADAHFIDYFkQNNnNn^n^n^n^!8~NN!7~}!6~}!16~}!6~NNnNnNnNnNnNnNnNnNnV^VZVJVjVJfJVjVjVjVJVhVkJTITADALADIDI?D?I?@A@?A?D?A_DOAGRG?hAO@A?HCA@CAE@MAC@MpMpItAsB~B~RnrnSfSjTZ|z}z}z}zu|N|~}~|n^|~}~\^~x{mlrUkvv}fqzlsuzyv|}vz}v|}vz}v\mzT}zT}j\q|YtylYtYvlYvi\juXmJDmTiLze|zUlJEC^E@GCD#38G#83C#35@#10@#45G??O_wOWQOG@!5?FF@A#75??oo_??__o_o_!7o_o?___!4owGkwsW[??ECDEEF!4B@#85?oOoGSM]IF]Li~yvNudBd!6?_#94!10?O?O??O??O_??O#89???KI?C#68!5?AAAB?AEBE?AAD?B@C?CS#67??G??G#43?A??AGG?GC?G#5@!8?O!8?__#29??_#4!18?O$#0G?g?g?G???O?O_??O_!7?O_#29!5?@??@??A?GA?H??GACi@GCoGOGo?O_??_#22!19?@#10!98?_!4?_?O_?_O?GO?G?T??C?Q@Ci?OGs?@ODO?gPAA_?AG?CG?AG@??@G?a?CO?c#22??G!8?HGH?IcAC@C@C@CHAo!5?O_!5?_?CA@O?G@?G?OGCOAH?C#14!13?_#9!17?_?QdGTaSHePsY@iTACHACHQSWj?HI@A?A#39?C#86A#43CC#80A#59A#46??@#67??_!4?GG!4?G!16?CC?IKKC#84!8?oO??__owWwWgGGCKCCIB@BDB@@@DG@?@?@G_HYkYD^NLDCEIUMUMMMmMKMKGGW?OWGW_O_OG!4_GOGO!7?_!13?G#89???GG#45???@!5?C???O?_#11C#37O#48_#56_#17O#96_#14??_#76?_!5?O$#3!21?AH??C?A?C@?GAD?CB?HB?L?ElBTzC]`yLShuHugTq?S_??O__#11!121?G?_??_??_?Qh?h_GoCoDoIo[_i?t?cgSOl?_P_AhSAgOG_O@G!6?G#14!102?O#4??O#31!4?_#3?_?O#34_#24O!5?A#42??A#37@??@#68!5?__?O??_O_?_?GCKCCCMIADIEMGC?GC?A?RD?H?AD?DA@?@???@#87!4?O?G??GCCM?A#95??_?__?_#94!7?O#65?G???A??@#85!12?_#65??A!8?R@?J@NBN@FDCC?EO??O@OO_g?UXQB`[\ApQUO[}?S_S_O_??__#10A@C@E?IDQC@CJ?HEHEHEHEHUhQlQlQ_o_O_o?o$#76!26?O!8?IOGC#10!10?@?A@?@!7?o?C@D?C?A@?dA@AGCQ???_???_#22!104?G#26!12?C???G!16?C#19!133?@#16??_!4?C#65!15?o?O?O?GC??_??O?_OO?O?P??G??G???_YPOH?ILACABA@@A?@@A?@#93!8?_?o_?_OO_OO#75!11?A?B@?!8@B@BFFFNLFFENNNLVGOOSo_o_{!4wsoCoo_o_???k__GWAAATCc?d??i#46GC?G#0@??A!6?O??_#11!4?OAO_O?_O?O!8?CHACHACAK@AK@ICA$!51?C?AAE@EHFILLJQmWjQLWkAGOGC!4?_???_#2!278?_!5?A#78!14?_?O!5?_O??GwW?CKICG??@G???O?G?KACH!5?CGEALE?A?@#87!34?O?_?___o?OO_O_O_???_??_?_#67!12?@???@???A@#44!18?@?AAC?GG??O?_#60_#83O#33?_#1!8?_$#14!364?O#0O!6?@#43!38?@#68!78?@???A#61!13?@?@?@?@??@?B???C??@??A@?I??C?O???O?o??O#77O$#81!365?_#44_?oow{oiKkIEEFHHBE@@A@#47!148?@#54@#70@#16@???@#66G#4@@?@CGAO???_O?c?O!4?O$!366?G??@#68!169?O_?O#92??G#8G$#70!366?O#60_!5?Oo?S???CA#42!157?A#55A#1@??A??GG$#41!367?O!6?@#35!166?A#2@???C$#1!367?G#59!174?C$#90!542?A-#2TjSATISlJcXASbMpA?_??A!7?A??nTiTeUKTmIxIyTTulI[PWDI_T_G?O#10?@?@#11I@Q?ATgD_Z?Bs@egUgQCOGCQgOgAo#26?O#11!8?_?_!38?_O?_O?_O?_O?_O?_?_?O_GOG_OG_W_W_Y_SgOmOkOiShUwVGQHQGR?ePk@eOl?`MZUlYvI|ItYlYsJ[bS`KAT_LOEPISBS`KOkOKoKOhGOgQG_?OcO?G#22!11?IDA??DAs@AC@C?DA_#6!31?@?@A?@?@!4?@?A#9?C@AG@C?HaC@?BCA?@OGGDAB?@#61O???__og`OOIGDcMDCCKCE?A@A@???@#88?_!8?CwSG??WoooWOGK?CCEEAMGAAAEBAB?!6@?@?@!17?A?@!6?@???@@??@@BBBJbvFVSU||eCESS\GKHWC[s[Acc_o#78!12?C@?A@@@H@D?AEMD_QHSPGAR_A?@?OCWO???_#5@?A?AA???CC?G#11??CGOGoGO_OGO_O??g?O#29?O$#0iOiTiShQcXa\a[`IsGTaOcGOdIShQCGO!6?_#3??@??@?A@ACBGDAdQiTuhE|it}tyl}|iOiS_Sg?GO#5@??D?dQGCB?D?JCB?C?S?C?A??CPBR@HBBbBBbBBbBBbBBbRCCUCESEC_AG?C??I??@?A@??H?A@??H?BB?CA@??@??A!4?D?HA?@?@A?C@?@#3??oCoCoCgOiOiOiOiS_?_?_?_?_?_?_?_?WaWaWaWaG_G_G_GO#5?A@?Q@AGA@AD?RCj?RCRCJsBlRLRnRnVta\bNqLJe\z}z^iT^!7~^~^~^~^~!8N!8~}z}|~}~}!4~}~|~z}|v}z~u\z}~{z|~?C@C?C???@#60o_[IBKFG#78__O_OGo_O??jHA?E?A??@?G???A@#85!10?_???_?O?GG?G?K?SCCK?CC?@IACAA?B?B?@@@A?@?AOIHYJTB@B@BCGK@A@BA@A@A?B@AASkOCG?g?@?A?G???G_P?OAo??__#65!18?@?A?!4ADTGOA\dqjEQhc??_O??O?_ooO?__#4@?@?AAA@P??CGO?C!4?G?_?G$#1?C@g?`A?OAC_H?OCHtI\nXvnYtjUlxvnOiTiXhRiPsEtCigG?p_caoOG#4!10?C?@??FOJCjSJuHEhU_ZGcr@OlQdCrk~z~j~z~|^~Zm{k}u{{[{{[{{[{{[{{[kzzhzxjxz^|v~z~~t~^m~\m~^e~\m~^e~[{^zl]vnu^nt^f^bYdQ`Si@iOl@iS?EgFhEhFgVHCBSHDATI@?GO@G??DG?O?I?@CHEPdGFOfXeTb[bKrKOm@KoFOcGQlCJOFGbKbSB{AKqKOkOg?W_[oGo?W_???_Og!8?_?_?_?_?!8o#14!9?C#0!30?_!9?@#37@#46@#65!7?_?_O?O_Q@?_HC?C?A@???G?@??@#93!14?__OoOG_WOO?WGOGgG{cS[I[CMCIcQeiU@b?uOJsQDSISE[_[AT@IDeccEDMSMsMk{gOkoSGOGGG???!4_?_o__?_#68!30?G??G!5?`C??oSg!4_#60C?G??O#10@?A???K???pQ@A@A@ACBC@E@E?DiS?SgG$#76!17?A!30?O#29??A?G?D?I@UhASI#10!16?O?@G_A@?gCA?W?G!80?C??CGBCOC@AO?Ag@!17?Oc@AC?TAOACAC@Sa!15?A?`A@_A@_CQd??_OCg?G_O_G?O_?_#4!84?I@?AAGC#7@#45_?CC_?G?OOMKCCAA@#67?@#75_oOOogGg{{}}WUFNMl}qpo@!6?!8@#99??_?_?_??_?_!6?_???O?O_?O!17?_???_O?WO_#84!14?___??@GG?A?CBE@JBIAKIIVN^n^Kk[k[{{wWOO#61!21?DC?AIGA??G?_???o#11@#2CKC@?oG$#5!218?@?@#6!131?CAA#47_!5?C#54A#68!10?OG??IIHA??C@?@?@#85??_#87???_!8?_ooG#95!7?_?_O??_?__O?OOo?W__O_WOGSGKWCgSKuHlc@c_??gw_[_WAQsGGO?gGOgOGoO#94!9?A???O@O@?A#67!48?O#46@???C??GA!6?_#35G#3@@?D??MDytititJsjUhUhViTjVjFvn!8~$#34!352?O#14_?O???C?A#84!22?OoO!4?E`OoOO?KMN}zFJFNvEMMMEMEAFBB!4@B!4@?@?A#100!31?_#87!23?@?A?Q?I@?A??C!4?OOOG?_O_oO_O_#43!29?A??AGA???GWG#70C!6?_#16G??_$#10!353?GC#31@#44__OoWgGYATSB?E@B@B?@#98!43?O!6?_!9?!4_!5?gOG!6?__!6?_??O?G??O_?_#75!18?@!9?!5@!5?!7BFfjm}|{}{s{wy_p`oAGC?gCOGIGHCS#45?@C?C!6?O_#50??_#64O#29A$#2!354?O?G#3@?A#1A#44!187?@@??A?CC??O???_$#38!354?_#55?O?G#50?C#47!190?@!4?C?G!4?_$#43!357?O_G#50!192?@#20@!6?G$#0!554?@@??A!8?_$#40!554?A#58A!6?O$#1!556?@???C??GO??A$#14!556?A!6?O?G$#54!557?C#53?G?O$#96!557?A#97?C-#0~\SuzxKmzgnx{}Jc~|zmz]tz|ju|iTzcZtiTiOcGP_@_@???_#29!5?@??D??H?Q@?G?O#4???@!4?AGAc@??AC@SAIPEGASASBGUGViUlRmRlZdYVlZlvLzLzVj^jvJ~J~TnZVjTnZe\bMPeLQnTYF|A~DYDZEXFYDZDu@^?nQLALQLRc?A?GAC??A?@!5?A!7?@A??@A#10!11?@??@#4?@??@A??@A??DA?AD?CA??AC?A?HA@QCJDaHE?VGDiPMShS_Mh?n|Qh]i~nY|M~]y^}hEpM@uHm@YdWTItWnu|mz{nuz~z|v|z~s[k{u[{[!8oCYW!8?A#45__?O?CWCH@CAA?B@#80_?_?o_O?W?_#95!8?_?O??G???GGOG???O?G!6?CCE@?@@!4?A!9?C@??A???@?@???@?C@AC@?@@?@A@???@?@@!8?c@PCHQo?G?g?GC?CCA?M?T`CQEA@AC?C??_#88FFCCCKAKG[GW?OO?o_oC#75@@@BBBF]N\xooOW`GOX_O_?_#61??O@?DJRVI{ico_G?OO?_???_#59?_#10??GO?G@_i?A@CC??CAG$#1?_@?C?P??@?A@?S@?A?OC`IC?SGADiCJcITgPeHQmPmQkRcj^~lztmYqOYD_OG_O#76?_g?_#10!12?QD?_I?@c?@S_G@G??@??@#5!27?A#3??_??O!4?O_GO_?_?_?_?g?g?g?g?g?g?g?gOcOcOcOcGO?O?O?O?s?s?dGPa[ti~y|u|Ytmxu|i|}t}}y|}m}]}}]i}uxmty|ulyTisYdwTy?gOg?gOg?O_?_???_#26???@??C#5?@A@CPAT?A???@??DA@?@D?@EPM`UHEPmDYFiTIFOHAPCBOHC?CAGAC?JbRBHbBb!8NxdFgL?I@@???@@@#1@#61GGCQ?G?KCCCA@?@@#78?@A?A#93GGGwO???_oOOG?W?C?CDEK?KOGGG??GKCKEBB@A@?A?@A???A@A?@!5?A@?@??ACA?BD?A@??@?@!20?A?ICjULJ\?GCSC?MAIPF@fIEAL@\A\J]Zz}WWowoo_o_O_?_?___#78!11?@?AAFFf?Q`@?B@CA??c_??_!5?O?C?_#37@!8?O?_#83?o#17?G#5?GG??_#29?A$#2?AG??A??CQ!5?I#76??C@!4?A?@?O#2??O???ACHQd?MOLQkZS??QCIPcLi_gQC`?I_#11??@?DAGCA`KPcPGUlQlZSj[Pmwa\a{bKR_V_ChAKPKQCYDgQcQGqCqCgS_SGs?s?gOcGSi?cXa[`MPaLOIdWA\?QdQcPeOdQcQHU_V?HaXaHaGRe|JulZezGvI|QfkT`IT?DAHAcGPEG?TA@I@@DA@P@?@@_T?HEOGDAGODiOHdWAi@|ReTzUlRUhUkZSiXUgvgSiPgPiS_Y_O_O?hS_S?O_?_?_?_?OG??_!6?_???_#3!32?A??D_I??A@#60_??O?g!4?CE?@?B#85_O#88?_!9?oCC{WUIMAC?CC?AAA?@BABA?CE?EABB@#77!7?_?_G?O!8?_??_#100!14?_?Oo_oeoYCW[Wy{_gSAg??c?O#85!7?CA@C???A??@!13?@?C@F?G?G?OGO_?o?o#65!17?CGGGfKSieOkJpNvJMUkGS??C??WG??_g_??O#96C#86G#4C?A?@???`?A?_C??O_$#82??aH?CaP?COCA@_O#3!40?D?QLaULc^VVm^y|uz|]rkRkRg?gO?_?_!8?ocG_GO?O_?_?_?_#10!65?H?c@?_HC@G?AGOAG#76!25?_#10!23?CH??@?C_CG@?_OC?PG?aOCA_??I@?CI??CA@!5?O!6?_?OG?o?O_???_#22!36?_O#14?OS?G??GA#38C#75O!7?_Oo!4?KG?IMDE?BBB@?@@@#99???__O??G_GO??OO?O??OO??W?GG???E??FA@A?A@A@???H@AA?A@?CNCBG^CIEKAY@?IKGGC?H??D??[?gSQzZGcJ\IOiO_??_o_OgogOWoKg_W_Gg_g_s?o?_#87!5?BBA@C@AACAKJCGEKAg_gGO_#68!11?AC?GAOKOGO@gQO_g_o#43A@@AKCI?KwG?O??_#11!11?@?@$#5!91?@?@#6!245?AQD@?C?@#44_OGgCUQBH??B?@#87??_?O?o?OgO?sC?AA?a???K?FAAB?@!7?AA?B@#48O#102!14?_?__??__#88!54?EBAAA@@@#84!23?@A@AD@BDBCJVHRLR]Uuk[{w_o_#67!9?C!8?@A?CG#46@@?A?@!5?O#1A!6?A???A?S???O?A$#10!341?_?O??AC#59G#43?C!5?A#84??_?oW?W?SK!4?_!5?A??@@@B?@@?@?@???@?!4@??@#103!15?_#72???OG!4?O!5?O?O??_?_??o?O#84!34?@?@#80!26?G#45!50?C??AAC!4?_#53??O#76!14?G$#2!342?_C!4?CA#24A#40A#68_?_??O??G#47!10?_C#85?OC?g?CgS??G?G?C?C?A??C?CC??C?C??A@#87!75?@#44!80?@???C!4?__#97G$#9!343?A???@#56!4?@#65_?_??O??G?KCAAAD???@!4?@#98!8?__OOW__o__?G??O?G?O?OO_GOC?E??C?D@D???@G@AI@KDK?IBOgWC?WOWPGCKICQEOJC?EBADABUAhDCcRZc_Pc???_???O???O__?_OO??OP?O?G_?_!4?_#60!57?OOO#16@!4?A!4?GG?G?O$#33!343?G?AC#46O#41!5?@#67??O?G!5?A@#42!5?G#100!16?__?O!4?!4_???_!7?GGGK!4?C?CCCSEMCC!4?CC#54!131?@!6?G$#17!343?_#16OCG#78!9?__#46!13?@#101!28?__??_?__O__oooOwWsWGWWwgAOooOgoWowog_?_o?_?__??__!5?_o___#41!109?A#0@@???C???O??_$#70!344?_#0O#37O#72!55?_??_???OG#50!158?A#33A#3@?@BB@DFCFFFCA@D^Weoh^~z|v~~~$#35!345?G#42!224?C#2A!4?KG?O??o?S?O??G$#69!345?_#55!225?C#14C???AO?_!4?_$#47!572?G?O$#5!572?@-#0~}~~~{}~~x||!4~vu^~}~fv}~z}~|y~tszmhupG^cZsPIdy?@A#29!9?AO?D_A??O??CO?C??O?g??G?G#10??C???@???A!80?@?A???@A?@#29!4?G?C??A#11!34?A???@??A?CB?B?B?B?BA@AB?@B@IAQHtBaHRAdAXAiP_EHCjOHeGaLaSi@]_]_]`Yd{`]_{dYc?_?_?_??A`?A@?A?q?__?o_???GC?GC?A@#44OGGSCAB@@#84??_COOAIE@A@A@#100?G#95?KW[O???G??A@???A?@#102?C?OO?S??G?__q?@??AK???_?C?A?C?C??bodW`@dS`?DWCGSGO?GG[Soo?oo_Wwgw_wWOqOk{cc_!4?_#100?@?H@F!7?A?A?GSGb?@GWCKKGKGA#48???A!5?C?O#85!8?A?@A??@A@??OCG?O_Og?_#75?@@@BBAFFNNLX[XOke|wsow?_#44!5?@!9?@A?AA??!4C?!4G?!4O#17C#60_$#82?@???A@??CAA!4?GG!4?OG!9?I??O?GC_???G_O??_#3!11?@??QGPCJDMRJfZj]lnS^}c^c}{ykq{qkqkOno^_~Ono]sisYcwDwcWcwCwcXcxCxShqKolQkpItgsHqkQhUweWugUwSj{j{jsZkzkzsZkuxUhu\u|i|{l{|k|u{[m{\m|e\RjVXExVhVj\b^`^bMPvI\b]hTNSjLlVlZF|jV|Lz^vM~n\~Zkn{^kn{^[|}{{|}{{t{huGsGsGsGs?s?cGO_O?_?O?O?O?O_#10?P?O@OC?AG?TAO_GQ?SA?SA?HO?G?_OCGC?CCG#31??O#1O!6?G#60__?_!4?AA@#87??_!4?GK#99O??O??g?c??OO?C[CGG?CC#103??CC?CC?O?[G?CC?GA?@@[A!8?AAA@edOFQfUmQb[lwcWcGA?WOS_g?GoG?WcCS?GC_CGEQAW?Oo_O_O#53?C#99!4?@A@?B@?C@CB@?SKFCF@B@@ABCDAJQHPIhgS`GAOAOG_g_O_G_#123?O#88!4?BBAGCSKK???A#65!6?@!4?ACB?KAP?C?G?c[O_Ko_g?O_?@#43???A#47??@???A#2@!9?C!4?G$#1!5?@???A!7?@??@?G?@?C@?A@?A@?@A?A`?Q?BcPA?mYtjRhRgOmXa[_YaKtCQ_w?gcO?C??O?_#76?O_O!99?_O?_O?O_GSGcXEGUGSA[?]?[`I?dAG@QA_BCQAGAcWASgAoC_Go?O_?_#29O???O??_#10???@?A??A?@!4?@??@?@??@#26!18?@#5???@???@??A@#3?g?g?g?gO??S_SG_!5?_?O_gG__G#104__#23_#43_??_??I#65S??W?CCG?C??@???@#48G?_#80?B@B@AA!6?@#100!6?!7@C@#107WGO?CYAI#119?_??GWG?O_#107??CIWYK?G???GG!5?O?O_#114!14?CC?C??G!7?_#98@???@?I?AHeASAE@A@GUH@OgG_CG?AC?BG@?DCEDQBAGSkkwcOOO?G???C#87!7?@BBBA@MESS[s{w{wo___#46??A#78?EBPGABJEBY?mOo?GOg_G_#40!8?@???A#65_??O#3A!4@B@@@BF$#104!18?_#2!11?C?G?COCHCQ?HcGACGDOCGSkUkRnPe\`MdW??g?C?o??G_O_#4??A!9?@?C?G@??D?I?A?I@A@I@QDA@RCB?RCB?RCB?BCHADAHAC@GR?ADQ@CHA@AHA@AH?@?@?@?@?@?A?@?A?C@A#1!20?_?_?_?_?_?_?_?_?OcGO_S_CgOgO_O_O?_!15?O?_?O??_#4!10?C?AGSAcGQGeHSIVhUjSNuHvLqLjD]`M_N_M_Y@U_I@GCRD^B\VJTnsMjTiVLzDZVRZFJZB@FHBEBF??A#61O??OGG?CCAAB?@@#98__???G_gOOO?_A?GOAAWc?c_??A?@#114?_?___??_!6?_???G?_?S?C[s#112??O#101!10?AAA@@ABDIDABABHBD@FABB@BRB!6@BRLJFJEJvaUq?gS_GcgOW_WOc_aA?Oo?_oOoooOog_??_#41?C???@??C?c!5?O#80!12?G?O?OG?_#68!20?@??B?LBKACOCOOO_???g?W_W?OG?_O_?_#109A#43Ow?__?OO$#76!48?@!6?C!8?@?Ah?A@#11!5?@A?@?@B?B@B@RKBGRDQlOI_T?lOD_HS@cHAwEGbWFgBWeGAwEgQCpIOcPIsACJsG@kQ_DWd?TgDaSASASIcQCQCHcQHChQG_HATAAQ@ARAG@B?BA@A@A#124!129?_#22G!5?C#9_?O_#19?O#105O#33O#0G???@#75_?!5_???IKC?A#77__#117!8?G#87?@@@#42@#69!16?_#115o??O??__?_???_??_?g?GW!5?G??GO!6?_?_??__#107!16?g?_#72!7?C?C?GgCsOgSOW?k_WcgO??_???O??_!5?SSgoGo?O_O_#84!24?@A@@BHBIAE?CKWWOoo!4_#61!6?C@?@A?BTAFJENm^~~{S|c[_ygOWWgC_Oo!5?__$#5!323?G??CC?EOACPGG@?@?@#68_#78?_O!4?O#85?_?_O??@E?AFC!4?C!8?A?A#118!12?O#111??CCG?C#113C#118??_G!7?_w_#122!11?O#72?A!8?@!4?A?@#108!7?A#115C#93!20?@#95??@!9?A???A?@#77?_#93!8?C?A?@A@IBHDZd\fIxL}}|]s{koo__?_?_#45!34?@!5?@A?A!8?G#67O#115C#116C#37C!4?G#35G$#76!332?O#79???C#6A#55G#20C??@#59@#67?G?WWG?B#88_O???K!4?@??A??@!4?@???@@@#108!14?G?O#112CWO_O#121OOO#40C#69?w#100!20?A#77@??DAD???ECICGC??A???A!6?GACW?W?GO#93!22?A#95!15?@?A?@?@?EACA??S?a@??_G#60!55?CCC#75_#49A#63A#0@??A!6?C$#12!337?C#110C#7@#45O???CC?A@@#68!4?@#93OO?GCC?AF_???KCE??A@E?A??@#72!22?C??@#114!24?_???_#120!68?G#56!76?@#24@#64@#104?@#105@#20A#1@@??AA#41G#4A?A$#41!337?O#106?A#10A#71G#89???O!4?OK#101!4?_??_!7?___?__?O_W?wg{YyyIAMEIABEBBB@@???@?F@BBA@B@?@#9!176?A#88C#78??_?_#62G#10A$#47!340?C#92A#72!16?OO?O!9?O?_?O?O?C#34!213?C#96?C#50G$#77!370?_!6?G?O?_??Og?G!4?_!8?@?AC??A??@?@?@#104!181?C$#41!370?G-#0~B\jTJ\b^jVj^jVZ?Yd@IRDT`T`DZrBvTTlZ|{]}~~~{{~~}nco}gOk_SoS_S_O_#76@??A?C?`???@GC???DGQ?@Q_@AGSc?CO?O?O?O?OCg?g?O?O_?_?_?_?_??_??_?O?_?_??_?_?_?_?O_O?O_O?O_??_??_?_Gc?Gc?g?GC?SGAGaGAGaG`AcH_EP?@C`GCBS?T@cAT@cA`IC?_QC@C@?aH?i?@G?Ha?SA`GA?Dg@Q@Q?T?CO`?SGA?I`GAH?_C?O_?_#4!6?@??A??C@?I@??C@?DG?C?I?C?G?SaC@CAH?DAD?DACHCOG?A@i_???G??BA@#133_O#95O!6?OO!5?G!4?G?O?CW#107?_???_??_O#115?_?_#114?O??G!4?KC??AA?@??@@@!4?C?@!9?A???C??C#81!5?O#128??_??O_#127O#114??A@?A@??_???cGSHC?_XK?KO?Kb??_??_W?_O???_?O#98??_?_?A#100?@??@??@?AG!5?A#98?@???@?BCGE_B_eXESs@g`a?OC_???a?O#85!4?AC@C@OA?W_OOO_O#75!4?@@BEFDMMNMN[y{wsoagooo_OO__O_?AQ??gCCAaG_GkC$#104?{ASISA[?SgS_SgCZcYSTgY_]_]ocGsG_GO_#1?@!5?@!5?JC@UaRMhJ`]`YdI{~\tlyTItyiqPgiI{qsgOcGSgS_GOgO_?_?_?_?_O!47?O_?O?O?O?O?O?O?O_O_O_OcOS_SoCoCwAsIoiSyo]ti{i|isY|i{Yt[ti|Zkzsz{v\q~?~QtmsXuhsYcxuwQ{_[_Y_Y_IShAs?s?S?S_CGO_#10!29?@???@?@?@#1!14?O?_???_!7?GG???@#87_???O?O!5?E!7?B#101_C??@!5?G?A?DCAQ@?@B?DD@B??@!9?_#111_!4?_#107_!5?O??C!5?C@@??AA?@#112!14?_?O?O#107!5?OG???@?@!5?A!4?_#72?@?B?@?@@A`@a@a?T?c@??@?AHC@??QU@DG?LISJ[`SgQsG#93???HAKQCXiDITh\pHvJ~V~^lwww}cs__O__#78!10?@?A@!4?B?A?GCSB??BQ`ATGaCg__PAObX?CAA@?IC$#137??_!5?_#82!7?C@?I?C_I?I?I?CG?IaACAA@@???AB??@OOJ?@C?O#3!13?@G?A@CGAPCPBGBDnYdJUhVbJViN~N~N}N~NjV~U~n|n]~Z}\~]~Z}|^}~\}n~]~\}~^}\~]~\~m^n~n\n}nN^}L~m^n^fZnvJ~F^fZnJfXfHVhFXFYDXATHCjCJ?AP?@A?I@??A@GA?PAC@?I?AG?C?T?kAPACHAHCRCHADALaLdIdZdIUhB|JtIvhUzVj]n^}\~~}~k~y|}|u{z{ytylux}tyukqmOmq[a[a[a[qkq|yTy|iszCZKRmTITOHq?OTEC@A@#75G?S?O!8?@@@#98O!4?GCBBCKE?IBHF@?@O?O!5?A#125_!5?_!4?CEEACAAAG#127G???C?Q#103?OGGK!8?AAA??@!9?@???@?A?@?`!5@?ADA?OGOKP@Ki??U@KCOWg??gOO??O!10?O_?_?_???_??___#48?@!4?A#95!11?G?DG??CAICGC?G?_O#88@EB?JG[CMKG_O_ooC??_#65???G?@?@??D?FAJHSEMGKIkGQCWQWGaxDW_wWoSoQoo$#106!4?_?_!8?_???_#109!18?_#2!14?H?@ACI@IDITA?aGQ?aOGC?Cc?P_#11!14?@!5?@!6?@??A?@?C@A?@?C@A?@?A@??@?A@??@A?@?A?@!4?A?@???@A?@!101?@??@A??@?R?CA@?HB?AD?CQHA?I?@RGPdPGbSbG@XaHPCA?g?AOH?A?Ac@GC?COGKF#57A@#44_??GCCAA#68GCC?@A?@#94G#139_#72_?_??_!5?BA@@@!4?@?G!7?@AAA#52?_#81?O#49_#135_o__???_??o#130O?O?G???C??_#102?A!9?@@@!17?@!9?@!4?@?@???@LNHK??K??W???_?O!15?_??_#115??_#53???A#99!6?@@LGVXexaHqDQ?Oa`IO_?O?_?_#80???A!5?A#84B?@A?BCJCJReM[wW!6o_#68?@?@???H@C@C@?CHA?CDG?A??C@CHA?@A$#96!5?_!10?_???_#29!50?C??P??A?C#5!232?_!5?O!4?o#0?_#2O???A?@#84_??GO?GGK?CG#99O???OO?C?GO??G??G#112?_#118_O???_??_O!5?G?GCC!4?G?G??H??C?D?@@@!5?@??BFJHKG!7?@?A??AB??D!5C_A?OkWs__ogWc_c?_c_?O?O?_#101A?B?F?BCJCidIEXE\lI}J]iNIU\CRM^TCHSIUHQsIs_Y_O#41!11?C!4?A?C#87!13?@@?@ADNKJCJokWO_?_#61!20?A@?@D@?CC??A@?@!4?@$#76!313?_??O_??G??@#12?G#40_???C?A#34@#78o_??E!4?A#131??OG#77_#103_?_??_!5?ooOOGKC?JKHMNEK???CCABA#107A#102@@#40@#112OOG??G!4?_??a??OG!9?A!8?GC#77!38?A@B?E?CKQCICGCWCW?O_?O_S_Sg?O?O?IH?GO?S_?_#123!19?O#84!71?C??G$#10!314?@!9?_#55??O#60O!7?@A#41?__?A@!4?AEB#134O#100oG??__?O#119!4?O!6?_?_???GG?OO??W?YG?OOICSD?@BA!4?@???A??CC!8?CCE???@AA??EC!5?_!4C#108!27?O#114!22?_?_??_#43!98?@$#124!320?BEDA#42!4?_?O#70A#47GGCC??_A@A???AA@#122!7?_#126???_#77!4?C?IAO@CO???C!4?@??@#141!4?___!4?_#136O#116?WOGCGae???O#125_G???_O!6?__oOOo_O$#138!321?_#58!6?G#80_!4?G?__???_!9?C!7?E?CE#120?A#108?__#102!5?G#121O?W!5?GGCK?A@!5?GDA??A!4?!4@G??Og?O??WWOWGGEAMCCKCKGGGwgwWWGWGG$#105!328?C#46O!6?A#85GGCC?K??G???G#132!24?_??O#126!13?OO???_G??OQ?G?CQ??G__O??_!5?O!4?G??G??_O?O$#24!329?C#123?_#49??@#43B?@@??@#88OO?C!7?@#73!21?O??OO???O??C??@C!4?A???C#132?_!8?OG?_??O!5_?O??_G???O?_$#65!329?G#93!11?O??O?CC[?G??AOG?OOGC#140!14?_??__?_#129!19?GC??_?_#73!5?O??_??G!4?G!5?__O$#48!342?_#120_#53??_#42A@@CB#128!25?_!24?_??A?O_O$#115!406?C??DB!4?A?DCC?A?@?@?@@@??B?AA@?AA@AaQAAIE?QDAAQaAIQOCo?_OO?_??__-#0T?@AP@?E@AOHACO@??@DI@IoC@?@A@QDA@?cJASJSIuHvLrfGBELf^unVmU~ny^}_?c?G?OG?O?_!5?AS_Sg?g!8?_?_?_?_O?_!22?_!47?O?O?O?O?S?S_SgOGqGQgQGqCXaKAgAKA_!4?O?O!8?GOiOIoIS_O?Sg@AC#3?@C?A@A?D?@CPCbCOAHC@a\ADQM`NtJtNtJtNtJvl^l~l^l^~~n^~n^~nnN~n^~~E^jTmVjvoI?IO?A?@#40O?OG?kcooo_?O??OOO#154?O!5?O#151G???G#51o?OOO?_!5?_!7?O?G!5?K?G??C?C#36_#57!4_#21OO_OooO#121@@??A#116@?AUYKKIKKKA?Q??oOgGOOOGW#126@?AC@?C?CA?K?G?GC??O?oOG???O?C?C?GC#103?`??A@??_A!4?`A?A?AERAD?ICSGbOkIHk?WCI??G_#98???@?@A?@RCTAAWpMgVC_G?s_WWGCO???c_#85???@A@ACB?KOgOg?O#75!8?@@@H\{l|Z~n~m[mk}]|{ygcP??@ADADD$#104A@A!6?@??O???RHKIdetBBAfAH]DA|MlIc\ISJsHsGoGOcgO_#1??@??@???D?@NBHFRNfRnLZNv\zu~wgJHAuRF}VunRxT]^]^]^]NbXL}|y]\\]}\^x[]~oz{ncjwNKzWlaTwz\SuxzT[vtwNduxzw|}mdvx{~|{mf|ryUmvUnuVmbmJvJjfj@lbHI@ErKAcAKaCWaCPhDdPH\^n~NfnF~n^n|~}~VaCL_EP_JF{aA[gpz}z}tmwvW~szkrKyJlcry\Alyk`]oAsIoIsIoIsGQ_Q?Q_Q_!8?O?O#11!5?@?CA@!4?O#12_#1?C??@C?@@#41A@!4?C??GGG@@???@@#48@@?G#108A#103A#111CCC#59AA?AAEKC#49O!4?G!9?A!8?C#126@??@@#58C???C?CC!5?G#145o??_#136?_!5?_#52G??O???O#73?AB?@?A#127??W?O!6?_!4?_#112??C???_!4?OG?_!4?G#101!4?B?@?@?@??@??@!7?A??A??A?ACa_F_DITkRc^[?_[cO?s?_?o?_??_#95DA?A??O!4?Y?COcW_O_?O_#87?@@?AAKNCY}WScW#78!12?@@@B??A@CRGepwwTw[WW$#137_AGPa??@EOHOGO`qC??O?G?C?CG_???O#150?_#82A@??@??@!5?G?O_O!6?@!6?KQGcOGCOAcO?_#76?@?DBSaTHCw@gHOkCi@_@_@_@_[Cq???`_a_@__Ca`?GC?OOOCOo?cOOg?C?aH?C?a?GA_OG?CCA?POGCA??APO?GChPGhOHgPKPcGcSGSiQGU`UHC@THT@THBCHACQGAcA!11?A?@??LPATHCJSgBHTaTIC??@GODGa?I?AGO@cOQGC?_O?@O??G!20?O_?O_??O_?O_??w_OgOgSGJ_XPaIH?A#48C???C??MEAOO#87A#50_#155?_??__?oOOo??O?OO?O#21__#81C??!4G#128O!4?C!6?@A?@!7?A!5?AA???A?A!6?@GHCAACAA@?ACCHI?@?!5_WO#118!6?@@@!5?B!6@!4B@@?@@@_aQOUoO!4SWO[SGMCC?A#107_#59_C???O?GO?_?C#72!7?A?@?BKW?aX?aGa??S???O?O??g#88!19?@?BBEEMD{_ow_??_#65!15?A??@@?A@CRGIDA??@?A$#105G!8?C!10?O??GwO??_?G#109!12?A?AC?RCHAW_GOgOg?O?_?O??O?_?_?_#2??GACG#3!14?A!10?A?@AD?A?@?A?A@??F?B?JCB?BCBALAF?aH?E?i@GADOI@E?B?@?I?A@?A@?GAC@#138!22?_??_??_??_?O_!6?_O?oGOg?O_O!7?_??_#4!81?C@ECGC?A#46O?C!7?G?GCCC#147G!4?G???!4C#73GG#163_#40?GKC#20__#102A#107@?@@#91_???O#38GCG?C@???C?AAJA!5?CC!8?C???CC?GO!6?O??o!4_#132??AA@?@A???c_K?WKWsAOOAS?W?__!5?G!4?A#114??@?`??A`?a!5?G??Wqo[K?_O?C_g_?G?@??@G?O#108??O#53!5?A#100??c]??GgG_!5?_#41??A!9?G#84!15?@?@B?BD@fJZf}}}uaBQAc?O?O_OO?_#46!6?CACGA?A$#96?gSgCItGOgCaC`ICgcQ_?O???gOGS_?g??O?O?_?_#138!24?o?_#109!135?O?O_O!16?_#138!88?C?_#5@@!4?A#10A#0@#54G?O!4?_?OO???O!4?G???G???K??GG!6?G#119G#121C?@#37O!4?O???gO???_!8?CC!8?OO_#129?C?C???OO!4?W#121!9?A?B?B@BAFBBA?K?MSIU?[[KwKksWoOK}ici[SGKK?KK!4G!4_#107!17?@???O#99!15?@??@A@HFE@FGI[SOG[cccacas_?Og#68!51?_??__$#106?S_CGcIOg?aC`ACG?Q_!8?S??_??O?O?_?_#51!277?_#66_og_OK???G?G?G#84@@?B?A#93AAA#159_??_#101A!5?A@??@#99@#50OOo_#55OO?OOG!4?G??A?CA?@?C@A#23!4G!4?G?GW!4G#86O#125AA?@?A???@?@?@A@@@BEDFCD!5CccW?og_o_Go_???__#114A#107!8?_!7?@#102!7?_A!9?_OWGKYZDP@fSKOPS?P`HOW?O#48!16?G#93???@BB?@B@BRHJ\JV@NRnZe\m\yk[ogO_O#61!39?_$#150!5?O?_!5?G#153!303?O#9OG?@#92__OoO!6?_?_??_??O!5?O#134?A@#23??_#62???G#133?A#118E??ABA@#142C!4?@#20_?O?O???OO!4?OGG???G#140A#73A!6?@@?A#140KO!8?CCGGO?g?oGGGO??G#119!9?!5@??!5A?CCCA?@OOAA#77!9?@?@?@??@?@@?@?@???A!4?A??ACA?D_LaSiO_?_$#6!318?C#105C?A#43G?C?B#47@???DE?A#67?C#99!4GAAAE#120@#115A!7?@???@?@E?C#103?@#63_!9?G??_O??_!9?C!6?Gg_O#142?O??_?O?__OO#73!25?A#128?__#73!11?G#115_!6?O?A`@?a@???I??c?_G!5?___!7?__?_$#44!321?G???A#42?A@?@#85A??@!5?C#77?GG?G?@!5?DA#122??@#56???_???_OGAI#52OP!6?A?@#19_?O!6?G#103@!5?@#49A?A#149C#152G?G?_#127@?@???@#119!60?CCAAQO??K$#155!324?_#80!4?@!9?@@#146??C#72??@?@@?@#58!10?_!4?__O__???G??k[#13_#91??G#25ooo?O??OO?_?_#55??CC???C#165!5?__??_$#68!336?A#117CCC?CC#160_#161??___#162__#69!11?C?C#73?A#116A@?@#145?A#50G?C!6?C#148C#121A???A#118A?A#100@#107@??@?@#51_#91_#132??A#141!7?@$#158!337?_#139@#156!10?O#100A#112!11?A@#125??C#140??@??GCD?@!6?@#141@A#56C!8?C!9?_$#74!369?_CA_#70?o#24_#35O#125@#143!8?@#164_!5?_#81??A$#144!370?AC?A#86??_#132!10?A#157?OO#34G$#135!387?@#112??@???@@???@$#69!390?A-#96A?A?@A?@?C???A?GACG?ACI?A?C?AG@C@A@GFgDOEO?O???gS_W_G_?O#109???A?CA?A?`a?IC?Y?W?Oc?OiOgS?Og?_?_???_O_#2!22?A??C??C#76!35?G!4?A?HC?A@A??@C!7?A???A!5?A?C?G!12?A!5?A#2!5?A?A?BB@B_?_??G??POPOOO?OoOoWwwWwGCKK?C?B?AAAa#29A??A@@?BB@@#2A@H#106O?OOO!8?C#171CCC#82A#14@#28C#83@#16@?@@?@#3@#5A#26A#171@#154A!6?!4@!9?@#161??__!8?AG?OA?E@A@???_#164@@?A??C??CCCBB_K?C??A?H`?I??_???AA??S_G#92CC??G#20@!6?O#116A!5?@A??@??oR_OOYOYHCKCCGDWKcs?O?GG#112??O!4?A!6?C#132?@#107!6?G!7?A?@?@#101!7?C??C?A?@???@?@???@?AL@J?BYsLQlOlQKxCgcG_CgGO?_?O#41@??@?A@C?ACQ?gA_C#88@???IH]k???G#75?@?B?@!4E??abFN^^}}x}{w{{w{xk$#137|w{{}!4{yqZ}|poSWoxoopWpYwwOosyccA??QG_gc?_OGg#150!5?_#82!10?OgUGSgOhO`O_Gg?@#76!13?A???CA?A?HC?BGQ@QCOK?cOK?c?_I_W?G_W?O???O???O???O#2!25?@#138!9?_OGCOAG??_OC?OGDA?_@???A?C???OGAcB?C?OGE?GG?_OG?C?CGC?KGG!4?ADBG?I??G?E?E?A?@?@`_!6?G!5?CC?A!5?O!8?A#158!5_o???_oo!5O??W?wOWWWKFEFBCEAA???@!7?@??GG#92OG?G?G?G?O?G!6?G#21?B?CC@CSGWG???CG#178@_wo}LDQ?C???CP?G!7?_#179o_#91GS?S??G#145@???GoCKWwwwWO#52?@???A_!4?OG?G??G#125?@??@d?CCGC#118?oo@WWXlLKKCOo]UEz|\rQpzgyTkmSCgW[GGECA#77???C??C?EA@@@?@?@?@??@AESIScIOgO_?_O#48?@??A?@?@???C_?C?GO?_??_#95I?P#123?O#80?@Ao@!7?O#78!19?@?A?!4ABAAB$#106?A?@??@???C???A?HACAHACAC@AC@AG@A@?DGD_EOAO!4?S_W_GO?O#138!20?A!6?A?_A???O?OO!5?_?_#109!77?_?g?s_]?iOjkQogTYSkr[pkPyTidOtGWsjOjTohV_VGN`U???SO[OC!9?A??G#167?_#170!13?O???O!4?O??OW?W?WG?KG???CC#154_#160_!8?_!6?_?Oo?o?!4_owww{wwksMZrizryzzq]}~NSvnUZvUc[cOaG_?O?kocCwGo#157A???@@CC?@#57A#163??GOEJ?A#195_!6?_#157?O??GG#177??A#162???G#23?@??G@??__#136ACKG!4?C?GO#128!5?@?@ACAB@@BBAB?GI}?C#121A_qojLJMfdeAAARPBB#103!9?CA@A?@??OA_Cq@wDeOAoaHYCgOiGeYSAABASX??g_SG??_#99!9?A?@???ACA??Q?sACh?IP?_#87!7?@?@??@BNZev^}}[s{o_???O#65!7?@C@@D@@C@CO$#150?D@A?@AA@@HC@?KA?@ACCH?CGC@ACD!4?O#1!41?CA?C?C@IDHUbMbM@CHUJ?@SHE?rK_D?K_JAbQJAbQJYLPFbfvBFfnn^nnn^nnn^nnn^n~n^n~n^n~n^n~n^~Vf^n~NWeQqLOkSl]IaRiDsB]?L?hC@?GDA?G@?@?BG@iDA@GAcI?_?aGU_SGE_UG_!7?ULLF@@AC?@??BBJ@BHJ@DAC?EIQqkZ~{C!4?c!5?A_?O??CSC???I??A??@@???AA!8?A#109A?@#76@#177A#172@#173@#40!4?@#185?OG?CKCCC#174@??@#155???O!4?_???_#175???@#163?@#176!5?@??A??C!9?CAA!5?@#186C#179A?@?GG#79_#28__#15_?_#37!8?A?!4AMG_o?___#73A#140?@!4?@@_P?JCL@C?AA?C?CQQ??GW#73`#126@???AC!8?A#115_???g??A??I??C?AO?i?CA@C?Ao@`P@P__??_O?GC#107?O?O?_?_#72???@?@?ADANQLaEwEWdYgSakYSg?Go?_#85!15?Q?PA?O?cG?_$#0!8?A!6?@??@!8?@??A!9?@?ADI@A?@AC@ATaCjDjTNRlE@@A@FDANCNFTBX}jTjS`Yc@[PKPmHuHcZ{JsXuGr[qlqLolOlOlOlOdOcW?W?W_W?O_O?O_O?O_O?O_O?O_O?O_O?O_O?O_?gO_O?ocXcHqlQhQ`SHCPAH?@`ODAO?dAOgD_QGaCOaC?OGe?P?@OHC?@??@_P??`?c_a___o@A??C!6?@!4?G!7?O#3???A???B#17___!4?__#181A#3cC???OA?GB?GC???AA?C@AA#154G#124?C#79C#166A#157C#51C#170@??@#175!15?o!4?G#162!11?_??gO?O_G_???_@KB_FOCwW?w_O_Oo?wooS@@?@??_o?G?A?AA#57?G??G??O???_#86???@?C?OO#144@??O!5?_#149!7?A#130!5?_#132!7?@@?AB?Q@JC#119??_???Oop__GK?@@!4?`??C#102!5?@!8?GKGGKA?HPGCeO?gg{k{GeKoO?__#98?@!6?@?AP@O?QBS@`HRNcIJSiS[ogPOg_D?G#84!11?@???@_JAHXxx~n\[wo__$#193!11?_!4?_#104!17?C???A@?@@?@eTBIDBUDILjSySgogOhSgSGO_O_?_?_#168!16?_!119?C!11?GGO?G#76!5?A?IC!5?G???G???C?C@C?O@@@!4?!4C#64?_#12O??_!9?G#156_#155_!6?O#66?!4OGGggg!4G?KCKCCCA?@??A#159!4?_!4?CCCK_???B??@C?@BB@FDET}h]OAWO!4?_#124?@???AAA#169!8?_OC??b?hO?KCCC?CKG?O#63!7?CP??C#132??A?AA#129???A!4?AGGGC?___?OogoO_#127!5?_O?C#107!4?O#114!7?G??_gOCA_KCC?P?gP?hOE`?q@w@GOA_A?O@o???O??AC???A?O#100!19?C#93!9?@??@?A@EK@DMQlVy{Mk}cs_?o$#105!15?C?_!5?`?_??g???WWgqo?OG?GkIcO#166!178?@??@#29!7?O#166??O?!6_O_?_?_??_#109!9?_O??O#90??_??O#171??___?_#26_!7?O!5?G#21G#105!6?A#185__?_#190!18?O#155!30?A??G??_!4?_#7@#180!9?OGGA?O??@C!8?G#35!10?C#74@?G!4?C#38???@@??a?CCC__???O??O?_#108!59?C#59???_$#110!224?OO#171G#168!13?ECCACCC?C?C?A?AA?@_??_???GWGGGW?KCC?OC!7?BB@?A@@#167C!9?@A#92?CC#0A??A#156!49?C???O?G_???_?G!10?G#21C?C??@RBO_Qq_CDJPVitisw_w#142?AC@!5?C?Cem}[K!9?_!5?_$#82!225?A!4?A??oOgoogw#171?G?C#166!21?@#10@!4?A!6?AA@?A??G??!4C?C??@???@#183!4?A#184A#54C#40C#177!54?BG!5?GW!12?O#155?C#192O#51A!4?!5@BA?A#152!9?@!4?O?C$#167!225?@@#179!40?O???G??G?G#0?C#109C!4?S#181???O!5?G#174__#173!68?A?A#12A#36@#191!16?O#25!5?O?O#127!19?@#126B#125@@@A$#167!267?@@@B@#22@??@#16???G???A#28_#166???!4G#182GG!7?A#25!64?A!5?@#194!13?_#168!7?C$#194!280?_#76O?@!8?@#2AAA?@@@#79!68?@$#173!283?_#169!4?@@#189?O#15O#29??C$#188!289?O#187!5?G-#137~B}@~A|JtkRlYfYuHbI?`APCAOdADI@IdIRHjTKSoQqoSsSsAO?O??Oa???Q??O#109??@A??C!7?ATA\v}lytmTyTmp^qlQ{jSlQlOgoLsGuGS__O?o?gS_OgCo?gC_?gC_OcGC_OCgC??gCO_SGcOCGoG_GO?G_?CGqCHQcQ?qDgS_Rox{{~o{YuzTr~r~|~~|~~~}~|~~|~~}j\jvlzju\QiuH}IA?C?c???AA?@!7?G???G!4?C??G#26O???G!5?C!5?A#156?A!6?@#197_!8?_???oO?_C??CK?!5C?CID??A???A#163!11?OgwwoMoSafcxaKiUkWGg{w_O?{S{{G{wgo___?_O??_GA?_O#180E@??g?WF#36?C#203{Ku}{{wO#0O#25g!7?H_@??Ak#24@#116C?Qi_O{Wmal\MDB!7?_?OOGMA@#140@#132??@Q`???g?__G?O?G?_g#73!12?_#103G!9?@O?P_PG?e?bO_POO_FQ@EXSiC`AQgRCkW@KAGcO?GS_O_?_#99!7?@EGfSA`k?CcAH?O#80O!4?AC?W?Og!4?_#84??`B_bCrdUxJrZVm\kprpppooo$#193?{@}?|AsIPkQdWdGaWsLYCkY`LY_YoKs???c??_#96?A?@?@A@A@GBK`YC?gPC@QG_??_O?O#1!15?@??A!10?A??AG??Q?AGD_J?aHI`UGAHSaGOChAGVGBgRCJ?jOFgBGV_JOjCRcRCJtATaRAHcRCHQcGRCaHOEGB_@!7?G!30?A?C@A??Dc?_?A?QOOO?@@??@!7?@G?GH?CDD??@BA@@@B@#176C!5?A!6?@#174??!5_q__?Oww??_!5?A?OwGOW?g?_?@#175SGO?OCGKAmNmIeKSKCC?K??A#162@???@?@??@?A@?HgcA`?@_@CQIXEGY\MNFB!7?A@#169?@#124_#157W_#138G#3A#213oG!4?_#33G#21P!7?CA?B~[#86OA#145@@#136@?@#142?!4@???_owwkCANBJB#125_?_OGMGAp_gGGG??GG?OW?G!4?G??GG!8?__#126_#107??@??G@#102!7?@?CCEBA@B@?HKXEJDZY\lVKh?__oooWgwc?C#53???@#100!7?_#48!4?CO@gAO#41?C?cA?O#88A??IEEJ?OgZO???GG?GGgKO?C??_#65!7?C???C$#96!9?A#150!5?@#196SC?_?p??S_?K?D_?Gs?O?I?_#106???@?@A@?@GBGdG?PcH?H_?G_OGOG_#76!30?@#138??DA??@??A?SGC?C???C???C??OC??OC??_OC???Oc???C!5?_!5?G_CO?_!6?H???@?C?A?@?A@!4?C#104!27?_!6?G#171W?K???C???A!4?A#169C!6?C#205_#106OO!6?G???C!4?A!5?@@@#194@#188?@#173@#159!11?A#156_#206???_!7?C#159_??a?oO_QPO??aA?POPXPo@sWoGBABAB@@!8?@@ABC??CF@@A@?@?AD@A@OC?@#178_GCCtNNNw]lO???_@#173B#28@#5@#7@@#13@#20@AC#218_#164Eeuo???@?XG[#34?@#4@#58C#52O#128Sk??_?_OW???A#52?@#130C?iH_WCKA#126_?__OowKO??q`a?QOH!5?o?O#107!35?C???Ag?O!5?C_???O#77BCA@CDAC?@gPkOgSgS_S?_#93!11?A@?TGd~l||xo`@_DE??_#75!11?@!5?@ABMKMIMJJJ$#105!18?@QCGA`GA?P_?Q@Q@kAS_RJLlKMiGgG{es_Q?`???__#182!5?C#82?A?@AHQDIPID?P#76!44?A#168!51?GC?A??C?@??G??G#138!27?@???@_?o?GCO!7?@@!4?G!4?AE?AA?A?@?G!6?A#2@?!4@#210!24?OGOOGO#66?@#161G??G?K?SG?A!8?_!6?__!4?_A@??@??B??ACC??EQ?W?GAAUA??CCWE@A#164_OoWRG_O_?_OmB???]#215O#202?A#204??A#1A#177@A#57??O?AC???O??_#16??A#63_#55G#165A?@?@!11?O?C?C#127?_??O?O?CC?A!4?G#73?_??_??O#59!45?C!10?_?O#72!6?A@AA?@AAA?@AhA]hUHeWbgA#95!7?@G#85???AC@W_Sg?T_?gO?C?G#78!19?CC$#104!52?C?ASCI?CCULaVIcdfQ\ulytitg?g_#110!144?G???GG?K??GA???G#2??@??O#172_!4?O!9?CC???A#171?A!6?@#199!20?O_kC__g!5?AA??ICGU#211GWG#212!18?_O?G???O_?__#160@A@??A!6?@#155!4?@#21_!5?_#176?O#195??@???S#191k#153A#217??_#193!6?C#23@F!8?A!4?_#91?W#125_#126_#129?C[CAA!4?_OGCBBOoO_OOLND@@#121_???K@UDUTVDFCD_?_oK[?oSSC?gg_??Oo???O!4_!6?C#101!26?A?BCA@A@@EO@GALTGTi\A{@S?_O#87!22?A@ACNVN~rUsVSR?IgAsKCgO_O$#0!55?@A?QG_@ATG?@G?G_!4?C?OiCAG@QCIPgDiPM_LQlBShQkOfQL_Js@qHSJDqDY@b\aBXFhRQLr?rKBGrON?jORkR?ZcJ?rGJgRCA\aLcTQJgRChQdGhSCiPa[?IC@A?HAc@CaG?C?A??A???@?A??A??@SaSGQCSH?lOGs@sOBBAB@b@`@@O!5?@@@?@H@GP?@?HG??AAA#66O?O!4?G!4?C#211!28?_#200GOO!9?CG??CCCIEAC!8?O?C?OKGKWQE[oCGO?OO#192!33?O#194@#214!10?G#163??@#157GGo?@A?Cq#144!5?A#130G#140?O?G?C?CQA@#149!13?A#128?C?A@A!9?O!9?G#98!63?A!4?A???@?AGO@?GPKQVxH{qiA??A$#150!55?G#168!170?O?G??C?AGAGA?C?AA?IEA???E?CA?A?@#82C#182C#185__?!4_OoOo?WwGWGoSsgSOSS[]C?A?EFDENKAAA!5?B@?B?@@?_??_@``?@!7?A#201!54?A#207C#178!13?G#36@#179@?A#192Go#76_#180?C#38!9?AA!5?_OGCA??@#112!15?C!9?@_!6?_?O!8?O$#64!226?@!9?OO#170G#182!5?_#82O#209_!9?G#155O???G!5?C#29??A#190O_?o_oGgGSGKGG??G!8?ACG!5?B?A@#173!93?CG#124o?C#118!50?AAECEAA?BABbaABQZvDBFEBB@BMUStoOck?_I?Eu?PG?G?GK$#179!227?O?C???KCCCKEGAKCEC?CAC#76@???@!6?@??A#205C#10??@#212!32?O#156??A#191!98?@?UG#114!53?A??@@!4?@??@??AC?H?GA?@GGGDgO?h?OG@?OaO@OG__KO!5?O!9?W?G$#82!228?_?_#208G#166!4_??_?Oo_oO#198_#29?O#3?G#216_#162_#174_#160_??!4_??_?OOO_?gGg???CCC???!5A??FLD@?AH??@@!7?o?_@!4?_`@???___???O@@@B?@?@#169!67?A@#138_#119!54?@?C?ACC???sCCCGwgG?SCCSO?!4A?AC?Cc??G$#106!228?O#97!6?O_?OO#180!9?_#194?O#181?O#158__??O?O?OOGG?GG?C?CCC?!5A?!6@O!7?@??!4@#168!100?G#116!55?G!7?G$#83!237?_?__?O#124!11?O#104G#10C#17C#198??C!7?A#171!134?C#115!56?@@???@???@O!8?OGG??@??CI@QI@AoG@G?g?cE?O?_a___?_$#156!256?O#177???G#3AA$#154!262?GG!4?CC!4?AA!5?@!6?GOWG!8?AA-#193Ono^onO~_^o^onoN~p}P~P|rkR|r{zcy_spSOg___WS__?Q_A?G#96???A??A@A@I?E@A?@?T_A???_G_#109??IELIcJDJBLbNBMBlFNLFLYfYLJELyDzCytwsyTyulyt]tI|U{ytwpubRr^NFNJN^DACJCIP}_oIC@AKAFMKMNFNnNnM[mikUBHJFLHFBJFCLJBLDnNN^NNNnn!7N?B@JAHBABAH!4A?C???A#160_OGG?GGGC??CC!5?A??@@@#210!4_?_?_?Oo?O?G!5?C??_!4?G!4?CC!6?O?!4O???GG#206?O_!6?O?_#174?A?@#156!10?O??O?__#212???@??GI@AB@LG#162?@AA?G??BA#180_??GCS#36???_#180!8?_??@??G#21?o!9?OgOO!7?on`B#55o#125B?_@?_#142!6?@@@???@#121?_?_?OG`?_GO?aCaIaBAPAEH@OEDABbJbAAE?FjAFvJ\N\GPROP_o__oOo?_oooO!7?OOo_O_!5?OO#102??ABA?CEDE|@Eb]k??o#72???C`?g@NHcUXaWc?_#41?@_C@aG#88!7?B@?@!5?GENFYEyB?NE|?W?e?C??ooo$#137nON_NOn?^_N_NONo#196?M?m?mAKAkAKBCIDPI?I`QSIOA_QHS_GS??G?_#106!4?A@A_I@A?@C`GQ@?C_G_O#168!36?A#138@!9?_#168??@??A???C#1??O??O??I@?CA@G?DGCBC?BK#90OOO?O??O#179???_???_OooOOO#182?_???_#82???O#179?___??O?O#191O#1_#168?O#2_#166_?OO?OOO#1_#22_#23_#155_#40_#158_???o!4_oO???G!4?CC???!4A?@@#211?__!5?O?O???G#222?O?G???G??CCOO!5?C???A#212???_#229_#228_#230_#224__#223_!6?O#229_#212???_??_#163?_???O_??_OgQHUZUEFBB@@?P??CPB@P?@??AFF]TGT@?@!5?@?@#191!16?@G!4?O#57_#192_#105???_!7?C#57_?_c#36??G#91oL#38_#116EEWG\}M^iMSkw{YM^C?A#135_?_!5?_?O#132??Gd@OTCK@aWG`a?KK_O@O?DGC?O?___?_#119AGKCE??O!4?O?G???oxhhIH!6?_gOOO#107!4?DC@?@HAH?C_O_O#101GALqDdYQu@}OcQg_#48C?@?O#93??@qOTAtnV~n^nwkvepqOqooo_!4?_g_#84@A?AC@K`IjBMB$#105!18?@!5?P!7?C@I?IC@CHCHC?AHA_iDoAZDhIhKGK@S_gsoW]_Go?W?O#1!43?@!7?_#110???C??G#170!4?G?C#64??oO#138!7?A???G#2O#64O#214_?_#97O?OO#110!10?C?GACGS?GA?CGAG?OO?O?_O???O???O#104mGM?C???C??G!4@#2AA?A@@???@#166@?@#221A#26A#189A???@@#156@@#219!10?_?_?__?___oo?_??ggGGCKKKCCC?C??@#227!10?__???O#224!6?__#162!19?Go__SG_a#223??A#195?C??Sg_?_#164???sIsXm_?DA`__?_inUPfVBJ^XU?RsG??@o#168C!8?O!5?G??@#86C??OQC#152A#149S#130G!8?@A?AA@@?A@#119!4?__OwWO#127!4?O??K?_??O!4?O??OG!4?O?O#143!9?@#115??G?@?A?CAHC?HC@A?Q@U@?@?CA?R_@aAD?i?_SH_OO??OG#77??@AL?LaY`CGS?_O#99@?E@AW_HA_?H#95C?tIOg?O_O!6?_#94!20?O#75??@$#137!30?P?I?C`C@IPE`AHUhCTHTqF|CwUtSosOS?GS?I!5?G#82??@?A?@!6?O!5?O!5?_?O!4?_#104!26?G#166!12?_#82!13?_#166?_#168@!8?@??@?C!9?@#208!10?O!4?O??OO#214_!6?O#226O#106???OG???@#105C#82@@??@@#182@!4?@?@?@#154A!4?@#199!16?OGGCCK?ME?CAA?A??OO??A??__?o!8?OO!6?_??GO#155!19?_#176KKKA@ELD#161!14?@#21??a??@!6?@!5?g?O#76!7?_#203O???BMX^^~}PN#4@#164FJJC???oO@#63???G#225?G#140oO!4?@?@?_O??_O#126?__OW[]LDMFCElf[zC?C??A?G?Ad??D_???cC??_?@?GS?O?P???_#114??@I?D?ICA?F?AC??C??GDIA@G@C??@KAgC_O?cO??_??O#59!4?_#100!6?@#53A#98??AG@?WdA^E|]U?iG#85!8?CQGOIGDGHAH?G_G?KC?G?G?GO_O$#104!60?_?@??HCa?ADCebZEVLnmtxqdYsgO{_[okO{Oo_Oo_???_Oo#170!58?G!4?_!5?_#97!4?_??O?_O??O#196!6?_#193!11?_??_???O!6?G#184G#208G#192C?C#138AA#190_?oOoo_g_!4w!5{}}]]]^^]^N^M]NGEED?A??@!7?_?__?Gg!5G!10?CC#160A!6?@@?!5@?B?@@#178!12?A!4?IyK{qc}gS]oOw_g?_ACOCKALMEJIED?@!4?C?EhNkJu??EN#25G#177O_!8?O#51_#28_#157G!5?AB#127!5?@?AC#125!13?OO?CB@AA??B@AG@?@?W_gGPOCC?WOGOOCC?_`w?OGG!4?_?___#103!5?A?C??CA?C??C??C??G?GA?A!4?@?B@???A??gOAi@K@AtOA?W??G#123!15?G#80!14?GC?G!4?Oo?o???O_?O?O$#150!62?_#0O!7?GP?C???OO???O@?Ac?Q???`?AGOAGAdWdQCHqDyCzDIDIDiDGQDI`ITAHADI@EHSgK__oo_o_?Kzoxse@YDpwyt_@G@A`__!4?@A@DA@GAC??A_GCOWAos_a!9?_?__???@??C@eKLGLEDCCCE?@A#15G#156?G#185_Oo?_??WOW??CC!4?A!4?@??@???@@?F@@AB@BB?!4@!7?__?O?OO??KCCCEBCBFABDEEE?A@A??!4A?@#21!16?O?SG?_#157!19?WoWo???_???GCW?G?__#106!5?E#202_!7?_#23???_#13C#178?C#176C#124_!5?O#129!7?G!6?C?@AC?C???A@#112!4?O#128!9?O!4?__!4?G!5?GG#116G#112A!6?A?A?G???@!4?_#107??G!13?CC#112_#59!14?A#87!49?DADED???D@DOR?O?fdbGRIdSK?K$#104!166?_?oOO?OOOG???__?O!9?O???_#82!12?C??G#66!7?___?!4O#209?C#194CC??A#220AA#150?@#206?A#174A#29@#224!26?OOo!5OG#174!4@??@!6?@ABBA@#231!4?_#200G!6?GW??OGWGw__?_oSe?kO?C#177!6?G#164A?OO?_#169!21?OO??G#194!15?G#124@#204_??C#213@E???@M#18?G#79???O#192_?C#3A#25@?K?C#128!4?@crA@o_OoG!4?__#127GKKB#73!21?_A??_!4?O@O#118???c_!5?ECCAIWF]CLGJp@?@GaxI?U?o_ea?@GT[?NmK_gSOWGgOG_$#214!184?_#166_#198!24?_!6?OO#188?O#173O#177O!5?G#155?G#181A#172AA#212C#10@#159C#209???@#212!28?_!5?_#211?__?O?GG!4?CCC?OO?O!5?G???GG??O?O#161G???S?O?GOG!4?_?_hHO#57!33?O?OOO?i??s_???O#208???O#171C#169O#215?A#96G#36!8?A#173???B#138C@#137G#5C#7G#12G#126!98?O$#83!210?O#218_#196!9?G#191G!4?C#201!4?C#195C#162?C#197!34?K??AA?@@!4?@???AA?AbA@??@??B??@#222OO???WW_!4?_#207!70?A#217??@#162_#155!8?_#169!4?B#153_@#14G#20A$#12!226?G#228!45?_#206!4?A?!6A!4?@#221!12?!4_#171!97?O#106G#191O$#200!279?O!7?_#109!116?A#202A$#175!280?_??OO?_???OK?G?!4GKG???@@@E!4C?G!4?KGOGEIHV@EH#215!75?O$#156!283?@?@@@$#159!285?O?O!6?G??C!9?@@A?AFCCC?E?CEE?@!4?_??_-#193~}x~}~~}|~x^~m|!4~|~~}!4~\}z|~Sjx{B|gCTu[yhdu|?O!4?G?CgC#104!4?@!8?DBA@kyP@I_WMBBbZ]}\NzM]|V^x}T~i|~j]xukWgwWGwgW_WgwgOo?__!8?oO_O_Oo!9?_GG!8?O!6?C?GgOw#182A?A?AA?A!8?A??A#54G??_??_#160?GG??!5C?O?GAK?C?@?A??@#224!7?__o_o?O!4?WO?S?G???CE?CAA?A!4?@@H@??CCSOO#199_A??_?_!8?O?O!6?W?Gg_!4?GA#161AOP@@?P?A??B??@#51O!9?O#21_???`Cag_OO#57?_!5?_C?IA?C@CEEAECDNDIW@BI\oos@?W#192@@#195?K#162@#155@A#124G??G!9?C#20_?AA#39GE#116w??OopIOHAG@?@#132SaAGC#119?OghPAO#125!4?_?o?O_?@OG?cSa`bOIi_IO@_?AO??M_E`AfAM?G`po#119???A?@?OC__Dff|WGH!4?CDC?GEEC!5?GKC#103?_?@?C@iOCO?ScaH__gCG#108O#99!7?HCKE@A?Y@cieHqComGs?gO__O!7?O#80CCC@GRG#85O?AG?C$#137?@A?@??@A?A??@A#105!12?A#137!6?A???@i??@?AG@?hATiDQdrGBqPj`GI`??O???_?O???C???I_?G#196?O#109?@??OCP??G?A!8?A?@ADFFvFVf^eUFVnE}^V^~n~V|mzMcZcIcGg?A?AGJFLLVbHHGGGPH?HH@F?C@@BFEEFC??C?GKGIAKC!5?@@?@#1@#31C!4?A#218@@#159GG#174_!4?O?W!5?CC??A#219!5_ooowOW?WG_gGgK?CES?AAIFJA?FBD@B@BAB??G!4?OO???O?O!4?!6O!5?GG!6?C!4?@A#159?G!5?AA!4@#92??O???O!5?C!4?_#164G?G??C_g_O?_???@@@??@@!4?@!5?@@!4?ECA?kAEGGOOC___?___?AO?GC#63?O?_#51O#92G?@#140@@!4?O!5?@#112!9?O#118_O#127!9?_O!4?G???A?A?OA#115?_!6?@#127?E?E??@???G#73C#112!4?@?CO@A?@!5?@!5?O!9?C#107!11?O?I?Dg?G#77@??XEoShOo?O#48!5?@?CG_#93@CGSHOLON@FHBDJFRNIVfJ~D~MzjZyuce_oooww{}$#196??C!7?C!8?A??@!4?_@CA?jSCB{AUPiHaDSQG?Ak?Cqc??O??_#96???C!4?H?AOAGC?A??i!6?G#82???A!4?A!4?i?CA?S??GOC#106??_#168!5?@!4?@#171!19?ICGCAC?A!8?MEECAC?A?A!8?C??C???C#154_!7?_g___??!5O??GGWWOCGCCCA?@??@@@#175!11?A!4?@???@@#197_?__OoOO??O?_GoGWg#206GO!4?C#231?GGG!5?C???A?GG?CC?C???A???A?AA@#212C?__A?@@?!5_#176_??_C??A?@#160_A??_GOGO??_#163?@#178@?BC?W?O@@B@?A#35_!4?__#86@???___?_!8?_#177?@!5?A??CA?@!6?_#179??@#91OgSA#125OE?DEDACaCSPSS]I?@BB#107!5?_#132!10?A??I@D?@???@??O??S@GG!4?@@!4?@E?AGHOg#143??_#118?_gw[[qOW??ECJ@DfBQrjaxXXhXXHxvQZMMe[Ig#102???JiFJQ[UU??G#98@??A??A?e?R?PiTNcwP?Oe?i?Oo?oO_OG__G?O?g!4?_#88C??ONNKFFBB@$#239!11?_?O#105!33?AS@iPGHQKbSHMS]voY~~nuu|Lg_pkP?K?sOE_og#179!58?C?CG!8?oo_o_#96_?_?O#214_?O_#64_#96!5?GG#237_#242_#106C?A!4?O!4?CC??AAA#104@#2@#220A#150@@#177?A#226@@#201@#185!4_!8?GG?CCAAB@#222!8?CCC?C?_cA???OO???GH???!4C???GOOSCO#185??A!4?A`?_@?@??__?_?_?O_O_O_?_#211??WgGOOO#174?CAK?I?GO??G#177!5?g!7?@A#176!7?BG#180AC?KM?S?KC#4_#1?O???G#157@?@??@!9?HG??@!6?_???_???_??G??b#38!4?_O#49_#121?G!7?___?_?SgOgtGVCI@lWiPICPEGFCNCCEABA@???@??p??QP@GGG@!8?C?ACJQlk^yNE@BA!4?aoooGWWGGGCC??AEEAEE#101!16?@??HEOAaCkHYchIO_?_??_#41??A#95A!4?@???AGACGC???O#123_#87!8?@?@??@$#106!64?C!4?H?AOCGA??aS@?@OC?C_??_??_??_#166!47?_!4?_#191!8?O#97???_?__O_?OOoOOG!5?O#191_?OC?A?A?@#48O#66O?O??GGG??C!5?A?A?A?!5@#211??_?o?GWGKG!4?CC??!5A?A???@!9?GG!9?_a___`@`_#221G?G??!4CAE?AB!9?!5@#200???CCC?___#155G?K!7?g???_COc?A?C?AEA??_#186???@AFB??A#36_!7?A#179A!4?OO!5?_#178?@A??HCOCGC?A?O#156?C#173G!9?A#69!6?C#55G#73?A!6?_!7?C#128!19?oO?_OW??SOKcCK???C??AACoG_GdO[Oh`O#114!13?G!6?CA??_??O??_?O__O??`?pPG_SQi?D_#72!8?@@?ABCdJStHUgQ_O?O#123???@#41!8?C!5?T_GC?Q?`?O#42???G$#0!75?O?@???D?@?S?C_@?_??`??_C@??P???`C@A`Q!8?@???G@?G_?O?gAPC@JCJTJFV!5POOoQ_CEEFFF??@?O??WIGIK_?`?@?GG!7?@@!6?@#198???A#233A#181?A#180!6?@#164@#156@#92@#197_??O??GG??K#212!16?GC_C!4?AA??@G#174??!4_O_?o#229@?@!4?G?G??CCCO?!4O!5?G?GG?!5C?C!4?AA#228?A@@#160?G???C??A#195!28?@??@A??A#173A?A?@#97_!4?O#90o?GOO?O_#180A!4?B?A?_?OS?KGG??G???S#25O!6?OC?@#148_#130??__#129_#126!8?_?_GOcOIf?ACKAfTmtZmHvGH?I@!9?@??AA?A#130_#112@#126!11?AC?AcDQO#115!8?G?AC?A?ca??_??P??_???_???_??PA`@CT_O?O_??_#120!16?G$#110!145?GA?C?G???Oo!5?OO#138ACA?@!9?C!5?C#153O#174_#158?!6_o?!5OwkGkccssOQ?AGJEAAG?FABAA??@#229!13?O?O?O???GGK?C#200!4?G!6?CC??CE???@#238???G?G?!7G#161@#224@!4?GG!4?C??C???@A???@#154?CAC!8?O#25!26?_!9?C!6?@#168AA?A??Kg?_#171!14?OO??W??A#204A#152!8?@#132??S#128AHAK`LQHEII?@@#116!21?__O_?g[?K_O??C@GGcC?sq?OWOWG__OO#69!18?@#126???O$#214!145?_?_#97_?_#106!11?G#82??GGC?C!9?A!4?@?@!6?AA???@??@#190!12?_?_?OOO!6?C?E!4FBBB!5@?@@@#199__?_!7?O!8?sC#210A??O#190A?A???@`@?@??_#234?C!4?AE!4A?AAA#227C#190OO???O#158!5?G?A#163O@!6?@@?@#124!24?O!4?GC?C???A#170O!9?OO_#28!15?@#15@#23@???@!6?CGC#127!5?W?G#140!39?G#73!4?@?C???O#140C$#64!146?_#90!21?_!7?!4O#192_!4?OO#208A??C@#188G#28G#209CCC#199!18?_?O!8?C#228!16?O?W?G???C??C#175!5?G!7?_??A?A?_ABA!4?@???_#220?A??!9@#235??A#206!12?O?O??SOC#169!29?KGK!4?C#16_??O?G??_#21???_!9?OA???@@A?DAACEEAB!5?OGGB@#129!54?G#119_!4?@$#168!168?@!4?@#226??_#166!7@?@#196?G#11O!8?C#210!19?!4_Oo?wo?OOOWGGG?GCK#200!5?A?A#210???@@@???@#159!5?OG!4?_#228??G#227?G#236!6?CCC#206??A#159@??_!4?_??_?_?_#156!18?CGGGOW??WCCG?@?b@OG#79!16?_#207O?G#196??_??O#17?O#14_#83_#169!7?C?CS!7?oaa__?OO!7?G!4?A#142!62?_$#181!177?A#1??G!4?G#168??CC#155O!9?C!5?AA#185!44?_?__O??O#161!4?_O#212AA???@@#197!7?_AAA??_@!6?O??O!5?G_!7?CO#162!6?C?eaCiEegREZkZ[[badLx\V]Q[SOG#12!7?_!8?G?GKG?G?WC#36A!7?G!9?@#191??O!5?_?@$#241!177?_#193???O!6?G#15O!9?C!4?A#223!80?A#235???CC#222O!6?G?G!4?CC?D??__#168!43?O?OO#21@#110O??C#194!32?O#51@#153GG?C$#105!182?O!9?@#177?G#232!95?@#160_#200O#174??_#175???O?O_??O?O?GG?O#138!44?O?G#109?GGG#207!33?G#216C#57?_??C??@A$#207!182?_#243_#156_#179!4?AAE#227!99?G#210!7?G?G!6?_#23!53?A#64_#192!36?C??A$#237!189?GG#150G#240!170?O#168!38?_@oWK_$#110!189?@#202!211?C?@$#79!401?@O-#193VFdBFTBlAO@L?P@WVfdVFdfRNfrmFTFrkJC^cj[JuVVvFzFqGPcY?hO?PADitIPg@?C!8?_#0??A#104?@?CA@GI?dXEAiDPIARHIeBJAhXHdvffU^bfl{zskv{}t}|u|Vm|JsySkDvJHQIAB!7?C?@#160_???_!6?O??GG???CCCA?IAB@?@@@#161?_O?O???C?O???G?C??C#227???G#190?@???O?O?O?O??G#159?_?_?_??O!7?_#190ACA?C!4?A?AA@???A!8?D@BB@?@??@!8?@#228O??O?O!7?!4O#206G?G!5?G!4C#195?__#156_!5?@!7?@#226!6_#12?C?CC?C??AAA#245C??C#97CA?C???G!6?G#104G!5?C?W#110O#34_#169?@_?@@!4?AA#36?C!4?G#92_?O?A?A#142CCC#119_?_O_???C!4?@!4?@#128???___???AGeIBIHH?M_EKRDP@CAOY?WG!6?CCWIOIPioSACA#118!5?@!5?O??WSA?OP@??AHBNH`@P`@OGGYuQTsM\II?aO#102!4?GWPXnvDt?wO#72CCB@CAAtLUPYPi\gydwoGoGO?OG_OGO_O?_#93A?DkO[TY]|rn^|~j^vm$#196g?W_W_GOChEoBkAD_GOGoGOG_OG?OgOGRcZ_JSBsHggGwCwLtiZduSjlisgO?_cAWaOaGCO_C_#106!7?@??A@?I?AOD?iCP?cO@GS?CA?QG?OG_?G#82???C??GA?G?A?A??AO?C_#105?_?OQG?G_???G#2O??@#153O!7?CCC!9?@#208??@#174O#197___O?_?_!5?GGOO?O!4?ACACC?DdA_@?@!6?!5G?_?_OcW_k_iA_A_??Q`o?O?O?__O?oO_??P@_A!8?G!7?A?AA?A?Q!4?AAA!9?@?@#189_!4?_#235_#186?__#228O!4?G??C#79?_#162A?@!4?@?@??@??@?@#96G??GG??K???C???A@BA!5?GG???C#90IAEB?A?ADC#157?@@???A?C??C???AA???A#16@#132_!5?G???IGg_O?OO??O?WGGCoYCG?GEC??@?__??o?O!4?GG??@??@#129_MYEG?O??@_#132!4?H?O?g?E_Op#112??@?GCa!4?@??G??CO#114???EA??A?BO@?@_A@o_TsICiT?ahC@?C#101!4?_BkQzCsJoSGq@mCgS_O?O#120!6?G#41!5?@???A?D?QG@i?`AG#85?_??O_G@$#237?g?W_GO?WEwA{AkA?OG_GOG?O???g?g??O_?O?_#137!9?AC??HACQCGO!4?CAG@ODhASG?W?P_?a_?GC?OO??_G??O!7?_??O_#1!36?OO!6?C!4?@#158__?oOooOWGGG??CCC?AA?A!4?@!9?BA@@??@?@#219??_!4?OO??KCKK??ACCCBBABABBBA@?@@@#200?G?G!6?G??W?GGCGC?GGGWG?C??O??OO???CC??C??CC?CGGG?G???AA???A#178_#195_#243___!8?_#230!6?O#164?OO?OAC?m?BCA?AC#51@!7?@#57A???@!5?`!5?O??O??_?_!4?O??o?O?@?ASSAaA_?QGSSOO!4?B#49???_#39OA?@@!4?_#112!6?H?@!7?@#116???O?owSSOCCDAEL?A@ACGAcqs_cuAQP@pRmlzbcDcdcCC#73@?@??O#143!5?O#119?@HHTb`gkNfemxHduwo_GKGSgc_?_GCGG#107??_?OGCa???O?_???O?O#98!5?A?CHA?g?`A??A@?DJbFPF`N`FhVcQMUXdWQ?D_?D#88!10?O$#239?OAC?AcA`!5?O_G?A??A?c?GCP?A?C#105!25?@ADITIPcTiLqQlJr^f^m^|\]}rw{cctOC_w??_cW?Co??og?C_!7?O#196!27?_G#166_?O!8?ECCEC#173G#96@@@#174_#185_ooOoWwWWWwkWOWG[GYK?L@LLDDC#206_???OGCCG?AA?A#210!6?a`_AHH@@#206?C#175o_G?WCG!4?OG?cSSI@WGC?O?J?@?P!4?A??A?!4AE?A?C?ADABBA?A#199??A?A#159?A!4?@@#163O??_#199???@#26???_#155?O?O#216?!5O_O_O?O??OGG#26__#7?_??OO#193_!6?__w!4?__o#106_#105__#14A!5?G!5?G!4?@!6?O???O#164??A!6?_?_#20???__???C#63?A#118?_??O!7?AEAC?A??!4@#140!7?o!7?OSO?@??@!6?C!4?_cGc@A?O??@#127!4?A?a#115!13?GOA?OO??O?O??C!4?CGSG@Q???_A@???dO@?iTCA_E?O#77???ACAh?wGoH_!5?C#99@ACCGA?CGaGQ?QGA?IC``CW?g@_A$#96!83?@?A@?I?@?T?I?`G_?PG??C?COG?O?_#182!31?Oo!8?G!4?G#170?AA#180??C#2?@#190_?_?___??!4CAUCQMAM!4A#156_#154@!5A??@@#230O#185!10?O#211?!4_o_o??SC#185?G?CKOKCCE?A?`???@A!6?A??A!6?@?@@@??C!8?!5@H@@?B!5?@@#223_??OO!7?G??GG??G??WGC??GA#21???A?BC@@???AB?B!5A@@@#16C!4?A?A??G???O??O!9?G???G_#21!6?O?A!5?_??O???@#69??O#81?W#73ggG?O???O#126!8?OG?C?C!4?AIC@?@#52??O#129O#130!5?@#127?_?a??@?G#121@#126@#38_!5?O#121!12?O@g`LiE}Zm~uqCaKCA?_???Ea!4?OOo_???CcC?G#48!39?@???CO?C_C_COC_?G?G??_$#0!96?C?AC??CO?A?A???G?OGOA?HA???A??G?gO?cA?H?Q??c@@??@!6?AFCD!9?A@??@#82@#106@#173A#205!4?@#180@#176@#199?__!4?o??o!5?G?C!7?A?A`BaaqP?BP?O!5?S?WC?O?O?A?oW@@bSGCBWlBF?@Q@?@@OA?AO!7?EGI?K#206GG!5?C??OC??O#210?C?!4C?A???E#15!6?_#156o?o#15!11?_!5?OOS??GG#13?O#35OSCKG#0?G#90C#218O?O?O??O#25?@#104COB?CC#83A?@CDH@HAA#170G?OG??W?G@A?GG???G?[CC!4?GG?CG#114!7?O!4?_#127C!4?O!4?_??_!5?C#49!6?_#142!21?CC#126!17?G?PGQDG?c#69!8?@??G!4?G#103!4?CAA?A?A?@?@???A?@?@?GTGQ`EGa?GiIL?@#93!17?A#95!13?@!4?A??A??_??CO?A?C$#109!103?@!5?G?@?C?A@?AP?@@?@?@??@??H@ARGGc?csDCGG?AAI!6?@!6?A#196?A#194??AA!4?@#175!8?_?o?O_??OGK#174O!4?A?A?@@@#212!18?@?@#211!10?OG??C!6?CECCC???!4C?CKGGKGH!5?A#156G!4?!4_??__#189?__#173_#219!4?G?GCGGKCKCE?E?A#178!11?AC?DC#177?@?GW???GG!4?@#91?@#182?_#2G#170C!5?C!4?A#138_??_#36?_?__!9?_!4?_#25!8?_!6?_!5?@#38!4?CA#121_X??O?CeDHhZEL]ME]AEAB?@JDDB?B?@!4?__?O$#191!144?CC?CG#194_OO#138G#156_???O!4?G!9?A!6?@#200!10?_???GCKGC!7?_#161!37?_??_#222O!7?G!5?_OOO?Oo!7?CC!7?CCCGCG??G!4C??!5A@B@@@??@A@#173!7?___OW!4?A?E#70??CGG#83O?G#150O#82??o#239G!5?G#153O#76_?_#90H@@?CCG#79_#12?O!4?O?O?O??@?@!7?g!8?CG???C?@#103!4?O#74A#112_#128@!4?@#73!11?O$#179!144?A?C#64@!8?A!9?@#207???A#212!20?_!7?O???Gg!5?O#206!35?_?_#174??__?_?@@?_@??@!6?__???G!4?G!6?_BA@#175!4?!5@?@?@#18!4?_#163!14?G#25???G#6??_???O#37?G#14?O?CC#198!4?__#164@#168A@!8?__?_!7?__?__!7?A@G!5?G?AG?IBAEGCC?A#145!7?A#116C@AD@$#97!145?@@?@@???A!5?AB???@#223!29?_#224_!5?__??WWOG?G!5?CCCAAA!8?@?@#210!14?G??G??GCG!4?C?O?C#224_#161???_?O!8?CO?OW#178???O#212O?WG?WOGOg?C!5?C?ACDFA@ABbBBBFGB?A#2!6?___#25!4?A#166?OO#157!4?A#86AA???@!9?G?AEAE@DVCDA@!8?O!4?O?O?O_??_O#192@#91O???g???D#152!4?A#125SGG?OO??___?__?__owM_OO??G?GaG`G???A_KwOgOcQGHA?G?@!7?GAOIOIPAgl?SE$#110!145?AA#29O#168C#106?G!8?@#164?G#229!34?_???O?O?O!6?G#159!44?OO???@#219?__?_#154!5?O?_?WOO?O#176??__!6?!4_??_!6?OW???G???G?GGCCG???@?@?C!7?A#204!11?O?O??O#246G#196O?W#109O#3O#35W?G?B!4?C#37???A#208?C#179`@KacCG?_aG{CC@?G??G??@!4?A#130!10?A@#141A$#209!146?__!8?GG!9?A#66!28?@@?@#228_O!5?G!5?G#154!42?__#158_#212??O!5?_#54!4?__#66O#50_#177__#155_O#224!16?O!5?G!5?K?A?C!8?D#57!9?O#28C?C#203!14?G#183C#169@#110??GG#124?_#34??O#4??O#145??C!4?A?@#245?C!5?C#215!8?@@#191!4@???@@#126!12?G$#171!146?G??S?G?G???@!6?C#236!32?_#222OG??G??_??CCCS??A?GA???@?C!7?AA???@#206!24?_#159!10?C#158O?O??G???G#211!13?AA#189!33?G#244!17?C#241G#20???@#9!12?O#20OO#124??_#55!18?_!9?_?OgGK$#220!148?_#96?B#216_#174_#192O!9?C??A!4?@?@#231!24?__#160!77?G?G?G!7?@#25!78?_#51!31?_OO?CC??@$#207!150?_#150???A#154_!4?_??_!4?CC#23!230?O?G???@$#201!154?O#198G??G$#243!155?O#176O!9?CC$#214!157?A#155O!4?G!9?A$#179!158?@-#196ASASA_GQKO?C?CHSaSJCgU`SICaTIPgEhCPCi@hQ@GPiT_TItI`ZeZa[c[A?AOTipQWZ_lYShYSiSiOaSKQKOcG_?@?a?o???__???KcWOGC!8?CSK??O#214?C??CC#160_!4?OO?GGG?G???A??GABCE?B?@#222_???OO!6?g__!4?C?O??AG!4?@@!4?aAA??!6_oo???O?G!4?C#154?G??CK!4?C?CC??E?C!7?A#161@#227!6?G#230!5?_?_!5?___?_!9?OO???OG??G?C?CC!8?C#206A#234_!5?G#194_?O_oooOo?_o_!5?!5O??G?GG!8?A?AA???A??G??GGG!5?G#168@@??@@?@?BF@?A@?A@A??A?AA!5?CGG#90A??G#38@??CC?GG??_#132C?IA?AA??C#38_!4?GGg?o?O?G?_#127!4?C!5?@?AA!5?C#140@??`G?g@?OO?I#127C?C?E?G_?WG#73_?G??_#143!4?A??A#119!4?A?A@@A@??S???GK?AYAC#102??C??AA{goAOUaVSC!7?_#98!4?C???C?G!8?C??GC?@?A??I@WJ[WUGlB@#41@#85@G@G?C$#193g?g?GS??_Cg?gO_?H?_Q@?GB_PG?_E@OQIIPCQSCmbETiNiTAtMcXc\bZb|~{laDKcCcS?_?C_!4?CG#208?_#104!7?A@?A?_CAA?@??A@??OQP?A@@BPHB_@AAHGA@?A@@B?@@BB@@???A#4A#20A#50A#190_#188@#173@#155?@#159?A??G??O!5?G#219?O___??G?OOO??CGGGAA??C??@??A!5?@!8?O!6?__!4?O!4?Oo_?OO?OO?OGOO?OG??G??C?!4C??CGCC???C?S??O#223OC!8?GG!4?C?C?_O!4?G??GC?C!4?A#178A#201?_O??_#188?CC?C??A!9?G?GG???CC???G!5?G@G#162__!4?_?_!5?___?!5_??___#171O!4?G???_?_#157C?CCA??@C??O#63@#91@#55@!8?AA#69@#73A#126??C?G#52!4?_???_?O?C?G?G!4?@#132!4?CC?A?AG?C#38!4?_?A!7?A#121!6?@!5?@@D@BBmFLj^XntZ~h~z^l|t[{QwWEqaeAEAAE#107???@#101!9?KCGG?GGHITUhVGIDZChZ_\aXiPuLsZ[nO}KWSOsWk[?S_?_A_?_#93?G_OC[}}rypyx|{$#237TiSJsHSkRgShSHUhSjShUhUgTITiTgUhC`?i@gA@O?g??O?_G?O#105!9?@A??A@B?B?@AA@A@@@ITHQLonZv]y[gO[@VR`@@ao~pWAdA?KCCK??KCO?o?O?O#191O#186_#173_!7?G#199_?!6_!4O_O___!4?GGCGO!6?AAA?A??_?_@BOooOPWHw?wKsgcOo_{sWSDWCGB?h`?GQTKLC?AEPA@!5?@@@??@!7?@#212??GC?C#155!11?@@#154@@!4?A?AAA@#231_#232_!8?__?_?_!4?OWO???OO?OGWGCoO_#189@#187?oGGKW!5?G!4?O#171O!7?G!6?C@A@?A!9?AA?G!4?!5G#106C?C#76C#204GGG#4C#13C#207O!7?G#138A#57H??G?GOOWQKWOs?_O_#140@!5?A?C?E!7?O_!4?_??CA??A?C?C???PA!5?W#73???G#142_?__???g?OA?O#126!10?@???@??AA_?@gOC__OGC?C??_#118??A@?CCeGHHWlHd@X|dwIeOA@#77!6?GC?G??QSI`QgP?O_AO_A?Oa?A?aIc??c?_!7?o#131!12?__#88??CCEDAAB$#239?@@?@AB@?BBABA?A!9?_#246!7?OC!4?g#239?C#137!20?GO?G_?GQChOChSiS`?a@_B???@D_UH`MG_WGWGG??A???`_?_!4?o!9?G??GG#185_?_??_?OO??G?G?G???O#200?_??_#206_!5?C!4?G!7?C#230G!5?CC#212???C#211!5?G???A?IGEBFC@??GDD!4AB#224!5_ooo__GWggGwggwgOgGWG?OG?!6G?GKK?C??KSSOW?S[CCGG#58?A#216W?o?__!8?A?_!7?A??AA!7?D!7?A?@#209CG?K??EC?AC#164_???_#176_!4?O!4?_???_?O_?O!5?O?O!4?O!6?O#173O#9?C#3C?!4C!4?A#35A#12?A!5?A?B?CSG?_#136AC#52C???C#121@@??BD@G#129!10?__OO{?O??OO?___!9?O?_GG_Gg?o_O??COO#132!8?WQPA?eoKG_?O?O?C#115!12?A?@?@??@?_?O_??COPAg?Cl??@?@??@#72???@?GC?EDACXECWaLCPK?O@?`OJ@QbjiBaRaCg^US?B?Ba?A$#246???_??_!6?_#192!20?_?O!4?O#106!49?C???G?OAOD???@???A@OaCGA??A?@?A@?Q@?A??AG#154O!6?C!5?C???C!4?@?@?A?AA@@#185@?C!6?@!6?@@!7?G#212!8?@#185!5?AA?A!4?O!7?@@?@?A#222?O#229?_!5?_?_?_?_O_O_O_OoOOoOw_WgOgggC_G#155???@?B@?@@BC!9?@?@??@@#229?C#238O??O!8?O#15?@#173A??@?A@#220_Co#198C??A???C?@#182C#214A??A#30C#196A#105A#109A#138AA?@#26G!8?@!4?A#212O#79@#57@?A?@B@AA?AACAC#203G#36?@#194?O#191GG!4?O?_#164??C?H??@#14?A!4?A??G#116@??B!6?o?oo_OGOoOWy[Y[?CA?CM?K`l\UCXryhhx_osocGG?OI?ROFFKfjAmhJJ^?O?o#118!9?C#112C??A??A??_?O?C?Q?G_?g??OC#114??OO?_???@_GdOGQ?P??A?@_#53!11?G!4?@!4?_@???A#99???@??D?@??@@?@?SCS?D`TAWA$#184!11?O!25?C#150!58?C??C#96A!4?A_??A@O!6?ACCCE??A??A#174_!9?G??G???KCKG??ECC#224??___!8?O?OO!4?C!6?A!5?@A@#197!14?A`?__o?GGG?E?AAAB?@???@??@?!5@?@??@?@?A!5?@!9?AA#227!4?O?GG???_?O??G?C?C?CC#235?_!5?!6_?O??G?GGC?C#195??@@#172GKG?OGOGG!9?G!6?C#180G?G???G??G!8?A???A!4?A!6?O!5?_??C???K#25?@??@@#86??@#180??_#124G#109C#37A??G?OO#125@@?K?OGi?CBCcBM?E???@?@!6?A!5?C??AE?BGB?ODVCDC?C?G!7?C_C@dIE`leS}??!4O!21?_#103!5?O!7?G@uhOkBU@oa@S_b___???_o??_#53!24?G??_?_?_$#182!97?CC#0!5?_?@!5?AO_AgG??@??HGC@???@AA!4?@#156C!8?@#161!4?_#54!6?A#228__??_O?O???GGG???G!6?C!5?@#174!17?_!4?OOOW?CC??GAA?!5AC?EAAA?!4A?AA!6@???@!5?!4@?A#243???_??__!7?GOGOGG?CO???O!5?G???O??CC??C!6?@A!9?_#195_???_??OOO__??_OO!4?O!6?O#201?G#173?@?A#169???@!7?@!8?i@gCSOOoo_kCk__g???_#170[?_#96O#104_#128@?G???WK?O??S_@G@H@DADAB?@B@@BB?A?GICG@QO?DK?C@?Q?BOR??G!4?@?Cc_?piY?w???G#48!92?A??G@G$#110!104?C#208G???G#150??_#97_!6?G???C#156?__#188O#179CCC#207G#153C#162G#109A??@@#158!5CAAA??@@@?AAAB!4@#229__??O??O!4?G?G?CC???CAAA?AA!4?@@@#200!12?G#190?@?@?@@?@#156!4?G#155!6?C#160A!5?A#228_?o?_O_O_O_?__?_?O?O!4?_G??Gg?OOO!6?__OO!4?oOGGK?GCGG?GG?C#221!9?OO_?GG#26?A#3??A#106A!4?A?C??C!7?@#104@#220?CC??C??C?C#157??@?@@B!4?@!8?A?A?A#179!4?B?A@!5?_!4?_!4?@!4?O#58C#110_#127@#74G!4?_#119?@#127???@?H?C?A??@#149???_#130???_#142_o#49??A#121!13?@#130!10?O?O$#191!106?CG??G?G#110!6?O!8?C#189O#177O#197_?_!7?O__G???O?WWWoWSCWSGKGEMIF@?C?CCECB@__?@???@?@!4?CG??O#206!17?_?C???O!5?G!4?@??@!5?C?D@?C?C?C!4?A?AA???AA???!4@?CCC!8?C!7?A??A#176AA???AA??A?A??BAAA@?B?A!4?@#20@#31@#193ACC??A@A!7?@@#187C#216??OO???O#192A?CA?A#28?@#164?_?A??`!5?O!4?O?A?A___#170?@!6?@#21??@#36??A#183!5?A#142???A?AG?G??O?_#52!52?C$#109!109?O???C???@#171?_???_#182??G#198O!8?A#196A??@#210!5?O!12?C#212??OO!5?G!5?O#231!4?C!6?A!4?@@#158!24?GGG?!4C?C#156!7?CCC?C!5?A?!4AB?B?@AAA??A#50!7?A#156??BEIKJDEB?BA@B@???AA??@B!11@#164!5?A?A#29?C#218!5?C#76@@!4?G!4?C#124C#213@#202@#233!7?C??C!5?!5C?C???CC#153!4?G!6?GGG?O!4?O#16??@?@!9?A@#35???C??O??_#56O#144_$#193!109?_#182??O#245!6?G#194_?_???O!8?C!8?@#161!19?CG#190?@@@?A@!5?_!5?O?O?o?OO??C??C?A#227!23?O#222!17?C#177!30?C?C!5?@?@A#231?O#154?@?@#92@#205_#248___!5?O__G?_O?_#177??@#201!11?o__OO!5?O??G??GG???A?I#163_!6?_!6?_?_O?O_?O#161???__#105!7?G#186_#202O#201_?O#193!18?O#165?A#86_#70_#145O_?O$#192!121?_???O!6?C?C#159OO??O#175O!4?_?_#200!19?G!4?_!6?A??G#176!90?G?OOA?GAC#247G!7?_???O!7?C?KCG#181!17?@HGG??G?C!8?A?A@@@#11???@??@#243?G#192!13?CGG!7?G?OOO#130!25?A#129?C#149A$#82!127?G#193??G#155O???G#201C#195C#105A???@#174!24?C?C#210?`!4?O!5?___?_C!4?CKGAGA?O@WOGKSKSA#235!64?O#15!4?@!6?A?A!7?A#227??C#153!25?A#186?_!8?O#209!9?C??C???E!5?C?CCC??CCC#11!5?C$#191!139?A?@?@#211!25?A@!7?A??_#189!97?C#238??_?_#224!10?CC#138!29?@#207_!6?O???C!6?G?@?@??G???G$#175!173?A_?A?@!7?G#109!140?@#204??A#137@#178_???___O?o_?_???oO??Oo?oO??o_O?O?OA???OOO!8?_!9?G!5?O$#159!175?A#242!154?@#216_#241BB@A#21!10?_#186???G??G$#173!346?O#124!4?@??G!6?A!6?@??@@!7?A???C?C?G-#193i?G@_C`OC_?@OcH?i?I?I@CH??Qd?GA?QH`?Do?@UCQgAPSJ`ciQctJWdYnnMlS_\aXEgDi?TgQC?AOCW?G??C??AOA?G__O??__O?OOH???CC#176o??GW??KAE?A@!5?!5_OOO!6G#178C#224C???CA?A?AAB#230?@#210??O?KCGCK?EEKBIDJCKDNFFJFBEBBA@DBDA@#206AC??@??A!4?@#199@#222@#243!6?_#249?O!4?_#223?@#232GWGW???!4GWO??K!5?___A???_?__!6?OSOS!9?G??`?``@?`@!5?C#180!12?G???O!7?O?O@?OGO?A?CCCAA???@#57A#55_?cGO!4_?C?A??E?_?C!8?C???G#62OGg__O_O?OOO?O__?__??__???OoO?OOooo___#145O!6?@@?G?_w??__#130?O???B_?O_?O???O!5?O#128_A??O?_?`?`_qAAA@GGHdOCcOKGSQDACGO@?G??G#126?O_?_?I?COI?AO??G??G?CACC#143G#115!5?O??CA?H?kP@GYdkG?GgO?_#72!13?@A?@?D?A@!9?@?@MS!4?A?EGP#131G?AQ@s??Cc?O?_$#237TiTiThUHqLYsHQChDydIpm@qlQlOlQlQcQKOiDY_H_DOdI_CGP?HA?_A#137!6?HA???O@_?I?C?qCXaHCpcXAwEGgCHcA@O!5?GW!4?@??BAA?A#104?A#197__?wOG_KG!7?CEABAFB?@?@!5?Go?gO?CCG?CE?A?A#211!4?@@CCACBBA!6?@??@#231!4?_?O??O???_??__goo?OWowoSO?G???OWO?CCAAAI???C??CC!6?A?A???A?C?B!6?C?C??O#235?A??AA?AG???A??A!8?@??@!4?A??A#173??G??G!6?C!4?_!8?C??A#54__!7?O!4?_!8?_?C?CoG??_GG__!4O?O?O#53_#133_#77__#177!4?O#69?__#180?@?@??@@@#179@???AA#55O!4?_#241CC??OO#74EIG?OO??_#52?A#149?C#116!8?!4@ESvnnYSmuEtSDUTUVCh[|wEdeQNqRJrb?@OOOP@!4?G#119!8?O!8?`CaQ?__!4?__cc!5?B#107?_???C???A?C#77A??A?I?H?@?F?iCADK?\A{?E_SgTqdEGFGECYOObtnEb\Op#134_C#93?GSHUHUJPBtJ^^$#196?T?SAOGAHQ?G??AS?@Od?Oa?Ql?GQdOl??QCOACQ_H?DG_J_OAPcXASdYdOOpQa\a\ehUYTtiRlHzcLq?CA_h?WOCGSIcCI?OgM^B?@#22_#7_!5?G??C#105?@#156CO??I??@?@_@?G?O??G??OO?_?_?g?GOoGW#222??_OoOoWGK?XSOOS?WAGO#229??_?!7_oO!6oOwgwWGGS?K?C?C?IAK_CI@MGDMEDA?I?!4ADDD@D!8@???@?@?@@?@@?@#187??OOO!5?G!5?G?KG#220??C#186??_??__?!4_?_?oOooOoOOOo!5O_?O??O??_?@#124??o???O#21_!7?C!4?A?@???@@??@?@!6?@??@!5?@??AAA?@E??!4G?GG!4?OOWOGWWIGIC?KGCCCG#12@#90CCC???O!5?O#14O#116?@!5?@#52!10?A#149???O#52!7?G#125???_?_??@?@??@!6?C?SgcIHJ_gUJONBDj`G[SCCC!6?GG#73?G!4?C#114!10?C@KCsK@?eP?Y?o_O?cO?_!5?G?G??O#53!10?A#59!4?_??_#53!5?G#40?O#100!4?O#98gvd_c??_Og?G_$#192??a?G!7?A#184!20?c???G!4?_?OC??C#105!31?BIPESB@FPa?P?YDN?OP?CB#150MMAA?DB!5?@#216?G!4?@#174?___!4?!4GCGC?C@!5?_O!9?CC#229?@#199QOA?JBJH#224???__!4?O?OO?O#236?_#197!7?CCA???AA??@@@#247!13?_???__o???OO?O?O!6?!4O?SKC??CGC??!4CAEC!4?EEE??F!4?@!4?AA#187?ACE?C?A?A!4?@@@#188!10?O!4?G?O@O???G???G#23_???G??G#63G#155?CAE?AA???AA?AA?A??A!5?@@@B???C?C#164A??CC?C!5?GG?HG#139!4?___???___#168?A?@A#14@#16GG#38O!8?@@DE@GGYKCDBkJsgOohOC??G?G???@?@!6?GG!6?O#127!10?G?C?A?GO@OCA?I@??O#112!7?`?`??@??O?_?_@QC?A#103???A@G?OQ_Gad?RCWaTGgOWSAaBg`GOPGGgOG?g?OG?_OgKWgOG_W!4_???GW#99!6?QH?gAGC?O?C$#246!5?A?c??`?_?_?O??OC?OC!8?H!6?C?QG!7?C??G#104!26?_!5?_#0_!7?_!4?_???C?A?G?@@?@#124??A#194?@@#222_?O#199??C???C??B@@?@???A?AB!4?@#195A#161???C#219_?_?__``!5_o_oo?WoGoW?WGCWKGKKKMIKILA??D!5?A!6?@#228!9?A?A!8?GC#248_?_???_?_?_!6?!5O?OO?GGWGO!5?G???G??G!5?C?CD???AA!4?@@?@A?A#187!10?@#176CAC?E??AA?A!5?@?@#15GC#92!4O?OG?_aC?E!7?GWSOOWSOW?EQYOOCs??_?GG!9?O!10?O???O!5?O#36C#25G#69__#96A???O???O#37_??__#129A??A?A??OG??G?JWmmsh@GO??@?@G?GGG??GG???A?OO#132!9?___CA_Ce?OOCCQBIAOAGC?CG#118?AAUqO__!7?@OPC~zwooAB?MO#102!4?@F@?@DLD`tSsUOo??P_O__!4?oW!5?O?_O#95!21?@_AGA?_$#184!10?C!6?C#192!17?i??`G???A???O?G#208!39?@??@???JE#2???_??O#31_?O#15O!5?CC??C#200!7?K#159A#155O?O???_??__oO??_?W?G#163C#212!25?O#222!18?@@?@#236O???_OOGO??o?_!4?_?OWW[CEKC!6?AEE??CA?ANMMMEG!8?A??@!4?@@@#216_?_?o__O?A@AAIAWO!5W@P@???KCGC?KCKCCC??CEECCACAA?AC??A?@?A!5?@!4?A???@#162?@!7?@??@?@!6?@!7?@@@??!4@???G@@@BECCMCMEE!4C?K#57!4?@#86CG!4?@O?_???_#140!4?C?A@@!4?C!9?A?a!4?_O?`G@O?A???S_?C_A?G_HG_??B#73!5?C?_??_?O?C#101!47?AA?A?G?G?E?fCaDAATaSBi@DIDA@A@F?F@IDM@GAO`C_nGFA$#239!11?ACHOA!6?G!4?A!7?@!12?A#96!41?_?O!8?C?@?@#26_??G!7?A??@#210!7?D??A#162O???O!6?G#228C!6?A???@?@@#227!36?!4_G?O?GO?CC?KACC??A!4?@!4?@@!7?AAA?A!9?GG#228??@!6?@???__?_?O??O!5?_?O#205!7?C???O!9?A!5?O!6?O?@#178!5?A?@?@?@??@?@A??@@#73!4?GGG?O?O#59G#148_!6?_!6?_#69?o?O!5?_#178AC?CACC???G?!4@?@?@!6?A#245!4?A#104@#97@???AK#142AAC@?AAGISCC?WwW??BFNFEc_O!7?CG???AAA#121!29?_?_???_@h`hrjtztMtS?@KD^JXZzV}LYJGj#114!49?O??O$#184!96?C#191@#3!4?_#182??C?A#21?O#18?G#161_!9?C?F?Qg#211A@B#177??_!7?_#223???C#212EA!4?@@?AA#174!38?AAA@?@@#247_#238!16?__!5?O??_??_?_!5?_?__!9?O???A??OGII??G???E!6?@#173!9?O#195?O??C?GC?C?G???GCKAGGAGG??G??GG?L@?ECCE?AA??B???@#176!9?@#39_!4?_???_!4?_?_#163!4?@???@A?A?AAACAAECC@!7?A?A?A#164AAA#109!6?A#183A#35@?G!4?G#128!6?@@$#237!96?_#10!8?O#198G!9?@#190!12?A?@#154???c!5?O?OO#224!51?CC?_??IAAE??AB@@A@B?@@?@?@@?@#235_!8?O!9?W??G??G?G??GG#195!4?_#221???G??GG???CCC?CCC?C??CA???A?A?A?A??A?@@@?@?@?@#223?A#26?G!5?CG?GO?GWG?G#58_#50?__!4?C_GOKO??Cc?C?CO?CAC?C!5?C??C#23!6?C#59???_!5?_#169!12?@!4?@@@#83!6?GG@G??G#136B??C#56!4?O??_?_O$#226!105?G#6O#106G??CC??A??@#160!11?O#92!6?_!5?O#228!55?GC?C?C#234!22?___#221?_!4?__?_#249!5?_??OCAA!5?A!4?A??AA???C#223O??o__?OO??G#207!7?_?_?_??_?_?_?_???_??_?o?o_O???_#28??_?_??OO#156???C!9?@#140!4?G#81?G?G#23?@?@#156@#177A?A!7?BA???C??G#161??!4@??A??AA?A#250!5?_?_#239!11?C!4?W$#214!106?C#173___?o???G#161!23?C#200?A??B@@@?@@!6?G!5?@!7?@#230!27?OOG!5?G!7?G__?C#243!8?G?O!4?CGWG!9?!4_?aG?`!4_?_???O?_!8?G?@!6?@???O@!4?GG???GI?AA!7?G??G??C?CC!4?A!6?@#121!14?_#72!28?_#40???O???_#91!11?G??CGGG??O?O??_#70@Ac?_$#164!112?GO#185!27?@!57?@#216!32?O!6?O#234!6?O??C?C?GC???AC#195!12?_???_#194!12?C!4?A!8?@?@?@?@#164!4?C??A#223!5?@?@#177_??O?G!4?C!6?@?A#39!64?_#152O!4?c??C!7?_$#4!112?C#206__oO?w?CsIQOY@SG?CC!7?AC?G??A__?CcTkWGG?AA#230!79?O??@@?@?B??@??A?@???@?@@???!6@#173?@#176@POO??G!7?!6G#248!21?@#36!8?_#79??O??G#49???_??_?OO??GCOOW?W?oCO_GgG?GgcWG?_GG???G#214!40?A#237A#63_#130@$#97!112?@#222!28?C#201!148?C!5?A??_???___??_?_@`@?@___#51!8?_??oO!4?OG!8?A??C!5?A??A?AA??C?A???C!5?G!8?OO!5?O#244!18?C$#195!112?O#189!177?@#18!42?GG$#202!112?A#164!221?CC?A!9?@???@!6?@@-#193C?A?C???A??Q?C?i?CG@O@G@A?D??H?D@c?AWcOcGcHCXCHc?QIAkta@UlId]dI\A|A|AsIPgASJSdWoJA?CAD?CE?DQ?A#24?_#28_OO#173G??C??A#219??O#197??_?A?@???A@H@C#15!4?C!8?A#197!5?@@#236O?__OG??o?OoOoWOwooOS[?C?C!5?C_??CECC?B@!5?E?AA??AA!4?@@?@#248AA???A#235??_?_!4?G#224C!4?A?A?!4A?A#195?C??C?@?@A?A@A??@#171G#192_#232?A?@?@?@?@@??@!9?@#124??__??QOOg_gS_O?WGgOGG??C??A?D?AE?@??@#92OKKEEAVMEFBCJAE??@@@?@!5?_#73?GGG#59??ooCC??_!6?@G?OOGOHDo@??A??A@GWO??OO?_!8?O!7?A#148@#39A#250?@@#73A!5?A!4?G?C!5?_#130G?@??A?@?A???G!6?@#149??@#125!5?o?gO[AboZO}Gj\DHv`[IIQ_``@A#119?GO???OWO!6?GO!4?@CBHDDSCKCCW?__??!5_#112!4?A#102GO?GKG?@aOe]CGYue|_?EEaap_Yc`pJmu}u^EOkCC#98??abD~J[gEWX{xIh{Y|$#237zItkRkJslTYcJp]@[qB{AiTuGtqkRSlQ_ZcPaHAXAPaOaOaXc@S`A?Cg??O??O?_#137!6?@ACH?O?A?D??@@@?GG?AQ???G#32C#2C#15_??G#206?_OWSKYKMMKFKDEDAQWGAKHHA???C!6?A?AAA@???@@@#231?___#227??__?_?_#235_???_#247?_O?O!6?G!9?!4ACC!5?G??BA@!9?_??A?A???@O#229?A?A?C#171???_?_?_?__#223!4?@#172?_?_?_?_#243@???@@@#205??A?EA?A?@@A???A???A#26!6?_?___???_???_#195_#173!4?OOG{[CC_?C?A?@@#51O?OAGHKG?@#140_O#39ACC@??A!6?_?@!4?pLC!5?A?LF?@@?G#102?CGK!7?_??_???A?_?`__A?a_?OO??GG?G?_@g!6?@??_??O#116A!7?OCCOO?O?okWSgGHHw_AQQUkw[!4g``WpD@[E`AC?C!5?A!5?O#121?DKKWSC`BNU|ne`fd@@fbfbebbbae?C?GGH@AGG!4?C#107!4?G!6?O?WAO???O_O?O#59!7?O_GOCG??O?_O?@??OG??_#100!4?q?o`O!5?O$#196?@?@?P?H??@???@!5?C!4?G?Ac?Q?O?HC@?@A???A?A?AHc@S@I@UhQdY`ItA|A|A|JskRsjcjWfIS@AICGC!8?@#7O#11G#156_??o!5?CA?@@??__?O!6?C?E??@?!5A?@@?@?@#247?O?_#231!15?GG?_?kWKW[K][MaMAEG@@@OOO??OO??ECCBB@@?@?@??@?@???@#232@A?A#195_#249@!6?@@#232?G!5?G??GGG!8?C#221!14?_#172?___#171_O!5?CSOOWKOSSOO#76G!5?G?G?G#164!9?O?_og?S__!4?C#55G!4?O?@WWKHO?WIA???@_?_O#119C#125C?AAS??A?A@??@#119A???A!7?C???@#99??@#103__???_?_?_!8?_!6?C!4?__oooO?H?G#132?@!4?O#136@?@#129A??A@BFDCCQ?@CD_aAF?C!5?CCDCSMAE?A#127_???G?A_A@S??WCGA!4?O??_#118WWo__!5?OS?WWOO?[[SGOxWOQQAQPrR?}XPomCYOOOoaa_?_??__#77!4?@?@?B!5?@@?@??@?BCE!5?_@`PO@d#95!5?C!4?A!5?C$#246?S?QgAoA?I_HsI_SaGsAhS_GTAG@G_??C??GCOc?sGCHCGC??G?GO#239?O!25?_GWOG#64O#246@#104A!6?@#26???G??C@A@?@#161!4?A?@A#174OO!8?C?E#154AA@@?@#230?O!5?_?___?OO!15?G!5?A#232_?_#238??OOOW?OOOG??GW?GGG?GGKCC???EEA?EAC!5?@?@@?@#186_???OOO?O???O?OG!5?CC?CKEC?C?ACAAEBAA?BA@A@?B!8?@@!5?@@???@#138?G#29AO#205?@!4?A#171!9?@#157GOWGGOsII??@@@#56?_!7?__#54??@?A!5?A?A???@?OGC?QP?C\?GU?UGO_o_#77?O!4?_?A!8?QO!6?OO?G?G_OW?KCO!7?G??C#59?O#149@!9?A?A???G#165!8?C!4?@???AA#132!12?OO!5?O__o?KADDG?OAA`?C#143!5?A#114??GG!7?GO??__?_!4?_B?AI?OGCJCA?[?QKBCA?A?CaGC!6?@??S_GOCGOcO?G??H?H??CAA#72GOiTOG#99??A@Wc???cO@_$#192?_!4?C?O#239_!6?@#192!7?_??O???_G?Q???G?@?O_?@??Q?_???G#105!26?C??OA???@?@#10c?O?A?@?A#79??@#212_?O??O!8?C?OCQ#229_?__?o_o?_o_?O_W_!5?CQCKGOW{K[KKKMCM!4EJABBB@B!5@?@?@#234GGG?GG??G#221???G!5?C#249CC??CC?C#173O#189_?_?O?G#234!4?@?@@#231H??@#194!9?_??!6_?_?o?oO_o_oWowowwWoGWWGCGG#76OOg#1O#106?GG?O#11!6?G#180!8?__?OO_oogi_?A?AA@#25O??o#15?CA#58C_?_#155?@#38_o!7?C#49CCO???A?@hgK??_C??B@#115??_#118!6?_#250???A!7?CKKCWO??@@HDECHGCG#101??A!4?C?C??G!8?cOA?c#142??@!4?@?@@!7?@@@AAACC?G?HHGPBB?@AAA#126!22?@???BA???E??@!5?Aa#73a#69!12?A#103_??_!5?CC@?@??@CB?CGOCHCD?RHS@IH?GS`HWA]aGPCHAE@GG?S@!5?A?`AA#93!7?C?BC@E@EA?A$#184??G!7?C!6?@!4?A!9?A??_?A???A???_O#96!34?_C???a?`#82O???G?G#29??C#164O#176OGWkCGA?@@??GO??_g!5?A?@@???C!8?@#249!28?___?_?__??G?O!6?O#228!6?O!4?G!4?_!4?@?@#15O#156!7?CC#201_?_?_?_o__?_?o??OOWOWOOOWOOGWGGWKWC?K?KCCCGSCCEAEC!4?ABB`AeAaB?BA@!5?B@A@?@@@B@D!4?@!4?@#169@#23C?o??A#91_?O_#128??_!6?_OoGOOO???O#250!8?G?G#92!12?@#62@_@!9?KK#121CCC#69C???C?G#53C#251??@@@!6?@#119?C???C!5?CARIGCWGCC!4?__#127!14?O#52!6?_#112!33?C!5?GAOHC???C?C?C@???C?A?C???G#101!31?B?C???@!9?A!7?_??GOGTGK#131!4?A@??A!4?@$#239!29?A?G#183!49?O#17_??_!6?G#5_?O??A??@#216??A??@!4?O#155_O#222?ADH?A#227??O?O!9?C???G!4W!28?A?A???__!4?c?cCd`@ROp@@O#243?G?G?gg?_o_?CC!6?CG!6?G!4?!4G??G#247@?@#207!8?G?C??C???C?C#220!8?O#29_???G#188E??C?C??G?C?C_?C?@SO?K??CCC?C???@#26!5?A#21?GG?sI_A??@#50!6?_O!8?A?@O!4?OC???@#114?C?A?O!4?O???E!4?AAA?A???AAOGO!6?OOAOGGG?OO??_OQQgOC]GGKK?eGO?c??c!5?_#38A@HKK?IAA!9?D???A??!4O??@?A#115!25?G!9?GG?O??G?G???@G!7?_??c@??I?Q@CAHK@XD`?a`O@cqGC??___!5?G!16?G#134!13?_?_$#14!83?__?O??G!7?A?@#188CAA#224??!5_oO???G???DC_??OGOXGWGG?CC?KG?CCE?EIACIBEACA?!4A?A#243!12?O??O??C?A#224?_!7?__@#176???___??O!5?!4GOGKWC???OAACC#228?ECMAKECAC?DCECA!4BAA@A@B@?@?@#192!14?G#181OO?C?Gg?_??G_GGKOCKAKCAE?A?C#57!14?_#177!6?G#152_#63?OO#52!7?_?O_O_?___?_#62A!4?@@!5?G?GK#103!10?G#101C!7?`!4?_#122_#72!5?A?A@?DFCEEHAAEBA?@AA!8?O#128!5?A?AA??OG?O???_???_?OOO?@?o___?C!9?wK@PM``KHCl?bC?AA?O__o_#102!32?_!9?@$#192!87?_?C??A#177!6?_#155_#243!4?@#154!6?_#223?G?G?_??O??A?G!4?CC!9?C#228!34?@?@#223__?_?_?_!7?_??O_O??O?GG!7?C?G#205!4?_?o???O??OO?O??O!4?G?GG??G???C#26!18?_?A#207_O_?_C?`!4?B?O?@@A@??ODY@AAM?EADAB??@??@#148!19?H?@!7?@???A_oAA#40!20?__o_KWQOWC??QA?AGHGAC??G!4?__?_#69?__??C???DAA#107??_#145!5?@@#152@#140?A???G???O?oG?Cg?_!6?C!8?GOcG??A$#35!87?O#0O__C@PA?@@#181?C#228!19?__?_?_??_???_O?O__O_O_?_?CGG#230!35?AAB??@?CA!10?G!5?O#221??AAA??@#227!5?G!8?@???@#231???@#5!32?_#195@@#127!62?G#132GCG??GG!4?G#115!24?G#72?W#100!4?@#111@@???_#120!5?@?@#111??_#122?_#99C#139@@@?@#121???@??@A#100?_#125!9?A?OWGCCO???_!9?O$#202!87?@#1G!7?G#162!31?@#155?A???@@#177@#216!48?C!6?_?_O?O?O__O?WO??_O_KC__oSWUmWOIA#207?_?_!9?O#11!34?G#180A@#121!64?A?C???A!7?O!4?B??OO@??D!6?C#107!9?@#115!10?_#108!5?A#98C#115!8?G!5?O???G?cW?c!5?_$#33!90?G??C_#219!36?O!4G?CC???A!6?@DB@B!11@?@#234!38?A#177!4?O#230!15?G?@@?@D@C?@??C#124!32?C#81!66?CKG?CG!7?A!8?A#119!32?O#118!15?O!7?@@???_??_?__$#6!91?G??C!5?@#54!31?@#227!77?@#138!61?_#140!68?AO???OOC#125!61?@#121!14?OG_!6?_$#3!91?_???A?C?A#69!242?C?C??@!4?__??__Og?__gkGqeP?ABA@C?A#81!51?C#127OG$#106!92?O#52!336?A-#237~Tj{Je\iSNsnYntZexQntYfxVkWbC|B~?TgBk@QDiDYDITIC_?C?ACA???C@A@#241@!7?_?C??GG??CAA#173O#176O?O?WGGCE!4?@A?C#230???G???G!8?_?@?Oc@@o?H@d?GoOOxdgH_AECA?@?APbaCC!6?A_!5?O[GIGAK?G?AI?@AK?C!6?A?@#220??_!5?O#171O#195?@#181??O#201?W??_a_ORDU^EbBRo@xghwogOO_WGwoOWCG?O_??OO?G??KCK?CCEGC?E??DC#195c??G!9?GO??C?O!4?@C@??GG??EW_CghgpSxq@C#21_?B#58@w?G!4?WOG#132?A_oOS_wECA?O@S@GO!4?C#50??G#39E??AC#54?O#115?_???G?G??C??GKY?S!8?@@?O?g?L@A@_`aHG?AwgcOiG?AO??WcCE@@?A!8?@!4?_c?g#125B@EC@?GGOS@CK?OOO?`?oOAaA`i@PP_GX_`oOR_AC???@!5?@??AC??o!4?@#119?_?@@?_G???_OWG?cKKGgkKCECM[Wo_Ooo!4?E??@@#102!5?__``aajk}Z]^^NNNLFDFFFn~FCAbE#98O???@?@???@A?C@IAD$#192?g??C??C??A?d?A?O?@O?@O?G!4?A??O_?G@!8?G?_!4?CgOGOCG_G?O!4?C#90o?O#226?OOO??G!6?@#227_??O?_??GC?CSOoW?w_C?CCKEEE?G!4@SBAGaCGg?_G??G?_??C?KKGG?IyWGIW@?G@WHGGG?GG??CCA!5?B@B@@!7?B@C#173?O#194?__?__?O_o?o_?_???_o_wwGGGggwH_XW[gLeEDEDNVNLNFFEFFEBFKKLJKEDE!5BABAB?ABB@@BAB@#173EM??!4CG??CE?C?ALCAE?AE!4?B@?A???AEC@?@???AQ#25@O#23A?@#56_GGOW@??SC??A???@#125AoO?O?Go!7?CUGUUK#114!4?Wg?O_OogGQC!4?W`cG??AA?@O?@_S??AA!4?@?EHCEQXC?tXCa?_?WhX?E@?A#122??C???C#114???A???G#128??A?@???R??C?A???A@?A@AOP`OPO__?P!4?@?@#143?O???G??C_??_#112?@!4?A??CG_?@_G_@!4?S?CA!8?_G#103!12?O@?_???ICPgS@QAOTSB#77??_???OO?WgOgg???B??X??O_O?_$#184?A?@!6?G???G!6?C?A!8?D?@!6?g?O!9?ACACG?C#240?_#150?@!5?@@?a@#14C???A??@#26??G??C#181A#224_OoGOWOO!4?QAB??AA!5?C_cCS?CGAKICE_E?G???CCG???O!6?O???G?G!6?C?C?A??A#235??_??_?_??GO???G??g?G??G!9?G!7?C??@#207S?C#187??_???_!9?__#186??_#248??_???o?Ooo__O#232_?_o_??_??_G_?O_?O!5?__??_#31ACA?A@#36@#57??@#180!7?C???B??@AG?AAA?A?gG?O#51_G?E?O@G@#140A??@#49@A?_#118G#121G!5?CCAAAMAAAcyo_`?__@@WG???@@AA#125B@#103??AG?Oc??O!6?O??O???C!9?AH?@?I@?C_@??c?O?GgE@CDE@DCF`??IOaCWO#127???@???A!6?G!5?_?_???A?A??P__P?@_?OC!5?@?@BBAA#118??@@???CC??CCC?C?Kcwo_@G_p_ZQOeC@@@pPpbFNHLHJhvaf_MCGQ@o?CEG?KGG#72!7?__??_#103?O?OO??G??O#100?@!4?@ABN^Y??@$#246??SA_XaOJo@O?O?cHAk?I_GC_QdGo?{?IGAs?yCw?O_go__O!4?@?@d?A_OoO_???C?A!7?@@#11_!4?G??C#230_#22?@#229??__?_!9?C!7?_G?O???dO?_@O?G?_ODi??Q@_!9?_?O#238???AA!4?@`!4?_??OO?O???O#188_???O!5?_???O???O!7?YUUOGGA!6?C#248???_#171C?CA#220??A!9?@!5?@A?C@#172@#171??CCC???C#220@?@@#248?C?E#243G?_??OOo??_OO_???_OwGo_G?W_GWGW@CEG@GED_!4?A#164???o@A#63G_BG@#52??__?__?O?@#81G?C!4?C!4?@??_!4?A?`@?OIAECD@?A???AA#102?oqaA@BIBC[??`eIggINIE@#119_GCA@A?uoo!4?_O#118!10?E!5?@!6?!4@A?c?wW!4?_#140?@A?@?@?@#73!5?G_?G!8?A?A#141!4?A#112O#116!4?@#73!8?_O!8?A#143!7?C#115?_??@??AO@?_??a??_?Oa??S?G?W?@q?o@Ia@?K?CC!4?C!14?oG#118G#72???m?D?C?G???GtIyCtgZ$#193!4?O??@_!8?C!8?ASH!4?A??O?gAO?CA@?@A[kWgwOgOa_@?DEEEB@@BC?C`???A#166OSOGG?CCCAA@#206!4?C???AGGG@c???A?@@@?@H@#176C#228!10?@???D@?CAA??C!4?G!7?@??@?@#206CC#176C?C?A#229?@???CA@!6?@A#205_!8?c??_GKCC?C#173GG!9?@#172!18?A???A#235!7?O#192?A?A?A?A@!5?@#207?G#235!5?O#216!4?Og??GWGOG?GwO_GG?O?GCGEK?ACAC?OCK@?GO?OC?G?CO#57@#207K#13_#18C#37O?_#55CEeACC@DA#142?C?@B@@?@@#119AA!5?SOCG@!8?c`W?CCC???C?@#77?@?@!6?q{WW?AEC#69?_OG?C_CQO!4?o#102@CA@C?AXK~^BBA_oOGC!4?AA??IA?CSW#132@@B?C??COS?k?GO_QIg_O?O!5?C?KIICAAGOG?gI??c!4?G??S?C?C?WG??`?@?AA!4?AA#103!9?@?@?Q?A#107!16?O?GC?_!9?O#119!17?oO$#196!25?@!8?C?AC@?DA@?CASG???E!4?G@OI?GGWC#97_!4?GO??G!8?@#189?G??C?A??@#236_!9?W!7?aA?QG_a_???O??!4OC??H!4?@@@bc@?`_???_oO_o?OO?O???@?@@D@@??C!7?A?A#26__???O???O!7?CG??GGCD#205?EEU@VB?A!7?W?OO!5?O_O?GG`Go!5?GGgOgW??OG?W?S???gCO?A#176O!8?C#28A??C!4?A#186!8?G_?_O#223_#212_#178??O?OK?CHE#124??K#177?C#91C?O@#50?CA?AA#116???I!7?@#140_?__!8?G#59!10?OwgO_?OogHCO_?_?GrbL?C@_?O_??@A!9?C!6?A_#101!10?oG?___gWwGc?s?G#121@?AOC_wo_g?c?g?gOcCCKkKK?CCC?GC?CCI!4C?M?CX??hS_c?g?gOGo??AbNKYYyuXXw]o^OPENZIFBC]?__!6?G#101!26?@!4?_?_?O__O_?g!6?@?_mPnYmy[so_ctIoCpGQc$#239!28?A???_?O!12?@BBB@?@??@?A!4?_??OG??A?@#237A?@#182?_!8?@#18!5?A?@#155@#231_?_!4?O_wG!7?QGAIGG?@O!5?AAa!5?AAA???@??CD?CCQAa??o__x???@_OC?A?CC??C??C#201_#194_#223@??@??!4@!6?@@#172?_??_?___#243!34?_#187??_#186!7?O??W_oO_w?oWg?OgG??__#124@!8?@#228?_?_??Oo_Oo_o_oO_O_O?O!5?_#38!9?OA_O@?_!5?C#127?_#73?CWWKGGGHOC@`@`B?M!4?@?O??!4A!5?@#107???C??C#40!5?@#101??C!4?@#121?oOoWWKKK#72!22?o_?GO#77?_?O?{?g#119??A?C#116???AA@@?A@AA@??A@AA@A@@?O??_#114!53?@?Q?A!7?E?ECAGTG?pICcICPGOBQ?O?G??@?@!5?A?A???O???cK$#242!49?O_O#105!5?O!7?AA#245O#137@#252A#35??G??C?A??@#223__?_?O?_SGG?C?CG?E?cHDC@?@??GGGC!6?O!4?A?E!9?OOO?OO?O?A???G??!4C!4?AAC?A#228!7?A?A?@A!6?!5A@A?@!5?@#209!44?@#26!24?G?@?EAABA?@?G?@?E???!4@?@A@A!7?@@#128!20?C?__P?C?QA__?_@_#49?C?_!6?O?OGG#118!9?@#101!7?@#72!12?C#118!8?@_??O?@#107!21?@A?A?@#108?AO#112!11?G#126OC!4?o???_???O?K?GGC!9?IC?C?_hJUjUYuQ[?kPNwyCC?p?`!6?A???@#102!13?OO$#96!64?_!4?c?A?_@???C#167O!8?@#156!4?AAA?@@#174@#197!4?A!5?@#234O?O#243!17?A@#247!6?__??c!7?@!4?@???OGW#248?_??_#224!12?@@#216_C??S!7?@!4?B@!6?A??@#181!58?@#180?D#11?@@?@@#5?@@#227O#157?A??A#144!39?G?G?G#69!10?A!4?G?WO?@@!4?__@?`!4?CLC?C#99!53?WWO#100GO#73!16?G#49A#129!8?@#69!71?G$#183!64?OG???G#64???C#2_#82__!8?C#228_!5?O??G!4?A#219!4?@??A#235?_#216!31?O#249?C??C!7?AA!6?GG!5?O#247!10?A!5?C#232?C??EBA??A#188!73?A#230??O???O!9?_#145!38?O?G#115!17?K$#153!64?GC#83__?O?G?G??E??A??@#234!14?_#243?A#232!6?o?_o?_#243!45?A?A??_O?G!4?G_G_GGOO?[_[OOS?G_GW@A?O?AA@ACABD?@A@?@#189!66?G?C#223??_$#244!65?O??G??C??A#214O??G?CCAAA@#249!21?o#238O?O?O#232!44?@???o!4?_O_?_?OOSc?CK#189??_#187?G#248G!5?CC!4?C#231!79?_#79A!7?@$#208!66?G#104!11?@#1@#216_??_O?G#221!74?@#180!23?O!5?O!5?G???C?G?DA$#30!79?_#207O#29GG!4?A?A@@@#186!98?G!4?G?C$#235!81?O#201!112?GG#221O?O$#192!195?_-#237~Dq}hUKrC~iTnqlyKzlUxNuj\alYftYmOLQKQ`oAS_sI?Q`???C?A?ED?a@_#226OOO?GG???@#243OOG?GEA?AC!6?A#212!4?GG#223???GCGGW!6?C!5?A??AAA#189O?_!4?_?_#243???CGA?K@IGO?K?GIGELWI??EG[CGA??CC?G?DC!4?C!5?GG???G#235O#172!8?@!5?@!7?@#188_!8?_!7?_???_!5?_!6?_??_!8?OO#26O!4?_?__!7?_?_???OGO?OOO?OOO?OOO!9?OO!6?O#25O#7_#34_#20_OOG???__#55@!9?_#132@#130??G#125?@!4?@??BAA??CG?SSC_?oO_#115@?A?ICCGAABA?@?@?@oYwASAGCGCGCaAP!7?@D?CC_??CB@@@?O?O!8?OO?GGgCcQDC?ALOAA#112@!4?G#125?AAAEDD?KAALGASP[OVB?`Dc?oG_?O?O?_o??oG__goOOCcCC??OgC#73??@#112??OC_?O?gOO!4?O#132?@#73?@#107!13?O#103GI_POPQ_AXPKhLO??@AG?A?C#100!11?_??O??_$#246?OK@AGrCX?T?OHACR?AgA_GOATQ_?Gd@jqdplIFLHB@PF?IAKC!7?@#214G??_?O?CKMEE#82CA@#247OOO!4?C??CC#223P#243!12?_???O!5?A???C!4?G??C#15?_#249???C#231CA!4?A??@??A!4?A??@?B!4@!4?@#232@J@JA@??@?@#173GG#180?C?_#247_#221@!5?@#187!12?OC?C???C?E?CA???BA@?@IAB?@B@BBPO??@@@#186!6?@_?O??G?A?GG??@??C@A?@!4?@#228A@DA@E@BB@?@@?@?@!5?@A?A?@B@?@?@!6?A#28_?_#21??C#36O#15EA#58@??_PO?O!4?g#116C??AEQ@#129!4?GC#55??O#49?@??CA?G?G?GAO#118??C#114??@@@?AB@@??@@!6?@@?B??AA@??KGKSLpRPOPWqxrHLphGwOsg@CGG#107!6?ooCIyaC#114QOG`I?LOAGOG#119?CC#73A??G!6?A??G!5?A???_!7?O#141C#143??A?C!7?@#118!18?@@?@@??p?FAaayy_LTT}{WYW]WHple_`H!4CHC#101!4?_?Sc[O?s_XoIkOmS_[hShkIID?I\?nOnPeJuJ?VgVitIt$#192?a??S???a??a??O??C??C?@?_??DOA?OC?GA???O??AC?@!4?A#83_??OOGGCC?AAA?@#188?OO?G?CCA??@#180@#236_G?SGG??AEBA!8?@??CSOO??GG!5?D!6?AAA?AAGABFACC!8?@@???A#228??C#180G!7?C#248A?@!4?@??@?B???C??___???_?o_o_?OG!5?GG??G!4?CY?GKIMWS[[]!5[IGX^YMC\]NlW[}?EIFFF@?@C!7?CC?AA!4?O??O#188??OW?G?OG??W??G#25_#15_!9?__O?o#20_#63_#51_#163@#178ACO@CA#9???O#63_??A#52C??GA?C???GGCOO_cCAA?CG???GC?G???O#121AAA!4?A?KI[K[O___cW?OWIMIoAA!9?B#77!7?C!4A!7?o!4?__??_?_@?@!8?@#121!9?@?WW{[TcGPGp?o_qoo_?_`G?A?G?SOQQHE@EIICHE?K_D?CD??HGGOPaRSHCBpMon}lzY}m}UMMKCGXHH?@?AAA?A?CC#102!9?___?Oo__`OOKHBAD@HK#59A#103!13?@#95O#99_#53??C!7?_??@?C$#193?G???@?G!7?@!9?G#239??G#193!8?CG?_??__g??AB@A@A@?_?_?@?__#171_!8?A#186C#230G??G???A??G??@!6?_???_!4?GGG??A??@D??@!7?C?@??@G?@?@NAM@?@??C?@B!5?C?@@#238A#195!7?A#171?_!4?_#187??C@!6?O#232!16?O_!5?G?O?C!4?O#221?@???A?A#205???ca?_?a__?QbA?UoCG??_??A@CA?A???@??@@!4?O??OO#124??O#79_#180G??O!8?GO??G?GG??C???KK?O???O@#19!4?GG#56__?KBAGC_C_?Oo?C??G_oo??__!6?_#81?@!7?E?G!8?OGCo?_?o?I#102!4?@??@@!7?A??G!7?A?A?@??G?IAFBNT[C}_IE@C?@@C#126!15?a_PO_OG_?O???OO??_`?g?G??G?AOEG@@BC@ABAACB!4ABPG?OkA_?WC`MO?A!9?G#107!6?C#77!20?_!7?__W_GS?PcJdAC?GC???O@@!7?LOmHC@CI??_??C$#239??@??_#184!5?G?C??_?O@?O?C!13?O??A!6?@#244o!6?_??A#137?_#14???@#106OO#205__O_#235GOG!7?CG#224__?oOOWW__GWWC???A??G#249?`b@_#247?!4G??K??C??C??M??CCC!5?O?O@CAA???C!6?GEA@FCE#207!6?G???O!29?@#186__O??O??_!4?_#232!13?C!4?A!4?@??@??G?A@?@EBDADF@A?@??A@@??G?@G#195!4?C#31_?_#13?__?_#232CBC@CC??A#173OOO!5?O??O!5?_?AB#13?@#91CC#38C??G@???_?C??o_G??GCGYQAO_cswOOOo?__#69???!5@BCA??COG!4?KAS@C?OH_E[GWuwSySyPP_@???_!4?C?_O?C?CA#118A???O!9?__??O?g?KOxoc_dLs}bb@@#132AA`G`?WIG?G???XGA?h?cUIi@LC@W@_cg_GG_K?aOWCKC?ABiH?hER_IO??@??C#114?@??@!4?C??C?Q_g!8?OAOHECOGHI?AHCCOC??A!4?A$#239!39?_!6?C!4?K?C_AE??B#209!4?O#201__#182?G?A#138?A?@#231?oOoG!5?CCC??@!8B?_?_bbA?QO?O#235?OOwWoCO?_COSG_???G?!4_O???__k_I!7?G!7?G!5?D!5?O#243!31?!5_!8?_?___?__#173!19?O??O??OOoO_!8?_??_?!4_??_#76??O#28_?_??_?_#124O#207G#21_#23_?_?__?_#195AA@?DE???CGEEA?@@#51???_#74OO@!7?K#125@#141?A#142GG?GQO??__O!5?__??_#119@?@?@???KA!4?A?G?C??K?C_??@kCC?_?c??_?_@?_!6?___??G!8?A#101???C?_@?@?@!6?@#127!18?CCC?A?D?C?A@C???C?O!4?_?_?_?O!7?OG???__#119!21?_?A@O??O!6?@@e`b_deC!4?A#107!11?@#72???_!5?OPjPbXbUjEOCOID@aXOa??OoGOtgUGPIpI$#196!41?S??G?O???G?C???@#241OOOGGKKEAA@@#181G?C???@#228GKC?`b?@@_?__?_O?Oc?ow?O??G#238???O_@o_o#221_#205_#228C#26_?o?_OO??_!5?_!8?O#232A!4?C#194!8?__?_!11?__??OGKU?@@AQE?A?@BJ@JBFA@A?!4AEB?C@AA@?@B?@?@A???@#26!22?__#189O??O???_#194??_!7?O?O#189_!4?_#227!4?C#186!5?CG?KAGAGKK?MCC@!7?KG#23_!5?G??CA@#144HGA?O?_??OO_#73???@#116!13?C!8?_#112!10?_?O!9?C#54!5?_#59@??@!4?CAgqM_?@K!5?AGQ??g?S?H#111!9?G??C#128!28?@@D?E??C#116!16?O??O?G#73???O??C#115!22?@?Q__?C??G??G??@??@A?GA?POCAA?HC?AI!4A!4?A$#202!41?G#240G?O??_???OGG#150G?O#232!12?_?__#249___?_?O?O#232!19?_!7?@@@#224???A??@??@?@#205!12?___!4?__!7?O!5?OO?W?OO??AAUA!4?O?gSSCHG_GWOC!5?___G??_??WGOW?O?O?wsoO#176!29?O??O!4?!4G??GG#29_#223C?CA?@???A@!7?@???A@??A#177?_?_??_!9?__#157??_??_OGG#24??A#37?O_CCcGWW#132!21?@?C!6?GA???O__O!6?_#103!27?CK?C?A???C?A?C??S?__OIAy?]C@I@@Sa?AR?_AAHOA_#112!19?_#116?A!5?@#128!12?O??O!8?_#69!21?_#103?_??C??C?O?_#98!30?_!9?A!4?AOc_Is?A$#153!45?C#105?C#242@??@?@#150!16?@@#109?@#216??CA?A#229A?_O!5?C??SC!7?S??C!9?@#216???!5GgOOOW!7O_???CGO@O!5?CC?A???G!6?CCAA#26??G??G#220!30?@#192@#238???G!7?C!9?CA??C?G??O?C#243!8?G!6?C!5?C!4?KCCAIC??M?GOAIA?G@A?A?@C?@B@D??A?C?C#124GG!6?O#164GGA?C@#142!4?A#128!4?@??@A?DB@?C?@???@@@\?@A?C!5?O??_?_?_#59!5?@@?A#102?@#40!27?G???G#121??O#112!77?@?@?@#135??@$#137!47?O#217?OO#96?O!8?@@@#207!12?@#173??@#238O#227G@AQAHHG_CC?_?C??SEDJB??CCGCCEEA?A??@?AAA??@@G@@_?GG@G???C??@!9?A#235!59?C???_!5?_??_?_!4?o!8?@!7?G!4?O!4?O!4?G??G?O#205!13?G#235C#216!12?C???A?AA???G??CC#140!12?ABAA!8?A@DC??MAIA?G?GGW?O__?O$#204!47?G#183?_#64_??O#188!64?_#206@#176@?@!4?_#188!9?O!6?O?O?O?O???O?OOG!4?G?GOw{!5?_!5?H#187!65?CCC__!6?_!6?O#249G#230?C??C!4?A#28!20?O#164O#207GG!6?O#212??@#145!14?O#49?@??B#73!19?@@EACCGA?KW???O?__!4?O??_???o$#208!49?G#16??_#97_?G?C?GEC!4?@#234!51?C#173!23?O#186?C??W???O?O!6?O#216!86?G!8?GW??KGC??A!7?CC?@CCCEC?@#188!12?G#201G#223A!4?@?@#54!47?@?@$#201!145?!9_??_?!4_o__o!4?DErgRAHQaaOC@UdfMwC]C[wKU\fx|GSPCAA?DGCJ_???C???@!8?@!4?O?@???_?GG@#171!4?_#207_!5?_#201?A??A??O#195A#21!34?_O$#195!145?O#238!102?A#195??G#220!4?_???O#247?G!6?G?G!7?A?A#176!17?A?@@?A?@@G??G$#181!258?_#221O?O#13!37?_$#171!259?_-#237lRKalQLAlQH`Q@e?n?cXONG`JcNGMTJm@?HADIDN@AE@b_@???IGK?@#198KC?A@@@#243O??GO?GKCA??@G#212???G#156G#176C#235O?G??G!6?A#187O#248!7?_?S[QA?B@#181!4_C!5?_c_?Ag!4?G!5?O!5?O!4?OOO?O#191???_???O!8?_?O_?_???_?_?_?_?_?_O#31A#172??GG??GC??CKA?CKCCE?CACAC?A?A??A??@?@??@#138CK#11CG#4G!4?!5_!7?_#24??O???_#55C???CCK#15?@@??@#21@#74!9?G?G#56??K!5?G?G?G!4?C??C!8?_??@??hG!6?_?@@BB??@AA@BCA?AFD@C?E#140?@??QZC_#49O_@__?_#143G#118?O?_!4?_??C_OE!8?@#72_#102G#115!5?@?C??@!5?C??G?GAGc_?OGoOA@_O_?@?AC?H??G!4?G?GA#126??K?E?@CoH`Aq?Sp?oC?C?CC??C#140!4?@?@??O_CP?`_KCG#73?A#121??G?@?E?O?HgIdJPvW^lz[jXRzXY}Ueu}SKG??OO@!5?O#107??G#102O?_?cCkidcS?B?CAc!6?AA#98?_?OAESDO@KACG#100!6?@$#246QkR\AlQ\AlQIdQHvON@cboVY?XOQpiOOENEKI#252O??GC?A?@!7?C#171O?GGC#205K??A???D#229O!7?C???O@A??A?B?A#236??C?CCA?EC#235!6?___G??A??@#218G#193G#166C#82CCG#106G!8?_#194?__aEEAABB@B?_!7?C?!4@?_!9?@???@???@H?G?!8G?C??C?CCCGEEI?CC???G?A?CI??GDADBBD???AA@A?B!6@?@#157A?A#23GGGEG?C?CAC??C!9?_??A?G??X?P@P?@@`@?_!9?_???_?A#55?OOooq`aoqKAO?_??@_#74!5?O@??A!4?Aa_CCMKGG!6?@?_#52A?A#116?CG#73???OOO???_??DDBD?A@#59?O!5?___oo_KEO[qtmc!7?R_G??_A???O???_!5?O#112@?CA#121O_!6?B!8?KNBNHJcGHo?!4@E@C?C?C!7?C#129!8?@#127!5?O!4?OACa??C_#73!4?O?_!5?A#118?CCC!6?@AQS[|d_yuRZPp@OEAGC???OO#101?G?gSGXgHYULY[o@G\SBmLlHgGH_@gP_JOGPaSiTiTiPkA$#240??_#202?O???O#252?COGC?G?OI?C??C#204_!9?__#242O#96_#241O?_?_oOYWWCM?A#194_!6?AA#106?@@#249OO#223?_?O!9?@C???C#238?_?c??gG?gg?OGW_KcCjBA?@#188GKC@???O!4?_??ACG?GN?O???WOO??GGOKG??G?GIG??KC?AMEGCCIIBH?CGINIG!6?A!4?C!4?@?C???AA??@!7?@#192???G???G??G?OG?a?A?_?OA_#105OO#0O?_#9O?OO!9?A_#76@#31??@#63GG??O?O?_!4?_?CCC!5?A???O?@??_!4?_!4?OOa!4?E!7?@?A@A??C!6?O?@?Aa_c!4?G???SOO_g_Oo_#91?_#128@@@?QTMBE?C#119?BO??G!4?O?A@GE??HPEHDIFA?@!7?@O?OA???O??C??CogCG#103?EL?BB??O!5?K?O_GM#77_#73!6?O???_??_OA!6?G#112?C#128???A?A_@GPAHAWCoWGoCI?K?CYBa_MP@#126!4?A?@???D`GsI?c_?C?Sa??_??_O#115@?@??B?A?C?G?CGIC`?AAW@WB???A@#53!5?@#72@??_Goo_g?O_?o??_GOPIECeEeCa?GCG?kAp$#218!6?_!7?O#192??_O?G!4?A?C??C@G??@?@#196I?A@#166??G#14C#203__#202_O#153_#183@#105O#207_!4?G!4?A#227?_??__?O??OA?QP???GG?C???@@@!7?A#249!6?@#205G__?_#29KL?C@RO?_CO???C???G#221?A!8?A?@#124?G#243G#106O?_??_??OO???O?_?o?cCOQ!6?O!8?O!6?GG???G???G!4?G?G?G!4?G?C?C??C?!6CK?G#207?G#79C?G#21C??G#18G??A??SAP!7?P#50CEAA?AA#56???GKC#13@#18G??`!8?_#91!4?G?C?C#20???@!4?B?A#92@@?A?A!4?C?G#148_#144C!4?G!5?@!6?A?@??A?ACG??G#55!4?AO___#132???G?HU?_!4?I?_#54G!5?_??CH?AD?@??@!5?O??O#77GG!6?@@!6?A@_#107??GLG???@?I@#101O#81!15?O#132o_SI@CEQO?}A?o@pH?_G?C??C??A?AA!11?O???k_HGCPWLhcQSA?CGA?A!4?G#119?CD@@H???___??B?@!5?a!5?G#77!5?G?GS_PO?gQd?@?@?@S@A!6?_?_PoHpGXHSaPaTAPK$#244!7?_??_#193C?G!5?A!4?S??@!6?OO_C??C?@#2???A#150@???CA??@#137@@#247?_#232___?A?ADEBB@#234_!7?o__Oo_O?OW??QW??G_?_??OG???D#187SC_#26GA??@___!4?POOOQOO??OOO#192__?_??_?_??_#172!6?!4_?o#192O#105_??_?_?___O!5?_o_?oOoO_?_OO??!4O!8?_??_!4?OO#193??_?o?o?_?OGO?OO?_#181!5?A!9?@@#188@#37S?CGGGCG??WO??_??_!6?_W_O?O_?__?_O?go!6?_?___#25@?@#86?A#155@??@#91GGGD#50A!5?G#70A?ACACD@KCG?OW?WGOO?O#20??_#58???OOO#129!5?G#149_#125??@I`[_FA_!7?K?A#114GG!11?GOAOEBLIPQm}igCs~c^fyjYcbJ??O?[G??C_o!5?ADOggOe`O_??O?_#125!6?O??oA?KkC?_GIIAqHB@IQ?IOA_cYCc_EICI?KGCO@Bpc}BTqSxgaAUQ#112!6?@?O?@!4?A??G?G?g#114@A?AGC?GccAE?@Gt?gAOA?A@???@#100!10?G???G!4?B#99QEEAC$#240!13?_#202!8?_#239???__#240??_#105?_#198O#0!4?_#83_O?GGC??A@@#246O#191_#218@#172O???C???A#228?G_!5?_?CAC?K!4?@BB?B?@#248???O#194!18?O#220?OO#172OO!9?__!4?_#248@#207?G??GGGO?C???A?I@!7?C??CAI?@!7?@A??G#173CC?!4CAA???A???AAB?@?@#26???@?@#180@#171AA??C???CAA!6?@!6?C??AA!8?@#51C!8?A?EA?A??C@??AAAC??AO!6?_???A?QQ@AD`GDZFLUIEKCWs`??A??@?G?OA??C?G#20AC??@??A#152???_#142!4?@?@???@?GH?ACBAO#121!11?G?HGF^Fb?O?GDC???GH@EI?E#40!4?_G__???G#121!4?_!6?O??OOA#73C#101?A@??A#118???EMNJKK?_BBEP?CFNBBR@@OO#127!11?G!5?G?oWoOGq__oO#143!39?_??_??_#103!7?@???G!4?g?cGO?dPDe@g@SQPAa_EAc??_?BEEC?A#53???O??_#48?O$#153!32?O#202_#214!5?O???C??C#240?O#217_#192?O#96?A#193A???@#186?GGK_C@?A@#230?GkIKI?ACEEA???@!7?D@??@?A#22!14?ACAA?B#76oOO?GK#187A??a_?@!6?@#209?_?_#198??_#187!11?G?G#186A#193_!9?_??_#201@BA??!4@??@???CG@???G??A???A?A???A@@B@?@@@?@!5?@?@??@!8?@?@@@#24?O#5_!7?_#16??_#2_#34??_#91G?G!4?O#20?__?_#38!16?G?G!7?GCG?_G?GOOC?o???C???HOooo___!7?@!7?@@???A?KH^[sKK#81!9?S??_?A?_A?@!6?O#118!19?A#102!5?@!7?AO?OAdGC?_#119??Oo?O??C??O?Wo{kc]elbo#116!21?@_@?H?H@_H?TH`PoarQ@_GC?G$#226!41?_O!4?CG?C??G#242CAA#216_o?OO!4?_#224?O?O?OO?OOGG???C!5?@#249??A#189!22?A!4?@?@@?@#124G#216@#205C???GCH@?H?CCC!6?A?A?A?C?AC!4?G?@#181C??A@?C#205???JA??A!8?@DCG??@!4?A??@!4?A??@!4?@#184???g!5?O?__???_??_#3?O???_#34??O!4?_#74?G??C?G#56??C#155???@?@!27?@#18!6?@#7?@#128??G#149G#142?G#177???@#39??K?O??O#81_#145!6?A?O!6?_C?g_???_C???G#112!20?G#69OG_O?_OSe`O?O__OOW??KO!6?@??@F@??G??C??WC???_!4?O!5?_#73??_!41?C??C!5?A$#97!41?W!6?A?@#244??@#124_#181O#26O#173O?O#201CC?C@A#231!6?@`!4?__?O???GGCGCI!5?CG@?D@BA#209!10?G#198??G#182GG#10A#79?A#11A#173?@#235?@@?P#220!6?_?_!7?_!9?O#198!4?O!8?O_OOO#195C#187G?H!4?@@!7?C#220?C!4?G!4?G#235?@#191!12?GC?G?G?GGG?G#31!4?C?G#177!4CKC?E?A!6?A??A@@@???!4@A?B?A?A?A??@!4?@?@?@#23!25?@???A#121O#86!6?C!4?G?G?O#115!34?CO??O??_WA@Eg#54!31?_#72!4@$#182!54?G#195_#176_#220A#235!5?OGCGG#236!6?_```#189???G#221?_?O?o?_o?__O?o?o?WoGOSG???R?O#30!7?A?A#137G#171!5?C?CC?A!5?O?OGO@OO?o?__Q?O!8?C?C?OA?@!7?O#28C#186?A#235A?C?C#176A!4?A#198!11?G!6?G?G!7?G!4?G??A#28!7?C!4?A!8?@!5?@#38!5?GCGG?K#54!46?CG?O#125!97?C$#206!83?C#247??C???C??A@DA@?CAA#27!18?@#138?C#201!7?AA?CC@?D???C?AEFDDDCDDHJAGI?!5@#109O?OO#26@!4?CC?C#104???O#221?G#109??O?O#207C#193_?_???_?O_?_#208!5?O#220!19?A!7?A#12???O#26AAA#207!4?@#13O???A???O#92!8?A#69!51?G#37@A?C???ADAAG?IU[CCS?CGKO?ooO?__???_$#243!87?A?A!9?@???@#32!16?C#76!44?G??G#180!5?C#243G???A???A!5?@?@??@!7?@?@#188!32?A#1__#15G???A#58??G?G?G!8?GGoCoOOOo_OWO?ACMkmM[]]]CMCCMOqUqq?OQ@S?AO_??C??CCC??@__??@!4?@G?W??`?_$#124!166?A??C#216!16?A???A!5?@?@#7!40?G??O?O!4?@!5?@#49!61?G#140_??O$#11!167?G#189!20?A#196O??__?o_OoOoooOo_O!4o__ooOo?O?o?o_?_O??o?OO_?__#35??O!9?__#19_A??o_O?_#62!57?O$#198!191?_#20!55?O???OOO$#14!247?_#26!4?@?@-#246Tii`SIgTQLqhUWVgFQBVIfQ^@J@E?ABA?@#90A@#96A#194_#207_?o!9?@#180@#221C???CC?CC#224??OO#176?O?OO?O#194_?_#216O!4?GG?G#187O#106OO#172!4O!7?G??G?G!5?ACA#246!5?O!9?O#137_GGgGGG??GG!9?C?C?C?C#208!5?COCG?C?C?GO?OGO#137@#198!5?@!4?@@?C#237?_#184?_O?CGCG??G_!4?AcOGA?AD?A?@A??OMSG?C?OS?OCa@_??Q??OC??_?C!4?_#58G#24_??_!8?AA!4?CA?C#0G!6?O#19G!8?g?GG?__???_#91??AGCOO??@GHA@??LOOOGA@??kBAAC#52GCsK?GG?O!6?G!7?_?_#125?CGBG@?@#81@@!4?A#40?_[CW#77O?G???A???CCMI!4?GG?G!4?GGG?CCKG?IK???@#121!4?_OO#54?O#103!6?@?@@#73?O??cYC[wOA`G_O#141???@#127??aBh?C?A`C@A!4?@??CA#52!9?A#127!6?@!4?H?O??_?_#112!7?AC?C?C??A@???O#115??OCQ?G_@AI@_c`aQAO!8?O?_#108@#72?GOO???AL?@#114?G!4?A??ABAA?A?A#72??@?O`O#100O$#237i@PSI`TALaLQHFgFO@CG@OL_GCC@?@#218?_?OO??G???C#228_!8?O!4?!4O?O`!9?G!4?G#188??O#181OO#198??_#196???___?___#191_!4?_??_?O?O?O???C!6?A?C#109?A??@#172@@@#194???@!6?@#191@???@!5?@??@??@??@??@?@???@??@??@?@A?@?@???@?@A#237!20?G#239??G#105!16?A??GO?@B?CICGQGOAA_oS??_!5?CO???_!5?OoO??_?o?_??__#3?O#51A#58@@#24???_???_#13!4?O#58@?@EK?O!4?_`?G?K?O??_?GAFGB?_`_!5?@?@@??A?A@@??AA#128!4?@?A!5?@!6?@#59???A???G?A?B?@A?@@?@@@B@!8?ACA!5?AC??Wh_#118!5?_CO?OQG?O?ECCC?A#121X[WCO_?N[[O??DIC?q_#128???SgCwO@cTjWRk_DDIHSQJ@AEaGwO__?Hd{AYSK?O_?_#119!20?ABBAAQ[KOC!4?__#102??QWGGGLDLt^H]Inc_??O#59_#98!4?@#53!5?@#102G?A@?KKCC?CKSKWCc$#218?C?A???_!4?_!7?C#196???O???@!5?@???@#232_!4?O???OO!6?@?@?@@#216??@#231??!5G!8?AECCE!5C???A?A#201GG?G??A!5?B#196O???o_g??wwqsoOoW__!4?C?C?OCCScaSkcS_W?WagoGwcsogsiKacmWeWkOCICa?OwsgowSwoSOKwcWsGwNC~PQra\fTJ[uJ|OGBsOlOoItWeWtM`_@qDy@m@@NQSKVmOciSiqkoKsgOK_g!6?_??gWo?o???O??_??OO???OO??_#177@#56@#90_#63A@@@?@??@@A@BFEEIGOO?_?__??_ocaq__??o?G_#142!6?_#128?G_??O__O#49_??o#51C!6?C?G?O#49??B?RQ!8?O#72??_w_???KGC?CCCG???A?GG#121CBB#101?G?G!4?G#72GG!4?Oo#81!9?_#77!10?_#81??G!6?@#125_?ABEcOOgK??XwSiQiCKQI_S_c?C?A@?H@OA!9?_?@?@AQ[cXhOo?_#118!19?CKKLbbhHUAMcOC_#101!7?G???_?_?BCACKTgdYPMTQlQDa_APCOo_Wg?g?_?_@XkxkYln$#244?OC?_S?G_O???_?O?_O?O#193???A???G?C#242O#203@?_OOOGCCA?AA#235GGG??C??CECAJC?AE?C?_`?@@@!6?AA!5?G?G?GGG?G!4?C!4?@#184_!7?_O?O?[?CCGGG_G#220@?@#96??_!4?OG???O???O?O!6?_#184!9?A@???AA??A?CA#246!56?G_#109!6?@#0!4@!9?O???C?CG?O?G#37@@???@???@?B?EB?A@@?BM?MWUKyDAA@A?@CG??GCO?__?_!6?YO!6?o_O#140!10?__!4?OoO?Oo!7?@?@H@?CC?A#63??_#69KLdC??I!4?C@?@!4?@#87O?o__oo?_?o_oO_o___Oo_#119?@???@!6?OCI?di`@BFa!5?x`abB@aAE#126!4?@??@P_KF!4?@?@#140!7?O?_??O???g?GOE?CGD?Q???_?_#121@A??CGDILomtrMB~|jnY~I~nt[{Wp`_#114??A_hSOIDOKQ?C?c@__!5?@??O?_#108!13?O#59!5?@$#240???G@?A!9?gCG_?G_?_?O?A??@#213OGKCK?C#106O!4?C??A#26CEAA???@#247G?AI!7?_!9?CSS#209?_#193_?_?_?_???_#205GGG???A???A!4@#193_?_?_??O_!6?G!4?WsOSooogcoOg??_?GgKcWcGCGE?GGKQI?_?O?aG???_O`?_???@C@i?@g`o?G`ACBOi?ICGSaGaSa@SAdQkA@QdAdGbGdAOMPICO@S?iO?G@_?O?G#1!4?@@@??A#4A#20@AEB@G!7?@!4?@AAA!4?C??ECEE???C??__?WCWSC[[WOGOOo__#55@@@BNCQ!7?ABB!8?GGCG?OGO?S!7G?wwWWwopOaE?O_??_OwSOO#114A?_?_P@A?CBA???@A@?A???CC?AB???FECFDBCC@@AE???ADQGaHD!6?EcoW@ZWrIqEC#132???_G???`?cWJicAQ@WCCA@?@?AG#129!6?O??!4_!8?A#141!7?@#132@A?ACHDYDOM@?GOo#107!21?`?O!10?A?A?A???G$#239!11?C!5?G_?_#202???COAGCC_#241?I??G?E#209O??G#240@@#212!6_?!5_?___#249G!4?GG??CC!4?C#192_???_??_???_!4?OO?O?__O?O?OGO_O#209!10?@!4?@@#104?G#183!11?_!9?_!15?O?O!4?_#104!74?AAG#9?@???G???@B??A???C!7?G#104O_???_#192O#5G!7?_#34!5?__?_??__#51?@?@@EGK?O?GOC!5?G???C#20O#152GA#116!9?O#50?_??_??_?_???__!6?CISg_C#148CAAM?_#62WG#102!5?C!4?A#99?C#93_??_??O#253O??_#84O#47_?O??O!4?_#93???o?_#102!22?O#69!7?@#116!19?O??_OG?FGBIYWOCAKcS|pLpFhTY~CYA{Cg?_#126?CA?A?OA@OIC`K??OO`?p?OG_?_#103!9?@?G@QLHAT@sAOqG_S@SO?GWOa?A?C?_?_??gCCG_Ic@A@?S@QGQCwA?A$#137!25?_?O#0oGWK#83CC#233?__???G#186_!8?O?O#243POO!7?@_@#186?@#221???_?_!4?@??@?O@@?@@!5?@#248?AAA?AB#198_!8?G?D?C@!8?C@??AA!5?@!7?@@@?@??@??@??@#192!12?A!5?@!8?G?C!6?@?_!4?O???G_?G@?@c?G?O?CO?G`??_@i?i@?c?`?AG?k?O_???C??OK#13@#34A@?O???O???@@?AA!4?C??CC#2??G#193O!6?_#38!22?AAK?XCEA??@??DKKF@!4?W[SOOOAAEEEIECCC?C???!4CHIACGo_!4?_#54???A?A??D??@?A#98_?OOWOWWW?G#103?CG!5?G!9?A???C#115@@?A?OGSQEB?@ACG?C_GC_G?G??C!4?@#142!30?_#73!26?A#77!49?_???BDI@ADI`mOg?QkQOBtKoHAO_OhO`@`@A?QCBCA$#204!26?G!5?__!5?G??A??@#238O?G?GG?G!7?GIIK!4C??CFDE@A@?BD?BB?ABAAA??@@??!5@??@#106O?GGGC??AA?BA@AAC?A?A?AIA??ABBA?A?A?A??A?A???@@?@??@??@#246!12?C?C#3!74?@@???C#19@#63C#51KC#2A#237C#137G?_?_!7?_??_O?_???__O???_#49!25?A#56??OD??LA!5?C?tOc@?BBb@@@!4?AA?A?A??A??BA?CG#39!4?O?G!5?O?AkG#73???@#48_!5?G#40!4?A@??G!8?A!4?A?A#102??G?AK_CEDA?@$#1!26?_#2_?O#97???A?A?@#244AAA@#153C#172G#188G???A!4?A#195@!6?_?_#230!9?G?GO??G#236??G??G!4?CC#247!4C#153???_#105_!4?_?_?_GOKGI??m!4?CAC_O?C?C??C?E?A?AGCA?A?!4A??A?!4AC?@B?@??@A@@@??@A?EIUIC?EMAEAAQAGPC!4?`?@!4?@#246!47?GO#52??O#14AOG?@@??C?CC???GG?G!5?G#10?GG#33G#23!38?_#144!17?@#63??!5@!4?@#92!13?GCG#121?@???@Q???A@#53O#80_??_??__?o#250???A#119C!4?A#69?@@???@@??@?@!6?O_ggWDIG@?G??C_$#105!29?_#104!6?@#239??@#217@???@#171C#124C!5?@#234?GG??G???C#227!11?W?G?G#234!10?@BBA?A@#207!8?C#220G!6?@?@#192!4?@!6?CC!6?@??!5@!9?A#55!104?A#49_#54_#35?RAC?A!4?CCC#63@#23@??@?B??@???B??G?CGQ?A?@A?A?AC?G#91!43?C??EE!5?C?O!9?_#58?_#250??O??C???G#101?C?C#54!12?C???@#42?_!7?O#41??_?_$#205!41?O?O?O?O#248?G??G??A!8?!5AaaB??@A@#243O!9?G#194???O!4?OOO?W?W!6?HB@#233!8?@@@#239!18?OGO!6?OO?O?O!4?O?W!4?_OcG?GOGk#70!81?@#56G#96??_#239G#33C?A!7?C#18@!4?@C?@???C??O???C??C#152!55?@@?@#134!28?O#115@!5?A#75!7?O#71?O#73CC#53?G?G#80O?O???o#48?O#98O$#201!42?O#198C#202?A#192A@@#194@#178_!9?_?O#220!12?_?___#188!11?G!4?C?!6CAAEA#150!33?G#140!115?O#202???O#4?AC#3?G?GG#12?G#70!4?A!8?C??O!6?O??O!5?_#88!80?__?_#81!12?C#88!7?O$#220!42?G#223_#246??@#29C???C#216A#163???_#205??@!8?_!4?A#234??C#209!17?O#171!10?C?CC??C#192!154?O#16G??G!5?G#4???G$#223!60?O!4?O?O??O?OO#1!194?O?O!6?G!8?O$#184!268?!4_$#13!268?@#19@A???A$#170!269?O-#246TIsA\bODtCQiaThcoIhoS{qzGw?O?_O?_??O?OGO?O!6?GgOgo__?_o_oo_?O?GGIGG#184???O?OOP?PG??O_?_G_??G???_?Q@GQGA#105!4?_!4?I?@WeWaWeWbWeGP?IEGAGYC]?[A[?OCOUgOCQCOTiWU?[IOK?GOK?OGCOK?[?W?K?O_?O#192_!5?_!4?O!7?_@?G???CP?I?C?H?Q?C?G?O?S?S?S?SGQcA?I`G_?A?@?P#191??@!4?A#246???C!5?A#208!4?C?CA#193?A!6?C??C!4?G?@?A?C#19@!6?@@!5?A?GG!9?G#56?O!6?CE??BADAMAA?C?CO?_?GO#125IOC?C!6?A???@#39@@#69@?@#59?@#40@#77@@@#101@#72@#87!11?L@?@BEBEABB@@FZRLIDIDEBB#48_??miGo#114B@C??CCCO@?y?PP??@@C#73_aQD[vAO@??q?G?_A?AGO?IC#140??AAAEKc?EOg[AO?@@O_CIP`IO???K_#127!5?A???GAS`C@AGG_#143!5?@#112???@?G@?_!5?A#107!5?_#102e???O?_@?@@FJP?GCW@bDEJWww!4?O_@#98?G!6?_?GOC??QA?a?ACI$#237I_A\aOLoIQhOTGCQH_OCg?HCOC_G_??!7G???G!5?G!7?_C??CI?K?A?A#183??C?!5C?CIA#193bBb@BCB@???_?g??_??Q`?_Q_?gWOWGOC?ICWeWeXeWeGQCG?@A!4?@?@_?`GOH_?GOGO@_@?`??`?`OOH?PGDOJ?T?H@GP@DF@F?GQcGQCPCgCBcIPCQ@?YCqCRcZ_AcO`Y_U_L_Z_U`Kb?J_BgB_A?GPcO?U@G?O?C??D!8?BGSKAHC#96G#191!6?O#137???ACA@C@?@A!6?GI?_??GOG#35@!6?@???CG?O#91??_@???A@???AC!5?H?C???G#52?@@B!4?AEGO!9?A@#48C??A#121!5?@?@#95O#85??CGOKKSC#98!10?__ooO_WO#75!8?A@#98?_?_???@#72PTKw!6_#102???H#121!4?GO!4?G?G@?T!4?@@!5?C?_#49!5?O#116???POKGEO_TnbAEAJ?pm]titytPMqgSPgS?_`A???O_?_#126@?A@U?o?CcS_?c??GO#114??G?gg?Hc`Q??GOGcQ?CWC_!4?O#100??Og_#107!4?_#115o#114o#100???G???O!5?O?GGCAK{uKmKGC$#244_CH??G?A?_?D??QHA@A#192!5?C!9?A!5?c???A!8?O?O!5?@@@?_`?`?_pp`o___o_OgGgGo?oG_g???G??CA??@?@#237???C???A#184!16?OGCGO?W?[?[_W_?_!4?C??G???C!6?_!20?_?_???_?_?I?C_G??CG?aCQ_!5?_!4?@_?@CA?B_BGB_B?@?GP_C?U@W_[?KaGOg?s?Og!4?O??G!5?@G@#0!17?A???@#10@#34@!4?@!4?@?@#104?G?O#58@?BWX?AWC?cC_@@AE!5?PAGS?O?C???G??G??_#69_#98_?_O??G???O#47G??CCIAAA#93OSCSiiumqBbr_`d_`???__OO???G?__WW!7?_O?O??_#99O#120C_#40A!4?G#119@?@?C??@?CAg?COGC_Q?Gg#49G_??G#116G#127!7?A!4?O@#129!4?G?__!4?Wkw`SwC#125!5?C???@CBGC_KDYPShSBIcScS_O#73!10?C!6?@#119!11?A#101!7?CG@P_EM??GoCB?BAECGSQ|vJf|mR{NeqaRpo@@@?@@B@$#218?P???C!4?C??a#239???C?A@A#202??_!5?_D!5?CC#191A!6?A#193?!5C???GMGG??AA#239CECCEAMIIIGI?A??C??A?BCABFBFDD@D??G?K?GC?G??GBCG#192!16?C?O!5?_#208!6?A!9?@#105!44?cH!49?@??@??AK_g?@U_?YgGhWdGsn\hz|izur}tr^~n~OOOY[iy_K_??k?SccowG_#17G#37@?ECCA]W_oG?PA?c??AC@IO???Gg?o??O??O?_#140@??C???GA?CD#88__?!5_?O?O_?__SO???OGG^]Y^]^~^QMNCK?G#47@!7?KAD?CA@#101!7?A#102@#59CM?G?G?GGOE??__??_#132???@!9?C?Co?`DHs?ID@?_#38!6?o!7?O#149?G#38!18?_#132???_?A_?@A?GKa_NCi?G?CGA#115?_??C?P?O??_QG?GGc_?@KCQCaO__#108C#72?@??GOO?_!11?sG?Og?OGCC_AG_??@#93???_$#240???_??aG?H??G???COCHA@C???G??O?_?O#217__?_O_O?S__s?C#173@#233A??!4A#201@@#198AA?A!5?_?_!4?@?@!5?O?O?W?!4Oo?oO?@#246_#137!11?_??C?A??C???C???AC!4?@?@!15?G!4?@??_?ACA?AC???A??AC?A#35!81?@#4A#2A#137O??@#96!25?A?@#208???S?C#3??!4A???C#4C#246_#2?O#63@?BC?`CJC?AT??@?C?E!4?S_O_#35?OO#55K@Q?C??S???G!6?@?A???@#253!30?@#48?O#41_?W_!7?_??o?Oo[#77!5?OWOOOWo__oC#81!5?K?_ROL_A#128!5?Q!4?M?O???@_?_DClTgaA@@GDAg!6?B!4?DI@IaPKRgeRHRYCcHAGGSW?O#119!14?@!4?A#103G??`?HCL?eOG@W@qHaWGOAoCG__?A@C@CCWG?x`B!8?@?@@@#99?GC??GOOoo#95O$#193!24?@?O?@?G?C#242CC?C#21@#216@@#178@!8?@#209A!5?A!7?@??@?@#244!4?A?IG?G#196?!4CG?CCGC!5?VgSc?uTg^vVBfcRdpzs`!4@?@?@Pdgr`o`pe`a_Ba@BEBbC@Vbb`baASaGqbSJAlbCrkbqjcpibsav_}iW}g^vLZVlZmZVZkPtiZdYu@qLPgHCZkZd]@^_^_]?^_Y`[gSGs?[GtkRcIDY`GudNaza\qmU~J}lV|oO??k?BodVvUaQaHO_S??S?GG?GG_?O?dccc?S??_O{{O{gWGG?OOO_#86C#90_#51???_!4?G#196???W!5?O#24?g#144@?@?@??G!6?G#116???O#93_?!4_o?O#75G#56@?@#42!34?CC?AaOc?OOg?G?KCEDB#115!6?B?C!4?A?@gI?`D?QI#125!4?_??f]~H?urNP[ioBLsOy^IgOgP?@A?@A@#121!34?@?BPGHoJSzRjYvPy]Shx__A@A!5?@@#77!11?CIa?@OC???A?BCDHAEGcA???A@CA!6?@$#90!24?A#0A@FAA#82A#137A#153AA!4?_C?c!4?C?A??A!4?O!7?OP?O?O@!4?@??@#191??O!10?GO!5?@#198!31?C#191?C!7?CG?G?CG?GC??C?G??CO#237!97?A#39@#56@#109?_#192O#104C#192!25?@#104!5?A#1A?AA!5?C!7?_#23???C#152A#38?O??Ga!6?@?A!4?C??C?I???OO_#148???A@B#80O?OGG??S?GI?OCCCEaA!6?_!7?_?_?O?I?Gc?@GCCCg?___?OOG?GHI#69!8?EAA?AFG??UCISAQg@C#140!9?c#52!22?O!5?C??C#73!29?A??C#118!12?BEA^CsCT]U?Q?OOBFcA?G_#98!7?A$#104!25?@A#196_GG?O#244O_O?O???G??OO?oOo?_#243@#242!4G#194??@@@#196G??G#241!11?C?CC#96!12?A#183A?A#237G#239!162?_#14!36?@@#86??@#20@!6?@@EA?W_!5?@A??K???@G???C!6?G!5?_#81D??@#114???O??G#42??O???KC?IC#253!41?O#121!15?@@#54?@$#105!26?C???C#233?@#209@#171@???A?A#201AA#194A?A?A#202??G#195?@#226C!6?C??C#191_?O?O?O#208!23?C#105G#109!201?A#0!6?O??_#193???_#34!8?_#55O_#244???O!7?_#17_!6?_#74O#50@!5?AIC@AC?FBA#59C#38A@#40?A#84O??___#118!58?A$#204!28?O@@#138!4?A#215_!5?_!6?O?O#186?@@#207@#218??C#244??O_g#241!30?A#16!209?A?C#0!19?g#96_??_#51!6?A?@#14_#64_#83?_#128C@I??A?@#129??G#87??O???G_?O?OO?GWgGGGI$#4!28?C#10C#173!5?@#176@!4?@@?@?@#216???@#150???CC#240??O#241??C#217O#9!242?A#70ABA!9?@!8?@GAG???G!9?__#53!15?C#58??@$#252!35?C#76A#181A#239?G??GG#183G?G_#184!6?O#14!272?G#246_??_??O#49!10?I@??@C?@C??H$#204!43?CC#212@?@#193!279?O#104O???_$#162!43?@#96?G#64!283?O#2O$#74!329?@$#239!329?_-#237i?Q@dOBg@S?I_DOA_S?gCAh?PI_U?GD@cJOaGO_?OGcGeOi?QAcOcHvGaKADOgOgSDYDgDGODgDwCX?W?W?O?S@?O?G?GOg#105??_GO?_G?C_HQ@_HQ!5?@?@?@#183!5?A#105!17?GO_?GOc?GO_CGO@g?S?g?O?g?GOCg?G??A?A@A?A@?@?@A@!7?@!10?G???G?O_?O?g?O#239!17?A?A???A?A?A?A?A!5?@#208!10?CO?cG?C#184???_#192???O#193??A??@?@O#184!8?@!7?G??C??OO#17G#96BA_#16A#23@#97A#208K?O!6?C???C#244_OG#150C?A#98O_G?_#95?g#85?CCWCA???A@?O!4?O#48!6?_?OG?A!5?g?CoSISkySK?]Kc_cs{SK{CwKWSkGCCWdXCqGSG?OG_G#133A#59CABAIQ!4O_#125???B?@GMXK@???@?GANwP[Oz^Ko#129??O?CU_?G??YdNpO??__??_!4?o?O??dW?A#125@?@?@?DKHKuvaahOE_#112??A@?gC??A#103_??_@@_d?LacI?oC@EWJIa?H?AB@CAAOH{LxzS#251GC#99!13?C??ACerQaYA$#246TjcYIdSQihTSIidSJhTPhSUjePGgSqIYPcHP_GO__OWOGg@Gk[GkWS?t[o_YiDAD?gCo?O_?o?O!4?_?_?_!6?_#198!12?A#137!5?A#192??O???G#191?A?A#137!27?C?@???@#208???C!7?A#191!10?@?@???@!4?A#239!4?O??O!8?O#198!5?O#191_!5?G#246!26?A#193!7?@#105??CGOgCgRkAcHQcIPcB@IR@JBtJbJQnoNqLpjDUaUiBAJ_O}DYeg?dcf`Rog[W!4_!4?oWK@{GiW{?KO!4?o#64?G#97S???@#61C#80CO#93S}V~zwC?C@?A!4?OC__APGOAG@C?@A?@DL!4B@@#53??O_?C__S?oOWOG?__!8?o!4?A?B??BA??CW#40?CGO!4?_#119C??G!5?_?A?w?gs#116!7?C??OG@__P`??@a^AC??AJURZAT^@zEZEBcBSZAFPOEZc???GO#73C???GW?C?GC#119???@?_??C?C#107!4?C!7?@?o??_??_!8?GC#112?_#59??@#98?O_cA?DAA@Ac@?@AdCg?GGLH@C$#244?S@cOAg?S?I_DOAh#252C?A??@#196!4?A#239?A#218?_?A#193?AC??C?M??D?D?F!8?@?O_??C?@?_?C??@?P?@@?`@_?_G?_GODA@eBAFBsLoKrKrKpNqLuHuHg?OC_ACQlOI?_?OG_S?gOG_Q?_CP?c@Gb@BB@B?B@@ED@DHE!5?_?G!8?hQHaHOdAHOIcTAsAL_DYDGdGeHcBSA?yDqChCydYCZsIlA[BkBsGaXCQKpCi@k?S?O_#191!13?_A!7?O#137!10?c#208!13?O_?P?CG@!4?A??C#104??@#96?A#193?A!9?O??C?A?@???Q!6?AGD!4?A#63A#56@#88G!5?BbZHEb??OXgghZKDKBC@C#99?@!5?I?S?G?COI?D?A#40???_#93??@??A??A!5?A#80!5?O#101!9?C#77A?HOOc__#118?A?A?A#39??G#54?O#73AO?PIDZD?}e@ODGaAC#128?BA??AA#149GGO_O?_?O#128!4?C#52!4?C??_WC?c??G?A?O!4?G#127???@!4?A#126G?EYG?O#118?@RY}WLiN]CIOGO_?@@ECA!5?D??C#77@??_?`?_!4?GAA?G???G#95!9?A???C?SCG$#218??G??G?C?A_@O?G#202??A?CA!4?C!6?GOcGO_GS@_??O!5?O#196??A?A??@?C!5?@?P?@_?C???CG??CG?cHCDGpCXsLOkIQDaKPCpIOC_GS?cFXdZD{Xk?ET|^|lS^j^VnV^l~^zm~Z}v[uk[ysmW}ugYyqawT{h{T[luV}tmxU|uUcsKskG{SkcYGsGw_FW`AdYaPSIwbKzDWCrCR?A_@C@_AO@c?wASHcYc`KqC{@}HfK@\a\zcXti\sWktYtlCyUkR|HukJtMZwmtGQswIs[SlON_LqKCIGK_@oss^n@wdWPzYYW[kDS__WW??_ogWK_oo@cCa??a?_C?_G?A#59_#69O#99O?_?O_?@#87!5?_owWow__#80??OCRGACJKAEABA@@#41!8?A?@??@?@?G@@?EA?AA@@A@BA@QBBBAA#115!13?@!4?@#121?@@DDCKO^MO?__OAcOG?Ok?Ae#127?g?__#140D}^LKO_??@?D_??C?HgC@i?ACxC`GRG_??_KcGcWG[so__#121!4?@O?`O`vtm}UGD@@A#102!7?B?SW?_?oIW_?oWWoww[}JG[EABAA??@#100_???BA_?A?BEEe`A@TxP!4?@$#240!7?@!8?O?g?Og?SG_T@hDOc#192!4?!4@??@_@?O_!5?_G??AC!4?O?O!4?OC!4?_?C!10?G!8?A#184!14?CA_A?_?OG_A?A?`??_??_#239!26?A?AA?A!6?A#192!8?A??_A@??G@?O???_!7?G`C??G?A!4?_???O?_?O??@C?_@?A?O?Q?a?@??P_?P_?P!5?@?A?@#137!30?O_?G?CG!7?AC#0!6?A@!4?G@GC!5?A??@!7?G#17@#87???_#41_???_AB#84!9?CLDKEDFA#98??__o_opwW{KCmS?qg[CCI?@A?@?@?@B?AA!6?A@A?@?@C??@GA?GO?_W?o?O#103??GCG#69@@A@E?GGOO_!6?_#126??A#132A@@O_??@@#55!7?_A#38@JSC_??IoGc_??[?_W!5?G?G_??_G_#132???!6A@GPCCbW@??G#115!4?_???P??aOH?cO@?SGA??@CCD?ACA?_!7?O#134!4?G#93!17?A??_?_o$#193!19?A#252!16?CC?G!7?O?_#184!11?Og?G??G?G??G?gCW?O?W?O?O?O_!5?_?O@??@?A#239!11?a??O!4?_!4?A#184!34?A??A@?@?@A@?@A@?G?O??O???O?_??CAGaCGQ?CGa@C!4?a@??GDODI?AD?DAGBCHaOA@GQ?H@A?@?W_]_K?CGEGC_JcRG???P!5?A?@O?_#237!42?@??C???O#33C#24@#239C!5?A???@!5?A???@@#149G#72_?W??G#94!12?A?A#120!13?_O?G#80!20?!5@#120!4?__??oGoc?_WC_G!5?_#102!4?@O?__#81??A?BBC??C???C#130!22?CG#52??W#128!19?B!4?@??Av_@?@OoG?C#114!14?_O?o@WcAQGAGA_PGHC_BO??D??C???C??O$#242!36?A??A?C!4?C#239?@?B@A!4?@G?@A@Aa??A?_EGA?A??_?CFBFFJAaIaCQ#246!23?G!46?@#192?@#246!35?O??O#137!56?A#246!54?AA#4A#63@??C#2??A?A#244@#104???@?A??A!5?@#218???C#14C#42G?A#40@#72!30?_O_o??_oOogCg_IO?IQ?_?G?G??GO?wCOCg???G??C`@CbVclFZ@dq__#114?CKKKGgOo__?___#127@#140A#142!25?A???@#55!19?CO#119!54?A#59@#101???Op?_???CCaS@JBkOWD\[XWwXWWWw$#198!37?A!4?A#244!6?@?A@#183!12?A??A#241A?A?A?!5A#86!235?@#51@#58AA#37D#74A#38??@#56@#137!5?OC?kOk!5?C#47!4?O#103C#77??C#49!100?@?C#72!113?@!6?_?SOPk_O__c??_$#233!38?A#209??A?A?A#109!271?CG#217!13?@#1?@??O#96A??Q?AAA??@$#153!41?@#20!276?@A#240!15?@#237A!7?G#65?G$#9!318?C#16!17?@!5?_#70???@$#184!336?W?gC$#35!337?@@@!5?@$#246!337?_?O$#110!337?AS$#192!337?G-#246TiCqHTI`[AiTDaYHdSIlHbUKXreCtiITtIiTSidSYiEOzLdYYuAn|iBhtcWOHqoTC_nOpg?b?D_U?AD?dGuGO??C?P?O?O!4?_??_??_#184??_!4?cGO??O?Sh?O?O?A_?A??A?C@!9?A???_#192!17?O?_???_!16?a?O??A?C???AOC_???OA??GA?Ga?C???A??A?OA?S?@???C?G?I???I??G??AC?_C?_#105@?_GA?QDG@aChQg??@gC?OfGAhQkuPV_Y`QTaSgEhV?TgDQ_RcJOiDQkOcZ`WaOdCWCC`SGoGON_AGDB#83O#93O???@?G?@?@C?GKMF~[w??oOgC]MIM@@???_#80?O#53?O?G?C??C!8?@@@GGG@IEHNLNAASC??A_QICCCAB!6?_#77!10?_`RrECCgc^_[CKWo#115AO#118G#121[YH?@N???@#49??AO#38_??GS?SKE?qqGGR_G??Fm_qNqO?CgTG@gI?Q_?C#128?@A?`VGtBC@#126O??W@CCO_#114??G?oOGH?CPcQHQ_Y??A?_?_?G?_!5?BOA??g#108H_#100A?CBCC?gO!5?o__c{KCDA#93_Wg~jv$#237iCqHSi`[AgT?aW@C?I`?ASG@aCGPI?T_I?T?I@OI`CPhC?Q?d?`OATgUGRcHqLAgQLOICQlOeOJ_\_GaGR?dItIP_CG_@?_C!17?O!6?O#105!28?@C?Od?AGP?i?OACG?@C??@!4?@#237!18?P??@??@C?@??H#246!34?_HO_?_C!4?G#191!6?A?O???_CO???C#208?D?CG#191!7?@?G#208!6?@#137@#191!9?G#137!11?A!7?O!7?@C@#244_?G??@#99O_wooOAGAX#87A!4?@?@@A??@@@?@#40!9?_O_OoG_GO?WOKOcc{{uQVA[tWuoa?hg?O_?C#101?G!7?O?O!6?_!4?_?GO_COgO?W_O?_O_#69@@@F#81@_C#125_oO_PKUBNKeE@#129_O!6?@@CA?O?@GGPKCOKciJSatIEtL?@`_?G#125?AA_FI{bmJ??BC?A#118A?GGOoJNFufbKA??_#102A?GGKWVbE`rZFzf??EkGhA!4?@#98!8?G??_!6?OGQPBB#85??OG$#218?@!6?@??G?C?Q???O#202!13?T?i@SI@COGE?Q?c??O#184!6?G??C?C?_Q??ACOCOa?H_G_?Q?@?DIPA??C?A?C_#239!17?A?@#184!54?O?O?OCO@c?H_AG_S?iCP?H?I?O_?@i??@??IOD??H_?_!4?P?aG_GO_H!5?GcQ@_A?_DOeG@SI`QsHo@Q@GQKPG@CGDO??@?A_!6?_??OgA!5?C?G!5?_??_??g!4?_??_G??GC???G!7?_?O#110_#96O#97??O?G#88_#72_!5?@??S?O?C#88!5?B?oK@F???@#72_??_OO?G_o?KACJBBB?JFE@BBHAA?@?@A?@!6?__TupR_Pqxo{W~n{_xUGicx?u@raNjFEKGg?GO??G_W#102?CGOG#73???oVM?H?B#142!9?_o?Oo?KKookNvMoO#149?OG_?G???GAS??_#73!13?GO?SE??A#112@?@C_C#115G!5?Ga?HcGK@dq@??GGG!5?GKG?ACWc#134???O?OG_!14?_#95o?G?CP?C$#244?O@C??C??D?AG@C_!20?_#192!4?@!7?@!4?S?A?@a!4?H??C?@?G?G???O?G!4?_??g??_!23?@?A!6?_??G??G??G???_?_?O???G??C#239!47?C??C!4?OC_!35?C??CH??@#237G_#137!23?C??G#193!7?@Cg#208!29?@!5?O_K??G#239_???_#0_#150G#64_C?@#41GC???C!5?@?_O?_!4?_?O!4?GAK?`#120!4?GA#102O_?_O#59O_O?g?g?Q!5?_!6?OO??!4G#120!4?AA@!4?@!6?C?G!4?O#53G???O_!6?_#119???AoaDA#132G??E#140g?_g?OH?KMCAFB??K??AC!7?A???ATO@??_P?QLAKPquL|[Go#132??O?cI`?AG#119!5?_DC!4?O#77!20?OOo!5?@?QG!8?A?G?AG?A#99!4?gCS_$#240??G?a?OA_O?_O?_?Y`SAsG`qCGPi?T_I?_!5?_??_??_#252G@?GC#239!7?AC#193??H!4?`!4?@!5?A??CG!5?A?A@SIO@iTYTiTYtITyTiTiTI?k?S?xACaHO?s@Qc?DQ_DOIO?Y??i?OAdGPaGOI?OAG`CO@c?HOaOc?HQCxASHOiCPGaTGaSHqCzCPCjC?GO_IOG_??I?CaCHsBs@s@CX_RKpKPkPcHcGbGeWdQHoFO_@O???OA_???A???HQCOa?O?_?_!5?C!45?@??Xa?G!7?AWAQ?A#203CA#35A#42A?@A#85?C!9?ACIC@I?I#99?O?OeGQc?P#103!4?_#77?G?SK?KC???CG???GC?C!8?@!5?KCCG?G?C#98??@CA?QPACP?S?GO#103!5?@?@CA?C?A???_#128!7?_O?OGSO`?HA?@#56??__!9?_?_#121!31?_Wcwpwl]rVBA!4?O#101!22?_!4?@A?AKcj?OPxU@np~v^|F^\ZBBB#131?_G?E$#193!50?G#196!12?A!4?G?A???S?AD?D?_?Q??C?TgPKg`HITiDiTIdITiDITiTiPdAuHnEhAXeNnJsLZtylTyjsN~D~nT~ntWvi\UjtnI|tUinSZnsjTnYjuLiElJeiDyIvSItTJaLP?iKqCpm`NIoDeXmiPTaWjsA[B[JuXeIkPEPeBKQeXvGvOBGkQLoNOI?fOaDOKBSJsLyvC_iDShfgIVYKzSLRzyyRrVnWfTSlQGa?ZdUli[iVXUg^iVQlVkZSnTYdRnR_[e[bYaDjBQjVFFN_[@C???@#98G_!4?I_?Q`AooP!8?O?__O?OC@JIAUHE@@?@#114???_?_??O?O!4?_#48!9?CCBBA@??@_@?@?_??AIC?@CP?AHaGT#114!7?B?@??@A?@BEKc#116!8?A!7?O@?H???@???@@!4?B??@@?@??_!7?_[AGD?_#127!9?@#107!12?_O!5?CO!6?CGS???c???F#59B#72!5?@!4?Sb_GAhU?C$#239!72?G!5?OO!6?_?GA?A?CAO#246!19?G_!4?C!75?O??O#104!118?C#237!16?S#246@#37G#48O??AC?@!4?_#80!7?sI?C#48!4?_??o??CK`EHE?DA!8?A#114!17?OG#99!17?hC?GAG??C??S#59!6?A?@??@?A#55!12?C???_!4?OA#149??G@?A#103!55?_?G??X_ADPcQDob??PUC?WCW_?@OdOc?Es@??GCA$#90!338?A#101_?gK?C?A__G!35?B#69?_#99@#250_!7?_O_?_??O_#40!39?A??A?@#52!14?_!5?O_?_?G?A?@!8?C!6?@??A!8?OAG?O#118!54?OO$#70!339?C#75C#16@#77OA#100??G?C#130!130?G#136O!7?O#119!78?G$#123!340?O#95!6?G??C?B?g!8?_??C#144!113?_$#80!347?@-#237CP?GTOI?dGaPk?Yd?aOGD?cOGDA?TgAOHCQ`CGPaCGPa?TGaT?IOdIt?tI`IsJcHoHqDGTI`M`EhBoDO@qHqHShUgU_S`OG_???O???_?O?@??@?A_GA_?@_!4?A??AO???Q?CO#239@?O@C#105!13?@??@??cH#192!22?CO?G@O?G_?@?A??_?G?O?_@???@C??D?G???C@???_???@CQG?_?G_D?a???G!4?_C???OAc??S_?G?GO?g#191!11?C??_!4?O!14?O???C?A???C??C!8?A#239!4?O_A?@@#56A#101CSO?O?G??aF@O!4?_!8?_G??a?_O?_G#53@OIGc_#250CIcX#54?eD[SSWCCoQ?@O@?_?_O?O#250A?G#72?@@^^^m^FJFB??CJCBEKE?DBC??BOA@OB@@@!4AD?DA#59???@?CO#121@A??O#52@EG@??A@#144??sO@??@???A#136@#149??O???WOk?D!4?`O?C?A#125!5?_GOkzg\QANEa#126O#112?I?D??A#115O???@?C@?QGG@C?HGI@_x?OC??B@@Eg__kA?@#72_OGCScIP?G???A#95?_?c[QmSoe#131mSyojSq$#246jCPaGDPI?TGAPc?ITGdQgQHdQg\iATxEqhKYreKXreC\iaTKivtnYOInIo]T@sYUDeGiQi_UO?oCWEgEgC?C!4?@!14?O?_?O#184!4?cHQcAhS@???A???_GQ?AGQG?O??A??A_C@gAOC?O!5?G?O??OC@O?@??AOA?OH_AG_AG_A?@A??C??AO?O?G?CA?C??CGOA!4?_?_?AD_??GaSICXc???@?C@A???OHqD@qKbKROhQc@?OIPAH?_@_???O?o?ShCQGcO@aG!7?c?gA_Ga?Ga?GA?C?`??_?O?_?_??Oc?O?gSg_Tc#96??GC#244WCA#102?G?@C!4?_#48???CICC?GOCO???k?C?O?G??C?O__?O#69!6?AE?A???CWGC@BQB?@???__?OO#114??C#77y!8?K]SGOGWO?O@G??ACG_@CG?O?GG??H?H?lQJUI___#69A??_#140@AGO??@#74!4?GGiaEqi]G#130!5?G?C@A#140O_w@M\??@Qw?PsHQPUU?j#132??A?gS?XC_!4?@#114???_o??B?EGCcbQOG?@CoAA?_OG???E?C?O??P#98??_ow!5?ACG??`A?A@#93gO_GO@aDJSjL~$#244O?aD?A_COA?C??@#202!34?G#192???d?O?@?_I?@_?O@?C?@?_C@!6?@_?O_!5?AG???A??A??A??A!14?Q?C?G?D!8?A??g??G!9?@_?G?O!9?AG_C??_C#246!20?C?_?P??@?A!4?GO_?O!5?O??O!7?O!11?CGQc@?O???AG#105!8?@??DAGADICI!4?@A?_HOAlZulJcHQDGTaHQcHQdGdAgQGdOcHQG`IPCHQdG@S??C???_CGC#41_?K#75A@#72_?@?@??Og}h_G?cC___OoO?wOsitPAH__?O[k_S#62!5?cgHwb`___qIG??GAIHJHIHg_#102!6?__??wowo!4_???_?_OO_O!4?_!4?_?W??O_!4?__CO#119@?KGO_#54_#38@FMPaOAr@@!9?__wg_{zelBN?[@?`C?@BG?@C@#55???@#73???CACg?_PA#118??WWGkwk]HRoswo@`R?GH?Ooo!9?A!6?KMI#134!4?GO`A#100?@HE[{]\n@?@#134@$#240?aGO_gC_I_Dg?YcOiTIdQlQGdQ?TgAChCQ`CGPaCGPi?TGaP#184!9?C!6?G?CO@?SG@AGA_@O@O?QGAHUgUg?_?@C?_???O#246!21?_??_???_C_??_??C#239!56?O@!4?_?G_?Ga?_??G_?gO_G_?g?_???O!14?_???G???G_#198!11?A#193!17?O!6?_#208!34?@??G?@gC#0??A#193G?@#121@A#95I?K@?C#53!5?Oow#114!15?_O!4?A!7?@?@#148???G!9?_#49??OO#48!12?@!9?@#114_#108_#98??A!4?@??OA@#100GA#108!4?O#114!9?PIIOoo#49?C#128?O?O_?@#63!4?EO#37GO#152?@?C#129!11?OAA?A?OEK?RGG#121!13?o?GL~tfaaB@B???KG#102??C!4?_aE??CC?MFbSlggwGBMM@@?OC?@#99!13?OWaC?JFHOH?C$#218?GC!4?P??O?A@!9?A??_#193!37?A???_!4?O?O?GAgCG!7?@???A?T?GD?GD?GD?GCA?K?PC@ODOGC@G@O`?OG_DQH?G@?gA@CQ_DQGaTGaPCGTAoAgAsAOChQCgPCR?xEHObSI`SAgDQG`I`U_IdAPI?gO@GAP?aDGASGD?G?@G??@C?H???@ISJcYcGDOEHQDOIOG!5?QG???O@???GPi@?S?_?_#137!57?@#104!8?`#37O#40go#88O#93GCo?O?G!8?@@?@@?@C?@!6?C?@#59C!4?@!4?A?O!4?@?A?@!6?A??@?BGIoA!5?O_#101?C??@I@CQCHQHKacJlysNKWESK]EDDLCIEIOd?G#115??@?K#132@#125@BAK??_#56I[_wKW?_?@@!5?EPCC?A#116!6?_o?MG_??c_AQCMH?A?@#119!13?SOC?@EKA???_#107??C!12?BA???o#59O#77@!4?_$#202!4?A#239!68?G#196??C???A?C@C??@??UHSgpIGDqGdAwDqGtAxNqVGQcHWAaQktQlSViTFGhSddQlExEwhVwLr[AtLizeI|E|FsJlJqEhyFkqKzChSjKaT[b\TqLtYc[`]`YtKdiELqeXGuPGvP?fOlUrKVQLUpGURkVG`@_A@IrGexQkoNonDQCgQC`CpCJCcZm|BcCgUiT]QLvTitJtjUzluXnYCf\QcHQCZQlQtITSlRSlQtIxVKrYLZelR]TizeHYf}AiTRiYVJRp?A#35C#134?_#98_?A?G?_P!4?CB@WOJYKIAIBCJ@?I?K?A#41A@#40???CaXXrsW??O??AAB@@??KK?KCC?ECECDdF|yC_#53!9?@A!4?@#73!33?AKG?__#142?C?KC?eA@!5?`r|WMBBV@#52!8?_OA!4?C??G???_#103!21?_??BGQG?OcAT_E@IXCpGG_OSC?@?O?Q?_?BB??A?CG__$#239!84?_A!4?H?ACA?TqGdAwDAGDAgCo?g!5?C?G?AG??G#237!71?C??C!8?A??A??A??A??A?S!7?_!10?@!5?A#42!85?O#99!4?@?A?PGGO?A@??AAC?A`G`OA?AD?C?A@?A@#39!15?G!4?_o??OoO_??O#103!18?O?_???_O?GO!4?_?!4_Oo__o_Oo?Gs@SI?C_#81?C??O#145!11?CSgKS#55!20?G#128_!4?!4_HSCQCP_@@#101!38?O!4?@!4?WKEB`JOc^Sqpb@$#103!339?G?c#85_#41!8?A!5?CC#77!8?O!4?E?B@?AA#250!14?C#92?__#119!168?o?C$#100!340?a?UAED!21?@#102?GKG!6?CG@#53!15?C???C$#133!370?O-#237\_SI`@CBOM`SIh?SgCOi?SigTAhSBgSBG?T_AH_SAH_SA@gCQ?OK`ITiChS`UgEpCO_HOcGqHqCiSGO@aHqGSGOGPgOaOIO?OiO?A_GO_?HO??AG#192COA_!4?Ag??Q!4?CO?@_??@O?C@?AO?AO!8?Q?H!7?G???_@C?_?@??C?H?C?a??Oa??S!4?Q?gAO?COG_AGC@G?AGCOC?_C??GCQ_CG??@?AO?A???OA?c?A?@?C??_C?g@cHAGACGAO?AO?AG#191?Q?G?A?_?G??O?A!8?A??C!6?_?A!8?C!7?CO?A#137_@#34_#37O#59_O#101_@S???s?iSgQcH?R???QCHCOCGOCOaHOAOICA@G#103O!6?O#69???C!5?AAE?AC?C?E???A@#103!4?@???S?CA??iAHCAaC?E?kQUAqA`g?GgcGcOCKQcOCCGCHC??d@T_C#69C?ECWO__#55@?C?CGG?G?G?G?G??A_#125!7?oo!5?_!6?Bl}WUWNK__H#112??_?OA|QC#115gC?_dGQHS`cO?A@AQROKED_?_?@BS!5?A#121KKA#134??hCIC@Fg?gAw?CI@CA#95?@?D?@!6?@C$#246a\_SAY@c@OI`SAh?QgCOi?SAgTAhSBgSriITkQJhsUJhsURhluaq]t_TZQjMhTPMIlJuDZQDUCx?AcGuGS@e@aC?CADGD?@A?@?`?@A@#105!56?C@A?D??D#246!24?_?S_?C!6?A!4?O!6?a???_S!5?_@G#105!43?c?@GOAC_@iCPcOAcHQDgD?IO?hQcHOAChCgQcHQdGQHOdQcGOg@ECSJ?C#53_#48G#72GA!6?S?jSDBA@?I?DLHABFGFDAF@A?cecrW[EAA?C?A?@#139???A#62???K@L?G?CG??C??C#102oOK???_A?A@?___C??O_pgSoooqQgggKC]UG_OOsOGO?GYjg_?G?OG??GIYqg?_#121@#81B?K?O?_#52?G!9?OAS?GO_??S?C??d??A??@G#55C#127!6?@#132___R[?A#143???CG#119??_yS#114OhCQ@K_JSGF?CA???aO?AL!4?K!4?wbD??C#99!4?@!4?KC[?woOyPh]cWa[YcYLidugQ$#218?A@?C?OG!6?A!6?@#240!15?_C#244!6?G#252???HC#184!11?G?@?O?G?c??HACGO??@aGOGOGOgO_OaOG??OA?C?Og?C_G!5?@??H?c???C@?GCQ`?A?G?C?GC?_O?G!6?T??S?H!4?C_?G_!4?SG??O?SGOaO!6?PG@?G@?Ag?H!4?CHa@?C?`?_?cO_@?@G@QHA@???@AOAs?G?G?OcI?G??P?_G_O?Q?@??C??O`O?`?Ch?Cg@_D??@_OGD?Ac!4?GcQ?gQ?O_O@O?G@Oa@???O?Ga?Ga??`?GA??@A?G?C#193O?@#56C#102AK_#77!9?gWs]kSLY__ooGoo_wg[SnXHP!4?H?D_#250??C_CEKGeWep_O__O?OOO?G!5?OE??G#77_?OaA?@bJD@CA@@BA@@?@@@?@?@?TC@?A?AQ`??AHU_u_V`Ys_#115??A@?G?_#132@#140@AC?GOOOoOO_OO??oGOCg?NohLQEDGVAXIIcr`Xd[O???@#73??_AT#126_DQ???D#107??@!9?G??G??C@#77??@??A??IcO_?_IBOG#125o#73A@#131!5?@!9?_??O?IcW`CP_Q?G$#240??A`G_IOe@SI`S?h?A@??A@#192!27?G???I?_C?O?A_?O???_??G_??O@?@!8?@!7?_C??G#239!97?O?G!6?_!4?G??G!9?CO?C#192!75?C#208!22?@#0?GA#96G#64A#77_#99@!5?A?@?@#103???_?_O_!4?_#48B?A!8?G@??C?A#54!15?@@A?A?A??A??@A#101!21?@??@??O@G??VA@?B@a``?@CPQ`R?A_U#119!7?@ACKOO__#128G???_???O??__?__???o??q_HG??w__TO??_ABkQ@eGFO#121?@ISyl^zfwAL#118?BjEQGc?A?A@#102?oW{hgKCaOo?WIP??A#72@@O!5?OGdQ@CG?G#103???@#93!5?_?`OB?A?ID?DAHUh$#244??G?OC_?G_!4?SA#202C@_C@_?T??OA?O@?CP_IPCOAH_SAH_CQ???@#239!12?_#193AC?A?@!6?AcGO?C??@aC?CA?G@C?@?CAOC@CIOC?aHO_Ag?\AgQGODQcG`YdQG`MOCIOcI`Y_[`CH_CH_IT_IPcHc?cHOI_GQ?cOJSAwBSIOmOJOe?OHOKrCGTgBGTi?L_@CH_@AD?P?w?EODOA@?TA@OhAh?GAPAs?wChCpKRcHcGRGdWcRGqCZ?RCIO?cO_P?_@Cg?D_@aCQ?GCa?hOI!4?aG???_??O?cG!5?_???A!6?G?C#237!11?_O#218C#80O#93C#103OOG#53!13?@A??QCG???G???_!5?CA@?D?BB?@?A@?@#39!8?@@@B?@?@@@#115!29?C?_!5?G???G#59!9?@!5?D?O_#73???BAK?O#142@@???A?AC@B!7?@#103!41?OH?Q`S_?QgF`?O?_G?`?OaP_A???W?C?O#98??_OICyoq??Fa?_???C?A!6?_??_OO$#252!16?@OI@SG??AgC?gCAg?C#193!16?@#239!24?@?@A!7?@a!5?_?K?C?CGOC?CA?C?_#237!89?_?AG_?G?A??_?_?_?G??GA!4?@!4?A#246!97?A#204G#239A#244@#130@#98?G?@??@A??A#40!6?_#99!9?@#102!8?_!7?O_?__#49!14?@?@#72!39?A???@#49!25?A?G??_#74??@#50_??_#116?O!4?P?O?K??H?AQgDCT?ICYEW_#59!36?C?@!4?D!5?C?@?C?@#100!8?wOOPR?EEJ@CGC$#196!76?_???C??@aC??A@GD?CaPi?hO`I_APhQb\UlVxE|AsVHvlQhYdU`GKrKpeZpnQ`]@MbSju\ju^_i^`mQcZuZqJsTVgvZi_B{BkJ`e@L_nO~juLaCiTaUgTA@U_JUPaSOKoRKSBMPBGFOmOa[_C?sQhEw?k@GFpErKbGPePvGeWFQKbLhCykRoJuHELiU\iQTjQ[UWhHuU`DWQDOTjmXDPHuDGViLdIbUdYeLWZUxDlRSlQTdqIYdXvnUwhrgOC@#100!4?Ab}~~GhS#59!28?_??_?G?C!6?WcWA]_[OGW?KGG?O??COGHOG_?OI@@@CG_O?Q??G???G#100!11?A#125!29?K?Oo?_???_??_#149???@@#119!62?GG!6?G!6?AP#251!8?_$#95!334?C#114!36?__OWOc??C??_!9?C!6?C?C??FOISCWL_?GOWOS?k?GS?GKGC?C???O??_!4?GC??C!7?G?G?A??H@]Wo_#38!4?A?EAEEKCK?KCKFLAGAFM?A#101!61?CCW_@aE_?G???GfO!4?E!5?@@$#40!371?O?G_?WhYIXWRo@B@!5?!5_oOgwGg___dBOF_CGSI#56!55?@A?@@@?A?AA?B#129???C!4?@A#118!65?O!6?_$#121!397?A??AA#63!75?@@@#69!78?G!4?_$#77!398?_#53!161?C-#237aG?BgD?aSGA`LOg?RKAPCAXCAP?i?SjgU@Ga?T?i?PG?AHCq?@QChQdWDA_QDWdAGbC`IPAShS`QcZcI?J_HaPeWaHA@AOeOdO?P?G@?C@?`C??@#192!4?OAG_A?C?H??@CO?@??C??_?O@C?H?O?G??C?_C???S???@CO?@?G???H???G_C?H?O@?O?D_?AT?AO_@?AC?IO?I`?A_??_??S??@GCOD???_?OC?A?`?O_?cG?S`G??AO??S@?_A???G@ACA@Oa?_?G!4?O??O??A???O!4?C?G??C???O?G??G?A??_C?c#191?A??A?G???OA#246?_#96_WC#77_oWC_?b???C?QCGTID@?A@L???B!4?DFKJEUAEkguIEEA@@@Aa_oooOWOO!5?GCC@CI?EDA@`???@@@O?`KL?qJJCOKO?G!4?_#115?@`_O_@_@`??_#114!18?C?C???@@?ACKog#125AGCD?@@?A@?DEGQC\CGpSkS?_DKq_IWCysG?eQLzdcDA#126G?L#118?owoq}zdFLCW#102AAKACcwYpG!5?@@@?AB@!7?@G#107?@#99??_O?@???_~LvJaHA?IPIqlRkdOGMdcuQR$#246TaGSBgTGaTGAoDAgCPkAXcAXcAT?i?SBgUtLiiTTiAt\SqXLuudyUkIby\LlifYhu[Y[tklhAAYCH?P_X_UCWCG@?O_Gc???GAC?C??I!5?_!75?_???G???@A!5?_@!4?OC@Q?A?A?A?_!4?_?O?G??`?O??C!8?S??C#105!23?_GA???@A??IO_@S?i?S?H?A?T_A?AGQ@cG@A?A?Ah?SdGPA_I?C?WK??@#98O!6?A#114!9?OgUP_aosICWd??_!4?G!4?G??OOG?C??GAAAaCB?i?Q_??O!4?O_?KKWSI_YiedBA_O?GoC?gO@_?OG??@!4?@!8?A?A#59!17?A@G@??B?W_GO_#140D@!4?@??@?@AC@??A?@??LJA@HO?BG?B@W#73?G???QqGT#112???GA@K@#115C?O?Q?C__OPA#77?C?EP?A@A?CA!4?a??B?B#100___g_?_O???_#131!4?oGSDQ_T?aDG?kRGdO?G@?c$#244G?T_?OAO@?_S?A?T#202gA?_A?cA?_?S?h?S@gAOD?i?D_A_HCa???G@!5?_#184!5?C??@??A?AO`?`QcI???H_?aOEGA@AO?GcO_@!6?c?Q!4?TI_I!4?O?O??C!4?GCO_O?HAC??_??C?C?D_?P?O@I?@?IO_??GC_ACOC_?c?A@??_C??CGA?W???_GCGS?p?P!6?G?GCHS@?H_S???_AXEGE?bGOGCGAH?@A???C?_G?H_??G?GOc?u?w@oGCGTGV?eP?BGCgCI_W_T???_O@_A@?A@?aGDAD?_A?_?GCO@O??_???_CPcaG?@#237G#0_G#73G?@#102W[C?Sw!4?_?_?_O_?[???C?AG~^IOoo__wwOO?TG@??C__!4?G?`__?Og?KOAG_O?GOG??A!7?G??a`@!4?_EFFfvwEYmUIMEJSMUKG|Ldx{i\z@P@?!4c?CC??@@AFUEe{{_O#81@?C???S?KO#54?_#128???DHA?ITMiPG_O?A?BPCRDGseX_ACO#121??o_~o~FDM@#103??Qg?_B?DQ@iGD`IO?wO??MG?@K!6?QSTW?A??A#134?Ia[@zSH?A#93?_GcXaTGo@Q!9?@$#240?PA?SA_CG_DGAgOA#252?_PK_X?_XKi@SA!6?O!7?_???H!9?O#193!4?O#196!9?GC!4?P?C?A?G@?O_G?@eOBADOCXCiTHIPCj\vAg@SPeXvIdm@nOrluXeRgJDIvcSxjSJ\aZ`ZaYDYeLakPsItc@MrKrAXShaHUXA\_]_^?ZdYr?T_DAtGFO_@aAK@iSa\dWv?Rc?O?sGS?IDqL?K?_?P_GQCb?Rc?uG_\bGrGBSb?UHudQdIBW@IDIDQbPaAgtGiPs_RSiOTDV?jJy@lCZGuSlGm?TgxOvLsZTmpRhmHExHYtm@Z?RHdfQDF?@#72CC???G!9?@#59??GC!5?G?Q??O???O!4?A@?PG@Ca??OOGG???CBDBC@A@!7?O!6?cOWIc[B?Q???OBA?G_??AO#107!5?G?GO??O#115!29?@A?C#49@?AI!4?A?AAAGO?W?O???A_??G#55??C#114!25?G?qH_XG@_?PA!4?A!7?@!5?C#121C!4?@#95!15?O?CG_C?C???A!7?G$#218?C_G??G@?AO???D#193!13?@#240!11?OG#244?A#193!5?G#192???@OC??A?O???@?_A??O?C!6?CA???@??_?C???@!5?G?P#239!84?GA_?AO??O?G??C?G??A!9?_???G?Q@??@!9?O??S??S!5?O#191!23?C???@!7?C?A!5?_?O#198!5?_!5?O#192!16?O#239??O#24?OC#16@#101_??`C@@DJ^LJVACA#115??_!4?OOc??_?_#72??@???@@!9?@@#54??C#250???C?C?A#103_?_?O?_???_??@_T!4?O?O?G?COjC@gOOG?DHCPgSP_Sa@gOcAQWE?Ta?wG_h@@A?C@QC`I?g??O#54???@#121@?A?O???Go_?OO_???_#132__!4?@??o???___!5?Do?AHGDA?A#119!11?C#107_O?K#101!4?C`mDluKOqGe_keTIFO`?ACQOACD!5?C#98!17?OIfpQYHGc$#218!41?C#193!33?G!4?_O?OC???@?OcG??G?Ga?a?C_Q?i?OAGsAsJcHc?TGPiOeGQGaHcQcY`GQHACiOaS_M_T_Y`GQHQcJ_IPmOGbCwE`QLq?eXaT?Z_U_IcGfGQ?\?_G@ACGs?g?@CaOCGdGQhEHA`AT_O@aGoAXAGD?`?OGcHAHQ@aGA?vG`KaHaGQLOdWf?s?oGcGCGT?APCI?DgA@cG_G_C?CGAO?`?AO_PGA?C!7?CG?O?OCA???S?cG!4?A?A#97A#53G#41A@#48A#115A??A#40!14?I@#119_#69_#101!5?GBC?@?@?C#69??_??_?O[G!5?A#72!10?C@C@#101!16?C!12?_!10?A!8?CAAQCQG?Y?_!7?_#119!5?A?CG_!6?_?_#116!6?@!5?OC??CGC!4?A@!4?G#72!31?Go??o?O?GGdG!4?A??CH?D@??W?hC$#239!80?C!7?C?CO?G@???Ga?aO?_OCG???G#237!80?cG??@?Q!12?_G??G?A!4?C?C_AOCGCA#125!94?_#56?A#103?_?W?gCyo__O_GoGE@GAODI@?@!7?G?C?A??_??CA#121O!4?CC#77!58?A!4?@???CcKQGQX@zYhzYswSoGgW#69!4?A?O#73?oYiuAK[KKWo__???_???A???o#108!46?@#98_??G?OO??o_?_??CCWqWIc\aE?AQ$#121!330?A#69@#122?O#53!30?@#115!6?_?OG#53?@#118!62?@#128!34?@#132??_#50@???@!7?A#129!6?A#100!52?C#134O!4?O#108?G#118G?G#115?@$#40!372?G??A??A@@@H?GGOg@[PeHrIiPeHaPqCiTI?C!7?C?_#112!142?G$#119!372?_??G?CC???C-#237GaC@IU`SGAc?hAGP?aOD_?D_?T?i?DIi?dOI?DOI?OI`CQH?a?SOdQcBG`ICR??pEO`SgDq@w@iTITITiSg@ATiSgSgUgPAO`O`GdIO?ITG??K`C#239!73?I?O??H!7?OA!4?@??@?a?GAO?a???@!4?P_???A?O?@C?@C?OC!7?@C?@?_???_!4?_??_#198!4?C#105@!8?D??G?ACG?A?D?I??iCO?CO_?GA!4?AC??HACI@MG@??@#72G@#103GmJEAW?O_@JfPF`SE_??O!4?O???A?C??@A???C!7?C!5?AC???C?@?E?A?@?C???@O@O!5?OC???_??@?YCgC?hCQ??T@K?BAG`AI?S@HSAL?DGBGEpGGG?SBShAS`!6?_O_#115@G?AO!6?GC?GSG!7?_?_O??O_O#126?C!6?O!4?@#118_gop\Q@@Q#102??WSg?G]DFFIFC#77@A?@?O_??_??O#108???G#251C#100SWKXEV[}}ko?Q#93_?_gQHuhqt[aWaH_???O#134??c??_O$#246TGaS`GI`SGBSOdAgT?i?Ti?Ti?T?Y_TDYIdtyiDtidSYjcu^TaimYLX{REtxk^VIwnMjRYKmASS_O__?@ADySg?A?B?@C?_?AGCO!6?aS!77?_??A_??O???S@??K?O?OCi?G?O?_?G???_GO?G?C??`C_?C?O_O?O?@??Pc?@C??O!9?_#191!11?G!9?G?A!4?@!10?A!4?@#153!15?A#208_A#35OC#118OC#101C@CG@A@#111??C?G?G#107?G#118!4?AA?O#72!9?O#77???@@@!5?E?BAAB?@@!6?C!4?O!7?G!9?A?G?G@GIC!7?G?G??A#118!7?G#77!11?AACECJ{jUljM~PNYs_O#40_#59O?ETG#119A?O??A?`?@B?ACO_??_?Ko?kSG?O_oo?O!9?_?CME#114_dO?_J?A@?@?@#122?O#100oO_?_o_#114!7?B#107A#98!7?COEPGB@@ADYKJM@!16?DpmJhdP_$#244a?OG!4?A@OGC?_C!6?O#252!19?@!4?_G@#192???_A!4?A??_?@?O?C_@O??@??G@?O!5?@?O??_???C!8?O???G???H!4?@C!5?@??@?G@?A??A!7?A???C?G??A??@?G?C?A?C?A?@?C???G@C??G?C?G@AC???D??@!4?oCP??AG???Ca?GAPC`?G?@?_DO?g?SG?@?G`C??c?OC_I???_??C??C?Q?DgT?DGDOChA?`?O??@Q?@?A?_!21?G!4?C!15?G#56_#115O?OO!6?K?o??_OO??GG@`SP?Ag`_WSaWOE?_???GC?C@??g??GC?C??C#69!18?A!5?H_#72!4?G#69!11?C#101?G?G?C!20?CA?A!4?O?O?mOdGO#114???APisk_#125@Oo#118!4?_!4?_#125?@?A!4@???@???@?BELL@AN@#112_?O?A@!5?@#59!6?C#101!6?W]@@op?GWfOkOc_tPRHjbb?_?_??O#72?@#131??OKV`cGQCGaPc?sQSjS_#100???AG$#240?CHAS`SI?cG`AGPA_O?o?O_?O__O_?_O_O???O_?OI_#193!6?G@!5?C#184G#252???_G#193!9?CA??_??_??ACg???A?@?@CG?GA?C??D_???aP??Q_SrKqGqHqLqSiOcWaSaSgDwDoCxA|AsHsIpIoFoLoHuGqDqPgDwBgTgEwBgTaSaOiPeOjOeOgPOnOGQsGOAsJ?I?Ps?@IoDG?T?c?GAS@aWe?G?TA?@?i?SAOIOJOI@I?PcI@M?jOi`Ao@GA?AGQ?aGA?OCWA@o?G?CG_GC@GOIC`?I?AH?AG?C?@?C?B?C@A??HA?C?GA?C!7?A#49_A#102__OopCCMbFACOM?MBhRVo!7?EB???A?gGLMIABG??C!7?O?GHI???g_?`@?C@?BHCA?O??O?O???@^VUT]c??@AOBO?@`p_caOGCdA?_@??O?`ojifkFhK@`pp_#72!8?_#102?B!4N{_#69?@?W???GNErYsico?O_!5?O?gO_!4?_?_#140A#115!9?O??AG?o?c@?_CA#72!9?KGA?E?AG!6?acQ#99!4?G!7?_O_A?GQ@?@??GAXALjSjIMPOSQMN$#218?P?_!4?`O?A?OC!5?G??G!5?O#184!42?@g?IDACICgO?@ASgCgSGQ?P?O`?@IcA?DG?@?_Q???CAG???GADGC?G?C?C??G@??G?CAG@?HC?@A?@?G?GC?A@?@???@??G??@AC!4?A?A?@!4?H?G??IcIsJ?A??aG`C_BO?P?_???O?eOCOA??a?R?AOCi???I?A@A_???OIOIOa@Io@G_???A???A???GCGA@?c?GcW_HSA`O_Gt?SG_SGaSAh?Ag??DAGO_Q?lQGaSHaHO_AOdC@#237C#96A#40C#114G@???_?o?O?o??_?_?C_MKgg_oCIPC_@`hGC??_?Oo@pAwW?GKO_MG_@OcJOlA[G[GmA{q{Aice_FZCIlAG@k__@?_Od@o@IoCPgOC?QOGCPQ?wPSAW?aW!5?_O?OO?G#81!20?@???E?o!4?@?B!5?O?G#118???_#128!7?@?A?@#69!8?G#103??_?C?K`ABkb_ygGdWb!4?A_O_OFOlJ^IK#95!17?O?C??CGA@C@C$#252!16?IHD?AD?AD?I?D#196!49?O??@!6?@?A??i?b?CWaOPgY?aTGCBKhUjGpDuHuDoGbOnReXbWjTqEwNrEx?tIsApMoLoMqDu@qLoKiUwFwUgVoFwUgXb[jTkPlOmPmT?e?dQc@?@??_K`K?AGQCG?aCGFPKbCH?HA?LOfG?CgC@O?`M_@cG_K?ZcI@c?`CG?S?M?VgVGtGvWDxULrAtkIuQlrQFTqIoEdPUGpbsSjoT`xUSxB|waXuc\huOlpXbsSojT{`OYC#239@#140G#70@#77AA!4?@#69!15?@?NHA!4?[???AOo???GCA??_OooC???C#115!21?___??c@o!4?_!6?_CAg?E?A?@@O??GDCi`eeHC?C??OO#59??_#121!24?C_?HD?OGC??PGKM[wS_O?KABCKMMG?WgO_?o_ow]|M^@#107!4?MMGOqCGOOO#134!9?CCCHCC?G!7?_???_?_???@Ic@C@$#202!17?C?I??I??I?D?I??D?I?D?I?D??COH???S?@!4?_O!5?C#239!23?@!6?CGC?A!4?D_???aO#237!82?AcH!4?_?@C_???O!8?OC???a???GAO?G@!7?_!5?O?O!4?G?C?O#217!66?O#240G#132?_#59!5?O_??G!7?O!9?SG?@?AC`ODAOs_?oG{?@@??_O_aWqaPsIO?@_?o?w???sOG@K?CJTAOEIO???A?AO_IS@G?A!7?__?O#73!41?BEN?_!8?B@AE?G?C?@?AA@@FIEC??_IG#98!30?QGG?B@$#218!322?_#108!8?G!4?G#119!12?E?C@??_G#121!11?A#40??A?C!4?O!6?`AOAPAC@?AH??@O??G#118??_#119!21?A#107???_?G?C!8?AOOO#132!30?G#49_?O#132!11?@GEAAA??@!5?@?GOOCC?E@A$#119!371?@!5?G#49!116?@$#101!373?A?@??@$#53!376?@-#237aGOCgQCKQHCaGeQhCG_SA?HcOA@OC_I?aS?T?I`OH_SAcPKAG@OhCh?I_S@IaH@?i@QdGtAShEW_Y`GCHUGRKOaSbS`WaXaHe@eWaC?AC_IOI@CA!18?C??C??C??C??C!18?G_??_??_??_#184!13?Q?`C?A?gO?A@E_F_AgDOGc?I_??h?O?_O@?AD?_OcG@aKB?_PaWcP_S_EG?aI`A?H?C_?_?A?_OGDOG?Q?_C??OCXEHQC`EGHcIPe?`IS_TI_TGQhCaPCHAhCQHcQHcQHcQHcQH#246_@#56OOA#115C[?}K_OgLdBGhPPGCcbW_bSCAMrGo?[`Qk?IS!4?o?CAG@?a?S_?_!4?_S_#77!4?OOG??O??OG#115PhGGgAO_GGO?LG?G??_OhGOTcaOSAgE???G?aOsOCCC_?qAOQOP?_#77CGK?G@?@?B?F@NYUlsWEr__OC#119@AG??_?I?p?_@!6?__??_O???GEI@H@#112??@#107!5?_!4?@?O?A@#101?!4_WsB@!4?swNI?gA[PKJCISVIZa]dQoA#98??_#99?~nAOCO???gOG??O?H?iS`QPoOG$#246TaGPCgR?cQHCPGCObSJ_HuOALoM`IT_\?jiiTSIeOJh\Iep|VyjUZU~TJisT[umfTukYRIlhAPdNdYuhQ_dc`n?@WAKAC??O?W!6?GOC`CO#239!21?P??P??P??P??@!18?A?GA?GA?GA?GAO#237!9?Ga?G!6?D?@C?A_?O!4?_??@C?GA?G??CG?PcG?_GA??P_?CO_?a???G?D??@C!6?@AOG!8?O??G#239!9?c#193!14?g#192??G??O#208!17?@#97_#20C#121A?a#103bD?A??@?A?@?C??_AG?AS?a?@#69?cEXBOl?wC_oOowK{Ylvun\[gCgWkcks[_?_!6?_!4?_?_?O`???O!5?@G!4?_?_G#102?A@H@H?Pp`?_?OD???OqATKCCCLMKLJbBvu}y}}wcww_???AB@!6?_!8?GC?KCM{kW??GG?C{E!5?__o_?o!4_!5?O__GcI?A??C#113C#100IkUkVfZBA#77O?C?g??_?G???_#134???A?A!4?T#131?OK@G`I_T?cqOdIcqTPi]c??_$#244G?@gA@?_??AP#218!24?a???C#244???P#252???_C!5?_!6?O#193O?G!7?_???C?Q_!5?@??G?C?C??O!4?@_GOA??`?OG`]`]`]`]`]`]`]`YcR_Ga@gA`Ga@gA`Wa\a\a\a\a\a\a\a\aD?HQCHQDGRCGRcGfWfWfWfWvdPKrdLiOiO?AoA_H?BGDOI_CI_?O`?O?_A@_A???@CAC`C`?GPaGCX?TGACP_I_O?I_CpI_G??_`I?tAGrC@A??@?GA??A?d???a#237!35?O#110O#63g#38C@#102O?I@@?@!7?G?B???@#118!8?C?A#59??B??IF@??A!7?B?B??A?@AI?Z@|WKJCFTJhCJE???C???C??C_???aDGC??C!9?G?`?@??A??A#107??A?G@#101!6?C!8?@?A?`#59!4?_??B?@??o!6?KCGE?GO?A!7?A#107?A#121?@!4?@@?@#77!8?_#111!5?_!4?G#98??Og?_G_G#72D!7?@?@DI?@C@?GD#93!8?pepMt^iVJDnYdZCiC@#98?HmIDb{Rg$#240?PcAOCGQHC_Ge?hEWbSJsHeXaLoMpITa\?T?G`SHaSA_?GA#193???C#192?_#202???S@I_@??G#192??@?c?O!4?O!6?AG??S??@!5?C???@?O??@??G???_#239!77?A?@!9?GC??c?I@O?g?O?_S@_O@?A??A!4?G?CAG?@!6?a???G???Q?C??c!5?G!6?C_#217!50?C#83A#73@#69G!4?_W_O#59!9?@??C?G#40!17?@#118??_???O!6?O?O#102!8?__#119_!6?_?O`?P_!5?O???O!4?O!5?_#107??@?A#40?A#69???_??G#118!5?O#108!9?G#40!16?GCGAgO#69C?O_@@PM?pA__?@???C!4?_??@@?C?A#122!22?O??A#95???O?OC#100!13?@???C@?GL|~~^i#95???GA#134!18?DASBg$#218?CA?@?_@?_O??P#184!57?ACG!6?CHO?Q??aC_O_XaHa@a?cG?A?_??A?A#246!80?O?C!7?O@?AG@O??CA???@!4?A?_!4?PCP!8?I?G?PC??O???_!4?O??G?A?_A?c?GA??@#239!50?G#125?_#72_#100G#118?_!5?O?cO?A?OG#54!34?O#40??@!9?@???G??AG#118!5?O??@@O?G??OO!7?_#119!16?_#114!34?@OD?EW?_!8?WAQ_A?B@LRUE?@@So!4OGGCW?CKQG@SbOL?HG#99!13?G#251!17?O?G#100!33?G??CV$#196!72?O?A???@!8?G??A???O?GCXASaKTAKpCOKjD]`]`]`]`]`]`]`]dZkZe\yE|Ye\yE|Ye\a\a\a\a\a\a\a\a\q\udXudWvcXvcXfWfWfWfWfG?KQ?W_SADiWsGXOCO?_A?@O?@SA?ECHACGcGOgEHO?O?O_Y?C??A?C@I_P?G?S@mOdGRGCZ?tIDUOdAXdCXiP]dYepSlr[hQ?ZtKP~]tj^it^ivDUzTmze|UzluZluZluZluZluM?@#144G#101O#132@#107?O!7?O#121!44?W?G#103!10?O??O!10?GA??@?A??A?@G??C?GO?A_UGC??@a???IQ?@G_@@I???aO?OO?@?D?@CI?COChQHcWCYCgQg#73@?DUSK#115?PAAP?P`?@@_QQ_@XG?ggEG@I?A??C?I?GDSIGDA?E??OC$#239!86?G!4?@??C!5?@GP_?@???_?O#192!80?@?D_G??G?CO?_A?DO?HSAGaCHASGO?TGA?aG??OCI?C@??A???_PC??S?AO@GA@CO?D!10?g?A_??_?G?O?Q???G#240!35?A#128??C#119!4?O???_G???_!5?_!6?KRHa?K?O!4?_!5?O?G??_?GO#102!31?CACA#81!67?CAGA?_#77!9?O#103CG?C??A!8?O?W_GOOCOI`SiOmO@uHO~\N^R`@??B!5?_tzVTbmQsqo_gC_O_O_$#114!330?EKEAOGeUGefOWSFWGbX|o!4?_??BCpJDGMEB@@!5?B?BCFA@BA@@^C}AeBCR?icCrCPMEEAE\mAdr`IocfDwvYFERBiPKEgS?_?][U[LIHD`hGTG?__ha_PAo?_!7?O#125!16?B#121G@?qC_#118!13?_?@?O!4?CCCEAAE@B@A!7?E@$#59!330?@A#49!151?G#77!23?_?_$#101!508?_-#246TGaDOi@S_ICPI_DI`k@iSAXDgU`QKbCXaHSqhDyDOdKqFQyH\uQJmx\VTWtmDioInIoYnIdSRLaDIO?_BH?OCWLY@?@?`A`G`Go?pGPC???A@?_?OG!5?O#237!9?CP??P??@??@??@#239!18?AG?aG?aG?Q?CO?C#137???_??_??_???_#184??AP?_HQC@?dGO???h!4?ITAPATg?O???PA?T??E@aS_DO@C@??O_ADGO_?TAS?cA?_???_@OcG?S?GOC_PaU@]@[`^?E_H_R_DGcI?kAoBgR?KaDgR_GoAgOaGoA_C#105hA#218g#64E#114G!8?{XH???CB?_OIdFPpGQJCAV`Go{??@#121EAE?AC_!5?OH_xGS?CGO?@O#102?_aOOOWG^GD!4?C!8?A?@#103@!8?@???Q_?QP?P??OA?_?O???OQQ@QEG@OGI?OCC_G_GOGOkOfOG?I?@A??@#53???WGO#115??A?A!4?@GIG??C?A?@#77OGQDBCA?BCBCHSo?WO???_!6?_#100_?_gw{|MFB#102?D?C!6?A?E@ICG_#77?O#100?O_suU~#99~i?~dgT?OG?aPI?PGDQ_EGaO??_OC$#237Ga?OiCSaITpI_DY_SAOC@gC_Q@GC`OGa?SaHCQ??i?Q@OgDSa?HcPCA?AdIPiTIt?tIdOdY`KqCgTiTIs?zChA_CoKoMOKOEOE?E?A_IpKPcGSHE?a?A_G#239!14?C??CO?CO?CO#237!18?_!11?@!18?@??@!4?DO?G!6?_?DA??PA???A?PA?`I?cHaS_D?_?O???AOd??G??A!7?S?_??dG?C?O??O!6?G?O#208!38?S#237@#70_#72_A#118_kR!6?_S_Cb_oWID?G!6?O!7?_??_I??OC?G??@C?C#114@!5?C??E?OAAIaS?oAGB?IACEA!4@BPB???HDCFBB@OYMr@Rh_GQ?}niwOYVbYAIM?HOKH`w?_?G#72!8?@!10?w?wswso_O__#102??C?WOOo_o@??_OoOGKCA#72?_WGWSg_G_#102??FAFBLntIVoM?J?@#98??O???A#95@#107?_o?_G??GO?O!4?_#72!7?O#134G?@#131??S`?WA_ydaT[CtiCqglZwTKb#134?HA`Oc$#244a?DG?@?G!4?C?_#218!28?G#202!5?Hc??A??_#192A??O?D?O?D??O?G_?G?_??C?Q?@A_!4?A!9?C!8?A!4?_G?A!76?C!4?GQ??@COC??PAT_???g?@ICOdI?_I?cH?S?@O_CO?g?A?DGO?CAG!4?H?O?AgC?I??PA??A??I??G??_???_H?Q?C?O?@O?@?C??C?P???C?@C?@C?@C?H#239???E#83O#56@#115oC@GrGc?AcS??b?S@AcOI?i?@dOQlGU`M?t?AO?O!5?_A@!8?_??@?EOT?L?d?__?gSGEOG?`CAQAAO?SAALA?@?COi?D@KGCCDEK???D?L?gCDDC@KCA@oO?@O#101?C??_?O?AD_A!4?_?Oc#114!9?@?EG??CCG?G?@O?GOGAHA?@#98!4?_??O#53??O#107!11?A@#122?_#72!4?G?C#113!4?C#108??C!8?A?ACGC?S#98!6?g#93??@M?ATIDITi@i?TiDQ?C@A#100???_OK$#240?CO_DOi?T_Ic@Y?TIPmPiTaYDgUhQKrC\aHCQgDyDY`CgD?a#252???O??_G#184!15?A???O?DIO?_Cg???_CoGOKOCOE?E?A?A_IPCO_G?GA?A#239!83?@!7?G???@IO!4?g?SG_G???C!8?O?C!7?G???O!4?Q?_???GCO?A?PA??C???O?C!5?C??_#244!34?O#97G#81C#59HA!5?O#103!4?@#102!11?o#103GC@#54!12?_!5?C#81A__oO?o?BA??_#59C?_A?_??CB?FOB?@@?A#121?o??C?GGG?!4_??OG#102???O???Q?_?A!8?_oo!5_??EkC`rJZZJFF@??@@??FB@#59!11?AA?SC?G??G?W?_#103oOG_GctAID!7?@???j?@?CaOIDgLo~S^E!7?owONwJalUfDeNt|x[Orr]hBSI?A#95!5?O#98!18?_PK~ULAjZ$#218?PGA???@!4?O#193!42?_G!17?@A!9?CO?A@???`A_?`GO?pG@??AG???_HTHPK@tLa\a\a\a\a?G_I?cQGcQGcQGcYdYdYdYdYdYdYdYdY@SaHSaHSAhCOgEOJSb[BSJSb[ATiDY`[AOGQLOA?Gd?aH_Ci?G??GtAC?S`_G???T!7?I?I?I@C@Og??AT_Od?\?u?cJ!4?P!4?_G@Cg@??@_A@?@C?A???@?@?C??C?O??P???C?P??O??O??O?_#104!5?@#125A#102C#107@Q_!6?AJ]#59!14?G#54!29?C#103!8?_#118!10?@???_??_#59!7?GA!8?_!5?_?O??_#119!7?@#59!4?E?A@O?_??C#48!23?_#69@@B@A??CC??A???@#101!4?o_olYcQdjCYsJu?G{_gO??O!5?_W^~FVBB!5?A?@A???@!5?@??@AkjdN@H$#239!74?O!6?C?A!5?A!8?@G?C!12?C???A#246!83?A??A@Q?C!4?GC!4?@???cGO?PAO?H?I?J?iASh!4?a@???_H???CH?@A!6?_!5?C??_??A???O?C?G#133!34?O#112?G?C!7?_#118!84?_?C!4?G?G??G!5?D?G?G@???K#77!5?AC?C_?O_WsiUkQnWgS}dZ}D~FIFJNFCKW_wwo___#107!5?_#108!11?@#122!32?G#115??O#112O???g#115!5?_$#196!78?_@G???O@A@G?C`A?G@GO?`G?COCag@U`UPc?OcRsGa\a\a\a\a\ze^pmZheZheZheZdYdYdYdYdYdYdYdYd[b\Sb\Sb|CzjExjsj[B{jSj[B|iTYd]_kjUc_isgAOeXcQ?TiS_?_?g??A?ADQcG??_IO_G!5?_?OiCDIO_?ALAg?aH?X?UhUPIcIPeG@mpBiTiK@W_U_I_X_^?]_]irYdzQlJ{Eg~aXyEg^eJ|Ej\eJ\UzUh#121!4?O??G?G#112!93?_#107!6?`C#118!55?@!4?D!4?CEBD#114!46?O#118gO?W_G$#119!327?CR?C@!4?WGGE@?_OoCMA?__?_G?@A?dG???O_?@OC?cG!5?_CHAc?_G?G!9?_Og_OX?HCkWCc__{?QSAoG?COg#81!66?@@#121B@??CCEA#77!50?@?A$#69!328?cRj?A!4?O?GC@!5?C!6?U?@IYSh|HD\zMjZpWVMANAEJwOpJYY`H?L?L?@!5?cOC__W?W?_W?C??[??OGog?CA_??C!6?@??DA#119!52?A?AAE??@@-#237}?dOIcT?iC@QC`GAGCAgDO?COAgD?OAG?T_AS?AhCOHcOI@S_Ah?C?_GBc@Y`UGe@gQ?QkQcHOiCH?VgOhO@E@Q?OGoKOD?D?OaSIs?GAG?gQL?QC?A?GA[?GO?_G?O??@??@??@??@??@?AG?C!5?C#137!7?_???_!8?_?OcQG?QcGT_I_TGaGP_?O?G?O?G?O!5?_G?_#246A?@?A???ACGOA??BO`GAd?ACA??A_CP?_OG@??C?c??G!7?A?@?OC??C?@?A!7?A??_G?_???G#237!6?_#105!10?C?O!4?E#153O#83_#69CO!7?@AC?O?G?G?O?_O?@_CO@_GwkrOwNLTIwqMVHF@@P??_cEcyOYLH\DTa_?AKa@C?BCAD?B@???C?`?cW?GCOHC?C@A?@@O!4?G??G!5?OG@??O?G??O#59!11?_#72!6?OOO???cGdkZK~~N{bF?BCIAYRRaO?_O!7?[?I?IDSiOJoNqLOgS?A_???Os!5?Gs?G?C#118_OW__oogC!5?_o?@#111?G#108Ac#100?g{}}~n`j#131?@[Q?@ADA?LAEIHtMU\BI@A#100???_Bq@$#246@Y?dOIgT?yChQCPsBWTAwFwBkPAWbKpEgATgB{SAxeOJdsiJ\sUzjLTu{Jmc]htP]Ulnl@HRun?rSr_CBABaOgChE`E@IOIOID?@?@AdOdA@??_@??GCO!5?G#237!46?@#105!22?C??C??C#192?@!6?A!6?A!5?@!4?EO?C?`G?DO?HS_G???D?@cOG@O?GOc?@cA?C?OcWA_K_WaG_???C@??O???CA???O!4?@O?@OCHC?D?OdG?@??@?_?GO?C#96G#115G_yDAZ_PK{Cpc?W_\?{D{IhSqLomOXc?BKBA?Q??@???A?a#73??C#118!8?O?A#115G?DB?@B?E@A?B?A???@!4?C???_!5?J__?AQO_PSEWAhBTGccHD`?G@X@H@I?`OQA??oO#53!12?_!9?_???B!4?@#101?C@G?WAgQkUiIuKq\b^cZtWiPnSJoLqKSGjS\oKpMGQ`iPfVALaC#119?O#115GcK?E?@???o__G?O?a#101??AtE@@#72@#134?O[?S???OkOgOg?__?_!5?_?gCgVGKGC$#240?`A?@OA?S@yChYcHsBgTAgFwBkTa[bKPVgITgAhSAHeOI@S_#202A@???_?@#192??O@??A?_??O?Q?G??C??C!4?GC!7?_?_!8?G!14?@#184!75?A???A!4?A@?@A??@?@!5?@I@O?A@g?H?i?E?O?G_?A@CPI_OI?A?c?I_B?BO??OGpA@??_K@ODGpC]s|gwUkjms\oh[v?LA{Bs?M_KA_?q?wA??AOgA?GAKBCE#137O#97?O#103O??_C_S#107ko#59!13?C!9?O???o_?sCGOGC#132O#54O??Q???O@?@_?A!4?GO!7?_#118??G#73O#112A#118!8?EA??C?O??KC?C?@_???O?_?@??O??OO?A?QOOA?_#48!31?_?[?jSA_W??_#103!6?!5@#100!6?A@C!8?_#102!4?A#114??A#251???_??G#100o?BBA#114_?OG???A?@?@#102OC!4?C`#99!8?A?j}alnQdQgTaSXcSIOhagTu$#244?COI?@?i!6?A#218!16?_!5?@#252!11?G?COAG??O#184!5?G?@!4?c???OG??GPgO??@A?O?OGOC?D??_OIc!5?GOcAG?QC???G_G?_#237!84?@#239!10?G!7?@C!8?O?GCOG??I???c?I???G!10?_GA???P!6?C@??O??G?A???G?_!9?O#246!14?_?g#241C#101_???W#59??A#102!22?A#121C!7?@A@_!4?_i@jURG???C_O?O!4?OoW_GoOWWGdCSyzyY]ArA_O?`_OG?G#103!4?_??A??D?C?A!6?A??_?C?@GB?`G?AG_??c??AO@ODACA@?G?@#99!6?O!5?G???_#102CCC!4@#53!11?_#103!9?A!4?A@G?@l[SKG!4?owLF??S?HE?BKJK!4B_XQKXIPA#98!5?S!6?G?C?OG?O??_??S?GTzVgVoDy$#218??G?c???@!8?_#193!35?OA!19?@?_??AC???_OGCGA@A?GOa?GH!4?A_OC?@_?G@iDPa?@bCBcBCBCj?gCQgCQgCQgCQG_O`A@aPA`a@aPA@AxU@IOcZ?[bKoKPm?Xc@HQcHQ@GACPACPAcGlIHcPIHcQLQd[_KSaSIpKOkHuSIcYCmPGA_@O?CAO_I??Q?EpI_OG?AAc?J?E??o??OG_A?@CO?B?C?@?A???_???G??O@?D?C@S?C?C_!4?G!5?COC?C?A#208???G#244?B#116A#119G!4?@!4?AO_?D?C?g@SAhCQA@g!5?GC??A???@!4?W?gS??`Y@i@AC??gWSig?@?_Dc?d_A_?CCD``WKX?KSOHc`s@?GL!6G???G?SG?cWKDCK?G???O#77CC?CC!6?A?G?KYfiLJL}hVYeYBCB!9?@@CCG@HUKAgSsGqKa?_Pc!5?_C???b?BShALoE`??A@A#134O_#98@ATG#107???BBBH?Op{oCOKOKK]C`O#93!12?@!5?@A?@?@A?@$#196!76?A!5?cOGC`A`C??@A?GTAC_PItOLA`EGOVc_@OiDSASRKR[r{jSzEzhEzhEzhEzHuVlU\yTMp]TyTMxu|Eh]tlZC|b[rMrmO^cJYcdZcHua\pMgrKtIROdqRk`uQl_kYa[pJSjSKrkRs?_cG@o?CO_S?GO`GaC@S_G_??C?@cPG@O`CO_GdMYdDASkXEO@aGa?AY_@?BAGR??B?BC??yApAGBy`ZQlZUHfA|nYtjExzqlP{rH`B#136?@#118C@??C!4?wGHDAOaO!8?H?E?O???_???G#81!4?_ogKEC??HG??CC??___!7?WOGG??OOGg!8?@?`#112G!6?@#102???AA#59!9?A???A#102?_!9?G?vLDN^}X^v|__!6?C#98!12?gSgoS__???_#108!25?@#112!26?E???A?A???_$#239!77?G???C?G!8?_?_?_!9?O!5?GO_??_??_!7?CO?CO?CO?CO?c?G??_?G_K?G?G_CG!5?A??A!6?@?A#237!43?@O?_@??_?G?E?O?G@?_@?@!4?CA??O??O?@OA?@Ga?H!12?G?O???C@?_#72!38?@#121C#114G??A?BA@?AGcA?bBAA@?AG!4?E@B???@??_??C!19?A???DC?C?A#73!17?@#114!4A??QQoo_ECC`pf_UOa_RXAaA__QcEcadgAGhOrG?aO_!5?A#120!20?O#108!64?G$#77!322?A#112?A@!8?A@#54!19?C#59!27?A!30?A#101!30?C??C!7?@!4?@CGO_?_?Q_@O?O_O$#102!324?O_?G-#237|PwEgTAhS?hAG?i?d?AGD_A@OC?i?DOCA`G?SBOCiP?cGCaHOCO_KQ?iHS_WcHqL?QcPIPiCpAShSGqKrKRcRkQkOcGdGDWdOaWaGcQgAg@?@A?GPaGP?AG!6?Q?@??`??@??@GA???_#137!15?_?IOdGQcHSAO_DgQcHUhShQcZcYdYcZcXeOdY`SHcxAXaSHOaSG`IS?H?Q_#192!4?@??_?PA_A?O?@CH?D??@?PCH_?@!4?A@?I?OAGC_GQH?IOjCQk!5?@O_??G?Q??@!5?@GA??C!5?C!7?D#246?b!4?@#72_O#115R_G_HGOA~tSIhSu\IhcZdQNoNshVOn?_G#59s]N@@@#39??@#73@G?A@!6?_?C@??@?G_?aOOOGGcQOSOaeDIOAc?C?_O?O!5?G???G#114O??O!5?GgGGxZK@cOQHSUhu_@E??_oDGg??g??G#72??O[KZO\Lnz^jJmDVFPNug??_?O!4?@@AAC??IS?H??_O@JS`ITiDoDiDOfGZ_ItA_W@K@#107?_???c!6?GLC!5?B@??BAK#101Kh#251A??A#134??C@RisOhA~aXCbQH`IdYCbsY@ID?CQE$#246Ac@WAgTAhUOcRS@Y?lDqILOm?jS@Y_IpKQcJ_kJPCmXRcXSejxlUolvSqjL`ZUCqzlHmsCPQM|aCJqD!4?G??@?B?R?Qa?AGC?@?O?COCOiO??_???_?O_?OA#239!101?A???@?C?_??@C?G???@aOA!8?A?C??@!5?A!4?G!6?A_?O???G_A!8?@GA!7?GA#237!8?CO#150?_#202OA#83B#114BCP!8?I`SaG??OQ!9?G!7?A!6?A#115!8?@#132!26?C!4?_O#119_!5?P?EAf`_cd`bkctL@fAA`???_??__?_???OO??O#101???C??AO?QObK?pCi_AO?_?C@A??I#41!6?A??A?c#95c#101?@@?BMTA~uJ[VI]sj]tIDYFYTOjGRCNOAHP??AsB?@#108A#115C@??@???S_HDpCAO??B`CGO#100?A\n~Xv^z}kO!5?GCiWks]sW_oG??coOwr?`ib$#240?G?_?A_OAhEXcjSdYAwDoQlOnOjSdYdIpKRsJOciP?eGPaHO#202C??GA?G@C??C#184!9?A!5?O_CGQKBCRcQk?c?cGC?DO`OaW_?h?g???C@O??@OA??A!4?@!100?AG??G?K?IoA_O_YcIOC_?ASgUgS_WcW_D?_@q@A?CaC`COh?ODQcLQK@Y?T@HCPEWfWdWA_TGVoIpIPi@?ODy_\q?QG#105AO?A#24_#86C#77_??A#107GOcJt#118?I_!5?@!5?OA??C?B!4?A?_!4?@_??_O#69!47?O?C?C@??C?@G?o??@CA#103?CPGA!4?@??@C!4?DO_?Cg?DGC?G#53???_CA_#99?C??O?G?O??GA_??cAO?O@OakGG#100???g!5?_!6?O#103?G!8?C!7?w][lrY?A?OOm?A?q?AOK?A???TarS_O?C#99!5?DJiU|?O!8?@BOG?GC???@$#218?A?@!13?O!26?A#252!4?A?@!6?A#196!12?G#193???A?@?@!4?G??@?A?Q??a??@C?P??@?OC?gS_@??C?I_@SaHcQG@gCOIOCIOcIO?_TGPCQgTiGtI_y?{@y@{@i?DQ?G@Q?dGDQ?H?C??A??A??@??@!4?I??AG_A?C?HACAHAOC_HQcHcJOjEwEyDWAk?SH_M`?OAgO?WCi?A_GACgAHS_Gc??`CA??@_?C_!4?@??CQ_!4?A?_?Gc???@?C??_@???A_G@Q`Go?OAG??OGGCK#97O#99O#41G#102GGtSERcG#119??@S?@?aSAH?GD_COJ?gCO@!6?_?_?C?@??AoaUtICA_?CXCiSAG?CiC_SO#81!24?@!9?A?A#102!7?AA@D@A@?Q@EAHMJF?AVRqV@g@@#98!8?O???O??o?g?_?PKrNX`n|bAI[Osq{o_#134???_???_!4?_?_?_?_CO__O_?oG?KpA?@#118_OG?|CuNF@B?QGI`kbKKKY_#102?@#113!5?_G_#131!5?D#98???DaPC@A?@ACGCAdQ@iFGCGPK$#244??E?T?GC#193!42?A?@!6?A#239!21?_!7?G!9?C?@??@??C?gC!8?@C?HC???g?S?OC?OC_??_C?H?A??A?C@!4?C#246!73?O?@C???A???OC???S???@AH!4?_G?C!4?_O?CO`?A??H?O???D?A???G_???A?c??_?@?C?_#208!12?C#218??_#240K#144G#122C#103_??@_#69!7?AG@!4?cQG?H_?Q?_?o^vH`?KQGBoW{sRG_!4?@?@??O!5?P!6?@#112!24?O???C!5?@#59!10?C!11?@??A_??G#77?SAu_nSbbA?@#48!5?C_O?g?cO@CRKO?K#93??KW#77!4?@?@?@??SBGD#98!11?I??C!7?O#114!8?A@?_G???_??O!6?O_#131!30?@#101!6?GO?O$#192!58?O??_H?C?Q?@gC`??H!4?_?O_!5?G!4?G!7?A???@!5?C#237!121?I_???dA??G??@gQ?S_?CO@OA?O_HQC???@!6?_???G???_!6?AG?O!5?G?O#101!23?E?A#59!12?_C#112???_#121!8?E!4?O??OG!4?C_OFHG?sWK@wIaQS@TCTGC?DbAGcjhdWGqtj|Z|z^NN~n~~~mn_x?IAJII?A?A?A#69!19?O#107C#103!54?_#77!19?@!9?A#119!4?wG???_!9?_#72!40?_?C$#196!82?G??@?Q?P??`O?GEG@?EGCQCAiPA?JQm[bKtLSiHsQgvkVQn`MjpmJpMv\IrmQlTiTtIp]D~B}@}B]TtiGvdYcjWfYgVcZqhUhUlXcZcYdYcZeXdYd[bUXExeShqlShfYTalQuHSnSxFwDwDtA{B_R?OCGODA?@_??HS?@?@??A@?A@WEGO?KoLOHOI?ACOnY_H?CbM_\_UCpAWdOeGbWU?S_IdGTES_[fIDN_Dyl?`fZ@#54!33?G!7?_???A??@??S`I?a!4?Cg?I!8?_#118!26?O?O??OK?O??o?OPOC???O?G??G??O???_#100!75?GCEaa?G#102!10?_O#121?O!6?oo$#81!358?oCESM???GCKG!5?O]B_?@?__AiP@jI?CRHCAIDPG!4?A#132!13?G#115O??O??O?G?KOC_CA__OGiCSi?CGGg__OGGG??@#251!72?D???C#112!15?CG@???OCG$#49!359?G#132???A-#237xOCbXcRGePGC`?S?OI`OCgAPGC@gA_I@Ga?TAOAPC_HSA`OI@SA@?Og@SHQlGt_TAh?OaTgF_I?SGPiPmPa?dI?I_I_I?I?G?WDQdYcYcQcIcG_I_S?OaCgTGS_G??IS?AOG?_??_??_??O#105???gOcGO_CGOgC?oC#193!37?c???@_P?`O@GAOChQCQ@GaDGRcHC`IT_OI_KOl?IoMP?S`Q?GcZcGCO?DOH??IT@Qe?Q?e???_?@GcOIOCAHSAGO?G?OGA@O?_!8?@iO?c!7?cv@#59__A_??C#102B#118O_OO_X!4?GAAAC@@?_OG??A?A?O?G??_!6?@!4?O?G#73???G?A@??_`POOWKKeAbtG]KgRbGBP_hSSciEMAG@!7?@@@#114!6?WEdkeO]OGApIcWa`_`OGLKET@A_#101??A@AO@yDqlcGSk?OIC#120!10?CA#101OG#95@?@#100?_o??GE@ecEF@@!5?K???@@HCQYGGC???@#98?CA#118OA??CCBA???@BB???@!4?OBdC#107@#101_Dac!9?O?_#98?@AC#113!8?GOG_G#101{m{SmYkv$#246AhOCaHCRGepISj@idOMgRTgcRgQDWDOu@Si?k`KaXUahSMdsyj[UfdS}jucQRINiwU^nLGRO\tQbdm?C?GOO?OdODODOdODQ`A_G??@?@G@O@A@O?@??G???_@???O_?_??A#137!18?CHO_C?QgCHQgAhQChQlQlqLqkRkRkRkRkRkRkRkRkRkRkRGQc~?MOM`KAKPcHQ?dG?S`GQ_CO#105??O#184?GA?@??g?@?APC?AC?ACJ?QcW_CG???IT?Ac@c?e?qC`Og?@Q?PGACO@cP?O?OGu@SHqGeHWCydApI!4?gdVyc#105B#96?BG#150_#0A#72A@#114@o!7?A_@?NF!9?_!5?CB?A??G#121!10?C?@DDFE`?C?aGOBS?ed_OPW@GAt_QDkSfkm^EJ?POwPlR}n~v~n~}]AAbaB`#102!7?c_cSKK?G?GMFCBQ?@Gg[\]}NG__GG#53???A??G#48A?@??S?AOCHC?H_?@#134!9?o?oGO?G_!5?A@?VDICA?hC@E@BADAWSj#119?G?@G??K!7?A#128_#119!9?o#103?Ai\AkOA#113CY`O??_#99?@A?O#77!15?O?_O_OG$#218CAG?C#240Q__PGEpISiTIdOFgATIcRkQdYdGuHTiPMpKaHSAhOI@#202C?@?OG@#192???H?c?O?@?_?O?C_A?CG!5?C?D#196?d?`?C?`O?A@O_I_?@?_G@O?ADW`[?OISiT_BgLqMhO_USbSyUdxUdxUd{jRkRCBGRAAgBaD_RHAhQ|EgZSdQlQLqLRkRkRkRkRkRkRkRkRkRkRkvHZ?~oN_]QlqeXehUGrliUTgVgJuzMta\isLoFOmoL_iShY_[`O??@A@Q_I_?_?_G?W?H?X??GADgQ@IcdOxCaXCbmDjA?sGe@SHqDqDGtIcSjmY@Y_DWc{O#202?G#14C#48C#119_S??o!8?w???WC?q?ACA@?TG_S_!4?GA?@!6?A@ABCAOOHSAGSWfISGA@?BA??O#132!9?O??O?_GC?_Oc?O#126?G?O#81?@!4?@#103!11?G???S?CO?GAC@Q_OA_???_cOGC#98!6?Q?@OIC@GtCjRCXKcX_WHFC?ypSH~Nv@EHA#103??Og]kY!8?_!4?_?_oOE??WA@!6?AA@#73C??C??g?GA#77!6?O#251O#100?HRmTzd]n~oNgSGsHyT~y|~^~~unv^vB@@B@@@$#244?CbW??GC#252!42?_G?A#184!10?C!4?a?G!4?O?PiPa?_I?I?I_I?I?G?G?ODQcYCAcAcG_??A_C_???GS?O???DI?@G#192!98?C?Q@?AOC???h??H_!5?@I_?CAt???O??H?H?HQCDQC!5?_!5?C@_C@!4?C@??A???G!4?@?Q?G??OA#37???G#77O#115CIJxGwiLKh\C}F?GrcH_HqkyTItIuTjH!6?C?GCO?@g?C?_#81??A???CB`!4?AgGGC_a@gSGA@`Q?G#119!6?BA@@#118!11?_O!5?X[COG!5?B!8?O#101_#77?_!7?OPIT_sDg#99!8?_O_AWC__A_QCR_EoizCMJE???G#101??HoGMU`RC\aOgO_YcO?_?o?gSGc_B?c@#121cGOHh_SCKaaK[?AAONDh~N#102!4?K#108??O?@g#134!5?N?VItIc@i?DA?_??@#72!6?AG?CA$#193!51?_G?A!19?`?A?C???G?O?OCO@OC?dOcA@??G??@??G@O?A?@A`C!5?A?@oA?@G_C@DGQCHQCHQ@CgRkRkRchSBSHQHCAoCD?OD_AG#237!61?@!6?@???A??C?A???Q_CG!4?T??_!11?O??@??@?_??_??A!9?C?G?Q!4?C!9?G?U#128O#133G#81G#69?CA#103@?C!4?A#69??oOC@OD?CO@GCA_@G?O{gKP@sQ}FJD^aU{gw[gw__o?Po!6?C?A#125!4?C!8?O!4?_G#119!15?kSSWsIa`?`OAPA@??@??@#107!9?@#72!9?BA?QLOZdbOncPiBG`?GQ_R?AGC_?OC!8?o?O@O_???`?KB?IT?GEOHC@U?HAH?gO@#107c!6?@#114@!6?@!7?oI@}@$#239!74?G!7?DI!10?_?C#192C!6?O!5?C??G??@OA!4?C!7?_#239!100?A!11?@#246O?cH???@Q`O??_ICG?QcO?CgQG??_Gc?A??AG!8?Ga???O?_@???C!9?AG@#140!4?@#121O#107??CAC@AbE#121!5?_??_G?G#59!11?F@_o?G?ooi_[??O#114!8?_#115!46?_GCG?C?bGAPGH?A_o?`Qa@OO?GC?A??A_@#251!53?_O_?_?_O???_??O#126!8?WO@_AOG?_??_#115?@?@!5?_KOI$#239!109?O?C??I@?@?A??A?@C??@G???@GA?GA?GA?C!111?CI!4?@!6?@???AC!4?G!4?AG?O?c@???GA!8?O@?O@C!9?@#112!8?O!11?O#54!14?O?C?@!7?@A@?A??G?I??GCOdG!5?@#69!34?G???S?A!7?@!5?@???G#98!71?A#127!14?a?A#125O?__?GW??_Sc?_o$#153!312?@#121!41?_C#59!84?A???C!4?_?O_!4?@??C#141!73?C#116eO#132???WOO?O_WGWEO?S$#81!355?AA@#102!183?@#112C!8?A-#237~?~?~?~@|A|@YdY`CAOCH?QGd?OGcAOHc_OH_OH_?GS@_I?S?HCQ`OI?tATIPkAtAG@GuHQhU_UhCYcHOeG@QcXeGeGUGUGQGQCY?ISgOACQ?EoDoC?SGO?AGQ#137!24?O?g?QGqCxAS@I@gh?pOI_AO??GCo?i?@c@OHAPGB?bGf??@?bGBKaCXfWfWfWfWfWfWfWfGQHQcHaT?_S?g???_??_??_#239?@??@!6?_?@?SG?Q???C!4?A_!4?G?GC?@O?GAOC???_G!5?G!4?O??@??@C??iSd??O?@#1A#119_?C!4?C?GE@?@cQ@O?O_PcA_GCOICT?I?c?E!7?@!4?C?@?AGC??CA?@O@C?CDGDYPM_?Ly@?A?_`_!11?pWOw[GKCCcSKU@K@@`w__c?G_??CC???_#107!8?C#101!7?ACPi?ZuHqOgO_G#48C?G?S@C!4?A?OC#100!5?@???@CAA#103?WOq___?U[Qkit}TsismvmC]?@#132_G!4?`@[a?Cr?_???C#115_#114?o?O#103?sg\WtMxyxppNQsycYCi?_???CGO??_?_OcX?tGqLylJEX$#246?~?~?~?}A|A}@YdYxljQUldQYldRXleQXKeoN_uH|biUTtiISqhC]dt^I|gteR\G|v]RHsdUhLhUZ_BcBPdYcH?O?O@_@_@?@?@?`?@A@G`G`G???p?a?A!4?c#105!33?g?s?U?AKAdOHcJsBOJCPUGQIcaS_AsGS?O?Si[?S_O#193!18?PC_G@CO?dI?l?JsJSb[BTITb[aOIOgSBK`I`A@Ad??c!4?c?K?CI?A??O?@?C!4?C#237??H!4?Q!6?C!9?_@!7?A#24_#69@@!9?A?AHCQC!4?@GC_GCogITtIQlWE_@oCIAa`WOIBCADsRHMX?LcmhOgGGWOW???WKo#81?GC_O???_#69!11?_??_O?G?G_O?Q?IA?@???_?G_!7?_#77!15?CAIPmc?o?_#99@DAC_RcOAGaGPMA?pKA?A?@#77???O_?O_W?E??ACOI#134??@!5?@#251?@???@#121?W?CoWD__E???ea?@?_oo?GM@@#108!5?fGoC?CI?_@G#100CACIDJBnNFXvJ^F@ABmZc@#77??C_??COe$#244!12?c??C!4?_#252!5?AC!7?C?C?CA#244???G??@#192!10?A?G?_A???_?AG??Q!4?GOcG???A?@_!5?C??cG?C?_C?OA?CO@I!8?O@??@G#96!33?_??O?G??O???C??G??c??G??G#105!42?@?A#184!11?AO_?gOIC@K@M_?`AGdQK_?C?K?CI?M?IOHPiDIAO@LgPLQk@_YcZ?aShCjCiOcA@^eP!5?A@_#203?_#35W#40C#118A?EFFFBNFG?Q_Q_G?QJLI?OPO?G?@#59!6?_?CI?@_??G?C?_WOO!4?_?O#73!6?@!6?@!4?WDjFEJDrBqM@fIBCB?E@#115???_?O???@?POgAAGH@G_AGg?ACC_AQO???_??_aO#72!9?@?HCLBSiT_Y_?_?_GpMol_KaHA{BwPi?C@CA?@!8?@A?@??@?A!4?@#125??_?A!4?@W[bOX@??WX@DAB#107??_GeI@a#101?A@ADACMOkB@P__Oo[Ooo_??_o[{[???]IvHQDA?H$#202!16?A?Ch?Q?d?QG_AOHcAPGAOH?O?S@gA?T_B?Qh?I?_#252!10?_#202C#184!8?_C!4?A?@OcGEGEGU?QGQ?A?Q?GO!7?_C?CGOG?C?G!5?_#150!34?C???C!4?_!7?O!4?C#192!57?D??@?_??O??SG?QG@ODiOAPAp?P_T_C?C??O?gAO?A???OC@???G!4?O??H?_?G#208!7?s?Q#217O#83C#59Y#39_#115@@!6?@?D??@?`??QcYdIEAAD?_A?dGQ@W@_GQCD?Q`gT?BCaHcQOEG?XO?_O?O??_??_?O#132!7?G???_?_O?@#81!4?@#112!8?G#118a__aCC[!4?@!4?I?A!4?_#53!21?A#98?GA?GR@KRNhUPE_@OLA@oL?CA??A???@#108?_??C!5?g_???G?G???OG?W#119?C!5?A#73G?A?K???o!4?GC#112??O?W@U#113!13?G?P?C???GA?c?GA@?@?A#108_!6?O_$#240!17?O!4?G#244!10?A#240@??A?A!8?gC#193!27?@?A??Oc!6?O@_?_@c@O@Gt?@E_W@G`G???G@?dGhDcGZkRuZcZcZeWfYcZeWfXeXeHilFVhdDHAl@U@U@AH?dOH_JsJ?HCPCHQ@cBOhAPGU?UGvJSAS_S_OO#237!45?A!4?C?G_??@?G?O!9?G#193!23?aO@?A?_?CA??AGS?@#153???G#240?G#96@#81?[#121wOg_gwo_o{g[?GcIhC!6?O_???_?O@!6?G!14?@?@?A?EK@FAAFADE@EBADubWCWOOWK[LPgWs{z{M?mFBfRrjRB@?K!5?CC?!5C#100!31?C#101!15?O???o@wCmS|j]yg\C~@BDLZNT?@kOSA?AGPI@??A@A#128_???A???_???O?G???A@?@#251!20?@#102!24?O_$#239!78?O?G!5?A?@!6?c??_!13?II@?@?c#246!129?Q!4?A??c??A??@G_?G?C???B_A?O_C!5?_??A!4?c@?AO??@C?OC?O!6?wAE?C#112???AGOGO??O!8?C_!6?_??O?G#102!7?C#81!18?A!4?AA#54!6?G#125!11?CA!4?E#81!17?G#114??_O?CROIQP?A@_WgICCCFoaPA`?@?e`???@O#102!42?_gGO??_#100???A@!4?C#102???O#98??@#118M@?`gWC#140!5?GCA??C#126G#118OOoMMd@$#196!84?G???O@_??H???G?c??A?gD?cQ?EO@?q?e?ROa?RcQcHCZcZcXfWdZcXfWeXeXuDQOgCQGqCOAg?G?S_A??AC???Oa?a?_?G??C?C_?`G`?G_?`GBGBLjeWfWfWfWfWfWfWfWehUdYqLiYTiQTsJsJ[b[itI[_LIsFC`W_Q?OSG?O???`IPiPAp?P_P_T_E_Oi?hFs_BgQcRKRcHcZS@CiOhCJQgW_?gViTiYDG@l#126!5?_#73?O#114!19?@@@?A!7?`YOF_Pw[CEB_W_gG??__?o_!5?o___?__O?_#103!40?AO?A?P?O??_AO@?ITG@?_?O@?A?@O?@CCO#107!52?_!6?__???@#115?OCA#142!7?C#49@?G#119?_!4?A$#102!437?@??@`PPXHGG??a[]^YLG]|}}mhw_#112!64?OG#116AE!9?G?A?A$#107!437?O#59?Q!8?DGC!8?@#126!70?O!4?O#52!8?CE$#129!531?C#127??@!4?@-#237~?~?~?~?~?~?vGrM_@cX?C@cAg@SAg@CQ?gGcAH_S@I_S@GdOAHcOGDAoHAPi?HA?`OHU`Y@m?Z?lA|?PACHQDQ?tGtGTgSGSGpE?DAG`?g?_?_?GC?AgS_O#105!5?O#137!15?_?OcHSaShUhE@??CAh?S?a??A?OB_TC?Q_CQ@G?_G@_G?bG?G_??_??@??@A@EHUhUhUhUhUhUhCHQdOIcHQ?hA?i@?GQ_?@??A#192@?_CQ?c???O@S???C@Sa?Q?d?h?Pe?AgOC?O?C@!5?C??_@??_??OC???A??_#208!12?b#240Z#2O#81G!4?C???C#112??_GOG?S_OA@A?G!4?c#114??G?C?@oC??_P?GE`@aTGSCEB_CACAB??A@?@cBXHDpHOo_?!4O?kOGsWguOWoOO__oOG_?_OG__a??_??_OOWWWMGLEcCEwi?DGQgebQXP?DCCCGA#72!7?IDQ`JeWsJ?haKRLgeSrWMhTZah?C#103??_kWsWsjSJg@?@FBBB@??@@A@?G#125?OMgOsqWG__`@??AA#107???_wwWsMS@!5?`#111!6?_#101!5?B?@FG@?GOoGx?@@!5?BGA#107??_#102HA$#246?~?~?~?~?~?~?vKp]mHezYMHtUihTUyhlVTpX{UJisTJisRGlsUHnqYLFukeTxulNIbqhMcu@l?vAW?iEwB_GoHeGA?A?A@a@???_O_CQCBSI@ICB?_???AC@A#105!20?G!9?OgUhQGSAhITCxcDgSGag@kBGhSaRMOQEPKOCrC@ITITiSiSgSgO_#193!12?H_C?h?Q?cIOcGDOjCGQLoLQkQGQ?h?QHQcI_G@U_I_G?Hc?G?AG???G@??@??_?O??Q??@???OA?C@??_G!4?A???GQA#16!8?C#128_??_#73g?O#135??A#118!5?ca?C!4?O@?W?@??G#59!4?O!4?@??OG?C@?_?G?OD@COC?A???@IP_A!8?_#81???@#73B??@#69!6?DG?C@??AG?A?@?G?HCOAC@A?@!6?O?@#102?GOEKOGG?eeqyx`ppxZ~YQO#53!4?G#98??@A?SZ??p?Q?H?C@OA_#77??CO?iCG@A#108A!6?C#112?O!4?O@L?o??QDO@#132_T??CA?C@O?O??@#103!5?CAI_JKzmn{v]h^~Vn|J}j^j}W~}or{zsLAtAV]S}Y|^~sr|zzRqx$#244!12?G#202???@?A?C@?AG@SAg@CA?g?CA@_S@I_S@IcQ?H_Q?D??G?OG!4?_OGC#192?O@G?Q???@!4?GA!5?_?S_?G??c?@CAG@?G!5?O!4?@!7?@?_!9?C#150!17?_O?@!4?GO?G!13?C??C?A@#184!55?Q?@???QGBC???@U`W?HS?d?I?S_GWdCAhQc`AOiDYdCPitMWePCHaGaXeHgSYDIvlP!5?d?K#35??B#49O}#121B?A?ITjPlxNvnR\jQHoi[cCkBdKO!4?o?C#102??C?A_o_?E??_OgOWKWgHgw{[{{}]CGC_O!8?__!9?_??_#103!19?A!5?O??@!4?OaG@?AO?G?GD??G?E?c?dl_@#48!8?@???O#100!7?_!6?@#102!4?OcHcJSbOBOB???C#119_?G???__#128???_O?kG?_S#115???C!5?O?E??C#114@#108?_O?OOB??U_?gOAS@S_S@c??GC???_???g?_@_?_?G???CGC$#252!17?O???_O!8?O??A#193A#240!12?A#252!5?_O!5?C?O?C#239!6?O!6?@??OC!7?_!5?A??G!11?oRGD?@#96!37?C?_?C?_??A?OA?O??Q??Q?G?_?@_G?_#246!55?C???@!7?aG??A@??H?O?SAK??O?C?G@IOgCO_GQ_!5?GAOC@???O?`CO?GQc!5?W]o#83??G#54@#132@C[SWcgOg#115!8?HAGS_?a@_?A?YDASAj_BwgSOIDC`OoCAE?b?_?QoB@?@?@?_??GC?yGu??SG??GGS?CsGCQGAAIACY?IcPKQGDQGO?q?OcGOi@a?a@QoGBhWED?_O`D?O@!6?G#100!17?_#99_CLAK?D?A#115!19?G?CG?kG_OC!6?C__#126?G#116@!5?_#126???O??G#102!7?_?O?_#100!23?A?BADAC?_A?@#77!4?C?C?C?C$#192!18?O???_#193O#192!31?_??@#184??A#193??O?C!7?c?O??Cg?_?_G?G??A???A?a@CgP_OoCRSBTYSB??@o?AGHewVhUhUnWfWfWfWfWb[bsZOJGQaXHA@O_CHA?SAh?T?aCPaCgAGPc@S`CaPGPaGPCOCrCPMtGTaSiCiSGSgO_#237!37?@#239?C??C@??A!7?S!11?AgO!5?@?@???C??c@!5?OC??C???`???G?ATa#97!5?_#69C#125?g??_#119!13?cC??AOA?W?@_O@g?SGCA@_C?I!4?O#101!12?_#107!4?O#119!7?F?B?K@EAGO!6?@CDGADA?IeODVG`SKTDuAJDG?_D??__AoO?@??C?_#101???C!5?A!8?ISjSidYSGdI??Q??__QOhGE`SIc\QmzTzVA@?B#107???COa{A?KG!4?ACL?@O#73!6?GC?W???@A??@#113!34?C??G!4?G?CA$#184!75?G?cAO?@?ODACO?TG@GS?S?OIO!5?_?_?_???GAGS_O?O!5?G#237!128?@O!6?A??_?Od!4?c???A??C???OI!10?@??G??C!4?_G!6?c#119?A#127?O#143@?@?AC?QAO#69!7?@?@H?OCAoIDasBH?AG@QHGC?B??G?G@@?@!8?@!7?C?A?GFGA?G?C_#59!45?OA!5?_??G??O??C#111!45?_#118!4?oO_WMCA?IOYK?FA??A@@@??KC???oO??gHDA@?@$#196!81?C!4?_@A???A@_@G???AGDAG??G?C@gC_S?AGDaGDgUgE@OfWfWfWfWb[b[JCfcRcHCaSgEHQ??h??OA??H??G@?D?AG?G???C??C??_AG?GaO?a?G@?P@A`A@EHUhUhUhUhUhUqUhYEtHuHtEXvOmSrdLqMqlPk`Ky?}H_cW`[b[_G?Ca?a?Y?t?@A@A?O@A?ISHC?i??hI??PAGcXaWeHAOePA`GO??Ad\ti\A`B[#126!5?A@A@!4?C#107!28?A#103!4?OG!6?_?A!6?A???_AO?a?C?_??_???_??_??_???_??_#77!40?C!5?AA!6?DiS`O?C_O???C#121!37?_oo{!5?gC?A@A??BBQIiG\DKcJF?A$#77!365?A#118G??A!23?G?O!6?G??AC?K???@?W!4?_?_?AB???G?o?CK?eD?D??GA_??@!4?@#114!66?A!6?A#112!13?a??_GcOO!6?AC@??G$#121!395?DBE@@??BBA@@@?@!4?@C@?@???C???G?@??@#119!107?C_??Q!4?@$#132!400?A-#237~?~?~?~?~_nOLa\qCGaA@?h?_WC@GaWDOAGgC?PCAg@cQG@c?I@S?`G@SAH?C?`?@Qg@ISJODgFgR_EgTgDgTgFg?cA\a[`GO@O_@[?HCPeOcO?Cg@OC_I_A_@#105???G#137!13?gACHU_DI_??_c?A?Ga`SCaF?iAP?gCP?KE@CCaS@?GC@GC@?O?C?OAO?@?P?PCO?@O@?@UHUhUhUhCxAS`IS`IdGPiChAHAS?hAC#184???c?Q?C???O_PG@A`Q_@cApC?cAC@U?AGDJEDJsC`CEH??IC\AGOdQHOcA\AHQ_HCLA!4?_G#105O???@#49_!4?A#112?_??A_GF!8?@??C??@??_AO#102O!6?O?C?_sQMVHVvbZJN?NMKCJNv|KL^^MEAACFAEBBBAAB??!4@BFV{A??@_BGWqg#118!5?CO?_AMcQ\sYP?o_O_?@_A!4?O__???OO#107???_O_#77??@A?aBGeOkO???_?oO?gCOg??OoG?`AK`S#107??O??sWlUP#121?EAEKMFzUvwO}K?NG???_!4?ABLBDD#103?e?_OK]JmTG`M~MnDbHKpD??cY@TGrPIVjeDzFnNk||NV|RaPDnRNDrVdZ$#246?~?~?~?~?^?nOLaLzt\keRQnD`yuTLayltRPxmiXTUyHduYHtsijVQrihsUZhKUrmdV}t`sm_ToTGVwR?UOR?QOCI?W_OASRCQcGOA_O?G?G@?_?@K!9?_#105!21?O??ITI@GsDqCGAXOGoD?kEPAkAP_WQH?I_VaPIaPiCj?z?hChEwEgEgAhEgEgUg?_#192!36?_?H?A?C?_CG@I?H?I_AG@AG@?CA???O??GA?O?Gd!4?_A?_?A!4?_?C_Q?_???O???_#183A#217?O#37K#121K???_oSzSlUVGD???@?A@AG??@???AOs#114??oSoS?q@Ca??I?@#77?_??G?__S__bXc!4?_?_?OgS@GCGCC?C??_CaKqK!5?O???O#119!14?@H??@??DA?@A!4?@!4?O#101!16?`OKRHdQKdYcXqKItEhiU?}`MpfM|r]`#115!4?G??OgAR!9?AG??D#125_Of_PNTa??dWO#118_GwYHA#102?_O_?O??AO?_?OO??A??Q@!5?C!4?O?O?O???O_??G#115_O?_oICgA$#240!10?O??O#202???A?@?_???C@GAOD?AG!4?CaG@CAG@CAG@S?_??SAH?C?`???G#192???I?@GA??_???_???_C?P?A??G@?_???@c?@CA??A???A??a!4?P?C!5?C#96!23?OA?G?@O?a!4?P??C@??A???AO@??C??C??O?C#246!64?A!5?CO???H?SgC_Y_PgO_G?A@?G@CA??Q_OT?G?S_HO_OCHQ?HAC!5?F?L#218??G#38O#81b!5?G#126C@O#119?_?o???A@??C?A?CA?_[!8?G?G#101!5?C!8?OIOPOAO???_O_?ogSgQ_W?W?k?KsGyKqC_?__?O?O#69!19?H??@!8?@#102?CA?D?G?@?GD??POYn\F{YcWC__#72?A@AYdYELBdIPQD@^?M@EW#102O!4?@gaK`IdA@#118kkxpxpOO!4?@??A#127?a!7?_?_#112A[??dOL#111??_?C#108??BC@?@O?GCB?Gyd??sGaCIdGCPiCgO_Q?A_GAGDC#111I$#244!12?a#252!6?OGC?OI???_!5?CA?P#240!5?O#218???O#252!4?GC!4?_?Q?GCO#239!7?Q#184?GA???CG@gCG@G?_?dAC_G?G!5?G?@_P?OC?GO?@OCO#150!35?@!7?O!4?G!4?_?_?_???G#237!75?@O_O??O?O???@A!4?A?@?S?O!13?@!4?A!8?G??C!6?A#56@#119O#125GrLLA#73@?A#115!9?O`AgQS@yco]??G_JM`FGfLCoOVN?@?G???CC!9?GA@#59A??@#114?@@G??@!7?@!9?c@_RGDEH@YAtTGjfJH[OAcAGciOLIcLeUOKiHCaGACQkDA_HKi@!8?O#98!4?@??@!9?_#100@#103!8?I}VLrU@#111A#112!5?C?A??Ch?Ca??G#128?@G???GP_@W#126C??AA#112!17?C#111?oCA??Y@?A?G!4?G#101!5?@A#114!4?_??_O??o??Oc$#193!20?O?C??A#244!8?_!5?_!5?_?A#192!4?G#193C!4?_?Q?G!12?CG@???A!5?CO!5?CBKICA?Q_OAG@IHDP?OG_Q?O?[QgVGvIxB{b[b[b{bslROo_?XiONtI@IsGqDGAh?H_D?gAPAgAT?GAH?G_U_PIs@iOjCz?nChEoEgEgAhEoEgU_Eg?_!5?I?_AG_AG?Q?CO@CO_T?hQcHs@IPcHQ@SAcGPiPK?A?C?AC?@C?_O?GcP??_G???_?_?Q??OG?C??O???O??H!6?H_Q__!5?O#240C#63A#128?vKA#118!4?_???oI~~~{m[{O_HO!5?@!4?A?A#72!8?G#122!4?G!4?@#108???_#72!12?_O_o_OOwOGS?O???_#107OGAK!6?_?O_#59!27?H?A!6?A#134!17?_#119!35?G??`_???@C@B#73_???XM!4?A#107!4?_???_^F@@O?gSW!4?i?q?GoDG?cI_T?_O_O!12?COI??K??G?G$#192!21?G??O!10?C#193A#196!43?A???A??A?G!4?A??_@OG@C?GC?c?_Q_?_C?HdJkBgVGv?tA{B[b[b[B[JQClJUhE?dO?_S?@???OC??C?IOC?_?O?g?PC_OD?G??_?O?C!4?OAO?H?P?PCO?HO@?HO@UHUhUhUpE\hUThUtGviDyQlUgjUCXqJ}tIZclYjsZdM?cQw?K?y?G?IOPG?_?@G_O?O_?HAWPG_tQ_`AhALAKaLAl?cQCHQ?_OUlTIV?a?he#244_#132!4?_OLA#143?G?H#69!11?D?I?HE@`M@N?@??@!5?G?@#100!32?_#115?@!8?O???@?IKCCA??ECSGIfOG_U@_O??A?Ci?TAOPgI`O?_W_DQK@QgKCA@C??_#143!50?G#126??G???O#116!8?GUG#115!4?O???O?GA?_@A_?_?O$#239!86?_?P@??@???_??A?_?A_!4?AG?EA?J??C!137?C?@??`C?_A??O???C?C?A_??CA_??GD!4?_!9?_?C_O?@?I@G???CH#127!5?O#114!19?_#107_??G!5?C!7?A@!6?A#98!31?_#59!12?G!8?@#132!101?_OOCOE_Oa??C??_$#153!312?o?Q#103!30?O!6?_??G_??_?G_O?_o_Og?O_O?_!5?o??Q!4?@!4?@??G??@?B???GQKG?@_BcQG_o@C??hA_O??S?_???_!6?G?G?CO?sQ?D?H_Q_?@q_C??AWBcXEH?COG#140!57?C@O$#208!313?L?O#59!38?G??O?AH!7?C!4?C#52!160?G-#237~?~?~?~A{agQPGvGQc??h@C?_GS@A_O??HS?aS@HS_CiOD?gCA?HCQ?gDcAW@QG_HcAIpCiTaSJOLQcYDgU_TISIo?hOeO_L?^_V?I?J?T_UgQ?@AcH_I??Q?GA#137!13?AcGCHQ@a?_GA@A?_IA?DOI_cOOR?IA`O?GCaG@T?Y?O?SAG?GCG?c?H?aOAOHOA?Ca??ID??cPC@e@MPmPcHOdItAShAS`SHAOd?Q#184!5?gAOC_G?_?SH_O??A@A`EGCH?@??O?C?D?Wo!5?`a?oIWcI_TQgJScXcRidCY`KO???G?YAk@#203O#63O#48_#115WoG?SAHC?GC!6?`WeIXTpXGmCGUAG?a@?TPGk?aoGG#122??@#101A???[`U@oKagQtaTeHyBCHs?Bg?AHSBmPJsLq@]R?Wg_c_?OO#107!4?@I?A_?A?C!5?GG!5?_!13?O?_???C??_?GCG?K#101@?DG@A`A@CI?B@A@KB?b?BC?@NA@?AC#111???O#118!5?J^fN~{???B#126?S@#127GSh!7?G??@#112IP??@#108!5?@!9?C@CA?CA!4?@!4?@!6?CA???@#114cAPGAOCKQDcaO$#246?~?~?~?|B\BkaRGvlZ|SUyjLTri}SFjxUqj\KiuqJ\xDmyVPj[UqhlUQyHle}dRZqX|SMYPiLhsfqlHdOR`LIo`TCZSeHH@Oa??G_S@S_A?H??c?O!4?P#105!18?O??_?_GOKR?_GSHU@SgQ?dPIDgC_T?KAtAX?U_I_D`I`G`?Q`Q`QHOeOL?l?e?lOHOL_?OiPI?iOGO_#192!34?A!4?A?C_?G!4?O??O?C?h?g???CGCAOC??C??@C??C!4?A?C??_!7?Qd?OA#217?_#83G#59@#119aG#118okapoXuAzV^Fb~}A`X_AGA_?PZt!4?C??AC!5?O#77!4?C???_]@kGqKQcITIPqD?@#99!4?CG_#53??C???G#103!4?CCAAI@HLE`bIO_??CgDq?h?AGCO`A?dAGPABO@AOHAG?G?SIG@GOK@c?e?KRAQ_t?WA?AkOKGy_`KGcGA`s?CSgYSU?WuxCJBSjC??O_O#114??Wo#119?B~??K#125??GujOeW_@BAE@GF_#118oA#102?gSAHOaHO??@?IRCgPAc#112???o?W?SgKOG?gOGSG?gO?O#115?O?O?W?A@H_?CQ?HB$#240!10?O??C#252!4?AG?COAG?@?g?CA`??A#218!5?A!5?A#202O`GCQ?hC?A?@?G_?CA?`#192?_C?OA?G??Q?_C?O??I_!4?OAC???@!13?C?O?C?AG?a?G#96!26?_G??@?G??O?A?G??O?G?a?@O?G!8?C!7?O??G!4?a!6?C#239!48?A?C!6?O??O???g?G???CGC?AC?I!4?C!6?CAGD??`GOdI!8?@#97C#72[#69C#125@@#114OGCA_Gs?g!4?@[A?T_?CAO!4?C??@???ieR{?C?O#100???@#59!7?A#72!6?_???{iQJtSRd[ahWPms?OG[__#102G?COQQQ_I[sl^}pr#118??G?O?hA@KA??O_CG?CGCCgog_AUb?_Ca?CA?O_?G#59!4?O?O#77??ADQlQdCHCBCADKQ?A?aC@BG?D#108???O#121!16?~Zo~j#132u@!9?CD?Q#103?_T?AlubDOac???_CzDiOGpCw@WaS@C_GOhQgOJDHVhPHPnQmYdmPkaO@_G@#107C$#244!10?C@G_#202!5?`???_?C???O!6?@#252!13?@!4?@?O!4?C#193C!5?@#184!10?I?GA_D??G_?H?_??H?S?A?A?H?S?Q???@?A?_#150!38?_!9?_?CA@!7?C?A!8?A#237!70?@Q?DG?@!4?S?D?O_GO???`O?_?PCG???H?C!4?_!8?O!8?@#77A#81@#112C#121EB@!4?@???_#107!4?C???_?C!6?@#59!8?@#107?GC??@??{#98!18?Oc?Ig?Q@SA_!9?_#114C??G#59??H!9?A#102!35?AA@??GCHFIbe|wo???O?QOooWo_??{WGO??_?_GEx?[AOgRKAC#112!9?c#128!6?EX_T?_sg??g#107??CiU_??GGCKOZE~T!5?OIpEIdDIgRAFeEDEb_qu?EI_k?K$#218!12?C#193!6?A???OA!4?G?C#244G??_?@G!5?@?g???_#192!7?O#193!29?@CA!5?O???G`O?S?A?@CGQ_H?UOch@k@S`VgVkP~~~nv~zHPrQoKSLRCrKsHS@sGQ?DOI@aC_T?GAg?S?T_I_D_GdG`SRkQ`SHOeOl?lOe?lOl?KqLoITI?iOIOgO_??I?CO??S@?S@GAOcHQcGRcZ?dQGdQGcPGcHuGdGP?Q??H??C_?H?a!4?D?C?@?O??@I?_A???_??_?O_@??I?C?@I?LjCO!5?A#132??A#107???GC#103A@#119???_W[#103!6?CAG?b???g?qG!8?PB_cIU}?AAGB?gQD@PCG?G?GC#77!16?BaDa@GR_PD?C_#115?C?@A??C?TGDSAhCOgAOdQGDQaSGeOhE?DQP`G_Da?DBOWHGWF@_o#108!19?O#114?G!5?_?O#116!31?DGI[?O_OO#115??G?@???CO_?JcG??g?AChA#118!6?_??O_?O!8?_???_!4?cOCJqH_YOk$#192!28?@#240!4?C??O??C_?AO???C#196!40?A!5?WaC_I_S?K_A_H_CgRcGQcH@IOcRShUgVgRm???OG?CcICHE@a?_GCPA_A??`CGa?C?G@GA_T?@?_?G?C?Q?Q?SAGc@?GAc?H?A?A?@OA?AO@?QD_?_PC@c@E@MPmPujItIhiUhiUheXeGZdkZc~YDtIhVRmTZa?VGvg\gsKoQpaISaCH?Q?Q_A@IoAhEGOC@C@?O@I?T?HA?G?O?P??A?taS`I@_OY#240C#116_#102!26?C!4?wCv!7?AK?BBtg?w@|v!7?@@#134!28?@#114!13?G?O?hCQOdQ`KOdAW`ChO@iO@EODk?SJOPKqG`e?P?oQC@_#72!21?@#53?@#115?_!8?_@C@?A_GaS_#140!15?AAs?G?O#142_#111!6?GO???A!8?O!4?G@???@A???@???C#102!6?CA?@?@$#239!93?CA!5?@?_??G???@?G!6?C#246!143?_A?CiCj?j?Q?ADA`Ap?G?GP??_Q`Y?_AOaH?O??OI?U_!6?_G@_A#121!29?_!6?oc#59!139?G#107?_!4?_?g?AkpLRL_#73!20?@#121@?A??D#118!12?o$#105!312?C??C#244G#119!30?A!4?GMHg?P#126!176?A??K$#153!313?C#112!34?@#69@??O?Q$#191!313?@-#237~?~?~?~?{QdYdYdY`SHSGc?J_AK@aPOGbSHQcHQdGTaSHQdGCPCA?gAOD??QGd?WdItAtIPiSbYDgUk@sATGRK@iOiUHe?e?R_Qc?JSHu?jOdAHAgAC!5?@C?@#137!10?g?O?gC?C_CQG?WCrOIGcQ@PGi_??A@P@cCAOHCc?O??`?GC@??_K_ICH???ICgA??O_?O???c?Q_IPcOcHQlOdIOdY`IcHQcHaPC_I?d?G#105Pa#184?O??ShAc?DA?CHO?GO@_A?G?GCh?DA?G@GAK_GOgPaPA@?As?^?l?QgTqLOIOd?S?C???IGC#204_C#114OH!4?A@?K??F#69!4?O#114!8?@G???Q!4?oOwsA?doE`X?A#101G???oChS?AGskJqKrMPhqUBCB?OGSGcq`i@xCyCyU`UHUGE?A#115?O?G?CK?AJ?AF`qgOEWOOPpGOAGGCoCAOc@OI_GCPGF?cQ@ohDO?IKQsIaWOI?gO?_??[GcA?kEA?CAAD@?OC??I?OGASUCIE@??@#119_}~#121~jhUDo???_!9?CGO#115A???QoXAHFO?`GO!4?P?G#119!6?_Gs?O#115!18?@C?@CG@#119?o$#246?~?~?~?|BlQdYdYd]juavX{SNdq]Kebp[julZulYvi\julYvxmX[UTliyVLcQYnbYOIlGteThKcyR?@qAkGrcQoCLP?sPlXTkZCHQc?a?HOCGOcO#105!22?@AC?@QhQH??dI`H?C`PAGkaCPCJsGcICQhODaOHbCjOKQ`QgUHQ@??_?Ql?_?@OcI@IC@cHQ?H?C???A#192!30?A!5?G?O?_??A_?A?G??_A??A?OA?AO?O@?@C?C??Gc?A!4?g?AG???_?O!6?_#153?@@#240OB#35A#69O#119E?PG??_@?__o{{]Kmb?E_?_?_!6?_??CI??GCAG#103G??\Pc_xPK@?iSD_A#98!7?C?@_W?C@_?_Q?K??CA?@#102???@?__owkLFrqqaq`?oO?W!7?C#119!13?A?OG?A#102!15?@?@C@??ACAR}BAA?G!5?@@???@?@A???CB#114!7?OHC#126!5?AhY?o?OO!9?A#118BC{!6?O_WfWA_!9?Y?HWcX_IWdO_W_IOc?_?IDgSqHgS_PcypUi~N$#239!7?A#244??G#193!8?@!5?O!5?C#202!16?A?A@_A?D???Hc?OC#193!13?@!4?_??_!7?O?G?CH?G!4?O???G?_OS`iTgiSsAhmOnOnOn~}vjETJlQhQHQhdQc??C`OAGCQCP?I_?cA?Q?ODAOHOC_OGQdQGUHSHOPtQsHQlOROlYdITJcZuHZCL?@CAHA!4?G@c??CP?c@GAOcHQcHQGbG?Sh?ShExAtAhEHSGC?GOD_QDG?@Sg???C?c@??c??A???AO!11?A!9?G@O#105?_#17?_#40_#77A#121h?_owO!6?B@_??[?O#103!5?B???C@#69?_???B??G#107!7?@AE#72_!9?OLRKogAH_[aKrkRgVHKQTUAhDyDG[GC?A#114!4?_??G??KO?DG?E@CGoAKbGEo@gOaOMPgDQGd?C@OgAoM@gCDQ?M_T_L?sC?__Q?i?G??_?Gs?O@gE_?COG#121??_OG#111???C#73!15?S??G?_G??_#116?AThAYQ#141O#112CG!6?_??_GFO!7?OaC`C_AQCB?bGAD?T_HODYC_O?@$#192!19?G??A!5?@?G#252!19?_?H?O??gQ?@#184!16?GQ?G?AC??G?a?gAG??_??_???GO?_?`A@???_A?_??_#150!27?A??G??@!6?SAOG?G??_???A?ICA!5?_??A#237!70?@O?@!6?C_?@?DO@G?GaG?GOgPAP!6?G???O??O!7?A@?A#208??O#244?G#49G#101C#112OO???_!7?A?_O#102!13?A@???_!8?__kQ[?MBA??gW#108?@#99!12?oGA?B!5?G#103!8?_?OGCPqGK@DH@Ok?iT_WKPEGcA?e?E_?eCa??@g@S?d@C`Cd?_O@oGCW?I?B_I?WAM@LP@|?@K?cR@jAO@@A?@??aM?@@o[J?D??A???A#132!9?_FC[e?oO!7?@o#107B@j]{kGCKC??_GDIsgWsmKPG?YU@G?C@CADYeGSaIw?x?IAg?O??G?A$#252!21?A@?O??_?GC#193!20?_#192!6?_!6?d?OA?G?AO@?C_?C?P??G@AO?C@??A?A!6?@C?A!6?D?G??A?@?O#96!25?C_???C???GA!4?@??_?A?G?_?O!5?C!4?C#239!73?C?_Q?G???I?CA??A?AO??@?@C!4?Ac?A!4?g?AG???_?O_KokOG_???O#63C#132_#115?A?@!4?G!6?A??U??dHaCSHChHoGE?GC?HpA?D_KA???@#77???wU@B_VGRc?_?@EOCG?@#48???C#100???@!8?@#107!11?C?O?A@??_!8?G?G!7?AO???G!7?OA?G!4?C_O??@?@??_C??C?o!4?S!9?O@ICA@b??OJHHD@#125!13?J@@MILy?gCG?G#119??_#103?S?A?B?_Q!4?QdAD???BCRC@?C@!7?@A@C@ADAD?TAHASBS?O$#202!23?_?G@?O??A#239!47?G@!5?C@#196!11?Qd?a?H?CGOcQKAH?TI?TAIhEOnOnOnO?@GSOg_QC?C_CQG?P?QGAC_O`??_CP?H?Oc?H?G_CA?G@?d?G?`??a?_M?HAc?QDgE?@Oc?oI??c?q_ZsiXcXulQnQsJYdYcZQkRsLIqLPuGvSe\jE|jAOCXAwCxQaehReCGPC_U`OA?OgDo!4?Q?A??GcGsH?H?_?Q?D!4?_D?I?@aHQfS@CIF#96?@#118??kMEDM^qv^WN??@@@?hh^YU\Y_uzU_?O?_??CACpWAPQCA#77!35?_?O???_A_QHD@B#118!10?C!5?A`@@`???@MT@PH@gCAG_A?QqGAOG@GCAA?a`P!6?_?O!8?O!4?gSwW{wiuK_O?oC?_og?_Oog}luy^@#127!8?A?@C!8?G#102!4?`?@CA!8?HQdI$#239!101?O???C?A???@??O??T?G??O#246!137?G?C`Q@O??Og?g?s@c@CQcA??Gc??X?|?v?V?D_D_NON?nIP!4?Cq?G#107!4?@#59!28?C?@#73?@#59!121?C#101!7?@#77@#59???@#112!11?gC!5?_?_?O!8?S#128!8?@AD{AQtcC_#111!5?@#108???@#114!4?C!7?_?_?_?_?AO???g!9?O_??CcBgAiHCI`S$#107!348?GE#121G]A@#140!177?@???@_#111!20?A#108@$#112!350?O@#129!184?@-#237~ONwVg^_~Wf{IlqMohE|IsloOgSylOy?O`QDoDqChQK`IT_TiPiDgFWbGD?I@?CaSHu?uHQLOeXaLoEXaG_HQC@U_ITIPkAtISjQhQgRA@AS_DWAC_S?A_G@C?OC#137!10?i?TGQ_???G??A@_?cSOAGGCGA??PgAPH?cAG@@_GCA`?_Og???gCGQcGQCO??Q?GO??_A?@a?@QcHQcIOdItGaHQcJOiChAS`SASgDO?c@G!6?C#184@!5?A?@???_CQ@OI?@??_A_Qc@KBCRK@JO@?_?IDGDY?OdOcBcJuHO??@skOOA#208?@#203U#35@#40A#73@O?G#118!6?@!9?G_O?o?OGAABJI`?_??G_C???A#77_WG?C?@A@?oMOdKoFXaTG!5?_#53!10?G#77?C?A@AXOJdAkQCASG#114aO?_O??OE?@@A@?_OHgPGEPaH_SBgQI?cOC_Qc??{BoGCAr_KaWAsKdHGcAOdA`GC@?C@??A?A#126??_#103!6?A#73??_#114??D!4?A#126!6?_??gQDoHQ_GS!8?EO#118GYskyT?gDAP?o??G?Ok_qXws{x}l|ULIKV{mWdW_Wi@zcrC?XUmlUhnUDnF#121C$#246?FoF_V?V?bGA@QCPJEwAPJAJdPaCAjDzjEdyNiLzUDr]ta^ITeSYRweSvy\SmjX\jqHlHucqjHeSQIgeSV\ucz{hHPi_eAXG`@?C?C@CgSgB?A?@??@#105!24?DQlQ@QcGSJAH@gDsBOdOlEcAOcASHOdQKQ@qGSIDA@SiTAP_??@?`AcH?cA@ISHSGSGSG!33?A!5?O#239!9?G@!5?AT_GC_?GA?@???Q???O??_?I???O!5?@?G_???gGA@A???OG#217@#37A#59O#125u__O#115!14?A@??A???BCH???`[{BQGdCQJ?A@!6?_#72!7?A@!4?qJuPlRKIxUSJexNRu`hPXckcA?C#102?O?@@h_@CIEC`_O_o{KSCEI#107!9?A!8?_!7?G@!10?OG?@G???DA@#112!9?_!4?G?_DA?OA?O@A??A?@!7?D#125C??oG???C?DJS@A?OK#115??CD??@?iDOOGeG?GecL?S??C#119!4?OAhQDBGAOcY_Y_Oo?OG_??_?O_?O?gOwz$#192?G??G?_??CO?c??_??@?c?O???G@O!4?O???O???G!5?_?G@_C?@G!9?C?Q??H?CO?H_?P?G_??G?A?AC?@G?_ASGOG?gO#239!5?G?_?O!9?@#150!19?_!5?O?A???@?`?_OG?C@!15?CA@#192!62?@?A!4?@!4?G?AG@???C_?S_AGOC@?A??g??O??c?I???O!5?@?GO???_!6?G#240???g#38O#77@#128G#112B!8?A??A?H?g?Q?D?A@!5?S#114??A?WdQQH`SJS?A??O?K?_C#98!11?C?Ga?g@?A`GO??_G?A?A?O?GC#103_?YG@?gS@uPdHBEP@KGAAIHGTAb?AGTGC@?H?C??OCAAOE_AcP?s?o?CCA?@A?@??AO??A!5?A#107!17?@#73!19?@???@O??@_#116__@sXAG@#112??B!6?A#102!7?@??A#112??_AGBC!4?_O_?@?@?BCBC?C??IS_#103?@?@$#193?_#184!5?G!6?G#193?CO!5?C?A???C??C?G#184!6?_???G#202!12?A@??a#184!14?C??@???@???O_?S?PC??AC`A?A?@A!6?A!4?A!5?@#96!22?@_??O?A??C?A??@???G?_A???_?C?@??O!5?C#246!72?_!5?_???A?H?D?GOgPg??Qc?cQHOcPa@a@eHAgA?@??aDBQC??C_?B#52??_#102G#121?KA@JbNtN^K}n[~u{S{gpQc{M[Caogg#102???A??@!4?__GCDA?OQGGwKA@#99!12?O??C#115!29?_OGEAB@@_?oo_LCQDa?pIWCAHO@k?I?G_GCP?e@?E@o?GDaC`GA?O?A@H???CA@?B???@!8?@!4?@?C???C#132!13?AG?CAG?_?A!6?o_#107???@B?A@O?GA@ADB?@A@BKC@???@A!8?A!4?@I?J?@?AHO??O$#239!11?@O?@#252!9?IC@!4?C?G!24?_?OC#239!15?@#193!4?A#239!5?C#193!8?_??C@C?SgTgDoAsGRAiXSDqgZcIpMpMpM~~~i?TGalQlQDQlQcICh?gDOAOA?HA_A?gAcHOdQKODqGSIdI@OiTIPaT_JS`YdZclQdItJShcISheG??DO?DO???H_CO?DOA?S@Ga?HAOdIOIcHsIsGs`[b[cYdWf?T???_CQ@?I?@???@??O_O!4?cA?O@Oc???cGCG!6?CG!5?_#56!5?G#103_#119??@!8?@?@??BB?CAG@??b?PC@?S#107??@??_#101!6?oO?CMB@A@A`KoNY`IOc\i@s@KACQpCGbcXEOcHSUgeHQP_No?dQkQ?I?G!5?_#102!26?CA#119?@#77?A#121!24?_!6?CwoOowWwo{NaosM[Og___os__{?o{_{^yyTdIAcd^QJ!8?Xno_#103I?C???A@cG@Io?Q???@#121!10?_O_$#193!59?_?O#196!38?O??g!4?QGDG`CgTcHqKRcIoMpMpMp???TTiaT?G??Gc?HO??S?A?g?_GOC?OGPC?OA?G?_AG?@_?O?gC??_?GALOaK?G?Q?HOc?_A?R_@AOdZugJtiItIvSUhJsiDxUhiUH|aTiItJsRsJtIvHIa[bYdYdWuA{f[RgK_?T_YCT?G?G!5?_???GAC@?Oa??@a?AGO!4?AScWA@IDtKu#142?C#114C#126??[aSS?IO_O?O_#69!4?@?C?G@??g??S?_S#103??CGC?QG_SHCHap_g_SS?Q@?_?OCgA#107!39?OG!6?O_#119!51?OOo__ckgC?GGCEEB???CG__??OOO??GO?_GBRB#128!12?WOiIC@?A#114!5?O?gS?gc?OCoCOG_OG?A?B?A!9?@??C@C?C??COjC??AGE?hQ$#192!113?G#237!145?OAG@?G!4?OA_OcACAC@k@I?H?C???GCG?O?OCOcASHO???_GO@AG_#132!7?C_Go?_?_#122!37?@#118!56?GK!8?OGcOCa?_CoSagU@dpX@HPGGXGA?GEJx?WPWCtGbAscQslYwWCiK[ZYRQ@NDFB@@CAOWH??@JFMGJNHVKB^F?K#127!14?C!4?_$#183!305?@#38!228?_#129CF$#74!535?O$#142!535?G$#145!535?_-#237^snQ|bLJuLrKXvILvIp^pnWvwfwNyfKrGqHQHQk@iShSHQhU_UHcHEPiS`QgQHC?DaCJ_LQdIpKQ`ShQHC?dQH_ISbSGO_@ASaAH?H?pAp?xA|?TG_I_???G?c?O#137!9?_I?TIPCOG@G?_??@C_CQI@DCCACP?WAAHA?W?D_H?C?cOA?C_X???P!4?O???A?HO??O_A?_A@iChAS`IOdIT_DiOIPcIOdIOdI?iD?I?D!7?D#184!8?@A??C?AC?_?GE@EPAP_PiOk@c?COi?C?GOgWcGCG?OgO?TgC?CgS`GsG#96?O#203G#50o#59A#121o?g_A???GpItaLq~Q~j\~ni^t{On~T~_O_o#103!4?XC@D_AH?Da?SaIoCQ{PZOD?Q_O?_!6?G#53?@!5?C!6?C#103?GA???RGG@CF_Ad@hCGQ@_s?eDWCG?MGCAHCAGCAO@?C?GC?E@C?COAK?CPA@?@#119!5?_oO]IG@@?N#143!5?C???C#73??A??A???A?C!6?A#119!6?A#116???o??OgIOfdC@Bg[MEg#121A@No_#112_#114IHaK?dOIoT@i?O#112?GCA_GaHOk@CHQDI?O!8?C@#107@!5?A$#193_!4?GO_?O?a???_#184!4?A?@#193!6?O#184!8?A!16?@#202@?G?@C??_?O_#184@!7?A_?_!4?_O???C???O?@_C?A??@?O#239!11?C?A?@#105!18?_ACaCPCJcIOJh?cOiOHoI?e@cWcPcB_Y?U_Z?J?LoJ?E_ZcICOdI?iChOc?AhAC@ODG#192!50?CO?H??O?G?A?O?_?c?I!5?G?i???G!4?A?A_?_C?D_?AO!4?CA?@#105?I#240@#52@#114x#132H_?UPGGgdGd??O#143@?G??a!9?i#112?C#114??@@GAtCAg??GoDQO?iD!6?_#72!5?DAN?Oh?ABa_SyDQIhQGFpKHyO??_GC#59??@#102!4?DDYuUqv`{Q?OWW?G?O#119_o_?O??O#107!9?@#119!4?G#121!17?__sQ}{oO~r~l~bLqnJUpKPcWjREGBHAi|LBcG}B?J?D|Gp??OP?@?C#140O??C?Oa#130_#52G#127O#132_KO#118L\^To??_QAdCGiOun|vz\VBTAA!7?@@ADADIQlQhSaXsHUItHVGQ$#192?AO!4?C??G??G?A?@?_G?_G?O?_D???_G?@?G?_??S??H??Q???C??O???O!6?A?G?C?`G??O??H??C?@?G?AOG!5?AO@?G???@?O!6?O@#184?_#150!30?O!8?_??_??A!5?C!15?C#239!72?c?O?_G??@?A@?OC?c!7?G?G!8?A??_??C!5?TaS??C?A@#244?E#55C#115C#73A!4?@!6?G#112???_#118!4?OD?I@lO???P?T?iutGA_?_?oC_gG_#101!5?@?A?CGQGFIT?}hUhTsDZGDOhTUhfWCrcDjyDWpAl?ePuGO?O#107?G???GAD!6?O#112!44?c!7?Q#132??o?OO_GOcY`OKo`GA?T???W!5?Ca!5?@?A??I#38?G???C??O#126?@Q#119?AA?_#103CGaK?D?A!5?A#119??_GS?S@A?O??G?eIdYtiTlQlOiSaHug`Gcgt`x$#246?@?L?SaOGaCPe?dOGoM?COE?FGFO?GrKVDukudP]TjAjucUhLhuZqxmCi]dFkqznI\hSUqhYSErlKJUCuzjYKeVthGbulJuKH@KoEoEGCGE!5?A#96!36?_?Q?@???A?@?G??@??G!7?_!5?O#237!77?A?@??O?G?_C@AP?PiOGOc?COa?G?G?GOcGCG??gO?T_Ta?G?g??G?G?o#116A#125?C^@GcuuRA#115!13?O_!7?AhAAS@GA_XSOOCAY?@^@Oo!4?_#98!9?@!7?_?iC!5?A?O#114!4?@!6?GO!6?@!4?@I@?EO?I?DAGCAGC`OL_E?iC@cPK?CQ?kBSGA?CQcWDGaE??A?@#126!4?_?K???WAL?_HE`I@CC??SC?D?AqKAC?C@CJO?D?O@KA@#142!5?GW???O#73??O#115!6?ASORGg?HAOCH#121!6?_G_kP}JelQdWcW_GO_#114???A?GCA?@#121S?Q?AKE$#184?G??A???@#196!5?O??C#252!45?O#193O!17?O!8?@ACGO?GoCpEWEgCHES?eI_FOSJyTdQIXFiTiTiTn~~Y?ta`cYdaSrKRcJ_IS?dOiOH_HOcPcOcOgQ_Z?U_Z?Z?LoJoE?Z_IcZdYdiTjSlOelQlJSlYTKy???T?G@c?O?AOC?PC?PC?PC?ODOaGTaWaTgF{@u?~?~?~?~PaH??_K?AD?_DGAG!5?C@A?A@??CPa?c?A??O?T?@A!12?_?c#128?G#126???U@G?@?OEOITaK?D?S#119!6?A!5?GAGC#102!6?AIC!7?GDNzk???Aq_#100!30?C#99G#108!8?G#115???G?C?GId?a@AD_OAGSaGCAWc?QG@C?IG_AI@@DO_J?K?A?A_IC??A#125!26?_G?ooG???O?P?G]oOG?AMlMakKQ`@??@!5?@@K__#107!5?@@???O?_C@#126!13?_O?_O$#196???_#239!91?_#196!6?_??A_?hAX_TGcJODgQkPegTiTiTiO??DtIGSI@GPG?aGO?S@??G?C?AOC?I??H?AC@?C_H?C_COa?C?H_C?P?_I?OD?OA?JO?CO_I?_ApCTzUgjUsJYdi\iPnciZcjYcjYdyDWv_\a\iVwB}Hy?~?~?~?mW?~cZQdx_YTo?o?_G?C!4?O?O?@???PA@C@?@A?A???A??@iPA@Y_BS?@#127!10?C#69!18?A!5?C?G#77!8?A@#119???C#77!7?BKCh?LdW_gO?E?UgGOCA???_??O_G?A??DqCApQkOe?bgY_#118!12?_`aD@?P`?pp`AHaKpyProQGopy_i@O_r_|wlWFor\x\NL@?@?AN#112!19?@!8?@?@#129!12?_!4?O!6?_$#246!264?AC???G?G?I?C@e@IPa@CPePePe@?P_PA\A@iGI?G??@A?P??u#101!47?@#127!145?o!5?_?o_?_??O?A#136!9?o_?A$#107!360?G#128!149?_!9?_!6?CS_GAAA{?@@?E$#145!535?@-#237jYsJStgRelOvG~?Ud]h^cZb{BKzNsJYdXcZ?ZcHqHqChQLQcYd?Ag@UGUgDq@GQ@OGaS?IPcHeGrKPiTAg?eOjCOCgODG@UhQcZ_HYdQ?ADQdGrCa?O?h???aG?O#137!9?S`?TIOcI@?G?c@??`O!5?GAGcG@O@OH?@OH?C?H?HAO@OAGO?BO?cO??O?H?cG?_?@?C@OAc?IT_TAShAS`IOdIOdIOdIOdIOaCG@S#184!19?hO?`??_AH_DAhUgEK?C@?qCq?k?V?D?g?G?d?@?B?R?t?B?D??AOBkAO#240?W#0O#125@_?w???@W??A#112!7?iCAG#143???G??QG?CGo#112??G#115CG???@?@??GC_CCaO?o?_#101!5?_T?CZkqDgQ|@SIGtItLqM@fgU`eYkTIEGZegPAo__#107???C@G!4?GC#119O??_???O!7?E!7?_!8?BB??WwCA?A`C?G#126?C??OiS`ACPHa@!4?A?C@A?@#116???_??g}?o?|w?s_wOG?NKK?N@]@!8?G#121Gw_D~Zm[O#103?QCOg#119!4?AF?OD#126!5?_U|MtkU~gcg!4?_O_O$#193S?A_GACGOAG???Tg!8?g!4?_#252!21?G!8?G??C#193C#240???A#192???C?aG?a!4?c?AC??GO??@C???Q_HOdO??@#239!9?C#105!22?@??Oc@Q?GuHCIdQhSaS`O@QcIcAcQkAcQhQcQc?kAk@cBcGcJ?@cHAc?Q?APICgQ_G#192!53?A?C?@C#237@C?A?S`CHAC@?O?q?c?e?T?G???h?D?@?B?p?d?P?C??A???g?_A#81oC#126?ADOkC?Gc?E@_It#118???_?`S!4?_!8?BrCE@y}Ea`^rhH_GD#59???A#77!7?IdYcQLqDlA!8?@?A?@???@B?CHAcXUAt?O?_#118!8?@A@?AOC_[SMCG]C_RMhRvdEFabP|Wy[zXNV{kbUfCrpRpOGG#143!5?D??C#125?OG?OWggc]gKhUkQMpD{AWgB?TLg?D~@YCIBv_@A???_#136?{g@??_C#126??_?W??cO#118AcwcrESh}i~\W^NG#143!8?OA@G#132?O#119@A\qlOMBEHUjUPMNnnNfBBB$#246?C@O_GAcGOFGr?i@W`A_P?[@Sq?o@OcGaZCucZQLcLzUCqlHdQ~TV}ht`VYGevkybTHjttmZqXTCr?T?|VYPl?znaDnyuQ_C?G?Uc??GdW_G!5?GA#96!34?O!5?G??C!5?G???G!7?O!6?@#239!74?i??A#192!11?@?O!5?A?_?g?@?`?G?i?S?c???S?g???_??G#90???_#49K#121ANDAm@O??Rgpi]tI~~TBPAAx~v~^hu|zvN~~s??ww??_#103!5?C@@WAuA_?a?PkPI_Y`???GQ#98???I?c!6?_!4?O???_O#103D???K?FATP`QP?`U_S_?oHK`A??_`?o?AP_!4?O_???G???A#121!10?GKKKIrvr~jz~iTBITj?s@CADA@?@!10?E!4?B!5?@#140_!7?A!5?@!4?O#125RD#132Ey#119??@#115@AD???@Q?@??_#121_?_ZtivWNhA`GQ_?FYTaLQmPkWcgS_K_O?O_Ws{{$#184?_GC??O?@?_!7?O?G??A?@??G!5?_???C?A???_!4?G!9?C#202??@?GaS?G#184!8?G?i!5?O!8?HQg@C???A???A!6?_?OC#150!33?CGCA?@#246!104?O??O??O!5?o?yCjCH?Z?W?I?V?}?U?q?S?g?I?Y?i?AOl?[Bs@?E#96G#140A#132G???@AieRGTGS@#119!5?Gc?gA#132!4?C@A#119!6?Go?EC?W[[_#107???O!5?GDG#72!9?@!5?}`tQItAaKp[WQh]HC?iP_O??@_#102GGHGK]kg{EG!9?@@@#107!5?G!7?OGO#103!17?_#112?C??C?OC#73???g!4?AG!7?A#112!9?@#126!4?C!4?@A#129?o??OoCOG?O???AN@?@_#73C#127A@#112!4?_G!12?_QcITGfO!5?@!7?@!6?G_!6?G$#196?@#192??@!7?C???A?C?A_!4?C?A?@OC??H??_?O???H??Q!7?AG?_@O#239!16?C#193!4?@G!4?@A???_??D???A??CYcWdGQCXGTdiQUdYTCrNcZcZcZc~UAG]I`eHokRu@YcHUG`O@SiS`[@QcIcQcQkQcQhQcQdQcBk@sBkQcJOJeXelQuHQtITiUgZaMgPZ_?GA_H?OAG`CO@CO@CO@CO@cHQ`SIPmONoMPkRcXeHsJsJsJSg@OI_W?aPG_AG?O?g?ACH?C?P?G?A?S?S?A?O???G?I???A???G?O?A??C#73?Oo???O??c#115!10?O??@#114!15?@??@?@?A?CQQIo?l?CO#100!20?@#53??GO!4?C???_O#99???_#114!6?C?A???A???aIsAC`IHC_G?yD@XC?O?KGIHGTKAAd@`CaOg?OK`?B#132!15?Og?e?CADQP?DA??@@???A@F!4?AO!4?C#149!5?_#142?x_C?kAO?W?ABM#114!9?@AHGhAC@S?_#118!26?@A@?@AP_O?O$#239!4?A?@!14?C!7?C?A#202!19?_#239!36?O!4?G#196!8?G`!4?QdGaTAG@?hYdGrK_ZcZcZcZ?hhU`_SGQDAG?k@Q?_A?Ag?@?A?aG@O@G@?@?@?C?H?G?H?OAGO?GO?cOGAO?H?cH?c?P?D?S`TIcTiVg\aUlhUSjIsjIsjIsjIsJShUi`mPnoNpmRkZeXuJsJsJsADSId[BkOM_\??R_@Q?g???H!5?O?A?A?O?C?g!5?g?O?D?D??@Cw@#244@#69?@#119??w#127???@#69!12?GS?C#103!14?A#107@#102!11?A??HHDYT~mRmT#115!39?A??@A?O`^HS@GaOC?IAA?@A__AK`O???O_??C?AC??C_???OG#127!23?_O???OO?GOc?I_@C?O!5?A??I??DCG??@#130A?_!6?O$#239!282?@?_?_?@???G?i?S?C???C?xiO?_???F#121!122?OO!11?_#141!45?G???O#38!29?O?A@??C#165_??O$#128!495?_?_?_?GoCY?W_?S@i???A!7?OA!4?@!9?F$#152!532?FG_?[__$#144!533?E???O$#145!533?o???G-#237lReXfI|Vg~SzkVylUj[ujLvi[a[ax]`]`GqLQcHU_UhCQdIoISbWChU`Y@YcBGAD_H?_GPiSHe?G@?XATIPMOeXAPAPk@kRcPgRkPhQlAl?U_EGUGTaGC@GAc?A#137!10?i?ChQd?@?@O@S@??_cAI?A?a?QGOGD?_?A?H??I?R?QE?D_C??OG?CGO!4?@?CG?cGAc??c?CHQdGcP?Ga?Ch?Q?CO@c?I?S@gA?HOA#192!19?A!5?A!5?c??C_?@C_I?S@G?I_?_G?A???O?G?A?C???Q_@Ci?AG#105?@#204C#14C#59A#128_O!4?O#112!7?D?SJKBO?G?O!4?OID?AO?dO??GA#115??_?CQ?g?S@HTAA@#101_?W??}GoGvYh~^q\u?b|NYH@gxTIC?GEhEW`CPKADYAtOKpOh_WoGoGog?__#107???_??C@??A???@#119A?O!4?C???EA?_G?KaAAAaD??_O#73O???AG#127!7?@?_@CCOBG???C#140!6?oCOGC??AA?@@?@A!4?@!9?C#73g?G??QE?I#118?@NSqhJVJ^g[B?W#126??I_?CpItAK`W?sJadGV?~?~@yDqC#119?R?gOC$#193Q?G?O#184???@?_??_?O#193??@??_!4?@C#184!9?O!5?G#193!7?@#202!10?@?G???@!8?O#193!10?cG!5?GAC??AC!6?P???PaGDqicPWJwTiTiTiTi~j@SrQDWeYcIcYaSjCH?cOl?l?l?dG_ITISlQcHu?m?l?GAWBwB{bUhRcjTiTiUgRu@ZoDYtIXeXq??_QChQ@Si?TGdQHcPI`SHaSHaSGdIpMpMpNoNoNoLa\a\a\`?i?T?G_?cG!5?@G!8?_??S?A@O_G?C?C`O_??Q`??G?O!4?A#217H#16@#69`#49Rc??O#119!11?AS_WACB??O#73?@???A#119!5?CC??GI!6?@#59!6?_#102WS\B^s?@?B#100??C!5?HO???!4C???aA#48!4?A#77!6?@?IOMIOH?GOGoGOG#118!14?Cacskm}}ZwJum}h|vPs}r!5@G?@?GK@@#128!11?@?_?@_GRICTiBOj`SlA@?E_??@@@#142W!5?xwgo@v??O??`GA#121?V?o`GhRDJ]o_!8?o@?N~t^jzMtIcPAD???TIVg~?~?}DyLz~kzUnz~~$#246?GOeGoAgA?BCP?D?hOA@COG@b[aHE@]`]VDolJqh\HUrlWTFthKezQhMcudX{v[IFuZXsmDjqX~vYJe|gteplHe{IsmRYRGQkBcAkALO??Q`GP_@#239!5?O#105!21?GcYcI??iSJCHOcOLOL?d?dAoITGOc?u@s?k?h?wAWBwAC@Q_A?i@iCgQ_@Q?@O?IP?H_#208?_#239!48?@?g?C!7?c!8?G???G?I_??G@!4?O??@!5?@O??C???GG#240o#35w#114[#50G#126@?C??@A@WaBLQgt#118?_R?DA???n}???_!6?I???ct?[~GCRAg?Q_#77!5?__?G@uGcGdQ?_D!5?O!5?A#103!20?CA!5?@??OI@W`HSgSoAgQcIW@OH???@!9?G#121???[s[kWqyALeB[u|??nSiCBBC_O#116???A???cPi@ShOSiOGymoZrrKCAAA??D@!4?A!7?_?@#126gsGQC?C?C#114??GC??_???A#119K}fo???S#132!4?OAC_??SG?_#112!12?C@$#196?c#192@??D??S?G?AG?A?C_G?A?S???O?_???_GA??C?A_???A_G?AO??C?O@G?A???_!6?O?C!7?A?G?AO?@!4?c!6?O!4?h?C???A?_??O#96!32?_?A???_???G??C???A!4?G?@!4?@_#237!78?S???O@AG@A?O?A?S_O@S`A_S@C@?@G_C?E@Q`A?G?I?K?C?E_@#244!6?A#83A#140?C#132AUoMleTIdHS_#114!6?C#115?@!4?@#126?@!10?`#107!6?A???C??C!5?A#108?_#72!10?GaHS?A_DAQ@?gtZTDXUheWiApLyd[Idb?`?O_?_!4?_#112!36?G_OC??_O??AG#73!15?G#129!18?GK?o?_[@IW!5?G!7?O#125oU?BFK_?_o_#115??AHAO??_#125!14?G_WA~J_?O$#239!20?O#252!4?@!36?_O??cA!8?c#184!12?@!4?c@?OG@?O_AC!6?GCG?A?C#150!32?O?@???O???A!15?_#184!85?OH?I@qGYdQ?S_O@?`?_C@C@I@C_K@U`I`A?G@W@K?C@U_@CxDQ#125!5?G???O?G_#132!19?A#114!17?pgCCRgCAgDGC@#98!16?aK??_oGQA??_GO_?O@CPKA_??_#59!5?C#114A??A@?AAA@!9?@D@@@CG??@@?cAo@P?O?GE@@#132!7?CCA!5?gc?bCXOc@YKGAH?C!7?C#38!9?C?_?kC_]s_]??FM_G#74}CAkE?A#127G#132!5?@OG?O_#103?@??CGO#73!15?@$#193!64?O??CA!8?c#239!26?O?G#246!157?t?sHA@W`I@M_I?S@I_Q_S?U@Q_W_K?K`U_S`Q`Y_G?Y?zCqd#121!6?@A?A??C?SgQlQIh??_gws~n??}{nTw~|n~Y`z]vP?~B#103??@gO?BgOAwTaI?C?B??FO#99!14?_!6?_!6?_?O#102!9?CFDDE!4CS]e]uJVJJ[OGWO#125!28?G!7?O??@_?WWCaV[q_JscPi?OgACI@AD?@@#52???OG#130O??_??_#152A!6?w?OGQ?@#112!14?S_?c?V`$#196!105?Q`GEgT_A?T_H?RkBsDiTiTiTiT?SSjGCgAP?@O@cH??OQ?H?AOA?Q?Q?P?_?`?HQ??@O?QCPC?C?C@G_CGPC?S?P?DG?k?Eg@?cAOACLYVHiUd[jPUidYheYItSja[Bs\afWtMpMpMoNoNoNq\a\a\a[iTVijcSAO?C@??G?A?I?S?I?Q?O???O!7?O?C?A_??G!8?s#127!5?_?_#115!104?A??A@@???@!4?_?_E_?caWA?R!4?D?G?@!4?A!8?@#126O?@__?ATBOGOAk?a!5?O#136!29?C@!5?Bk???C$#141!318?G#73G??G_OA#119!105?@#56!94?EO#52?S#144?@#145?@BpK@$#143!319?@#81@-#237TiSjSjuhLuKR}D}jU~DyUwT}H}HQuhZcItAShUHQcJoDYdQcZOiPeWEgRcRcGdIt?s?GBCHQkAhO_SHQlAlOdYcHQkAkPITi@i@iTiDQHsIWCG@_T_?HODGSAGC#137!11?@GQ?_?CI?A???CG@_CGQdI?GC?cE?@GGCA@?C?H?c?OAG@c@??Qc!4?@?cG?_?O?`?C?OCh??_?HAO@??a???@?AC_G?T?I?S?h??@#237!20?g??S_O?_???G??_?GCQ_IP?PaGCP_L_O_!4?@A??O?@ASgDI?A!4?G#204G#14@#73C!9?A@A[?G#119??B!6?A???_TD?oWg_oo?g#114??O?kBGCqHgAQdOA#101??ACBg?[bSHA]lvY~vkT}Y??aUslAPI???cOID_A!7?@!4?@ADAKIKtIPA?A??A#118???@?@?@??@?DqhgV~ZwCdBarrOSS_KL?cc_???C#125_?AAFcoW?_YxMIhYDySHG`a_PID@i?oOo_G??_#52?c#142!5?BB?~AwGE_K#132_!8?@@Bp?aDa#112H_O???Ja???O#126?_SIdY`CxCjCA?A?Ti?tIPIdYdGBCSg#112?C?O$#193i?`?GC!4?_!10?A!4?cH?C#252!35?A??_!7?A#184!8?@?_!4?_?A@?@?@gOA???S?G???_!4?A#105!20?I@O`?hChQ`AOI@_@??Pa@QH?kaCbOk?iPa?Q@G@c?Q?QcH?HODQcGQ?AOI@AC?I?HA??CHA#246!49?O`G@CGA?Gd?v?QLQ`KTCCiKSTqGCOIDITiTiSgDiCiSg@A?_@cHuGu@#217E#16C#125G?o?I?GjHOsCc_O#112!6?C??Ag?O?T???GDA?I?AC#103!4?O_Q?C?@cGQLhOAGpGQI_?gQ_`#72??@??RG@cQ??HAOlePe@YIDsITHAHE@I@A?B@@DI@i@@P@GO#114??C?GCC`???_CPGHa?J?DQ@G?cBA!5?_#132!5?A?W??C??U@H?_?J?iSDCoOSC_??OsO?C__?G???_#38???A@!4?BsHDGk]???C??O#125Om|^???BAC???B@#118??AFJy||SHK_GB#132???O??G`??C!6?SG?C#119!9?@A?J$#246?@A?@???q?Pk@o@?g?OChDA@a@QcHAcZT?|jAgudXSNi_YlHceTmHdpVkIgZVYoInH|t[YudP\UjLjudQWQnI_ZUdQxRMt_S]SiS?DwlsA`CpASI?IC?C_#96!34?A!7?A!4?C#150!9?A?@#239!80?CA!5?T?A??GC!13?A!10?O?@!6?O?O???@#240?p#64G#55_A#132?B@O??CBHYW@a`A#118!8?DB?_?Iyo?_!4?OOW~n~BOC_@?CP#102??_SN|s?_@@A#98!11?A?@kCS_HAO?cPQcPI@oA_gs_oD_`W_SEq?KOCo?_#103A?ccxK_J_[@AUIw?aQWaOI??O!5?A!5?_#73!7?A@!8?O?@#128!5?@?@W?B?B?@B?@?ACSIIDKs_oO??O#56!6?@?xC#74BOAB#128G#116@A#121_^~}_{wmcKwKiTsO_!5?aGokz]jdYdAGA??@!5?@VIpmtYdYv{zjU|zsn~$#196?S?S_??O#184?G???G!4?G???_?O!4?O???G!5?G!9?@!4?G???C#193!7?A??_!5?C!13?@!8?S!8?`?P_CIChUa?qH_dQkVsNcZkjV}}keCnTYhOlSjShQtISgPcGpmPqLOgQObOjOmPiSqLWdkOvGQkZcHQdYdYuHQtITMDi]OjuHaCZuLJ?OiCxATKQdWa[`GQdGQ`SI`Sa\_\a[b[b[b[b[b[b[b[b]_DAG@I?A?G_!4?@A_?@???C!8?ADGPaCG?gC?Cg!5?_!7?_#50O#128@N{_nQS__#126??@AGCOcW_V_W@#115!6?_!4?O???_?_!4?K_RGcQGdGA#77???@ISCs@[Bc\?QGc?G?_#100??@j!5?G#48??G@!6?C!5?O???_#100?C??W?_O#102?_???PROW?}[G?AAO??O#121!4?C!5?OGWCCKGJXbq`WAW{R~HGUsXG??e@I???_!5?_??OGC?_O#116@jCDIOB\?CoY_#130!6?_#136?CBo@O#127??O#119??_#126?@[@?OG?COOG#119?G!4?_OPVF?C@#125!4?SQCrOy\vl~i$#192??G?AO@C??A??A?S@?a???G?C!7?_A??S@??A_?OD??Q?G??OA???P??_?D?O!4?@?GA_??O??G?d??OC??G?C???G?_???A!4?G!8?O??G??H#150!41?@G#184!95?CAO_??_?GUGRG_?I_APIPA@aGCPaDgOa?G@?D??GOADaSGDI?UHu#83???A#54A#38_#127??C???AG#121!4?DQlZc^gZf}|O{n^I??NFAD^DNLBF#107!5?@G?Q!6?_#99!22?OH!6?Gc??_??GSPAXMo]Ke[iWGoo?_#77ACA?DIXA!4?A#119!7?C?C?o!7?wGcD?GBB?C??[A@D#126A_?Q@g?cO?C?S@!8?_??GCO#140!6?@??B??KGK?Is??O_!8?_#73!9?A??A#107!6?C?A??C#73!13?G!8?_$#239!6?GA?@!9?@#202!47?A#196!36?A@??ACIP?PA?HODASQgR_JoRcBSg@@QPhO?cACQ?OACG?c@QCGQC?CG_?P?CO??@OC?HC_AOAG?cH??Qc?I_G@?cH?d?ogP?dO?cXQ_?OsulDyE|GrlYe\`YVdYalSj`]A\a]a\b[b[b[b[b[b[b[b[`^QhO_CJtGAT?`???O@!4?_!4?@!7?C?O_?A?a??O?@_!6?Gu#97?O#121@#52W#116??O#49?d?OC?_#115!109?_C?@??@_T?GC_DGc?GCA_??C@???G???_#127!16?B!4?_A@CA_ADGE?A??ISIcO#129!7?AA@@DGJsIS!9?C#81!10?O#115!8?C?A#127!18?_GO$#239!107?A?_!5?_???_??@?G??G?O#192!134?T?AO??c??CO?G_??_G??aG?O!6?AO?P?@??G?Q?SH_?@#140!5?C#107!121?_???_???c#112!15?O!6?AO??@???G?_!5?G#73!15?CG???O#149!10?@A!4?A_?O#152!5?GC?B#103!19?@$#144!532?_@$#145!533?G-#237DYTitI|Iv[b}Piv|a^tjuHzc~A|UkzcVgU`YdGtIPiSbShEgRKPeWbKpEWbKPMOeHQk@A_BcHu@YcHu@sHeSIOiTaShEgRKaTaWa\a\AXeHqCwAXEGACi@m?IOD?CG_CP?A#137!4?HACO_D???_?ACg?CGQ?G??_@?C@?SgAO??ACO?_?_Q_HQCAC?QC?HO_HOC_?CGP?i?@!4?@OCG@aG!5?@??G??AG@C?H?A?C#237!22?_A??CY?S?aC_?o?S@G@Cg@??O?I?`OG?C_CGOg?PaGa@QgCG_G!6?G__#35G#125G!4?G@ATANTJMUO?G#112?O?_@??_#114?CAM@?_O??_?O_APSOII@dKG@e_I?O?G?_#101??dGA?@SgEJdJUn\j^hQ`LYcO?G#48?I??C???OA?G#93?G?_KOC_?K?KGO#101?@??AAIYcC#115@hA@?_PqSOHCQ`?Z??_!4?_?G??OO#126G!4?_??CGC??OooG?P?__?G??CAC?A?F??@?A??A#127??@!4?C#81?_#38_?PAWvJ[_?GC@#132OCCA!8?AC#126?ACGC@AG!8?_OkbCSIUG@??A!4?@?FGQD?mD[HQ???FOS_$#193y?AS?P?c??O?CO!7?C???G?@??@#184!28?_?O???@!8?A!8?_#193!14?D!9?@A?CP`WhO?OaSD_YR_VGaKxc^nLsoxINYtytItgRU`Z_lQTiTIuhYkhI?Ti[dHiDYDZCl?U_ZgZchQsAlAU_jUXj`Cm?Ts{Nn{[EQpcXCrkP}pysjspvGPcQHsAhSqCzCqLqLqLq\qlqLqLqLqLqL?O?B?@???O!6?a???C?@!4?C?A?@?@A?A?C!6?@?OAO?O#240!5?U#37A#128CrJe~r{ti\??C#73?@IDAC#118??G]E?M^J[pSvVn~oW{nVtMjN?osWADoP#102??ID@?HNuJG??oO#72!6?@??O_UgQ_`OkQd?OtJ?z@m@k#41???C#95KC!6?GOO???C#103@!5?hoUhCgOaCAGA?G!5?G!5?_O#125!6?C?AOC!4?_?GG?CKCJI?_@@?Q_?A?g_O`EQ@@DCy@gGoKH?Q?O!9?_O?MAB#119GCKL]?eQ??G!5?_!5?@IG@GD#132??O`?_?A?__oO???GC_@gO!4?s#112?@O_!4?@$#196?D_?I??O!20?A#239?G#202!35?@??@#184!29?OAO???H??g?OAGA#239!6?_??_#105!17?I?IDGO?@Q_@?cAPICGQ_QA?@?DaGo?i@YCH?C??_O_H?hA_AC?A?HA#184!61?O_??ODY??C_DcAoJS@?@?_@!4?I?@O??E?CHSGAPa?A@QgCG?@?@IdG#244??H#70C#140A??G??AG#49?_OA_#126???yc`II#119?_WB@_o_??GG??ND??GG#103??_T???oAK?Tt?iSPeOHs?Al?m?QgOGO#98!6?@?QCH?kOKcI_GCC?kORfvarAR?bT?RC`?aIgOgcO#77??YO#59??O#107_?@?G@?C???C#121!4?_Oo?OGAemJje{gF??gvBVZ?ZEEBa@__OCGCSK?LG[HFOCG?GK?a_!7?_#52!4?_?C#142?_BQF?A#121_?oWSA@A@BPlR\R~LZPbMtUw_O_?v{vYnRGQ`S`C#127oKO?GAtGS_#73?A!4?G#119!4?C!4?A$#239?_???_#246A??`K@iCGAG_GCGQCH?T?_P?AgRhMcYRIseThKiQXTcqiHdSQIhdSRi`lXucQ}lUsZQHkdZQGmJqXHtfTgLjQXTcr\gLaL_GateOO@Q@c?_O`O?O#96!29?_!8?_!7?A#246!92?OdA_??@?OHOHCJ_iSyqDW{wNttTYedzQXq@E@SgCPSg?@QpE?aTitWtcW#97?O#38_#52Co#50??C#127!4?_?O_#121???@YdtV?`{O#115??@?a!5?A!4?_??_DGA@oAGI?o?geO#77???Qt?N?jCPcQcgOaC#100??CK??A@@#72!23?O?@??A@C?Ksc#118!13?@CIH?ZFU\LH@BR?XOcCPBA??G!5?@#143!7?O#128@?@???@O!6?O???W?GCGUpKPUQ?K??G#129@?G???O?GA#73?G??@!6?C!6?GO#143?_#73!11?C???G#128!8?_#121!4?Di~Pq`Al}j^wnJ\}$#184??G!4?@G!7?C?A!8?G#193!40?O?G#239!35?CG#196?CH_?C?ACi@S@iQDgVGrKrCZ_OqALAdO_?D?OADG?K?U?H?C?P?C@?S`Sg?@QCP?c?_Q?Z_L?D?QC?HS?X_LO?cOUiPTiIBoOBahhEYCrKRm@MCJSBMGteYhuA|SjHzCzLqLqLqLaLQLqLqLqLqLADIdG_CITHAG?H!9?C!8?G!8?CG?G??A?_Cg!4?R??_#55P#56G#116CP#132!7?G?@Gd?O#103!12?G#69!6?@#107!8?A!7?D?A#108!7?O???@#99!15?A?Ar@?Sr?yPA@kOGP?X_nWI~_bAeLtSgOG_#119!15?A@O_!4?AAEMKC??@!5?OG@@#116???_!10?@#73C??A??A?_!7?_OO!6?_#56!6?O!4?DGC@#127O#128?@#115?_??O#114_#112!7?O?AO?G@FOG?d?A#125!5?GI@?pMRNLf|IVaZWs!5?A!7?_$#192???@?C???A???@??P??O@_?Q?_A??CO?C?O@?c?@G?AO@C_AG@COAG`COAG?C?A??G!6?c?O??c@O?C?A?G?AO?C_AG??AO???D?G??aC!6?C?@C?H??G#150!31?_#239!102?G?O???_!4?A!8?A?A!11?_??A!5?C!4?P!5?A?F#144?@#141!11?_?O_#121!22?A#100!77?A#102A?!4@AM??WUMK??@!7?_#132??_#112?o!9?OG@???O??G!4?@_???O#118OO#119!11?O#116?O?G??e?E@A??@@Av?Cb!4?_O!5?@#118wq_?{G?g__?___!5?Nf]O$#252!69?G#192!189?G??_?i??AO?C???CGQ?A?_I?_?G?C_?GO_?`?G?@S_C??@CGAC?A#114!122?@!7?CA@??@geow?CQccW@!6?@!6?@#132_SE?GG??QC`@K?QACCGAAI?G?p`SOGjEgd_E?@@O???_??_#130!7?S?G#136?@#126_?_?_#81!14?C$#48!433?O#69!17?_#73!12?c!8?_?A?_#140!36?A??HKQLGEg!8?K@$#127!475?O??_?C_???O?G??A?__p_#144!31?_??A-#193~?iDGO_G?CH?H?g???@#184??A???A#252!5?G#184!6?O!10?_!24?C!16?A!8?_@!4?C?S?A?@?G??_A??A??C#137!12?@?AOdGA?H?D_AGOC??CO?GCa?@?C@Qc@Q?G??GO?_??O_??AO@i??`?O?`AOD_IO!6?T?A?O?_?D#246!30?GA#237!8?iCGS?Pg@G?_?G?CA?TGC?AO?GQ`GOcGQC?@g?gT?G_AH?C`OlYdID!5?@#96G#38KOC??_#125??A`?OG??{E_?_#119?@@???@FBADW[KKG?GG!5?k{w?G}o#103@A!4?`ISDrcCClGCRCHaDi?G?o_#98?@A@G??ACJ?_CW_LY@[IzfWsjSiwdZ@YUhFq?CA@C@?CO?_??_#115??G??@?aPg_H_???A?G?IC!9?c_?_AO_!5?_??_#128G?GA?CCAE#115??A#116!8?OO???GAG@?D!4?@#98O#115GG???_?oGCBg_?_#112@?O?g?C`?_@?@cO?ICP#125!4?EOOGA}Z@nDrHTidB@\w_??___?O$#237?T@ybM\bmRsjSjUlwVg}VH}oN|rMzcVqHQkAkPK`Y@YcRcXEhQLQcYdGtIPKPeXaLqcRcHeGRk@iT_TaSb[_LqcRcHu@sHQLOe?cHq?tAShSjODRCJcG_Qk?iSgCQ_CO?G?_#105!11?Oc?Q?G?_A?G?@?c@O?SGQ_G??G?D?Ta@AGA@I?AC@G!4?AGAC?G#184!61?TiSgTgPg@g@???AS?a@G!6?A!5?OC?@g?iD??_Q?H?_?cI@I@#208???@#240__#56B?G#128KBBF^|Yoco???_#126EEGo??wk#69???C#115@AC!4?G!5?Dg???HA??GDBA@SC_GWC?_?O#101?@!5?@IDyDEIsgAPNOgo?I?_?G_#93!6?A??@?A?_!4?G?fOLwywo__#103@???GDWBG@__Sg?T_???A`??G?A#132??_?C??@?G?@G!6?K??GC??c?O@G???A_?c???B?EH@?@OC!7?C!6?B@#107??C?A#119???B?CwG_#126A?A???GGO!8?DiX?E`S_#127?cQ?GCaIOICA#121??F[B[ALANvnyt}N$#239?iS?S_?O?GA?A!9?@#193!75?HQ?C!8?G?G_PcRC@Y@@ApHCRidTqMTiTiTkyWLGqlQUhYD{ALyDXadZsITiUgZ_LY?latiTaleXMtILZktKeDQ|ULImSWL_Y@dn~?~~T?ih{BkZV_yy~~nzv~?PkRcZcRkRkRkRkRkRkRl}bsLqLqLqLq?PA@aC?OAOA???@g#202!7?G#193!12?A???A???_!6?O!5?A?P#37_#52nr_[O?_#49?CI@#121???A@?hAI}}FB^{oww__?ooo#107!19?SI??A???GO?_#77A?@?@ACTqCGXo#100??O#99???@??COB?B??cA`CWdJSiTDYC}dhUoLWA_C@A?WG??_#108G#59!4?@A??G?C#118GAI]P_?wscoX\]E!7?CA!4?OA!4@`_!4?_!5?O???__#115!7?_#103_!4?_O?O!4?_?_GGoCGIS_w?O#119!15?B#73_!6?DA??C_#128???GO_?O_D???_#143???G$#196!5?@ACP_?S_S@Q!4?_!8?G?C#239!74?A??A_#196cO?A?G?Oc?gSA?RgDWaKPiTiTiQDdaQD?H??_A@O??_AG???_G@_D?U_@u?WA?GS?PCo?dO_Q?bWOl??o`PAdaYDsIO?~??iiTSBkRCgYDD??OCG?~mRkZcZkRkRkRkRkRkRkQ@SHqLqLqLqL!6?AC???S@g#239!26?O?S?G?CA!5?_???gM#97C#144O#116??R?Gw#132???@?E~~@?X?OD!4?_#118!4?GAB@BFtvt~|YqDRBFot@MoWsg_?O?_#59A???G#108!9?_#72?@A?DITkeonSIspNWfOAcY`#100!18?_!7?O#114@!4?@?ACAE@ERACC?AO???OC???G!8?_#103A#125!8?KCOKSGSGEAJL@@?_???Q?B`CIIEA@A!5?C??A??C#126A??A#132!33?hgA@\@?c?QGC??OwKAFO?o?XQG_$#246!16?FgA@?s?FO?COCPG?udP\Rib]cudXkJaxUCqlHdYRIseriHeSQLHkYQXtcRYSiNi\hKbZQLHkYQHkJucqjXUHUGnI|h?j?KOG_O?RC@?@#239??@??G??A?@#150!14?_??O?@_?Qc?I??@#246!98?@A?ACAsBWBS@g@}?qr|hnvbKSfIRdhjyUUTB?idJ?cRqGC??O_O]~~~?O#142!5?_#140C#127!4?CI@???W#73?O!5?O#114!6?@?A??A?A?AdGQ???E??@E_GTI`IT?_GO?_?O#48!20?@!5?CO@??S#41!17?H?A?C#77@??G?ICC???_#119??@!5?@?G!6?_a??K?C!6?OO??_?A!6?_!9?ACB!8?_!4?O!6?GGKG#126!54?_??GbCBC?t?GODI@o$#192!18?S?G??G_?G`?A_@?GA_?C??@G?A?OC??H??Q??c?@G?CO?H_?Q?@c?AG?_@?O??AO?C_?Q?@c?O??H?C?_???O??AO??`??AC???G??S??G_#96!21?C???C?@??O??A#239!99?_?G!5?C?_AO#196!33?Q@!7?S?A#112!19?@!6?AG?CO?_#102!26?@??JRBAFwkyu[wO#95!43?O???K??_#121!15?OO`cGCA@A@??`PPRGMaf@YKDliXN|{aqOABOBB@?gO?_G?[HGYDlGKW??@??O!5?G???C?ABD?A@@!7?@BARN|V|z]~Vun}WN~tzm~yOcO@GA#73!12?O$#192!265?C?gAS??@GC?AS??S`GOdGQC?@g??S?O?SH?C?QH???C_#143!26?C#72!101?AACC??_#112!16?CGD!7?A_??C???O???A#116!10?O?C#112O???o_??O?O?C??O_#141?O#49G#101__!6?_?_???O$!438?@AA]SQO__o?_#107!10?@O#126?A@!7?Q`??A!4?@!6?A??B??A@??OO?G?O??G?_O#118!7?O?O???G!7?CC?A`@??CBK]WCc$#102!439?@??@@BYECSW[W#73!18?_G!9?CC???OK?OG???_??@???C@??DA!4?A???@!5?G???C??@$#125!472?`OG?O@#127!19?__!9?O_?_CCGCI#128DDEI!7?C$!474?O#116O#140!42?G@?B???B#59OO$#127!475?G#72!42?__#77O??_?_?_?O$#142!520?CC#52A@#114WO???_?O?C?A?`Z?S?_$#102!521?_o!8?_oGWOC$#38!523?A@?@#81A$#129!524?A-#193~?~?Sg?iO@Q??`G?ACG?Q!6?G#196!14?@#193??_#202!15?_??C?A_?GcO??_#184!4?G@#196?S#184!12?C?A!5?@???G?G?a?O???C?C!5?C?O#137!11?@?I?COA_@I??eGDa@?_??O?A?c?OC@A?G@AC@?Q?dG???HQ@C@I?T?G??H#246!45?OC_HQH_?O_?O???C??GcWeXA`cdxQ[gVWgiiwSVzy{xy|xYSdLZRtTk@smsRcl?iTgX^~~r}#244?F#14A#128_S!4?FFFB@?nXSIU@c#132R?VGDQKa[O_?_O_#118?@GC?B@??B@???@BE@@FEYL\]og?}z_O??_#101!7?A@?A@]`ZsIsHU@qK?e?G_!5?O?_?_#93!8?_QGVDnJ\inmCKGGOg_#100G??OOO#114?@?C???@?@_BGOG??GAC?OG?AA?EB!6?C#93__?_?_O?__GoW_GcGOGQGC_C?_#72@??@E?OcG?CGG?K#121!8?AAABHYYzWopqbff{y^umzFhUyHa?@?TG#128??@_GQcZ?OdOCO#126@CR?WA[`IoD_$#237?T?iATjSjSlxnYt^OjcYDzeXvkYbtLr[QhCxAXaTI`QcYCYcItAXa\_LQcZc@?gQGSGAs@GdO?@_MPIpEwB?TaSjOLQcY`MpIT_TaSJOlA[?XAk@uGuHuHcOi?QgCAOc?P_CG_C_#105!7?@??C??S?@!4?QGCa?dGP?HA_G?d?CO?g#192!78?_?OG@C!4?_GQ??C`AO_DOC?@g?C@AC@AC`IO_CGA?OC@?G_A!5?_#64!7?C#49U_#38?QO_?_??C#125@?A@CHUHgw_oo__O_#112??A!4?Q??G?C#73?@#143_#132??g#114???@???@CA?@CQg?CICS??gGU#77!4?@?ADI@[_?SG_#98?_K?a@Go?WPcnO@lAt\_\btePiSDD??_!8?BAC?KCOW?G_#121!4?OQQOAA?C?CA?@!6?@G!5?@C?A@@GE?G?@A?D@??@???@#118?@#101?@!4?@?A@A@ZCWoCw?sKOKGs?O#112!7?A???a?A???G@??HO#143??AG#125??GaQ`_CiviDrKRcZdQlOM{o?Gf|a$#239?i?Tg!4?A?A??A_C!8?@C!4?@#252!29?G!11?GC#193!31?@Ac???GA???AGbDO`CaXdIPiEI`VPYHnl[m_tqn{ZstiLOugDqHCqHfWtIXEhZ_|QuWdwUmGlOAuvlE`kqy_TAjbuXEwVy~~^v~nv~^v^v}]nv~z\mvz]~?nOnOnOnOnOnOnOntZehZUce\id]TiLU?Q???GaOA@#239!11?C#184!13?A?_?GA_G?@?GO???AC???C#70???@#125H#116Ad?@A??_W_cOCGP?GO#73C???G#115!11?C#119BBB?A@??A@!5?EMGG?O__#103@CA???j?Z?A`G|?Oq_i`GC#72?ACJ`BUh]@q\GvASDi??C?O#95!13?`?YOo_???AAC??O?___#107BA?CCU#118?A?DCO[?w??C?AA??AGB?@?G!4?@CGKGE!4?C#100?GG???C???AA?C?A@A???@?O!7?C#118@?@?@?@@C?CsT{CoccC???C[G#73!14?G??A#116!8?c#121!6?BGc??@]tNy^~$#196!4?@AS@Cg?COC??@O@_#193!54?G#239!31?_??@AG!9?C?@!7?O#96!13?@?G?@A!5?_??O#237!95?_??G_Q@???cGQGAC`AGaDO@A@g?C@AC?AC`IO_CGa?Y?@?GOAT?ACA???G@KGO#52?@Y`eKWOW?W#127!7?A#121?A?BADQCANZd^b^jgsws{g]m[c]B~U{woOoo_#107!10?G?D@???G#100!17?@?O!7?g#85!19?CASOOw?_O_#77?@#102?@@?CCOQGG???_?_??@?_!4?P!5?CO?CIA#81?A#98_#95__??!4O???G???[CGckAgCG#134???A!5?C_#114?@!8?@AG?GG?_#126???@??@!6?AC_??CoC`CO@OCIA#127O?GSIC`G??IGAh_#73???A$#192!16?_!5?@_GA_??_??G?_?G?@?@??O?A?G_AO?H?C??Q?@!5?G!9?C??@?OA!4?a?G??Q?G`?O???OA?G?c!4?@C?c@SH_??O@G!7?O#150!19?O?@?OGCQHC#239!95?G?_Q@!5?O#193!30?@??OAC??g@gP#150!8?G#132?G#142?GGO_#140G??AY?_a___#126??DGC?G@H@_CW?K?S!5?O_O?W_S?g#112??G_???_#102!10?C!4?AFNL[S[oo_#99!13?DBACZ?BmA\IA^a[IXmTjYgUg!4?@?@@??CGCOOG?__#115A@_?Qhd??C?G?aG?OOP?GGD?Q??F??@CGOC?A#73@?AA#112@ADD??BA?@@??@#131??__GO_??_#103!4?A@A`A??AAaA?KAgo?G#73!5?@!9?@$#184!16?G!4?C!6?A!4?A!5?_C!4?GC!6?_!5?G#196!50?O???Ga?O@??iCQH?A?e?H`UGiDuOQaPTIG???A??_G?QGC?@??GA?cAoC?U?G@aGB?PdQItHGQoKQHCTigSSHeoFgD??_G?OG?_G_G@`OG?CaPGC`?~OnOnOnOnOnOnOnOIcHQC_HOATI@iDQ@l@CGC?CH???@!30?A???@?AC!8?@#56!5?C#55?@???c#115!45?@?A?I@T@?T?b_WSU`?__#48!21?G_??O#88!26?o?_#103!5?A?@@a?``C?_?@?@?O_PLC?\?T?SGOo_G?C?qG?O?O???IG!4?CC???A???@#77!12?@A?Q?oAo_OsGo_O#132!11?@?@!7?@?GO?@eSL_SG`T??O!8?A@AGcP$#246!18?QDg?WE?O@SGQKadSZEte[Io]kJdP`RTGleSAZqlHcQ}VVlrbt\JuRInvQZpmsEgDg~i\HSfqlHdUOIdg^iLhseQXAtAs?O@@!4?QG!4?O_G@GC#184!126?A?_Q`Q@?C?CGQ?G?D??A@OCA#239!25?O???_!4?qo_#59!68?A!4?O#72!53?@#87O#101@BBABECK?GGG!6?_!4?@??__?__?_?_!7?_!4?O!4?G#119!4?@?A?@#99O?_?OOSgGGoO#119!8?@!9?@BB@?@WC???CIK??OO$!461?!4G?S??A??G!4?A???@?@!4?@@A#126??GG!4?AAA??A#98?OO??C?A@A@VSMK}kw_G?CG#115?@?@?@???CACo?G?_!5?C?G$#132!463?A!4?C??A#107???A!7?_WOw??O?O!9?C!4?A#102!22?A!5?A$#112!466?A#77!4?_?C_??_?c#108C#112G??__#125!7?@CD#88_??O$#111!483?O#85!10?_???__OOoG_?_???O$#116!494?@#111?C-#193~?~?Ti?GP?DA!4?S?SAS`GO???_A??@!10?A#184!8?@#202!12?`?I_S?G!4?_#184!17?A#193??CO_?g???G!7?C?DO`W??G?UPGRkACBPKHQCjYDuhUvvnZf^Y}lzt]}ltIlS[kqY_DmTZcFLY?i@TBgEOHj~Bjj~~zn^zx|Z{|]~m~^BhYb~}NZ^L]VZ^`iZjRjRjShUhulYTMtYLuLYtEbCAt@AQ@AAH_F?L??CG??C!10?O??O#202???A?A?A@?A??_#184!10?GA#196??@?A#153?G#239!4?B{#150A#140@??_!8?A@?A?@A#127?@?A@?A?GC_??_#73A#143???OG???G!6?G?C???S?_#118@??@G??E@Kq?hC?G#102???AI\u~|ko#53!5?@#98!5?@A@?HA?GQ_WDKPROMiTOfEc?W`?OA#85???B?EA@??BCBGC?g!4?_OgWWWwo?woSwWwWks[u[s[snXk{U|XgSbATiAcB@?A?@@?@#98?Gg[oGw}{jq~{DNUjQ@CG?C??O#115?@@GMO@??G#121Ad^{s\|tO]jTlV}JsD?B#125odrZHd[A^_I@PCiChEYdQlTdONrOs?@OK$#237?T?i?TiTmTytm\zViTHsB[AflQ|JSxNwEOlOLaHcJS`WaKhS`ShEgQKPeCIcHEGQK`?J_SAGQC@?bCjSgOLaTgTAsBsHeOdW`ADISBkRc@iTaTi@y@iCADYcRk?iC?@gO_IOcGOC?G#208!6?C#137???@!6?AP?_A@C@IO@_?GO_?T?i?S@gAS??S!8?A??A#237!35?_??_??_??G?G???K_S_S?O_Q_Q?O`Oa?s@YcAgTGcGDGCGCWCOCgCOcGCA?@???Q_IOACHa?_V?A@!5?hO@#193@#38E!4?@B#129??_O#132?CC!6?I@?ADCA?HUx?Z_Xa_?__[__PacY`S_#73?O_G#112???AS?G?O?K?_#103A???J?SI_TKoAH?AOG_#100!10?A???_csO?A??_g_#93@!6?@?AANcCxJRClPk}nzkw[qX{So___WK?___??[CIGC#103!4?@?@@@#100@#93@?C??_A_@`SlgTkR{[{{Ra{huPdS`Dd?@?CC#100???_#102??_!9?CC#108?_#118AYnDP\G???AA#73?I_!8?gOC?G#127_QG`[_J??A?@?O@?GCAGGdOK#126B?aa?P$#239?i?Ti!4?G??@??_?_!4?O#192??G??G??C??OC?@_?C@O?G_C?O?C_?G?C?A??C??G!7?A!5?@C_?G?@?S??AO@C??O?WdGSACPc???AO???@g?A??CH_A??@_?O?G?_??@#105!14?ACG@??G?AH?O?_???AC@?A#239!69?o!4?O!10?G?G???@#240!52?AS#56G#128CJ^[c!5?ApwIK|[{iCws{_o{_O#126@C[CTeXS??]@]OMKXC[iC\_YcY_#119??ABEKFB?GO_#107?C??_!6?_#101???BCHUkB|QdjStKoKa\QH?cGO_W#48O#95!6?A!4?@C_JWAogwOgO?OCO?_@_!4?O#103?@#108??C??C#84?_#41A#95C!6?AA#84??AA???A!4?A#95!5?@??_@@kSAAGa#134!7?A???AA?@#77!6?B?@aCW__#119?G?Oqa_O?AB#132!4?@!6?@?RCGICCcQA`#128?StQkaOZEWdAhO_O?_?_#121AHSlA$#196!6?Ta?a?GOaCG@A?G??C#252!50?`?G!21?GO_#184!6?@???@!5?C!4?OGC!6?C?O??O#150!17?@!4?A#96@#246!81?C`SGa@?I@GaL?K?C`ACJCWAkcPxEibZrirzbzbrlzPZlIrx|}[~~jKTdLxqST|Jg{|{~v~~~Uk#218?G#70_#116@??_GSgEHaT?ATpAa@#121!11?A@?G?CJjT@A@F_PA`A@RaJDRdJ~\g{oo_wo_#72!18?@A?BS?_ISbIrKp[aCOI@_D?a?C!4?A??G#88!11?A?@!4?A?C!8?_O!4?G!5?CCC?G_GaG_IOaPB@?ESIGOA?OG??A#131??G???G?!5A?@?@#103!12?BA@BAGU?d#112!5?A_@G_?Id???A#143G?C#116!15?k?XC_?_?O#132??AAI??KHSGA_$#184!17?G!6?A!5?O#193!43?_?G???@A#196!29?A?O?G?A@QC@_?_C?@gO_A?dg?DqHUhGGO_W_d?O?A_?Q?cO?_AHCTiOG_QgOdiTSigUPlaS?gSS??CO_CCAc@A`?P?_{Ud[?@oc_q`gc_]TcSkSkSjUhUHQdIpIDqHQdI@GQhAK_H?G`CAG@?`U_ACW?G#244!52?_#74O#52Ao?@OgVxUKg??_#112!22?CA#115!21?@A??APKO?hCOJ_TI_PC#77!5?AShOgAKO?G#99!8?@?DGF?BAKmpTglWpY~cWO?`CCC#80!8?@#99??A@?CO?GC???B?@A#94???_?_?_O#107?@#94!9?G#99!11?A!5?S?CQ@?GOD!5?@#114!15?A@P?c?GC#126!10?SiO_@oIyCgBO$#246!18?a@gA`GOdAS`E_AxnAjq[UZoiKfTRQjMjQWVdriXxtZqxvdQ]tSJjttlY]VSyOJUdq[iBi|HkIqXlIfA?A@@wAGR}SgLiS{?EO`W__???@?OGACB??@A#184!108?O!4?OC_S?O?O_Q???O_?A@?@GC??O!8?G#55!38?wC?A!5?@#125?G!6?ToEH?YH@VaG?a!8?_#69!22?C#114@?A@LQQ_SB_TI_@#95!24?A#72!36?A??A!4?AA?A?@?@!6?A#101!40?O???OO_CGqP`ZgSgCw_O$#239!124?A?O??C!4?A?_#192!120?G@??@_?Q?A?P?C?C?C?C?C???C_?OC??@A??S`IOaCHa??S?A#142!16?A#101!135?@B?D?AA@!5?@??@?@?@#72!42?G??g?GODKiUcOgSG$#102!458?A#131G??O#118!4?C#112C#77!6?@?@?@$#98!460?KAA???@?@ACA?@!5A$#77!460?@?@?@$#100!461?GC??C-#193~?~?Ti?i!6?OI@A?@??O?_!4?C#202!27?IC?QCH_COAOCH_??O#184!18?@#193???i?VcGPC#184!5?O#193!4?@?@??A?AD?eGD?GRCHe?JCD`LUpHKYShBXElQ|pN~zu|JEJOy@T_iCT_iCTaIPdGY`twyN_yy~~mvz|MnflmNjlM~?~?~NnOnWfXlZcZcZcZcZcZcZsZM`sB[`ehcJG_O@C??GQG?GaC_!6?A?_#202!5?O#252!9?O#202!11?Q?`???_!5?_!4?@#240???Q?Oy?P#14@#52@?FKgkVAJ?R_g???_WO?oW_O_#127!5?@?G?@G??AGOCIC??OOgW#143!4?A?CPAh??I#118??K_ANwC_iO?o?O#102@AB}JulJukO#72??A?GFOJgQHCO?I?sA?cQH?e?AG?_#95!4?@?ETgYDaD?f?C?O?O#88?DRYM~o@??c?wGGG?{oL_Cqoz{zox|zWZxarrGHB???CG#95oAGe@_@CA@#98cySYv[zu}V|Z\vI{AAC_#103!5?AH@IKbDG?W?O#119@E???Wg#126?PA@UKp?BGS??o?g#128??GPUPSKApKYDJccZgESPa[A#132?j{S$#237?T?i?TiTzvm\zVitiSxUlYfG]vkR]`yVhQKPeGV_TiSATiPiSbShEhQL?OIC_OAHHCC_OCH_G_T?HaKPeGrKHShQhQcZ?YcH!4?A?OjWfKQcHU_TiSyCz?|_YdObWcAgAoHs?wAOa?CQ_@AOc?O#105!7?HAC#137O_D?i?T?i?T?i?T_IOd?I?D??D#239!44?_!9?C??_O?O??KA?AG!6?C???G#184!32?G!6?C@#252?A#193A!8?A#244eO#38M~w??OgsCGc??TO??__??_#132!9?A@?OB@GD?G@@JEFfABB}xCp?o#112!4?CO?hQ?C#119l#114?BOTCiC@g_S?_#101!4?_@ADUHCZeWfOVlsyj}dtIOwOGcoOO__#48?@#93!5?`?AEDqTg~O~r}l}jtygC`!4?G?G?Aq_!4?OO?C???C!5?CGCGSokylvytF\vXqLUjLSZ@iDG@??@#72_??_?SA@taZShghO_#114?G??G?QI?QKG_#121FVDAQ~mt]GrKn{t#125@PKMG@U~`K`I`?GA`???A??RGbKXaTVS?i$#239?i?Ti!8?_C#246?CHE_OdGq@?@K`ICGUcriHt_^i?j|gTEThKjQXUcq~dpZKisUQjXLjqU\sIi~UTriXTCqqjUCUlHcudZu?G??cibCAOplJqh^i?@CPCSA???GC?OOCPC?A?@?K?G#237!90?OAG_AGOAO_OJ??`Id?_@s@?PGRGV?jODGBSH_ACaP?Q?T?T_@a@WAc@gQCH???A?`GC@AC@AC@?{?sG_G!7?G#20_#116??ADA?@?v?OS?D_GC?oG?S_O`#141!5?@?A!6?A#140_#121!5?@!4?PChEXaLUzltUlrIOo#103?g?P?iCPI_KW@SHQSGO_G__#53!4?C#100??A@???I?DA@_O??G!7?ACA#85!4?GG!5?@A@CI?C`O?NyzrWuEd?V]BMaNJLJCBCJEACfcATGCaEODQG@AG#131_??G?_??a#101!10?Ac?G@@kGXCjSRSmS_s?_#115?AD_`g?O#112???A@C???_#132!5?AamQ@vAh#116!4?cIBdCQDgc@Q_CpG_#121!5?A#73@$#196!6?T?CGPaCG@?O!6?@#239???_#252!31?_@???_?_A???A@C??_!20?T_?PC#196!18?H?G??AGD??A?@cAg?O`IcRchEWehQlAMo?C??ohSiDSiITPiITPiGTcIQdSIADoYDD??PGCApOWQPoSQp?~?~?oOnOfWeQcZcZcZcZcZcZcJC`[B[`UHSJOFCIcI?QD???C??AC?g??G!52?O??_#64?A#63O#56??o!4?_#125!10?@!4?@??O@!4?@c?Ea?D`A?OgGGGCC#135!11?A#115!4?P??C?I?@PIEDIoC#77!6?@I`UXcP_G_#98!4?C@O?@g@GC?AH`WTOYT@jDQ?hgP#131???A#75!15?C#84C?@?@?C#117!22?@#99!11?CQGOoG?C@_?aCH?G#100??A?_#77?O!4?ACA@HU?s#107??O_#118DEDbeXwgwc#73@!4?`!5?G?_??S#140!7?_OG?_?OOG#126!10?@$#184!17?_??A!4?G!7?@??O?G??@#193!19?@!10?A#192@???G?C?aG@C??h??Q?G???T_?P???OdGA??C???Si?i?h?S_O?O?A_?_???O?O#184!103?_O@??dG_@c@O@G@?B?R?@?@?@#239!48?_N?\#96?C#55???@A#128@!5?N@?INV@FMFAINM[~n}~}{q{IswSGaCWo_O_???_#107!20?B??C!5?@??_#99!24?CA@AL?EDAnCi}Swg[O??_??O?G?G#94!13?CA@??@?@?@#102!63?A@RSg?O#143!12?G???AO#127!4?@!5?UaG??O!4?Q?G@C???AC@gg$#192!19?G???C??Q??O@_?G?C?A???S??A?g?AO?C_?H#242!42?AGG#184!22?A@?_???G?OG???A#246!104?CI???Q?OG_SaS_s?gOawuOau^|xLm}lniyi^]Kmf|X]Vdxu}~l|[]Rq[xy{xyYuBXHuVv~lN_D?G_#140!4?O!7?A??O?AG??D@??A#49!6?C!6?O??C??O?_O#117!103?O??_??O?_$#202!99?A??G#239!23?@#192!116?O!5?A!4?G??C?C??CG???A??@?O?D??_@O??A_?GA?@???A?c@AC@AC@?G?c??G#142!16?GO?G??i_#126!22?@!6?@!5?@CaISHaKo$#116!356?o#73!8?C???AG-#193~?~?Ti?i!4?OI@A??C!5?I@O??@#184!19?P???A#252???G@C!7?G!5?_?A#192!5?C_?H?_C?Q??H??AS_C?CO@???h?C???cHaGQcG@GC?ODAS_T_??HcP!11?G#239C???_#137!12?@???@??A?C@i?S#237!49?gC@G?_?GQD?APAKOC_COCPaXaOcPA?CGC`?QGAgA?G?V_@cHQ?TGc@iODGAS`O?C@??G?A_?_A???~TuHU?g!5?c#217AO#38F~?E@F^?ACCNCH?GC@g@?wQi?_?_!5?_???o#125?D??@I`MpKqHcCO_O#121@kAXcXnZLYmtBo_#114AOL_JOIgOiCP??_???AOG#101@AD?BTIVK~i^yVxjS|Q??HueXO#95!4?B?RiSxDiA@A@@C@A?DA?_???__GOG!7?__?_O??O?_O_??O?O??GOMSAD??D?O???@?@#101???A???G??P?gRgAtIeHUhUiCBG?@???C#118?@``FfE]TB@A?CE__?Oow_#132?@AD?qG#127FgG?G#140???s?AGQ?_?Si#127!5?G$#237?T?i?TiTm\zViti[jtIhV}hVSojExMydYcRcHU`YDgU`Y@YcRK_LQHShA_AO@?iP?cP?AOFg?CH?gCCqChSjOjChU_UHQLQc?C?CQD?DOhQlOLQcHuHuHYdYDJchYdiTiTcWeXePA?CGcO_@GQ_O?O!4?_#239!72?A?O??C?@!7?_A?G?I!6?C#202!4?_?O!5?P?A!19?C@?_G?A_?GAO?C#193??g#184??@#240?@?U?NG?D#2A#58G?_#52@!4?H?B?O?FA??B??FD@{R]A{WsG_OG??G#132!9?A@CR@?EN{?w_#112!4?QD?I#118cBFsLq^Sg_S!4?__#59?G_#77!5?@?BKATGR?S_?_#100?C?AGlvC?G?_go#93???CGC@A?@@SHKWBY`^Q\vZv{]U]umsckORxTxY[u[N]~M^]N]~~k]kM~Vn`BHAHfI\eHb@CBKCG?G@#100!4?O?a@!5?@#77EGEgSJWAP??A?AC#107?O#119!5?G{u[MIHK?__G?Oo#73???H?O#128?TaLUtHsA?@C@cIT@?SfWHqcGo$#239?i?Ti!6?_C?C@O!6?_?C#202!32?O??kP?i@GAOD_?C??_C?a#193!17?i@Qh?AgOA#184!4?O#193!10?O_GA??@G?APA???CXcXaRGVgU`DJiLiTmTYTjZeVnnmlkmmlmMyxtry?SBjj~~?y~~z]j~u~?}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}jDPacTQLu?GySg?_@?H?B_GC?C@??GO@#252!10?C#196!44?E???O#35@#14_#56?Hw}W_qoW_O_???_}O}w??O#128???H@BBFUB@FF?FYEf]d]pMpKq?O_O#143??A?CIAOc?_#119@?WKW#115Ha??_AT@IDOgGWO??Oo#108!8?_#72???@?DGEOj?dQ??H?aCO#131!12?A_ACG_C#85???GCGB_H???A?BBG?GA?A?B?@?@?@?@??A??@#98!6?_O!6?Wo?OXrnTm\~D~fMKUgEp!7?@#103oCOiQdgOGhICK?W?_#121??G`@_oB]VL@FFKqlQc#125DfwATa??A!6?@??A?@?DaLRvN$#196!6?T?PaCG@?O_C?O#193!39?G?C#240???CO#193!8?_?A#252!19?@O_??_O#184!17?A?@?_??A?G?c???A???CG_?O@#192!84?G!8?@???A_??G!6?OA???C!4?AG!4?C?@_?C@O?C?_@G?C?AO@??C@??G??_??A???A?C#239!5?O_BRg#104C#70O#142?A??_?DCbW_JuwsR?C?F?gC#129!5?_!4?o#127!15?G_CG_#103!20?D?AD?hCSDKoQb@kagOAS_G?__#98!11?Gq?PCGAHkFob_PgCySG??_#88!11?@?!5@?CCCA?C@@#98!7?_#88???@@B#100!17?o#113_#72???_?a?O?G_P?CPCItOo`O@???@#59??A#115?_OO_?Q_?O@_!6?O#126@!5?BKOgQG#116!4?O`IsJH~{rkYTigTiWaS$#246!17?A_Ug?AG@I?xEO@IdPKYqhMcyRhMcudXkaZqlsbU|VciyRCmPIetliWVzZU\PzXLzQJSeSZQhLhucqlX?G??gGEidUCQjalZQ?S@c@Qc_OQC?O!4?I@???GcXaP?AGC_C!84?A!5?_?gC_@?HOB_@cGCHEJGtlyrZ]nlttV|mrxg]]ZqknirZ]Sfyr|hMmzyy]vvt\^V\l|z~??Hqg~U~hhOc#193G?G#144??S!4?G#116!7?@!8?BK`SACGoGGC?oCO?`O#73!9?A@!4?@#107!20?_OA!4?C?CG#99!27?BDERwKWC?A???sgSOaoCW_g_!10?GOG_?_!6?_?_!7?_?O?_??_OGaW_aHUKeGC?aCO?O??a#134!7?G#53??G#102!6?_cCkWTL@ACG#112!9?_P???G?E?G$#192!17?G???@S?_!4?_CO?A_@C?O@?C?O@G?A??C???G!4?@#202!37?A?Q@???G#196!20?G!6?OAG_?A???D?A?GQ_TaTIPiDiScXgOOPQQPPQOpDCIGCTjgSS??~D??C`S?H?~@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@SOiCPiHq?dOD?ATAKOAo!6?G???A#244!58?O#203??_#130!16?G#132!15?@#140CAwGBg_WG_O#141!7?G#126A@?APCAPc??_?O#102!15?ABABBLGCBTUkwgO_#131!53?O?_!8?_???_!8?_???OGcOC?O??_O?AGA#108!31?A#114_?OA?W?h?A#69???O#143!5?A$#184!18?@!7?C!6?G#242!64?H#184!136?GA???GO??C?COAPaO_?_#49!116?G#117!97?A???A?C@?G-#193~?~?Ti?_DO?D??a!4?O!6?C#239?A#196??P#252!17?CO!6?_!4?C!11?C??CO?A_#192_???_C?AG@?C?OAS`CHQCOcGQ`G`IOaCGPaCHOcG@aCg?_AcI?QCa??aO???C_O?G??_??A#239!51?_#237G???_?_?_?_?_?_?_O?GOCP?IDgOaS`A@qHOGo?QcBG?KOA_QG@c?AH_OA@GcA@OC`GC??T?gA?gQk@APcGC???G?A_G???O??@OcWC@IOc@W??K?S?_#56[BArrWe?@EW[pNNV~N?B^|Mw~ksovSW_#116?DgAOF{Ho#132!4?@UHCPI?@Bh{{ocwOgY#112??@?Q?Oc?O???_#114AAGP`CCAQg`S?oG_O#101@!4?oCQ@KiXe`HUhA]kiB@gWOCj_@_??_O?_#93??@?BACC??@AFRGBCICJ?C??@C@A@D@E?A?AO?AD??CB?@?@#77!5?_#103_#99@??A??SI@S?EKAA@C?C?AA#103!5?ORecAWCQ?@A@_?A#121!7?OGo_!8?GFTaKh_#127AD#116@QICjTn^I^LzUxlup}`[_gs$#239?~?Ti?@A?_???@???G#202!32?AG?C??A?PM_POAGdOAHcOAl?O!4?C??C#184!8?_#202!11?@#193@??C!11?A??O??@ACGO?C?_GCJ?G?\@I@C_DYDOiD?W`UiFsJKZSYLYuhe\It\b]eXeXeYdYdYeWeXeWeXe!4~?~?~TyVdQtmTYLuLYTMTYLuLIdR?G?i?O?HC?AGS??aC@C!5?A#202?_?G@c?AHcOI@GcA@OC`GCaGT?gA?g#192?gA?@?OC!5?G?A_G???O???OC??@G!6?C#239@#105@#38@!7?GO_??A!8?A@C?QBE?AcUlWOSh#128?@?N!4~{hCP?sgO_#126C?BCG?e?CCgO#119@??A?ED[WKW_#115D?C?A@G@SKATK_OG_#108A#72!7?B@EX]ahUh?OCgA@_GO?CI?OG?_??_???_???_#95@??GCfKrDxCy@AgAa?`AA?@?DGC?DH?A@@G#72G?_O??O?G?OG_?G?tiTSaUWRsDCJCIFcP??CAG#102?_???cp@?_#69?A!7?A?OI?CA#107!4?CZ_D#126??I??U[o#128AKdSIC_!7?AOHE@M@]PI$#237???i?Ti\qL~Yj}T~gVuJd}R|jSza|P~GeGdItAsHeSIOjSbWA_?RGgEOCI_PG?`S?GdOAHcOAH_SH_@OCG?sAhChEWbYdGTaSjUhUlQeWehQpMpMPiTiTjShWeCDySgPdIdYcZCq_TaOAS_Y`Y_?gD?gDAG@OG?O_?_?_??O?_#239!54?cB?_?o???@??C?C?C??@#252!13?O#202!32?aG?A_G?C?OA?@O!8?O??W?@#204?K#74AB#58WcGC!9?O_?O?_!8?G#129!5?A#140!4?A#141!5?A#125?QIc@Q_S?A#143?B?A?D#118!6?@?B@IBFBF\wti]wyogBOG_#102@BAEESy]bK??G#98!5?S??C@A@CGO@cJOR_DKaTJsQDiSiO[@hHUGo?_Oo?o?o?y[EGWCKGWOO`wTGBWoI\i?OeM\m^mN^EIFUK~TnI@_I@h??@_A?A??@?A#114!7?Ac?AggAT_URhgU@g@#112???O!6?I???@???O#125?BLWqG`#140pOIO?D_QCHCA?G?O_$#196!6?S?GA?_#246S???B_G_Y?C?Cj?K?E?aXvYPIkJqXHtfSiGf|ZhcvRxnxTM_RKIhtQIlsQJlOuJjuZijxTZJ|UZQxdSCYriLh?GQ_?hGAPCGEOC`KPaCGOaCBPiW@ADIO@O@@?PHCG?L_g@??C?DQ?O?O_S_C_#192!68?_#246IC@?QCW?GOg?a?bKilX{vupj\\duYZLsQNd{uRX{mjYUrXviiVT|VVDP}{mJrz~\vvt\TVr~nln}mnJbz}sfZmfNcRqIO#70C#37_#144cX#136CG!5?__??_#144G??~[_?o#52@?@G@?@BHAADHEwAs#127!7?__I?DIGO#121@??RDHQ`zVm}l}lWw___o#103???A??@?@??A`IASL_W_C`[A`GcO#100!7?O_@OOsEE?_??O#88!18?@#100!10?_O_?oO___???_!4?_??g_O!5?_#134??C#77!15?OO?o?O??G??O?`CXOH#115A?CUGgWHCS@gUOs@??A#114!6?@C@#132!9?_#52!7?_O#38?_#55?_#127!6?A@E@$#184!14?G!4?C??_A!5?_!7?@???_!4?C#193???C#244!9?C???A#193!13?C??A#184!44?O!5?G???O!4?AO?I@?_??C!4?G!72?O?g?_?a??A@OGO!8?C#196!63?O@?G_a#83G#142!5?f@RcGFAKo???_!5?A???G?g??O_?_#49!16?C#73?A??G#107!26?CC!9?G#99!23?B?CG?YbTICJLYTiTK`yQUguKoG??G?A?D?@@S@I?S?Mg]?ApkaCO_SQC#131@?A??@??@@??B#103!14?_#100!4?cpB?C#108!6?@#59G?@#119S!7?GFG[MCdBH?}Oc_???CW_\b#129!12?_$#192!16?S?@??@G?O??P?G?C???c?O?C?A?G?@O#240!14?a#196!69?_!6?Da!6?A??I@OgDA?@OJcRcJdQdHEXAtIa[`XeXeXdYdYdXfXeXfXeX!4?~?~?iDGQlIPIdQHQdIpIdQHQdY?kRC@CADA?HS`?G?@?A!5?@#193!65?_A#240_#96???O#165!6?WcIP#52?@#77!81?@?@@??@YdQ_S_#95!17?C#101!52?o??_O?_oOG_O?_O???_G?`_GGgOHpgWGC{zhvMG?HO#107!6?C#118?g?U@_??a``?GS~@nZO_OAq_$#239!143?C??O!4?A#192!87?C???O?A??G???A!4?_#103!308?Mw-#193~?~?TgO?AG???A?O???_??A??@??_A!6?O???G!4?_?O!5?OC?@#240???@#244???G!7?@#240G#252!5?_#193_#192?OC?AG?C??A??@g@QcGO?S_ChAGQcHQc@O?O`AcG`IOaCgAGQcG_G?i?IOAS@??GCHO?C?O?O?PG?A_@?CAG?C!7?G!22?_!7?_#246??O_O?OCO!4?C_GOGC_CI?`_QoloeP}tRKwtsUNjX]ypX^ji]BlcQNTuyJltuYJLtuYXkmvtlnJby{mNjz|\TVt|lnjyymjiy{ZVes}jNldv[Tf`W#239_O#56A_RFdiT_?@BADKd^V_Q`OOO`AGS]PA@Q#116???OhQDyJ?GO@?gC#127@AP?Q_GSGG#126A_PI?DcOgS_Q_!4?_#119@B@???ozo#103?A?GBGEOKBGoAIc?G@_C?O#100???@??@@??C@@OWAA?_?@?OO??O??GCQWKc_O@KSOG?S{YZWTRh?@?HDO?@?ABH?A@@???A??A#53!12?O?G#99!4?A#102???GG???O?OceACDD@DJHWCOg??_#112!4?G?_???_!5?@?G???A#125??O^ic#38!4?A@?O?A?OC?GS_$#237?S?i?TjUkR~tk\zekVyLTylO~g]tI\o^?j?@AcQ@?aTAGACB_SGB?_?gA?CAGDOA`OCQGCQG?QC_JOAGDOdWEhQl?lQ?I@y@yDYcgSiShUhUgZclRc`W`AdItItJSjShUlQsGsJSiTIsJS@HSJSHU@U?oCPiPIcA_LAkQcGTiOAGs?CG?GOG?GOG?GO??_?_?_?O_?g?_?O_COcGAC@Ga?H_AG`OA?a@oHO`K?K_COLOk@ICpEGBG?OC_CGE_?S@_?QH?_G@cOAG@CoAG@cAP?GAOcWDAP_S??A_G?A?O?C@?OC@AcGPI@S_OOG`IOKc#240L_#38C???O??T?K?_#144?A???BDCCDA??A#38??AGsGBsJgQ?g#128?c^vn}~Vx}Ti|CW_#73@!4?A!4?_#112?@???CO@G?AG?_#114?@!4?H_EoCPGAc_?_#59C#101?@QCAHQLQlSmz[mynyhsmaDWsSGgs`?ApK?q_O??_OOGgO!5_??!4_??}WUoiCy[wWOoSgwAXShOElOjOZhPzAKDCZPalUhSIDgDHAPprba`b`@#114?G@?oCQ?sA?A@??B??A@A#119?@?BwNYdAGKO_@ADYcXg#132F_#128TQXq#55??O!5?@#149?G!5?_$#239?j?Ti??@!7?@???A#184!5?O#252!9?O???G_???_?O!4?_OCA@?O?_#184!26?_#202!6?_!7?A#193!11?GA?C?O!7?@???@A@AO?C_@G_ASa?Oa?h?gAJ`AC_SGPGQ_P?HQ_?EXdBX`UdUDEtEdEtEdI|UH]hUZJJZCTYlJEXIHadWie@WeQL`EIHsLSAC_?A?@?B???A#202??_!5?OC_@?A_?S@_[AHcOA@COAG@COAG@cAP?GAO!9?A_G?A?O?C@?OC@#193!9?A!6?@#203A#14A_#58H_G#142GD_I\Ok\ioG_?Cg?h_?A`?i`ktId{Js@#129C#140!4?_#125!5?A?gCAhCSa@DO!4?_#143!9?G#118!5?N^}NCN~s]pGA??_#102?DNH`Z}cwWo_#98!6?A???@?A?D?c@GATG?EhGQc?Z?Q`?AB?DKQBGDSHA@?DAGS@A?A?AD??@?CI@???@?C@???A!5?@?B??G!4?@#107!9?GK?GG???AG???A_OgSgkKxSc_?G!9?@AGO_o#73!4?g#116??@A?KrkEB@@DEd_??BJFE`$#196!5?ACgPc?IO_C#192?A?D?G??g?C?G??G?@!4?A!4?A???A!5?_??A#193!43?@A?@#242!12?C#252?O#196!10?@!6?@!14?@!6?@?CA?G?CQ?GC`?A?CA@Y@iPIPIPIPITAHu@UHccSCRiDQcXaDQTGB?PKB?D_UG`SB??H?JC`?Q?G?A@#252!8?_??A?@#240!7?O??_G#252!6?_#192_!11?OC?@?O?C??A_G?A?O?C@?OC@?_G@??O!4?_G#184O#218?O#2G#144HOK#136?AO???A???@Q?gO?Q?IgSGt#52!9?E?lQDO#132!12?BB?Eal^gtGQHA#115!21?@?CPgePWO?O#77???@ADAK_kOgOC_O#99!10?A@AACH?C@@@CAhCA@GFA?@GFQJA@CCAGCA??@??@??ACCA@?EC#134?A#103?_!4?C?CACOao_!7?O_?o?gC?K[O?SCQ?di_Ag?O?DICADO??g??O#121!4?COdYkSO_!5?@EB#140???GcLrK@?OgUgOAO?T?C?HU$#246!12?@??GPg?OaDOF?A`AT_F_}S~mLHluVLg|V\hKNjt[NJpSkjXSqilSAjXcrhluK`ZTcntUYnIbxSDQzQl|t]CUCg@QDh?JQ?S`D?Q?GQKbIKGPAS?cHOAS_?G@U@_?@?_@?_iSa_?a?w?lCIk?C_PGS_O?@?@???c!4?_?_?_?_?_?_?_#184!22?C??_?G!7?a?O???C!9?G?@#202!71?I!4?A#24??@#20O#74A?o#165??I?__O?O#58!4?G?GA?DGS?@#49!28?G?O#121??C?vGQLVi^l^znuv^{s}O_#107!9?_?@??A?CO#72!6?@A@AB??@?COCQGOGa@G`S??Y_CA_IC?d?GD_?O?_!5?_!5?_??cGCOg?aC?g?_S?GaGE@GQLC@?Q??@??GCKDO`ABCADAA@#115!4?C?G??W?OG?Qgc??`@?Q?OE@WC_?O#126!6?O__!8?C#129!9?OgCgO_GA^agOoOG$#252!12?A#202!23?_O???O!5?_O?A???G?OCaHCOAhSCaHCQ?@qC_IO?G@#184!54?C?O?C??G??@??C?A!6?A!5?@?_?_APG?OG_#239!42?O!8?A??OQ?H?A#196!81?A???A#83?C#37?C#129!6?A#141!47?o#95!77?G!9?A#77!15?_!6?_!5?oC_OGo?_Ogc?k?kOIO_a?A?Sg_WOGsSaE??@A?A?@#118O?O!10?B??A@YDvM~{B???@BAKOe\IdW_O#52!9?gCA??G?@_???G$#239!173?AO#192!43?O!8?O?G?C???G!4?A?AG@_!4?C#95!237?@#103!79?B$#114!568?C-#193~_~_TI?AT?@?_G@C?O!9?O!4?G!4?G#218?O#192??GA@#193!6?@#218!9?@#240??I@!7?H#192!8?C?@??C?@???G??AC?DG@I?ACHAC?@AS@CHQGAGQchAGQcHO??GOCI?@?@AcGO?@OCGPAcg??AGAdG?GA?@A?g?@_??I!8?GA?CG??I!5?@?C!4?G@?ACGDA?OCP?GCA!4?A?I??C?A!4?@#252?G#240!7?O??G!6?G?CGA?O#252!5?G#193G#192!22?G!20?O?I?A!4?A#239?Ca#37AP#136@?Oko!6?@!4?@JA?@DI#52!4?_!4?ho_SHQG#140!4?O!6?_#132!4?@HNGEhco`gDqDOOo_??wC?o?O?_#115!4?DGA?C@GHcbHCq_G?O#101?@?A?A@NANCNANEAN|jNH|mA^jMJTNZKkykveqnZLf\FIMTjlRFQLAdA@Q@??LI?HAKJ?dQG?GOQ?A?@!9?@?BIDAT?JPCK!4?@#118O_oO???A?A_!9?Oioo_[ug!8?@ADJ{h#81C#116??@???@O`_o_?OQ@#130???O?O$#237?D?I_TYtit}lZdMitelqzkvjSjcjcjSb_qw`Q?dCA?qkaX_uG?CGQc_I?T?i_CPC_i??@IQH?QHC?HQ?icidahciDQ`S@OlacjdiTITicjcLQDQdiUHUlQKRkRSLRkRShOHShYdjAPaDYSgPadWTiTISGa_UlYDXALaadISH?R?ISI`?gQODYshewsgPSIP__Q?LodO?grgaTitiDAKPCZSicQG_aSISjSHE?JO?JCPAG?T?I??C@AO?I?C??S?A?G?@S??CA??D?CAg?PC?AGDOAG?QGCA?G?G!4?@!8?caOGAOcQcICI@?Q?FI?o#58Ka@#142E??@msJaucmun|icwhsi?Ti^~CqnqC#116ACZ`UlADyC_hqO_w_?OO#141???G#121???GQHCOBGDifIF^{pFHvNjMnWwgO!7?O#102!4?O??@JDM}iKAogO?O_OO??o_??oo??_??_#99!6?@#103!9?O!5?G?G_O?K?K?{o?OQCOo?o??O@@??@?A?@o`?aOJEQAKS_gsgQsgPpdB?ys@]A?l?G_OG?O?o_y_hO???@#114?@#119?@UDIH!4?@ACGCBU#140???C?G~sjOCITiD$#239?Y?TI!8?A!5?C#184???C#252??O??O?G!4?G_??_W?@!6?@???A!6?O!5?S!24?G#193??O!13?G???_???__!4?_!4?Ac_A!4?g?CG?`ACGA_a?g?@aGT_??__o_SGO`AcaChc`_GTE`di_B??A@Rc_`gCJcgaGAdiAC?L!4?w_aga_`?H?@CH?@#202!6?O?G?O??OS?IOOS@IOCI?S?IS@AG@SPCI?TAO?T?OAG?PC?AG@OAG?QGCA?GQ??S?OHOCHAPCY@CAOGA?CA!4?O?O#240???@G#35C#74AKk#56GRK???_??I@@?ACO@EIOtiT_??H#165?G#129?O#128???_?tyDz^ELnTEXfGfruCOC_?O#73???A!5?_!5?_???_#118OA??HRqt{yq{_o!4?CO#77!6?@?@A?D?I?D?GC?AS?A?OK_S?oao_o!4?OC?_oW_g?ogSQcocALY@M_qBCADLqGAsNYdFG?``?@@AA@!5?@@?B?DQHAL?Ei?O__#115?GC?CAADRG``P_O?I?@?_OJ?A@?A#121?@YtegA?@AC?Oo??y_#128?Y@E#52?ICI@???__A$#196!5?_dG?I?QC#246OoPIHO@CPGOjSJCZCjSFDE]dRIh\fDOKeZHvziclZLtiitTIieXTOnisdkuxcqjuclvTZPY[UZPyk]jufQLXOYOas_TXOQohqkW@Gq_?DPc@GAOc@GaCJQ`E_OOCkGo@ADiSGB???PAPTG@???ECOHSGO@QSGSP?PSiPCGO???O@ACA??CISGSOAGITS?SOgO?O?W@AG??@?hsZShs`Ciqx|cnvsimtfjitdnjislbttjysja|pu`mi`~ixlvaynxtVmiz|tuiltvldrx|vdvvj~numzu|mzd}zXLft|jHlPtpd}nl|woC#38@#20_#144O?_#129!5?CG#38@O#130O#144!5?C#38!8?ZCODzCJCI#125!10?I?CODG?HpeoOV_?QGCO_G#112??@!8?S@?C?O#114???A@DGACAGCQHG?q!5?_#72!6?@???@!5?CA@!4?CG?CBOCOGH?OCA?A?D?A!4?@!5?@??@!4?@@#114!6?A!5?G???`!4?C??G#108!8?AGO#107G??A!4?O!4?KNnJSDYSNNcSKKM_#126!4?OFL\AK?G#107A#149!12?CG!6?S?G?G$#192!18?AG?A#202!10?OG@??COA!4?O?C??COA??O?T?I?T?Ga?CO@IO@?E?COHQ?G!50?C!5?O?O#184!9?C!7?O?A?@!4?C!4?A!7?A?D#239!6?G?O???@#184???O!11?C???CAO!8?O@#252!24?@#193@#184!62?G#0!7?@#83G#145??Q#165@?B}PJOTG??GO?O??O#127!27?@AGA?K?I?A?_!6?O#119!15?@FFekG!8?O#107?A???C?O#108!9?O#100!4?H!7?@!8?B?@??H!7?@#114!6?O!8?o_#59!12?GA!5?G#111!20?C#114??_??cOicSMCA#112!8?_?@?AO@G?_#73??Oo_?_!6?@\#38!8?OCGSILsgqtiti{$#240!51?O#184!81?@#196?C?A!14?C!5?O!9?G!4?CA??G!4?SH!4?@CAP??A?@???@?A??@A??@!7?CA!103?O#126!61?@C?BGCA?OGCG?BM?QG#103!13?@?BCRGc_@NCoi`?TO|KS_w_?_goo?O!6?O??O#102!17?o!5?G??_?_o?K?G??_?c!4?G_usMC{{ss{EEMLNswg{o_O???_!4?AKRDAG@HH!9?C@?CA#125!15?A{?wo!5?A~_}p#129!4?A@A@??GBLADADB$#202!216?O#98!237?@!7?A#108!20?O#134!4?A#115!17?G??G??O#69!28?@#119?O#132!25?O??_$#107!510?OO?_#103!57?@\ \ No newline at end of file diff --git a/perl/lib/Image/Sixel.pm b/perl/lib/Image/Sixel.pm new file mode 100644 index 00000000..5cae15af --- /dev/null +++ b/perl/lib/Image/Sixel.pm @@ -0,0 +1,28 @@ +package Image::Sixel; +use 5.012001; +our $VERSION = '0.0_1'; + +require XSLoader; +XSLoader::load('Image::Sixel', $VERSION); + +1; + +__END__ + +=head1 NAME + +Image::Sixel - perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 Class Methods + +=head2 Object Methods + +=head1 AUTHOR + +=head1 SEE ALSO + +=cut diff --git a/perl/lib/Image/Sixel.xs b/perl/lib/Image/Sixel.xs new file mode 100644 index 00000000..1e56940e --- /dev/null +++ b/perl/lib/Image/Sixel.xs @@ -0,0 +1,183 @@ +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include "ppport.h" +#include + +MODULE = Image::Sixel PACKAGE = Image::Sixel + +void +_sixel(...) +PPCODE: +{ + PerlIO_printf(PerlIO_stdout(), "Hello, world!\n"); + XSRETURN(0); +} + +MODULE = Image::Sixel PACKAGE = Image::Sixel::Encoder PREFIX = encoder_ + +SV * +encoder_new(void) + INIT: + sixel_encoder_t *encoder; + SV *sv; + CODE: + encoder = sixel_encoder_create(); + if (!encoder) { + XSRETURN_UNDEF; + } else { + const char *klass = SvPV_nolen(ST(0)); + sv = newSViv(PTR2IV(encoder)); + if (!sv) { + XSRETURN_UNDEF; + } + sv = newRV_noinc(sv); + sv_bless(sv, gv_stashpv(klass, 1)); + SvREADONLY_on(sv); + RETVAL = sv; + } + OUTPUT: + RETVAL + + +void +encoder_setopt(...) + INIT: + IV iv; + sixel_encoder_t *encoder; + char const *arg; + char const *optarg = NULL; + int retval; + PPCODE: + if (items != 2 && items != 3) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + encoder = INT2PTR(sixel_encoder_t *, iv); + arg = SvPV_nolen(ST(1)); + if (strlen(arg) != 1) { + croak("Bad argument: %s", arg); + } + if (items == 3) { + optarg = SvPV_nolen(ST(2)); + } + retval = sixel_encoder_setopt(encoder, *arg, optarg); + if (retval != 0) { + croak("setopt() failed"); + } + + +void +encoder_encode(...) + INIT: + IV iv; + sixel_encoder_t *encoder; + char const *infile; + int retval; + PPCODE: + if (items != 2) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + encoder = INT2PTR(sixel_encoder_t *, iv); + infile = SvPV_nolen(ST(1)); + retval = sixel_encoder_encode(encoder, infile); + if (retval != 0) { + croak("encode() failed"); + } + + +void +encoder_DESTROY(...) + INIT: + IV iv; + sixel_encoder_t *encoder; + PPCODE: + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + encoder = INT2PTR(sixel_encoder_t *, iv); + sixel_encoder_unref(encoder); + + + +MODULE = Image::Sixel PACKAGE = Image::Sixel::Decoder PREFIX = decoder_ + +SV * +decoder_new(void) + INIT: + sixel_decoder_t *decoder; + SV *sv; + CODE: + decoder = sixel_decoder_create(); + if (!decoder) { + XSRETURN_UNDEF; + } else { + const char *klass = SvPV_nolen(ST(0)); + sv = newSViv(PTR2IV(decoder)); + if (!sv) { + XSRETURN_UNDEF; + } + sv = newRV_noinc(sv); + sv_bless(sv, gv_stashpv(klass, 1)); + SvREADONLY_on(sv); + RETVAL = sv; + } + OUTPUT: + RETVAL + + +void +decoder_setopt(...) + INIT: + IV iv; + sixel_decoder_t *decoder; + char const *arg; + char const *optarg = NULL; + int retval; + PPCODE: + if (items != 2 && items != 3) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + decoder = INT2PTR(sixel_decoder_t *, iv); + arg = SvPV_nolen(ST(1)); + if (strlen(arg) != 1) { + croak("Bad argument: %s", arg); + } + if (items == 3) { + optarg = SvPV_nolen(ST(2)); + } + retval = sixel_decoder_setopt(decoder, *arg, optarg); + if (retval != 0) { + croak("setopt() failed"); + } + + +void +decoder_decode(...) + INIT: + IV iv; + sixel_decoder_t *decoder; + int retval; + PPCODE: + if (items != 1) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + decoder = INT2PTR(sixel_decoder_t *, iv); + retval = sixel_decoder_decode(decoder); + if (retval != 0) { + croak("decode() failed"); + } + + +void +decoder_DESTROY(...) + INIT: + IV iv; + sixel_decoder_t *decoder; + PPCODE: + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + decoder = INT2PTR(sixel_decoder_t *, iv); + sixel_decoder_unref(decoder); diff --git a/perl/lib/Image/Sixel/Decoder.pm b/perl/lib/Image/Sixel/Decoder.pm new file mode 100644 index 00000000..6c78a052 --- /dev/null +++ b/perl/lib/Image/Sixel/Decoder.pm @@ -0,0 +1,4 @@ +package Image::Sixel::Decoder; +use Image::Sixel; + +1; diff --git a/perl/lib/Image/Sixel/Encoder.pm b/perl/lib/Image/Sixel/Encoder.pm new file mode 100644 index 00000000..a21ba473 --- /dev/null +++ b/perl/lib/Image/Sixel/Encoder.pm @@ -0,0 +1,4 @@ +package Image::Sixel::Encoder; +use Image::Sixel; + +1; diff --git a/perl/lib/Image/ppport.h b/perl/lib/Image/ppport.h new file mode 100644 index 00000000..9eff35fe --- /dev/null +++ b/perl/lib/Image/ppport.h @@ -0,0 +1,7258 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.20 + + Automatically created by Devel::PPPort running under perl 5.018001. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.20 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --version show version + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.11.5. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --version + +Display the version of F. + +=head2 --patch=I + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. Note that this does not +automagially add a dot between the original filename and the +suffix. If you want the dot, you have to include it in the option +argument. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C or a C program to be installed. + +=head2 --diff=I + +Manually set the diff program and options to use. The default +is to use C, when installed, and output unified +context diffs. + +=head2 --compat-version=I + +Tell F to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. Warnings will still be displayed. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F. +This reduces the size of F dramatically and may be useful +if you want to include F in smaller modules without +increasing their distribution size too much. + +The stripped F will have a C<--unstrip> option that allows +you to undo the stripping, but only if an appropriate C +module is installed. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints or warnings for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I + +Show portability information for API elements matching I. +If I is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C prefix is deprecated. Also, +some API functions used to have a C prefix. Using this form is +also deprecated. You can safely use the supported API, as F +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F. + +These functions or variables will be marked C in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C or global +variants. + +For a C function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + load_module() NEED_load_module NEED_load_module_GLOBAL + my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL + my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL + my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL + my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL + newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL + newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL + pv_display() NEED_pv_display NEED_pv_display_GLOBAL + pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL + pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL + sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + vload_module() NEED_vload_module NEED_vload_module_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + warner() NEED_warner NEED_warner_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C +macro. Just C<#define> the macro before including C: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C. + +=back + +The good thing is that most of the above can be checked by running +F on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +If you want to create patched copies of your files instead, use: + + perl ppport.h --copy=.new + +To display portability information for the C function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F is causing failure during +the compilation of this module, please check if newer versions +of either this module or C are available on CPAN +before sending a bug report. + +If F was generated using the latest version of +C and is causing failure of this module, please +file a bug report using the CPAN Request Tracker at L. + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2010, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L. + +=cut + +use strict; + +# Disable broken TRIE-optimization +BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } + +my $VERSION = 3.20; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, + version => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +# Never use C comments in this file! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip version + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +if ($opt{version}) { + print "This is $0 $VERSION.\n"; + exit 0; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +AvFILLp|5.004050||p +AvFILL||| +BhkDISABLE||5.014000| +BhkENABLE||5.014000| +BhkENTRY_set||5.014000| +BhkENTRY||| +BhkFLAGS||| +CALL_BLOCK_HOOKS||| +CLASS|||n +CPERLscope|5.005000||p +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002||p +Copy||| +CvPADLIST||| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV_set|5.010001||p +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_METHOD|5.006001||p +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvSVn|5.009003||p +GvSV||| +Gv_AMupdate||5.011000| +HEf_SVKEY||5.004000| +HeHASH||5.004000| +HeKEY||5.004000| +HeKLEN||5.004000| +HePV||5.004000| +HeSVKEY_force||5.004000| +HeSVKEY_set||5.004000| +HeSVKEY||5.004000| +HeUTF8||5.010001| +HeVAL||5.004000| +HvENAME||5.013007| +HvNAMELEN_get|5.009003||p +HvNAME_get|5.009003||p +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LINKLIST||5.013006| +LVRET||| +MARK||| +MULTICALL||5.014000| +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002||p +Move||| +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +OP_CLASS||5.013007| +OP_DESC||5.007003| +OP_NAME||5.007003| +ORIGMARK||| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_DUP||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERLIO_FUNCS_CAST|5.009003||p +PERLIO_FUNCS_DECL|5.009003||p +PERL_ABS|5.008001||p +PERL_BCDVERSION|5.014000||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_HASH|5.004000||p +PERL_INT_MAX|5.004000||p +PERL_INT_MIN|5.004000||p +PERL_LONG_MAX|5.004000||p +PERL_LONG_MIN|5.004000||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.014000||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.014000||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.007002||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.007002||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_PV_ESCAPE_ALL|5.009004||p +PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p +PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p +PERL_PV_ESCAPE_NOCLEAR|5.009004||p +PERL_PV_ESCAPE_QUOTE|5.009004||p +PERL_PV_ESCAPE_RE|5.009005||p +PERL_PV_ESCAPE_UNI_DETECT|5.009004||p +PERL_PV_ESCAPE_UNI|5.009004||p +PERL_PV_PRETTY_DUMP|5.009004||p +PERL_PV_PRETTY_ELLIPSES|5.010000||p +PERL_PV_PRETTY_LTGT|5.009004||p +PERL_PV_PRETTY_NOCLEAR|5.010000||p +PERL_PV_PRETTY_QUOTE|5.009004||p +PERL_PV_PRETTY_REGPROP|5.009004||p +PERL_QUAD_MAX|5.004000||p +PERL_QUAD_MIN|5.004000||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.004000||p +PERL_SHORT_MIN|5.004000||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_SYS_INIT3||5.006000| +PERL_SYS_INIT||| +PERL_SYS_TERM||5.014000| +PERL_UCHAR_MAX|5.004000||p +PERL_UCHAR_MIN|5.004000||p +PERL_UINT_MAX|5.004000||p +PERL_UINT_MIN|5.004000||p +PERL_ULONG_MAX|5.004000||p +PERL_ULONG_MIN|5.004000||p +PERL_UNUSED_ARG|5.009003||p +PERL_UNUSED_CONTEXT|5.009004||p +PERL_UNUSED_DECL|5.007002||p +PERL_UNUSED_VAR|5.007002||p +PERL_UQUAD_MAX|5.004000||p +PERL_UQUAD_MIN|5.004000||p +PERL_USE_GCC_BRACE_GROUPS|5.009004||p +PERL_USHORT_MAX|5.004000||p +PERL_USHORT_MIN|5.004000||p +PERL_VERSION|5.006000||p +PL_DBsignal|5.005000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||pn +PL_Sv|5.005000||p +PL_bufend|5.014000||p +PL_bufptr|5.014000||p +PL_compiling|5.004050||p +PL_copline|5.014000||p +PL_curcop|5.004050||p +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_error_count|5.014000||p +PL_expect|5.014000||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_in_my_stash|5.014000||p +PL_in_my|5.014000||p +PL_keyword_plugin||5.011002| +PL_last_in_gv|||n +PL_laststatval|5.005000||p +PL_lex_state|5.014000||p +PL_lex_stuff|5.014000||p +PL_linestr|5.014000||p +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofsgv|||n +PL_opfreehook||5.011000|n +PL_parser|5.009005|5.009005|p +PL_peepp||5.007003|n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rpeepp||5.013005|n +PL_rsfp_filters|5.014000||p +PL_rsfp|5.014000||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_statcache|5.005000||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +PL_tokenbuf|5.014000||p +POP_MULTICALL||5.014000| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2nat|5.009003||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.014000| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_context_layers||5.009004| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Perl_signbit||5.009005|n +PoisonFree|5.009004||p +PoisonNew|5.009004||p +PoisonWith|5.009004||p +Poison|5.008000||p +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +STR_WITH_LEN|5.009003||p +ST||| +SV_CONST_RETURN|5.009003||p +SV_COW_DROP_PV|5.008001||p +SV_COW_SHARED_HASH_KEYS|5.009005||p +SV_GMAGIC|5.007002||p +SV_HAS_TRAILING_NUL|5.009004||p +SV_IMMEDIATE_UNREF|5.007001||p +SV_MUTABLE_RETURN|5.009003||p +SV_NOSTEAL|5.009002||p +SV_SMAGIC|5.009003||p +SV_UTF8_NO_ENCODING|5.008001||p +SVfARG|5.009005||p +SVf_UTF8|5.006000||p +SVf|5.006000||p +SVt_IV||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVHV||| +SVt_PVMG||| +SVt_PV||| +Safefree||| +Slab_Alloc||| +Slab_Free||| +Slab_to_rw||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGAMAGIC||5.006001| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_nomg||5.013002| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK_offset||5.011000| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_const|5.009003||p +SvPV_flags_const_nolen|5.009003||p +SvPV_flags_const|5.009003||p +SvPV_flags_mutable|5.009003||p +SvPV_flags|5.007002||p +SvPV_force_flags_mutable|5.009003||p +SvPV_force_flags_nolen|5.009003||p +SvPV_force_flags|5.007002||p +SvPV_force_mutable|5.009003||p +SvPV_force_nolen|5.009003||p +SvPV_force_nomg_nolen|5.009003||p +SvPV_force_nomg|5.007002||p +SvPV_force|||p +SvPV_mutable|5.009003||p +SvPV_nolen_const|5.009003||p +SvPV_nolen|5.006000||p +SvPV_nomg_const_nolen|5.009003||p +SvPV_nomg_const|5.009003||p +SvPV_nomg_nolen||5.013007| +SvPV_nomg|5.007002||p +SvPV_renew|5.009003||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec||| +SvREFCNT_inc_NN|5.009004||p +SvREFCNT_inc_simple_NN|5.009004||p +SvREFCNT_inc_simple_void_NN|5.009004||p +SvREFCNT_inc_simple_void|5.009004||p +SvREFCNT_inc_simple|5.009004||p +SvREFCNT_inc_void_NN|5.009004||p +SvREFCNT_inc_void|5.009004||p +SvREFCNT_inc|||p +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvRXOK||5.009005| +SvRX||5.009005| +SvSETMAGIC||| +SvSHARED_HASH|5.009003||p +SvSHARE||5.007003| +SvSTASH_set|5.009003||p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTRUE_nomg||5.013006| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK|5.007001|5.006000|p +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +SvVSTRING_mg|5.009004||p +THIS|||n +UNDERBAR|5.009002||p +UTF8_MAXBYTES|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +WARN_ALL|5.006000||p +WARN_AMBIGUOUS|5.006000||p +WARN_ASSERTIONS|5.014000||p +WARN_BAREWORD|5.006000||p +WARN_CLOSED|5.006000||p +WARN_CLOSURE|5.006000||p +WARN_DEBUGGING|5.006000||p +WARN_DEPRECATED|5.006000||p +WARN_DIGIT|5.006000||p +WARN_EXEC|5.006000||p +WARN_EXITING|5.006000||p +WARN_GLOB|5.006000||p +WARN_INPLACE|5.006000||p +WARN_INTERNAL|5.006000||p +WARN_IO|5.006000||p +WARN_LAYER|5.008000||p +WARN_MALLOC|5.006000||p +WARN_MISC|5.006000||p +WARN_NEWLINE|5.006000||p +WARN_NUMERIC|5.006000||p +WARN_ONCE|5.006000||p +WARN_OVERFLOW|5.006000||p +WARN_PACK|5.006000||p +WARN_PARENTHESIS|5.006000||p +WARN_PIPE|5.006000||p +WARN_PORTABLE|5.006000||p +WARN_PRECEDENCE|5.006000||p +WARN_PRINTF|5.006000||p +WARN_PROTOTYPE|5.006000||p +WARN_QW|5.006000||p +WARN_RECURSION|5.006000||p +WARN_REDEFINE|5.006000||p +WARN_REGEXP|5.006000||p +WARN_RESERVED|5.006000||p +WARN_SEMICOLON|5.006000||p +WARN_SEVERE|5.006000||p +WARN_SIGNAL|5.006000||p +WARN_SUBSTR|5.006000||p +WARN_SYNTAX|5.006000||p +WARN_TAINT|5.006000||p +WARN_THREADS|5.008000||p +WARN_UNINITIALIZED|5.006000||p +WARN_UNOPENED|5.006000||p +WARN_UNPACK|5.006000||p +WARN_UNTIE|5.006000||p +WARN_UTF8|5.006000||p +WARN_VOID|5.006000||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002||p +XCPT_TRY_END|5.009002||p +XCPT_TRY_START|5.009002||p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSPROTO|5.010000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_APIVERSION_BOOTCHECK||5.013004| +XS_VERSION_BOOTCHECK||| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +XopDISABLE||5.014000| +XopENABLE||5.014000| +XopENTRY_set||5.014000| +XopENTRY||5.014000| +XopFLAGS||5.013007| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_append_range_to_invlist||| +_new_invlist||| +_pMY_CXT|5.007003||p +_swash_inversion_hash||| +_swash_to_invlist||| +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHXR_|5.014000||p +aTHXR|5.014000||p +aTHX_|5.006000||p +aTHX|5.006000||p +add_alternate||| +add_cp_to_invlist||| +add_data|||n +add_range_to_invlist||| +add_utf16_textfilter||| +addmad||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_deref_call||5.013007| +amagic_i_ncmp||| +amagic_ncmp||| +anonymise_cv_maybe||| +any_dup||| +ao||| +append_madprops||| +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +assert_uft8_cache_coherent||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_create_and_push||5.009005| +av_create_and_unshift_one||5.009005| +av_delete||5.006000| +av_exists||5.006000| +av_extend||| +av_fetch||| +av_fill||| +av_iter_p||5.011000| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_undef||| +av_unshift||| +ax|||n +bad_type||| +bind_match||| +block_end||| +block_gimme||5.004000| +block_start||| +blockhook_register||5.013003| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_mro||| +bytes_cmp_utf8||5.013007| +bytes_from_utf8||5.007001| +bytes_to_uni|||n +bytes_to_utf8||5.006001| +call_argv|5.006000||p +call_atexit||5.006000| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +caller_cx||5.013005| +calloc||5.007002|n +cando||| +cast_i32||5.006000| +cast_iv||5.006000| +cast_ulong||5.006000| +cast_uv||5.006000| +check_type_and_open||| +check_uni||| +check_utf8_print||| +checkcomma||| +checkposixcc||| +ckWARN|5.006000||p +ck_entersub_args_list||5.013006| +ck_entersub_args_proto_or_list||5.013006| +ck_entersub_args_proto||5.013006| +ck_warner_d||5.011001|v +ck_warner||5.011001|v +ckwarn_common||| +ckwarn_d||5.009003| +ckwarn||5.009003| +cl_and|||n +cl_anything|||n +cl_init|||n +cl_is_anything|||n +cl_or|||n +clear_placeholders||| +clone_params_del|||n +clone_params_new|||n +closest_cop||| +convert||| +cop_free||| +cop_hints_2hv||5.013007| +cop_hints_fetch_pvn||5.013007| +cop_hints_fetch_pvs||5.013007| +cop_hints_fetch_pv||5.013007| +cop_hints_fetch_sv||5.013007| +cophh_2hv||5.013007| +cophh_copy||5.013007| +cophh_delete_pvn||5.013007| +cophh_delete_pvs||5.013007| +cophh_delete_pv||5.013007| +cophh_delete_sv||5.013007| +cophh_fetch_pvn||5.013007| +cophh_fetch_pvs||5.013007| +cophh_fetch_pv||5.013007| +cophh_fetch_sv||5.013007| +cophh_free||5.013007| +cophh_new_empty||5.014000| +cophh_store_pvn||5.013007| +cophh_store_pvs||5.013007| +cophh_store_pv||5.013007| +cophh_store_sv||5.013007| +cr_textfilter||| +create_eval_scope||| +croak_no_modify||5.013003| +croak_nocontext|||vn +croak_sv||5.013001| +croak_xs_usage||5.010001| +croak|||v +csighandler||5.009003|n +curmad||| +curse||| +custom_op_desc||5.007003| +custom_op_name||5.007003| +custom_op_register||5.013007| +custom_op_xop||5.013007| +cv_ckproto_len||| +cv_clone||| +cv_const_sv||5.004000| +cv_dump||| +cv_get_call_checker||5.013006| +cv_set_call_checker||5.013006| +cv_undef||| +cvgv_set||| +cvstash_set||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXR|5.014000||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dVAR|5.009003||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +debug_start_match||| +deb||5.007003|v +del_sv||| +delete_eval_scope||| +delimcpy||5.004000|n +deprecate_commaless_var_list||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_sv||5.013001| +die_unwind||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_close||| +do_delete_local||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_oddball||| +do_op_dump||5.006000| +do_op_xmldump||| +do_open9||5.006000| +do_openn||5.007001| +do_open||5.004000| +do_pmop_dump||5.006000| +do_pmop_xmldump||| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +dump_all_perl||| +dump_all||5.006000| +dump_eval||5.006000| +dump_exec_pos||| +dump_fds||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs_perl||| +dump_packsubs||5.006000| +dump_sub_perl||| +dump_sub||5.006000| +dump_sv_child||| +dump_trie_interim_list||| +dump_trie_interim_table||| +dump_trie||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_cop_io||| +eval_pv|5.006000||p +eval_sv|5.006000||p +exec_failed||| +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +feature_is_enabled||| +fetch_cop_label||5.011000| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +find_and_forget_pmops||| +find_array_subscript||| +find_beginning||| +find_byclass||| +find_hash_subscript||| +find_in_my_stash||| +find_runcv||5.008001| +find_rundefsvoffset||5.009002| +find_rundefsv||5.013002| +find_script||| +find_uninit_var||| +first_symbol|||n +foldEQ_latin1||5.013008|n +foldEQ_locale||5.013002|n +foldEQ_utf8_flags||5.013010| +foldEQ_utf8||5.013002| +foldEQ||5.013002|n +fold_constants||| +forbid_setid||| +force_ident||| +force_list||| +force_next||| +force_strict_version||| +force_version||| +force_word||| +forget_pmop||| +form_nocontext|||vn +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_aux_mg||| +get_av|5.006000||p +get_context||5.006000|n +get_cvn_flags|5.009005||p +get_cvs|5.011000||p +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_re_arg||| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +glob_2number||| +glob_assign_glob||| +glob_assign_ref||| +gp_dup||| +gp_free||| +gp_ref||| +grok_bin|5.007003||p +grok_bslash_c||| +grok_bslash_o||| +grok_hex|5.007003||p +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_add_by_type||5.011000| +gv_autoload4||5.004000| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.004000| +gv_efullname4||5.006001| +gv_efullname||| +gv_ename||| +gv_fetchfile_flags||5.009005| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod_flags||5.011000| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags|5.009002||p +gv_fetchpvs|5.009004||p +gv_fetchpv||| +gv_fetchsv|5.009002||p +gv_fullname3||5.004000| +gv_fullname4||5.006001| +gv_fullname||| +gv_get_super_pkg||| +gv_handler||5.007001| +gv_init_sv||| +gv_init||| +gv_magicalize_isa||| +gv_magicalize_overload||| +gv_name_set||5.009004| +gv_stashpvn|5.004000||p +gv_stashpvs|5.009003||p +gv_stashpv||| +gv_stashsv||| +gv_try_downgrade||| +he_dup||| +hek_dup||| +hfreeentries||| +hsplit||| +hv_assert||| +hv_auxinit|||n +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_common_key_len||5.010000| +hv_common||5.010000| +hv_copy_hints_hv||5.009004| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.004000| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_ename_add||| +hv_ename_delete||| +hv_exists_ent||5.004000| +hv_exists||| +hv_fetch_ent||5.004000| +hv_fetchs|5.009003||p +hv_fetch||| +hv_fill||5.013002| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.004000| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.004000| +hv_magic_check|||n +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||5.009003| +hv_placeholders_set||5.009003| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.004000| +hv_store_flags||5.008000| +hv_stores|5.009004||p +hv_store||| +hv_undef_flags||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incline||| +incpush_if_exists||| +incpush_use_sep||| +incpush||| +ingroup||| +init_argv_symbols||| +init_dbargs||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +instr|||n +intro_my||| +intuit_method||| +intuit_more||| +invert||| +invlist_array||| +invlist_destroy||| +invlist_extend||| +invlist_intersection||| +invlist_len||| +invlist_max||| +invlist_set_array||| +invlist_set_len||| +invlist_set_max||| +invlist_trim||| +invlist_union||| +invoke_exception_hook||| +io_close||| +isALNUMC|5.006000||p +isALPHA||| +isASCII|5.006000||p +isBLANK|5.006001||p +isCNTRL|5.006000||p +isDIGIT||| +isGRAPH|5.006000||p +isGV_with_GP|5.009004||p +isLOWER||| +isOCTAL||5.013005| +isPRINT|5.004000||p +isPSXSPC|5.006001||p +isPUNCT|5.006000||p +isSPACE||| +isUPPER||| +isWORDCHAR||5.013006| +isXDIGIT|5.006000||p +is_an_int||| +is_ascii_string||5.011000|n +is_gv_magical_sv||| +is_handle_constructor|||n +is_inplace_av||| +is_list_assignment||| +is_lvalue_sub||5.007001| +is_uni_alnum_lc||5.006000| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_X_LVT||| +is_utf8_X_LV_LVT_V||| +is_utf8_X_LV||| +is_utf8_X_L||| +is_utf8_X_T||| +is_utf8_X_V||| +is_utf8_X_begin||| +is_utf8_X_extend||| +is_utf8_X_non_hangul||| +is_utf8_X_prepend||| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_char_slow|||n +is_utf8_char||5.006000|n +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_perl_space||5.011001| +is_utf8_perl_word||5.011001| +is_utf8_posix_digit||5.011001| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003|n +is_utf8_string_loc||5.008001|n +is_utf8_string||5.006001|n +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +is_utf8_xidcont||5.013010| +is_utf8_xidfirst||5.013010| +isa_lookup||| +items|||n +ix|||n +jmaybe||| +join_exact||| +keyword_plugin_standard||| +keyword||| +leave_scope||| +lex_bufutf8||5.011002| +lex_discard_to||5.011002| +lex_grow_linestr||5.011002| +lex_next_chunk||5.011002| +lex_peek_unichar||5.011002| +lex_read_space||5.011002| +lex_read_to||5.011002| +lex_read_unichar||5.011002| +lex_start||5.009005| +lex_stuff_pvn||5.011002| +lex_stuff_pvs||5.013005| +lex_stuff_pv||5.013006| +lex_stuff_sv||5.011002| +lex_unstuff||5.011002| +listkids||| +list||| +load_module_nocontext|||vn +load_module|5.006000||pv +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHs|5.010001||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHs|5.010001||p +mXPUSHu|5.009002||p +mad_free||| +madlex||| +madparse||| +magic_clear_all_env||| +magic_clearenv||| +magic_clearhints||| +magic_clearhint||| +magic_clearisa||| +magic_clearpack||| +magic_clearsig||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_getarylen||| +magic_getdefelem||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_len||| +magic_methcall1||| +magic_methcall|||v +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setamagic||| +magic_setarylen||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdefelem||| +magic_setenv||| +magic_sethint||| +magic_setisa||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +make_matcher||| +make_trie_failtable||| +make_trie||| +malloc_good_size|||n +malloced_size|||n +malloc||5.007002|n +markstack_grow||| +matcher_matches_sv||| +measure_struct||| +memEQs|5.009005||p +memEQ|5.004000||p +memNEs|5.009005||p +memNE|5.004000||p +mem_collxfrm||| +mem_log_common|||n +mess_alloc||| +mess_nocontext|||vn +mess_sv||5.013001| +mess||5.006000|v +method_common||| +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_findext||5.013008| +mg_find||| +mg_free_type||5.013006| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical||| +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002| +missingterm||| +mode_from_discipline||| +modkids||| +mod||| +more_bodies||| +more_sv||| +moreswitches||| +mro_clean_isarev||| +mro_gather_and_rename||| +mro_get_from_name||5.010001| +mro_get_linear_isa_dfs||| +mro_get_linear_isa||5.009005| +mro_get_private_data||5.010001| +mro_isa_changed_in||| +mro_meta_dup||| +mro_meta_init||| +mro_method_changed_in||5.009005| +mro_package_moved||| +mro_register||5.010001| +mro_set_mro||5.010001| +mro_set_private_data||5.010001| +mul128||| +mulexp10|||n +munge_qwlist_to_paren_list||| +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_betoh16|||n +my_betoh32|||n +my_betoh64|||n +my_betohi|||n +my_betohl|||n +my_betohs|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_index||| +my_cxt_init||| +my_dirfd||5.009005| +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_htobe16|||n +my_htobe32|||n +my_htobe64|||n +my_htobei|||n +my_htobel|||n +my_htobes|||n +my_htole16|||n +my_htole32|||n +my_htole64|||n +my_htolei|||n +my_htolel|||n +my_htoles|||n +my_htonl||| +my_kid||| +my_letoh16|||n +my_letoh32|||n +my_letoh64|||n +my_letohi|||n +my_letohl|||n +my_letohs|||n +my_lstat_flags||| +my_lstat||5.014000| +my_memcmp||5.004000|n +my_memset|||n +my_ntohl||| +my_pclose||5.004000| +my_popen_list||5.007001| +my_popen||5.004000| +my_setenv||| +my_snprintf|5.009004||pvn +my_socketpair||5.007003|n +my_sprintf|5.009003||pvn +my_stat_flags||| +my_stat||5.014000| +my_strftime||5.007002| +my_strlcat|5.009004||pn +my_strlcpy|5.009004||pn +my_swabn|||n +my_swap||| +my_unexec||| +my_vsnprintf||5.009004|n +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB|5.004050||p +newCVREF||| +newDEFSVOP||| +newFORM||| +newFOROP||5.013007| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGP||| +newGVOP||| +newGVREF||| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMADPROP||| +newMADsv||| +newMYSUB||| +newNULLLIST||| +newOP||| +newPADOP||| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.004000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSUB||| +newSVOP||| +newSVREF||| +newSV_type|5.009005||p +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpv_share||5.013006| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_flags|5.010001||p +newSVpvn_share|5.007001||p +newSVpvn_utf8|5.010001||p +newSVpvn|5.004050||p +newSVpvs_flags|5.010001||p +newSVpvs_share|5.009003||p +newSVpvs|5.009003||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newTOKEN||| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.013007| +newXS_flags||5.009004| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +new_warnings_bitfield||| +next_symbol||| +nextargv||| +nextchar||| +ninstr|||n +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +not_a_number||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +oopsAV||| +oopsHV||| +op_append_elem||5.013006| +op_append_list||5.013006| +op_clear||| +op_const_sv||| +op_contextualize||5.013006| +op_dump||5.006000| +op_free||| +op_getmad_weak||| +op_getmad||| +op_linklist||5.013006| +op_lvalue||5.013007| +op_null||5.007002| +op_prepend_elem||5.013006| +op_refcnt_dec||| +op_refcnt_inc||| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +op_scope||5.013007| +op_xmldump||| +open_script||| +opt_scalarhv||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +packWARN|5.007003||p +pack_cat||5.007003| +pack_rec||| +package_version||| +package||| +packlist||5.008001| +pad_add_anon||| +pad_add_name_sv||| +pad_add_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||| +pad_findlex||| +pad_findmy||5.011002| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||| +pad_peg|||n +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||| +pad_swipe||| +pad_tidy||| +padlist_dup||| +parse_arithexpr||5.013008| +parse_barestmt||5.013007| +parse_block||5.013007| +parse_body||| +parse_fullexpr||5.013008| +parse_fullstmt||5.013005| +parse_label||5.013007| +parse_listexpr||5.013008| +parse_stmtseq||5.013006| +parse_termexpr||5.013008| +parse_unicode_opts||| +parser_dup||| +parser_free||| +path_is_absolute|||n +peep||| +pending_Slabs_to_ro||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pm_description||| +pmop_dump||5.006000| +pmop_xmldump||| +pmruntime||| +pmtrans||| +pop_scope||| +populate_isa|||v +pregcomp||5.009005| +pregexec||| +pregfree2||5.011000| +pregfree||| +prepend_madprops||| +prescan_version||5.011004| +printbuf||| +printf_nocontext|||vn +process_special_blocks||| +ptr_table_clear||5.009005| +ptr_table_fetch||5.009005| +ptr_table_find|||n +ptr_table_free||5.009005| +ptr_table_new||5.009005| +ptr_table_split||5.009005| +ptr_table_store||5.009005| +push_scope||| +put_byte||| +pv_display|5.006000||p +pv_escape|5.009004||p +pv_pretty|5.009004||p +pv_uni_display||5.007003| +qerror||| +qsortsvu||| +re_compile||5.009005| +re_croak2||| +re_dup_guts||| +re_intuit_start||5.009005| +re_intuit_string||5.006000| +readpipe_override||| +realloc||5.007002|n +reentrant_free||| +reentrant_init||| +reentrant_retry|||vn +reentrant_size||| +ref_array_or_hash||| +refcounted_he_chain_2hv||| +refcounted_he_fetch_pvn||| +refcounted_he_fetch_pvs||| +refcounted_he_fetch_pv||| +refcounted_he_fetch_sv||| +refcounted_he_free||| +refcounted_he_inc||| +refcounted_he_new_pvn||| +refcounted_he_new_pvs||| +refcounted_he_new_pv||| +refcounted_he_new_sv||| +refcounted_he_value||| +refkids||| +refto||| +ref||5.014000| +reg_check_named_buff_matched||| +reg_named_buff_all||5.009005| +reg_named_buff_exists||5.009005| +reg_named_buff_fetch||5.009005| +reg_named_buff_firstkey||5.009005| +reg_named_buff_iter||| +reg_named_buff_nextkey||5.009005| +reg_named_buff_scalar||5.009005| +reg_named_buff||| +reg_namedseq||| +reg_node||| +reg_numbered_buff_fetch||| +reg_numbered_buff_length||| +reg_numbered_buff_store||| +reg_qr_package||| +reg_recode||| +reg_scan_name||| +reg_skipcomment||| +reg_temp_copy||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.009004| +regclass||| +regcppop||| +regcppush||| +regcurly||| +regdump_extflags||| +regdump||5.005000| +regdupe_internal||| +regexec_flags||5.005000| +regfree_internal||5.009005| +reghop3|||n +reghop4|||n +reghopmaybe3|||n +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regpiece||| +regpposixcc||| +regprop||| +regrepeat||| +regtail_study||| +regtail||| +regtry||| +reguni||| +regwhite|||n +reg||| +repeatcpy|||n +report_evil_fh||| +report_uninit||| +report_wrongway_fh||| +require_pv||5.006000| +require_tie_mod||| +restore_magic||| +rninstr|||n +rpeep||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rv2cv_op_cv||5.013006| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_adelete||5.011000| +save_aelem_flags||5.011000| +save_aelem||5.004050| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hdelete||5.011000| +save_hek_flags|||n +save_helem_flags||5.011000| +save_helem||5.004050| +save_hints||5.010001| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||5.005000| +save_padsv_and_mortalize||5.010001| +save_pptr||| +save_pushi32ptr||5.010001| +save_pushptri32ptr||| +save_pushptrptr||5.010001| +save_pushptr||5.010001| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_svref||| +save_vptr||5.006000| +savepvn||| +savepvs||5.009003| +savepv||| +savesharedpvn||5.009005| +savesharedpvs||5.013006| +savesharedpv||5.007003| +savesharedsvpv||5.013006| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type|||n +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.009005| +scan_word||| +screaminstr||5.005000| +search_const||| +seed||5.008001| +sequence_num||| +sequence_tail||| +sequence||| +set_context||5.006000|n +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +set_regclass_bit_fold||| +set_regclass_bit||| +setdefout||| +share_hek_flags||| +share_hek||5.004000| +si_dup||| +sighandler|||n +simplify_sort||| +skipspace0||| +skipspace1||| +skipspace2||| +skipspace||| +softref2xv||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +space_join_names_mortal||| +ss_dup||| +stack_grow||| +start_force||| +start_glob||| +start_subparse||5.004000| +stashpv_hvname_match||5.014000| +stdize_locale||| +store_cop_label||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool_flags||5.013006| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_common||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2num||| +sv_2nv_flags||5.013001| +sv_2pv_flags|5.007002||p +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen|5.006000||p +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff||| +sv_bless||| +sv_cat_decode||5.008001| +sv_catpv_flags||5.013006| +sv_catpv_mg|5.004050||p +sv_catpv_nomg||5.013006| +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpvs_flags||5.013006| +sv_catpvs_mg||5.013006| +sv_catpvs_nomg||5.013006| +sv_catpvs|5.009003||p +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_catxmlpvn||| +sv_catxmlpv||| +sv_catxmlsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_flags||5.013006| +sv_cmp_locale_flags||5.013006| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm_flags||5.013006| +sv_collxfrm||| +sv_compile_2op_is_broken||| +sv_compile_2op||5.008001| +sv_copypv||5.007003| +sv_dec_nomg||5.013002| +sv_dec||| +sv_del_backref||| +sv_derived_from||5.004000| +sv_destroyable||5.010000| +sv_does||5.009004| +sv_dump||| +sv_dup_common||| +sv_dup_inc_multiple||| +sv_dup_inc||| +sv_dup||| +sv_eq_flags||5.013006| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_gets||5.004000| +sv_grow||| +sv_i_ncmp||| +sv_inc_nomg||5.013002| +sv_inc||| +sv_insert_flags||5.010001| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8||5.006000| +sv_len||| +sv_magic_portable|5.014000|5.004000|p +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||| +sv_nv||5.005000| +sv_peek||5.005000| +sv_pos_b2u_midway||| +sv_pos_b2u||5.006000| +sv_pos_u2b_cached||| +sv_pos_u2b_flags||5.011005| +sv_pos_u2b_forwards|||n +sv_pos_u2b_midway|||n +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags|5.007002||p +sv_pvn_force||| +sv_pvn_nomg|5.007003|5.005000|p +sv_pvn||5.005000| +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_release_COW||| +sv_replace||| +sv_report_used||| +sv_reset||| +sv_rvweaken||5.006000| +sv_setiv_mg|5.004050||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.004050||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.004050||p +sv_setpvn||| +sv_setpvs_mg||5.013006| +sv_setpvs|5.009004||p +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pvs||5.013006| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.004050||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.004050||p +sv_setuv|5.004000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagicext||5.013008| +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_flags||5.009004| +sv_usepvn_mg|5.004050||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags_grow||5.011000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade_nomg||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.005000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +sv_xmlpeek||| +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_get||| +swash_init||5.006000| +sys_init3||5.010000|n +sys_init||5.010000|n +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +sys_term||5.010000|n +taint_env||| +taint_proper||| +tied_method|||v +tmps_grow||5.006000| +toLOWER||| +toUPPER||| +to_byte_substr||| +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.007003| +to_utf8_lower||5.007003| +to_utf8_substr||| +to_utf8_title||5.007003| +to_utf8_upper||5.007003| +token_free||| +token_getmad||| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments||| +too_many_arguments||| +try_amagic_bin||| +try_amagic_un||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unreferenced_to_tmp_stack||| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.004000| +unwind_handler_stack||| +update_debugger_info||| +upg_version||5.009005| +usage||| +utf16_textfilter||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000| +utf8_length||5.007001| +utf8_mg_len_cache_update||| +utf8_mg_pos_cache_update||| +utf8_to_bytes||5.006001| +utf8_to_uvchr||5.007001| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module|5.006000||p +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warn_sv||5.013001| +warner_nocontext|||vn +warner|5.006000|5.004000|pv +warn|||v +watch||| +whichsig||| +with_queued_errors||| +write_no_mem||| +write_to_stderr||| +xmldump_all_perl||| +xmldump_all||| +xmldump_attr||| +xmldump_eval||| +xmldump_form||| +xmldump_indent|||v +xmldump_packsubs_perl||| +xmldump_packsubs||| +xmldump_sub_perl||| +xmldump_sub||| +xmldump_vindent||| +xs_apiversion_bootcheck||| +xs_version_bootcheck||| +yyerror||| +yylex||| +yyparse||| +yyunlex||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %warnings, %depends); +my $replace = 0; +my($hint, $define, $function); + +sub find_api +{ + my $code = shift; + $code =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; + grep { exists $API{$_} } $code =~ /(\w+)/mg; +} + +while () { + if ($hint) { + my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; + if (m{^\s*\*\s(.*?)\s*$}) { + for (@{$hint->[1]}) { + $h->{$_} ||= ''; # suppress warning with older perls + $h->{$_} .= "$1\n"; + } + } + else { undef $hint } + } + + $hint = [$1, [split /,?\s+/, $2]] + if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; + + if ($define) { + if ($define->[1] =~ /\\$/) { + $define->[1] .= $_; + } + else { + if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { + my @n = find_api($define->[1]); + push @{$depends{$define->[0]}}, @n if @n + } + undef $define; + } + } + + $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; + + if ($function) { + if (/^}/) { + if (exists $API{$function->[0]}) { + my @n = find_api($function->[1]); + push @{$depends{$function->[0]}}, @n if @n + } + undef $function; + } + else { + $function->[1] .= $_; + } + } + + $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + my @deps = map { s/\s+//g; $_ } split /,/, $3; + my $d; + for $d (map { s/\s+//g; $_ } split /,/, $1) { + push @{$depends{$d}}, @deps; + } + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +for (values %depends) { + my %s; + $_ = [sort grep !$s{$_}++, @$_]; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "\n$hints{$f}" if exists $hints{$f}; + print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; + $info++; + } + print "No portability information available.\n" unless $info; + $count++; + } + $count or print "Found no API matching '$opt{'api-info'}'."; + print "\n"; + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + push @flags, 'warning' if exists $warnings{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); +my $srcext = join '|', map { quotemeta $_ } @srcext; + +if (@ARGV) { + my %seen; + for (@ARGV) { + if (-e) { + if (-f) { + push @files, $_ unless $seen{$_}++; + } + else { warn "'$_' is not a file.\n" } + } + else { + my @new = grep { -f } glob $_ + or warn "'$_' does not exist.\n"; + push @files, grep { !$seen{$_}++ } @new; + } + } +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +die "No input files given!\n" unless @files; + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; }; + close IN; + + my %file = (orig => $c, changes => 0); + + # Temporarily remove C/XS comments and strings from the code + my @ccom; + + $c =~ s{ + ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* + | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) + | ( ^$HS*\#[^\r\n]* + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' + | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) + }{ defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + $file{uses_provided}{$func}++; + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + $file{needs}{$_} = 'static' if exists $need{$_}; + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { warning("Possibly wrong #define $1 in $filename") } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + my $warnings = 0; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + unless ($API{$func}{nothxarg}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses_provided}}) { + if ($file{uses}{$func}) { + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + else { + diag("Uses $func"); + } + } + $warnings += hint($func); + } + + unless ($opt{quiet}) { + for $func (sort keys %{$file{uses_todo}}) { + print "*** WARNING: Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo}), ", even with '$ppport'\n"; + $warnings++; + } + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + my $s = $warnings != 1 ? 's' : ''; + my $warn = $warnings ? " ($warnings warning$s)" : ''; + info("Analysis completed$warn"); + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub try_use { eval "use @_;"; return $@ eq '' } + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and try_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <
$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while () { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub rec_depend +{ + my($func, $seen) = @_; + return () unless exists $depends{$func}; + $seen = {%{$seen||{}}}; + return () if $seen->{$func}++; + my %s; + grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +my %given_warnings; +sub hint +{ + $opt{quiet} and return; + my $func = shift; + my $rv = 0; + if (exists $warnings{$func} && !$given_warnings{$func}++) { + my $warn = $warnings{$func}; + $warn =~ s!^!*** !mg; + print "*** WARNING: $func\n", $warn; + $rv++; + } + if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; + } + $rv; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print < }; + my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; + $copy =~ s/^(?=\S+)/ /gms; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + if (eval \$Devel::PPPort::VERSION < $VERSION) { + die "$0 was originally generated with Devel::PPPort $VERSION.\\n" + . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" + . "Please install a newer version, or --unstrip will not work.\\n"; + } + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <$0" or die "cannot strip $0: $!\n"; + print OUT "$pl$c\n"; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) +#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ +#ifndef dTHR +# define dTHR dNOOP +#endif +#ifndef dTHX +# define dTHX dNOOP +#endif + +#ifndef dTHXa +# define dTHXa(x) dNOOP +#endif +#ifndef pTHX +# define pTHX void +#endif + +#ifndef pTHX_ +# define pTHX_ +#endif + +#ifndef aTHX +# define aTHX +#endif + +#ifndef aTHX_ +# define aTHX_ +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# ifdef USE_THREADS +# define aTHXR thr +# define aTHXR_ thr, +# else +# define aTHXR +# define aTHXR_ +# endif +# define dTHXR dTHR +#else +# define aTHXR aTHX +# define aTHXR_ aTHX_ +# define dTHXR dTHX +#endif +#ifndef dTHXoa +# define dTHXoa(x) dTHXa(x) +#endif + +#ifdef I_LIMITS +# include +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +# ifdef SHORT_MAX +# define PERL_SHORT_MAX ((short)SHORT_MAX) +# else +# ifdef MAXSHORT /* Often used in */ +# define PERL_SHORT_MAX ((short)MAXSHORT) +# else +# ifdef SHRT_MAX +# define PERL_SHORT_MAX ((short)SHRT_MAX) +# else +# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MIN +# ifdef SHORT_MIN +# define PERL_SHORT_MIN ((short)SHORT_MIN) +# else +# ifdef MINSHORT +# define PERL_SHORT_MIN ((short)MINSHORT) +# else +# ifdef SHRT_MIN +# define PERL_SHORT_MIN ((short)SHRT_MIN) +# else +# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +#ifndef PERL_UINT_MAX +# ifdef UINT_MAX +# define PERL_UINT_MAX ((unsigned int)UINT_MAX) +# else +# ifdef MAXUINT +# define PERL_UINT_MAX ((unsigned int)MAXUINT) +# else +# define PERL_UINT_MAX (~(unsigned int)0) +# endif +# endif +#endif + +#ifndef PERL_UINT_MIN +# define PERL_UINT_MIN ((unsigned int)0) +#endif + +#ifndef PERL_INT_MAX +# ifdef INT_MAX +# define PERL_INT_MAX ((int)INT_MAX) +# else +# ifdef MAXINT /* Often used in */ +# define PERL_INT_MAX ((int)MAXINT) +# else +# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_INT_MIN +# ifdef INT_MIN +# define PERL_INT_MIN ((int)INT_MIN) +# else +# ifdef MININT +# define PERL_INT_MIN ((int)MININT) +# else +# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MAX +# ifdef ULONG_MAX +# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) +# else +# ifdef MAXULONG +# define PERL_ULONG_MAX ((unsigned long)MAXULONG) +# else +# define PERL_ULONG_MAX (~(unsigned long)0) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MIN +# define PERL_ULONG_MIN ((unsigned long)0L) +#endif + +#ifndef PERL_LONG_MAX +# ifdef LONG_MAX +# define PERL_LONG_MAX ((long)LONG_MAX) +# else +# ifdef MAXLONG +# define PERL_LONG_MAX ((long)MAXLONG) +# else +# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_LONG_MIN +# ifdef LONG_MIN +# define PERL_LONG_MIN ((long)LONG_MIN) +# else +# ifdef MINLONG +# define PERL_LONG_MIN ((long)MINLONG) +# else +# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) +# ifndef PERL_UQUAD_MAX +# ifdef ULONGLONG_MAX +# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) +# else +# ifdef MAXULONGLONG +# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) +# else +# define PERL_UQUAD_MAX (~(unsigned long long)0) +# endif +# endif +# endif + +# ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN ((unsigned long long)0L) +# endif + +# ifndef PERL_QUAD_MAX +# ifdef LONGLONG_MAX +# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) +# else +# ifdef MAXLONGLONG +# define PERL_QUAD_MAX ((long long)MAXLONGLONG) +# else +# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) +# endif +# endif +# endif + +# ifndef PERL_QUAD_MIN +# ifdef LONGLONG_MIN +# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) +# else +# ifdef MINLONGLONG +# define PERL_QUAD_MIN ((long long)MINLONGLONG) +# else +# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +/* This is based on code from 5.003 perl.h */ +#ifdef HAS_QUAD +# ifdef cray +#ifndef IVTYPE +# define IVTYPE int +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_INT_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_INT_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UINT_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UINT_MAX +#endif + +# ifdef INTSIZE +#ifndef IVSIZE +# define IVSIZE INTSIZE +#endif + +# endif +# else +# if defined(convex) || defined(uts) +#ifndef IVTYPE +# define IVTYPE long long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_QUAD_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_QUAD_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UQUAD_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UQUAD_MAX +#endif + +# ifdef LONGLONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGLONGSIZE +#endif + +# endif +# else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +# ifdef LONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGSIZE +#endif + +# endif +# endif +# endif +#ifndef IVSIZE +# define IVSIZE 8 +#endif + +#ifndef PERL_QUAD_MIN +# define PERL_QUAD_MIN IV_MIN +#endif + +#ifndef PERL_QUAD_MAX +# define PERL_QUAD_MAX IV_MAX +#endif + +#ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN UV_MIN +#endif + +#ifndef PERL_UQUAD_MAX +# define PERL_UQUAD_MAX UV_MAX +#endif + +#else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif +#ifndef UVTYPE +# define UVTYPE unsigned IVTYPE +#endif + +#ifndef UVSIZE +# define UVSIZE IVSIZE +#endif +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif + +#if !defined(SvUOK) && defined(SvIOK_UV) +# define SvUOK(sv) SvIOK_UV(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef memEQs +# define memEQs(s1, l, s2) \ + (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) +#endif + +#ifndef memNEs +# define memNEs(s1, l, s2) !memEQs(s1, l, s2) +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif + +#ifndef PERL_UNUSED_DECL +# ifdef HASATTRIBUTE +# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) +# define PERL_UNUSED_DECL +# else +# define PERL_UNUSED_DECL __attribute__((unused)) +# endif +# else +# define PERL_UNUSED_DECL +# endif +#endif + +#ifndef PERL_UNUSED_ARG +# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ +# include +# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) +# else +# define PERL_UNUSED_ARG(x) ((void)x) +# endif +#endif + +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(x) ((void)x) +#endif + +#ifndef PERL_UNUSED_CONTEXT +# ifdef USE_ITHREADS +# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) +# else +# define PERL_UNUSED_CONTEXT +# endif +#endif +#ifndef NOOP +# define NOOP /*EMPTY*/(void)0 +#endif + +#ifndef dNOOP +# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif +#endif + +#ifndef PTR2ul +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif +#ifndef PTR2nat +# define PTR2nat(p) (PTRV)(p) +#endif + +#ifndef NUM2PTR +# define NUM2PTR(any,d) (any)PTR2nat(d) +#endif + +#ifndef PTR2IV +# define PTR2IV(p) INT2PTR(IV,p) +#endif + +#ifndef PTR2UV +# define PTR2UV(p) INT2PTR(UV,p) +#endif + +#ifndef PTR2NV +# define PTR2NV(p) NUM2PTR(NV,p) +#endif + +#undef START_EXTERN_C +#undef END_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C extern +#endif + +#if defined(PERL_GCC_PEDANTIC) +# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN +# define PERL_GCC_BRACE_GROUPS_FORBIDDEN +# endif +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) +# ifndef PERL_USE_GCC_BRACE_GROUPS +# define PERL_USE_GCC_BRACE_GROUPS +# endif +#endif + +#undef STMT_START +#undef STMT_END +#ifdef PERL_USE_GCC_BRACE_GROUPS +# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ +# define STMT_END ) +#else +# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) +# define STMT_START if (1) +# define STMT_END else (void)0 +# else +# define STMT_START do +# define STMT_END while (0) +# endif +#endif +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +/* DEFSV appears first in 5.004_56 */ +#ifndef DEFSV +# define DEFSV GvSV(PL_defgv) +#endif + +#ifndef SAVE_DEFSV +# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) +#endif + +#ifndef DEFSV_set +# define DEFSV_set(sv) (DEFSV = (sv)) +#endif + +/* Older perls (<=5.003) lack AvFILLp */ +#ifndef AvFILLp +# define AvFILLp AvFILL +#endif +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +/* Hint: gv_stashpvn + * This function's backport doesn't support the length parameter, but + * rather ignores it. Portability can only be ensured if the length + * parameter is used for speed reasons, but the length can always be + * correctly computed from the string argument. + */ +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,create) gv_stashpv(str,create) +#endif + +/* Replace: 1 */ +#ifndef get_cv +# define get_cv perl_get_cv +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef get_av +# define get_av perl_get_av +#endif + +#ifndef get_hv +# define get_hv perl_get_hv +#endif + +/* Replace: 0 */ +#ifndef dUNDERBAR +# define dUNDERBAR dNOOP +#endif + +#ifndef UNDERBAR +# define UNDERBAR DEFSV +#endif +#ifndef dAX +# define dAX I32 ax = MARK - PL_stack_base + 1 +#endif + +#ifndef dITEMS +# define dITEMS I32 items = SP - MARK +#endif +#ifndef dXSTARG +# define dXSTARG SV * targ = sv_newmortal() +#endif +#ifndef dAXMARK +# define dAXMARK I32 ax = POPMARK; \ + register SV ** const mark = PL_stack_base + ax++ +#endif +#ifndef XSprePUSH +# define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#if (PERL_BCDVERSION < 0x5005000) +# undef XSRETURN +# define XSRETURN(off) \ + STMT_START { \ + PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ + return; \ + } STMT_END +#endif +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +#ifndef SVfARG +# define SVfARG(p) ((void*)(p)) +#endif +#ifndef PERL_ABS +# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) +#endif +#ifndef dVAR +# define dVAR dNOOP +#endif +#ifndef SVf +# define SVf "_" +#endif +#ifndef UTF8_MAXBYTES +# define UTF8_MAXBYTES UTF8_MAXLEN +#endif +#ifndef CPERLscope +# define CPERLscope(x) x +#endif +#ifndef PERL_HASH +# define PERL_HASH(hash,str,len) \ + STMT_START { \ + const char *s_PeRlHaSh = str; \ + I32 i_PeRlHaSh = len; \ + U32 hash_PeRlHaSh = 0; \ + while (i_PeRlHaSh--) \ + hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ + (hash) = hash_PeRlHaSh; \ + } STMT_END +#endif + +#ifndef PERLIO_FUNCS_DECL +# ifdef PERLIO_FUNCS_CONST +# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) +# else +# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (funcs) +# endif +#endif + +/* provide these typedefs for older perls */ +#if (PERL_BCDVERSION < 0x5009003) + +# ifdef ARGSproto +typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); +# else +typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); +# endif + +typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); + +#endif +#ifndef isPSXSPC +# define isPSXSPC(c) (isSPACE(c) || (c) == '\v') +#endif + +#ifndef isBLANK +# define isBLANK(c) ((c) == ' ' || (c) == '\t') +#endif + +#ifdef EBCDIC +#ifndef isALNUMC +# define isALNUMC(c) isalnum(c) +#endif + +#ifndef isASCII +# define isASCII(c) isascii(c) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) iscntrl(c) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) isgraph(c) +#endif + +#ifndef isPRINT +# define isPRINT(c) isprint(c) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) ispunct(c) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) isxdigit(c) +#endif + +#else +# if (PERL_BCDVERSION < 0x5010000) +/* Hint: isPRINT + * The implementation in older perl versions includes all of the + * isSPACE() characters, which is wrong. The version provided by + * Devel::PPPort always overrides a present buggy version. + */ +# undef isPRINT +# endif +#ifndef isALNUMC +# define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) +#endif + +#ifndef isASCII +# define isASCII(c) ((U8) (c) <= 127) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) ((U8) (c) < ' ' || (c) == 127) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) +#endif + +#ifndef isPRINT +# define isPRINT(c) (((c) >= 32 && (c) < 127)) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#endif + +#endif + +#ifndef PERL_SIGNALS_UNSAFE_FLAG + +#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 + +#if (PERL_BCDVERSION < 0x5008000) +# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG +#else +# define D_PPP_PERL_SIGNALS_INIT 0 +#endif + +#if defined(NEED_PL_signals) +static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#elif defined(NEED_PL_signals_GLOBAL) +U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#else +extern U32 DPPP_(my_PL_signals); +#endif +#define PL_signals DPPP_(my_PL_signals) + +#endif + +/* Hint: PL_ppaddr + * Calling an op via PL_ppaddr requires passing a context argument + * for threaded builds. Since the context argument is different for + * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will + * automatically be defined as the correct argument. + */ + +#if (PERL_BCDVERSION <= 0x5005005) +/* Replace: 1 */ +# define PL_ppaddr ppaddr +# define PL_no_modify no_modify +/* Replace: 0 */ +#endif + +#if (PERL_BCDVERSION <= 0x5004005) +/* Replace: 1 */ +# define PL_DBsignal DBsignal +# define PL_DBsingle DBsingle +# define PL_DBsub DBsub +# define PL_DBtrace DBtrace +# define PL_Sv Sv +# define PL_bufend bufend +# define PL_bufptr bufptr +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_debstash debstash +# define PL_defgv defgv +# define PL_diehook diehook +# define PL_dirty dirty +# define PL_dowarn dowarn +# define PL_errgv errgv +# define PL_error_count error_count +# define PL_expect expect +# define PL_hexdigit hexdigit +# define PL_hints hints +# define PL_in_my in_my +# define PL_laststatval laststatval +# define PL_lex_state lex_state +# define PL_lex_stuff lex_stuff +# define PL_linestr linestr +# define PL_na na +# define PL_perl_destruct_level perl_destruct_level +# define PL_perldb perldb +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stack_base stack_base +# define PL_stack_sp stack_sp +# define PL_statcache statcache +# define PL_stdingv stdingv +# define PL_sv_arenaroot sv_arenaroot +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +# define PL_tainted tainted +# define PL_tainting tainting +# define PL_tokenbuf tokenbuf +/* Replace: 0 */ +#endif + +/* Warning: PL_parser + * For perl versions earlier than 5.9.5, this is an always + * non-NULL dummy. Also, it cannot be dereferenced. Don't + * use it if you can avoid is and unless you absolutely know + * what you're doing. + * If you always check that PL_parser is non-NULL, you can + * define DPPP_PL_parser_NO_DUMMY to avoid the creation of + * a dummy parser structure. + */ + +#if (PERL_BCDVERSION >= 0x5009005) +# ifdef DPPP_PL_parser_NO_DUMMY +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (croak("panic: PL_parser == NULL in %s:%d", \ + __FILE__, __LINE__), (yy_parser *) NULL))->var) +# else +# ifdef DPPP_PL_parser_NO_DUMMY_WARNING +# define D_PPP_parser_dummy_warning(var) +# else +# define D_PPP_parser_dummy_warning(var) \ + warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), +# endif +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) +#if defined(NEED_PL_parser) +static yy_parser DPPP_(dummy_PL_parser); +#elif defined(NEED_PL_parser_GLOBAL) +yy_parser DPPP_(dummy_PL_parser); +#else +extern yy_parser DPPP_(dummy_PL_parser); +#endif + +# endif + +/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ +/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf + * Do not use this variable unless you know exactly what you're + * doint. It is internal to the perl parser and may change or even + * be removed in the future. As of perl 5.9.5, you have to check + * for (PL_parser != NULL) for this variable to have any effect. + * An always non-NULL PL_parser dummy is provided for earlier + * perl versions. + * If PL_parser is NULL when you try to access this variable, a + * dummy is being accessed instead and a warning is issued unless + * you define DPPP_PL_parser_NO_DUMMY_WARNING. + * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access + * this variable will croak with a panic message. + */ + +# define PL_expect D_PPP_my_PL_parser_var(expect) +# define PL_copline D_PPP_my_PL_parser_var(copline) +# define PL_rsfp D_PPP_my_PL_parser_var(rsfp) +# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) +# define PL_linestr D_PPP_my_PL_parser_var(linestr) +# define PL_bufptr D_PPP_my_PL_parser_var(bufptr) +# define PL_bufend D_PPP_my_PL_parser_var(bufend) +# define PL_lex_state D_PPP_my_PL_parser_var(lex_state) +# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) +# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) +# define PL_in_my D_PPP_my_PL_parser_var(in_my) +# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) +# define PL_error_count D_PPP_my_PL_parser_var(error_count) + + +#else + +/* ensure that PL_parser != NULL and cannot be dereferenced */ +# define PL_parser ((void *) 1) + +#endif +#ifndef mPUSHs +# define mPUSHs(s) PUSHs(sv_2mortal(s)) +#endif + +#ifndef PUSHmortal +# define PUSHmortal PUSHs(sv_newmortal()) +#endif + +#ifndef mPUSHp +# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) +#endif + +#ifndef mPUSHn +# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) +#endif + +#ifndef mPUSHi +# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) +#endif + +#ifndef mPUSHu +# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) +#endif +#ifndef mXPUSHs +# define mXPUSHs(s) XPUSHs(sv_2mortal(s)) +#endif + +#ifndef XPUSHmortal +# define XPUSHmortal XPUSHs(sv_newmortal()) +#endif + +#ifndef mXPUSHp +# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END +#endif + +#ifndef mXPUSHn +# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END +#endif + +#ifndef mXPUSHi +# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END +#endif + +#ifndef mXPUSHu +# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END +#endif + +/* Replace: 1 */ +#ifndef call_sv +# define call_sv perl_call_sv +#endif + +#ifndef call_pv +# define call_pv perl_call_pv +#endif + +#ifndef call_argv +# define call_argv perl_call_argv +#endif + +#ifndef call_method +# define call_method perl_call_method +#endif +#ifndef eval_sv +# define eval_sv perl_eval_sv +#endif + +/* Replace: 0 */ +#ifndef PERL_LOADMOD_DENY +# define PERL_LOADMOD_DENY 0x1 +#endif + +#ifndef PERL_LOADMOD_NOIMPORT +# define PERL_LOADMOD_NOIMPORT 0x2 +#endif + +#ifndef PERL_LOADMOD_IMPORT_OPS +# define PERL_LOADMOD_IMPORT_OPS 0x4 +#endif + +#ifndef G_METHOD +# define G_METHOD 64 +# ifdef call_sv +# undef call_sv +# endif +# if (PERL_BCDVERSION < 0x5006000) +# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) +# else +# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) +# endif +#endif + +/* Replace perl_eval_pv with eval_pv */ + +#ifndef eval_pv +#if defined(NEED_eval_pv) +static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +static +#else +extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +#endif + +#ifdef eval_pv +# undef eval_pv +#endif +#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) +#define Perl_eval_pv DPPP_(my_eval_pv) + +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + +SV* +DPPP_(my_eval_pv)(char *p, I32 croak_on_error) +{ + dSP; + SV* sv = newSVpv(p, 0); + + PUSHMARK(sp); + eval_sv(sv, G_SCALAR); + SvREFCNT_dec(sv); + + SPAGAIN; + sv = POPs; + PUTBACK; + + if (croak_on_error && SvTRUE(GvSV(errgv))) + croak(SvPVx(GvSV(errgv), na)); + + return sv; +} + +#endif +#endif + +#ifndef vload_module +#if defined(NEED_vload_module) +static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +static +#else +extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +#endif + +#ifdef vload_module +# undef vload_module +#endif +#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) +#define Perl_vload_module DPPP_(my_vload_module) + +#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) + +void +DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) +{ + dTHR; + dVAR; + OP *veop, *imop; + + OP * const modname = newSVOP(OP_CONST, 0, name); + /* 5.005 has a somewhat hacky force_normal that doesn't croak on + SvREADONLY() if PL_compling is true. Current perls take care in + ck_require() to correctly turn off SvREADONLY before calling + force_normal_flags(). This seems a better fix than fudging PL_compling + */ + SvREADONLY_off(((SVOP*)modname)->op_sv); + modname->op_private |= OPpCONST_BARE; + if (ver) { + veop = newSVOP(OP_CONST, 0, ver); + } + else + veop = NULL; + if (flags & PERL_LOADMOD_NOIMPORT) { + imop = sawparens(newNULLLIST()); + } + else if (flags & PERL_LOADMOD_IMPORT_OPS) { + imop = va_arg(*args, OP*); + } + else { + SV *sv; + imop = NULL; + sv = va_arg(*args, SV*); + while (sv) { + imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); + sv = va_arg(*args, SV*); + } + } + { + const line_t ocopline = PL_copline; + COP * const ocurcop = PL_curcop; + const int oexpect = PL_expect; + +#if (PERL_BCDVERSION >= 0x5004000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), + veop, modname, imop); +#else + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + modname, imop); +#endif + PL_expect = oexpect; + PL_copline = ocopline; + PL_curcop = ocurcop; + } +} + +#endif +#endif + +#ifndef load_module +#if defined(NEED_load_module) +static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +static +#else +extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +#endif + +#ifdef load_module +# undef load_module +#endif +#define load_module DPPP_(my_load_module) +#define Perl_load_module DPPP_(my_load_module) + +#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) + +void +DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) +{ + va_list args; + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); +} + +#endif +#endif +#ifndef newRV_inc +# define newRV_inc(sv) newRV(sv) /* Replace */ +#endif + +#ifndef newRV_noinc +#if defined(NEED_newRV_noinc) +static SV * DPPP_(my_newRV_noinc)(SV *sv); +static +#else +extern SV * DPPP_(my_newRV_noinc)(SV *sv); +#endif + +#ifdef newRV_noinc +# undef newRV_noinc +#endif +#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) +#define Perl_newRV_noinc DPPP_(my_newRV_noinc) + +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) +SV * +DPPP_(my_newRV_noinc)(SV *sv) +{ + SV *rv = (SV *)newRV(sv); + SvREFCNT_dec(sv); + return rv; +} +#endif +#endif + +/* Hint: newCONSTSUB + * Returns a CV* as of perl-5.7.1. This return value is not supported + * by Devel::PPPort. + */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) +#if defined(NEED_newCONSTSUB) +static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +static +#else +extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +#endif + +#ifdef newCONSTSUB +# undef newCONSTSUB +#endif +#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) +#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + +/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ +/* (There's no PL_parser in perl < 5.005, so this is completely safe) */ +#define D_PPP_PL_copline PL_copline + +void +DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) +{ + U32 oldhints = PL_hints; + HV *old_cop_stash = PL_curcop->cop_stash; + HV *old_curstash = PL_curstash; + line_t oldline = PL_curcop->cop_line; + PL_curcop->cop_line = D_PPP_PL_copline; + + PL_hints &= ~HINT_BLOCK_SCOPE; + if (stash) + PL_curstash = PL_curcop->cop_stash = stash; + + newSUB( + +#if (PERL_BCDVERSION < 0x5003022) + start_subparse(), +#elif (PERL_BCDVERSION == 0x5003022) + start_subparse(0), +#else /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +#endif + + newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), + newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ + newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) + ); + + PL_hints = oldhints; + PL_curcop->cop_stash = old_cop_stash; + PL_curstash = old_curstash; + PL_curcop->cop_line = oldline; +} +#endif +#endif + +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ + defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) + +#ifndef START_MY_CXT + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +#if (PERL_BCDVERSION < 0x5004068) +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) +#else /* >= perl5.004_68 */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) +#endif /* < perl5.004_68 */ + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +/* Clones the per-interpreter data. */ +#define MY_CXT_CLONE \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) +#endif + +#else /* single interpreter */ + +#ifndef START_MY_CXT + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +#define MY_CXT_CLONE NOOP +#endif + +#endif + +#ifndef IVdf +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# define UVuf "lu" +# define UVof "lo" +# define UVxf "lx" +# define UVXf "lX" +# else +# if IVSIZE == INTSIZE +# define IVdf "d" +# define UVuf "u" +# define UVof "o" +# define UVxf "x" +# define UVXf "X" +# endif +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) + /* Not very likely, but let's try anyway. */ +# define NVef PERL_PRIeldbl +# define NVff PERL_PRIfldbl +# define NVgf PERL_PRIgldbl +# else +# define NVef "e" +# define NVff "f" +# define NVgf "g" +# endif +#endif + +#ifndef SvREFCNT_inc +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (SvREFCNT(_sv))++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc(sv) \ + ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_simple +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_simple(sv) \ + ({ \ + if (sv) \ + (SvREFCNT(sv))++; \ + (SV *)(sv); \ + }) +# else +# define SvREFCNT_inc_simple(sv) \ + ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_NN +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_NN(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + SvREFCNT(_sv)++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc_NN(sv) \ + (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) +# endif +#endif + +#ifndef SvREFCNT_inc_void +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_void(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (void)(SvREFCNT(_sv)++); \ + }) +# else +# define SvREFCNT_inc_void(sv) \ + (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) +# endif +#endif +#ifndef SvREFCNT_inc_simple_void +# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#endif + +#ifndef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) +#endif + +#ifndef SvREFCNT_inc_void_NN +# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef newSV_type + +#if defined(NEED_newSV_type) +static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +static +#else +extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +#endif + +#ifdef newSV_type +# undef newSV_type +#endif +#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) +#define Perl_newSV_type DPPP_(my_newSV_type) + +#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) + +SV* +DPPP_(my_newSV_type)(pTHX_ svtype const t) +{ + SV* const sv = newSV(0); + sv_upgrade(sv, t); + return sv; +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# define D_PPP_CONSTPV_ARG(x) ((char *) (x)) +#else +# define D_PPP_CONSTPV_ARG(x) (x) +#endif +#ifndef newSVpvn +# define newSVpvn(data,len) ((data) \ + ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ + : newSV(0)) +#endif +#ifndef newSVpvn_utf8 +# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) +#endif +#ifndef SVf_UTF8 +# define SVf_UTF8 0 +#endif + +#ifndef newSVpvn_flags + +#if defined(NEED_newSVpvn_flags) +static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +static +#else +extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +#endif + +#ifdef newSVpvn_flags +# undef newSVpvn_flags +#endif +#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) +#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) + +#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) + +SV * +DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) +{ + SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); + SvFLAGS(sv) |= (flags & SVf_UTF8); + return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; +} + +#endif + +#endif + +/* Backwards compatibility stuff... :-( */ +#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) +# define NEED_sv_2pv_flags +#endif +#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) +# define NEED_sv_2pv_flags_GLOBAL +#endif + +/* Hint: sv_2pv_nolen + * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). + */ +#ifndef sv_2pv_nolen +# define sv_2pv_nolen(sv) SvPV_nolen(sv) +#endif + +#ifdef SvPVbyte + +/* Hint: SvPVbyte + * Does not work in perl-5.6.1, ppport.h implements a version + * borrowed from perl-5.7.3. + */ + +#if (PERL_BCDVERSION < 0x5007000) + +#if defined(NEED_sv_2pvbyte) +static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +static +#else +extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +#endif + +#ifdef sv_2pvbyte +# undef sv_2pvbyte +#endif +#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) +#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) + +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + +char * +DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) +{ + sv_utf8_downgrade(sv,0); + return SvPV(sv,*lp); +} + +#endif + +/* Hint: sv_2pvbyte + * Use the SvPVbyte() macro instead of sv_2pvbyte(). + */ + +#undef SvPVbyte + +#define SvPVbyte(sv, lp) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + +#endif + +#else + +# define SvPVbyte SvPV +# define sv_2pvbyte sv_2pv + +#endif +#ifndef sv_2pvbyte_nolen +# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) +#endif + +/* Hint: sv_pvn + * Always use the SvPV() macro instead of sv_pvn(). + */ + +/* Hint: sv_pvn_force + * Always use the SvPV_force() macro instead of sv_pvn_force(). + */ + +/* If these are undefined, they're not handled by the core anyway */ +#ifndef SV_IMMEDIATE_UNREF +# define SV_IMMEDIATE_UNREF 0 +#endif + +#ifndef SV_GMAGIC +# define SV_GMAGIC 0 +#endif + +#ifndef SV_COW_DROP_PV +# define SV_COW_DROP_PV 0 +#endif + +#ifndef SV_UTF8_NO_ENCODING +# define SV_UTF8_NO_ENCODING 0 +#endif + +#ifndef SV_NOSTEAL +# define SV_NOSTEAL 0 +#endif + +#ifndef SV_CONST_RETURN +# define SV_CONST_RETURN 0 +#endif + +#ifndef SV_MUTABLE_RETURN +# define SV_MUTABLE_RETURN 0 +#endif + +#ifndef SV_SMAGIC +# define SV_SMAGIC 0 +#endif + +#ifndef SV_HAS_TRAILING_NUL +# define SV_HAS_TRAILING_NUL 0 +#endif + +#ifndef SV_COW_SHARED_HASH_KEYS +# define SV_COW_SHARED_HASH_KEYS 0 +#endif + +#if (PERL_BCDVERSION < 0x5007002) + +#if defined(NEED_sv_2pv_flags) +static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_2pv_flags +# undef sv_2pv_flags +#endif +#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) +#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) + +#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) + +char * +DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_2pv(sv, lp ? lp : &n_a); +} + +#endif + +#if defined(NEED_sv_pvn_force_flags) +static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_pvn_force_flags +# undef sv_pvn_force_flags +#endif +#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) +#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) + +#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) + +char * +DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_pvn_force(sv, lp ? lp : &n_a); +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) +# define DPPP_SVPV_NOLEN_LP_ARG &PL_na +#else +# define DPPP_SVPV_NOLEN_LP_ARG 0 +#endif +#ifndef SvPV_const +# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_mutable +# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) +#endif +#ifndef SvPV_flags +# define SvPV_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_flags_const +# define SvPV_flags_const(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ + (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_const_nolen +# define SvPV_flags_const_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : \ + (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_mutable +# define SvPV_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ + sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_force +# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nolen +# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) +#endif + +#ifndef SvPV_force_mutable +# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nomg +# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) +#endif + +#ifndef SvPV_force_nomg_nolen +# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) +#endif +#ifndef SvPV_force_flags +# define SvPV_force_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_force_flags_nolen +# define SvPV_force_flags_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) +#endif +#ifndef SvPV_force_flags_mutable +# define SvPV_force_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ + : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_nolen +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) +#endif +#ifndef SvPV_nolen_const +# define SvPV_nolen_const(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) +#endif +#ifndef SvPV_nomg +# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const +# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const_nolen +# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) +#endif +#ifndef SvPV_renew +# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ + SvPV_set((sv), (char *) saferealloc( \ + (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ + } STMT_END +#endif +#ifndef SvMAGIC_set +# define SvMAGIC_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5009003) +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) (0 + SvPVX(sv)) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END +#endif + +#else +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + ((sv)->sv_u.svu_rv = (val)); } STMT_END +#endif + +#endif +#ifndef SvSTASH_set +# define SvSTASH_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5004000) +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END +#endif + +#else +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END +#endif + +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) +#if defined(NEED_vnewSVpvf) +static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +static +#else +extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +#endif + +#ifdef vnewSVpvf +# undef vnewSVpvf +#endif +#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) +#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) + +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + +SV * +DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) +{ + register SV *sv = newSV(0); + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); + return sv; +} + +#endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) +# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) +# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) +#if defined(NEED_sv_catpvf_mg) +static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) + +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) +#if defined(NEED_sv_catpvf_mg_nocontext) +static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) +#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) + +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ +#ifndef sv_catpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# else +# define sv_catpvf_mg Perl_sv_catpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) +# define sv_vcatpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) +#if defined(NEED_sv_setpvf_mg) +static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) + +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) +#if defined(NEED_sv_setpvf_mg_nocontext) +static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) +#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) + +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ +#ifndef sv_setpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# else +# define sv_setpvf_mg Perl_sv_setpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) +# define sv_vsetpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +/* Hint: newSVpvn_share + * The SVs created by this function only mimic the behaviour of + * shared PVs without really being shared. Only use if you know + * what you're doing. + */ + +#ifndef newSVpvn_share + +#if defined(NEED_newSVpvn_share) +static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +static +#else +extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +#endif + +#ifdef newSVpvn_share +# undef newSVpvn_share +#endif +#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) +#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) + +#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) + +SV * +DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) +{ + SV *sv; + if (len < 0) + len = -len; + if (!hash) + PERL_HASH(hash, (char*) src, len); + sv = newSVpvn((char *) src, len); + sv_upgrade(sv, SVt_PVIV); + SvIVX(sv) = hash; + SvREADONLY_on(sv); + SvPOK_on(sv); + return sv; +} + +#endif + +#endif +#ifndef SvSHARED_HASH +# define SvSHARED_HASH(sv) (0 + SvUVX(sv)) +#endif +#ifndef HvNAME_get +# define HvNAME_get(hv) HvNAME(hv) +#endif +#ifndef HvNAMELEN_get +# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) +#endif +#ifndef GvSVn +# define GvSVn(gv) GvSV(gv) +#endif + +#ifndef isGV_with_GP +# define isGV_with_GP(gv) isGV(gv) +#endif + +#ifndef gv_fetchpvn_flags +# define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt) +#endif + +#ifndef gv_fetchsv +# define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) +#endif +#ifndef get_cvn_flags +# define get_cvn_flags(name, namelen, flags) get_cv(name, flags) +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#define Perl_warner DPPP_(my_warner) + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +/* concatenating with "" ensures that only literal strings are accepted as argument + * note that STR_WITH_LEN() can't be used as argument to macros or functions that + * under some configurations might be macros + */ +#ifndef STR_WITH_LEN +# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) +#endif +#ifndef newSVpvs +# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) +#endif + +#ifndef newSVpvs_flags +# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) +#endif + +#ifndef newSVpvs_share +# define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) +#endif + +#ifndef sv_catpvs +# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef sv_setpvs +# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef hv_fetchs +# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) +#endif + +#ifndef hv_stores +# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) +#endif +#ifndef gv_fetchpvs +# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) +#endif + +#ifndef gv_stashpvs +# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) +#endif +#ifndef get_cvs +# define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) +#endif +#ifndef SvGETMAGIC +# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END +#endif +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +/* That's the best we can do... */ +#ifndef sv_catpvn_nomg +# define sv_catpvn_nomg sv_catpvn +#endif + +#ifndef sv_catsv_nomg +# define sv_catsv_nomg sv_catsv +#endif + +#ifndef sv_setsv_nomg +# define sv_setsv_nomg sv_setsv +#endif + +#ifndef sv_pvn_nomg +# define sv_pvn_nomg sv_pvn +#endif + +#ifndef SvIV_nomg +# define SvIV_nomg SvIV +#endif + +#ifndef SvUV_nomg +# define SvUV_nomg SvUV +#endif + +#ifndef sv_catpv_mg +# define sv_catpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catpvn_mg +# define sv_catpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catsv_mg +# define sv_catsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_catsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setiv_mg +# define sv_setiv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setiv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setnv_mg +# define sv_setnv_mg(sv, num) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setnv(TeMpSv,num); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpv_mg +# define sv_setpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpvn_mg +# define sv_setpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setsv_mg +# define sv_setsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_setsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setuv_mg +# define sv_setuv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setuv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_usepvn_mg +# define sv_usepvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_usepvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif +#ifndef SvVSTRING_mg +# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) +#endif + +/* Hint: sv_magic_portable + * This is a compatibility function that is only available with + * Devel::PPPort. It is NOT in the perl core. + * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when + * it is being passed a name pointer with namlen == 0. In that + * case, perl 5.8.0 and later store the pointer, not a copy of it. + * The compatibility can be provided back to perl 5.004. With + * earlier versions, the code will not compile. + */ + +#if (PERL_BCDVERSION < 0x5004000) + + /* code that uses sv_magic_portable will not compile */ + +#elif (PERL_BCDVERSION < 0x5008000) + +# define sv_magic_portable(sv, obj, how, name, namlen) \ + STMT_START { \ + SV *SvMp_sv = (sv); \ + char *SvMp_name = (char *) (name); \ + I32 SvMp_namlen = (namlen); \ + if (SvMp_name && SvMp_namlen == 0) \ + { \ + MAGIC *mg; \ + sv_magic(SvMp_sv, obj, how, 0, 0); \ + mg = SvMAGIC(SvMp_sv); \ + mg->mg_len = -42; /* XXX: this is the tricky part */ \ + mg->mg_ptr = SvMp_name; \ + } \ + else \ + { \ + sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ + } \ + } STMT_END + +#else + +# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) + +#endif + +#ifdef USE_ITHREADS +#ifndef CopFILE +# define CopFILE(c) ((c)->cop_file) +#endif + +#ifndef CopFILEGV +# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) ((c)->cop_stashpv) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ + || (CopSTASHPV(c) && HvNAME(hv) \ + && strEQ(CopSTASHPV(c), HvNAME(hv))))) +#endif + +#else +#ifndef CopFILEGV +# define CopFILEGV(c) ((c)->cop_filegv) +#endif + +#ifndef CopFILEGV_set +# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) +#endif + +#ifndef CopFILE +# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) ((c)->cop_stash) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) +#endif + +#endif /* USE_ITHREADS */ +#ifndef IN_PERL_COMPILETIME +# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) +#endif + +#ifndef IN_LOCALE_RUNTIME +# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE_COMPILETIME +# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE +# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) +#endif +#ifndef IS_NUMBER_IN_UV +# define IS_NUMBER_IN_UV 0x01 +#endif + +#ifndef IS_NUMBER_GREATER_THAN_UV_MAX +# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef IS_NUMBER_NOT_INT +# define IS_NUMBER_NOT_INT 0x04 +#endif + +#ifndef IS_NUMBER_NEG +# define IS_NUMBER_NEG 0x08 +#endif + +#ifndef IS_NUMBER_INFINITY +# define IS_NUMBER_INFINITY 0x10 +#endif + +#ifndef IS_NUMBER_NAN +# define IS_NUMBER_NAN 0x20 +#endif +#ifndef GROK_NUMERIC_RADIX +# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +#endif +#ifndef PERL_SCAN_GREATER_THAN_UV_MAX +# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef PERL_SCAN_SILENT_ILLDIGIT +# define PERL_SCAN_SILENT_ILLDIGIT 0x04 +#endif + +#ifndef PERL_SCAN_ALLOW_UNDERSCORES +# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 +#endif + +#ifndef PERL_SCAN_DISALLOW_PREFIX +# define PERL_SCAN_DISALLOW_PREFIX 0x02 +#endif + +#ifndef grok_numeric_radix +#if defined(NEED_grok_numeric_radix) +static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +static +#else +extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +#endif + +#ifdef grok_numeric_radix +# undef grok_numeric_radix +#endif +#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) +#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) + +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) +bool +DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) +{ +#ifdef USE_LOCALE_NUMERIC +#ifdef PL_numeric_radix_sv + if (PL_numeric_radix_sv && IN_LOCALE) { + STRLEN len; + char* radix = SvPV(PL_numeric_radix_sv, len); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#else + /* older perls don't have PL_numeric_radix_sv so the radix + * must manually be requested from locale.h + */ +#include + dTHR; /* needed for older threaded perls */ + struct lconv *lc = localeconv(); + char *radix = lc->decimal_point; + if (radix && IN_LOCALE) { + STRLEN len = strlen(radix); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#endif +#endif /* USE_LOCALE_NUMERIC */ + /* always try "." if numeric radix didn't match because + * we may have data from different locales mixed */ + if (*sp < send && **sp == '.') { + ++*sp; + return TRUE; + } + return FALSE; +} +#endif +#endif + +#ifndef grok_number +#if defined(NEED_grok_number) +static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +static +#else +extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +#endif + +#ifdef grok_number +# undef grok_number +#endif +#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) +#define Perl_grok_number DPPP_(my_grok_number) + +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) +int +DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) +{ + const char *s = pv; + const char *send = pv + len; + const UV max_div_10 = UV_MAX / 10; + const char max_mod_10 = UV_MAX % 10; + int numtype = 0; + int sawinf = 0; + int sawnan = 0; + + while (s < send && isSPACE(*s)) + s++; + if (s == send) { + return 0; + } else if (*s == '-') { + s++; + numtype = IS_NUMBER_NEG; + } + else if (*s == '+') + s++; + + if (s == send) + return 0; + + /* next must be digit or the radix separator or beginning of infinity */ + if (isDIGIT(*s)) { + /* UVs are at least 32 bits, so the first 9 decimal digits cannot + overflow. */ + UV value = *s - '0'; + /* This construction seems to be more optimiser friendly. + (without it gcc does the isDIGIT test and the *s - '0' separately) + With it gcc on arm is managing 6 instructions (6 cycles) per digit. + In theory the optimiser could deduce how far to unroll the loop + before checking for overflow. */ + if (++s < send) { + int digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + /* Now got 9 digits, so need to check + each time for overflow. */ + digit = *s - '0'; + while (digit >= 0 && digit <= 9 + && (value < max_div_10 + || (value == max_div_10 + && digit <= max_mod_10))) { + value = value * 10 + digit; + if (++s < send) + digit = *s - '0'; + else + break; + } + if (digit >= 0 && digit <= 9 + && (s < send)) { + /* value overflowed. + skip the remaining digits, don't + worry about setting *valuep. */ + do { + s++; + } while (s < send && isDIGIT(*s)); + numtype |= + IS_NUMBER_GREATER_THAN_UV_MAX; + goto skip_value; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + numtype |= IS_NUMBER_IN_UV; + if (valuep) + *valuep = value; + + skip_value: + if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT; + while (s < send && isDIGIT(*s)) /* optional digits after the radix */ + s++; + } + } + else if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ + /* no digits before the radix means we need digits after it */ + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + if (valuep) { + /* integer approximation is valid - it's 0. */ + *valuep = 0; + } + } + else + return 0; + } else if (*s == 'I' || *s == 'i') { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; + s++; if (s < send && (*s == 'I' || *s == 'i')) { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; + s++; if (s == send || (*s != 'T' && *s != 't')) return 0; + s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; + s++; + } + sawinf = 1; + } else if (*s == 'N' || *s == 'n') { + /* XXX TODO: There are signaling NaNs and quiet NaNs. */ + s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; + sawnan = 1; + } else + return 0; + + if (sawinf) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; + } else if (sawnan) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; + } else if (s < send) { + /* we can have an optional exponent part */ + if (*s == 'e' || *s == 'E') { + /* The only flag we keep is sign. Blow away any "it's UV" */ + numtype &= IS_NUMBER_NEG; + numtype |= IS_NUMBER_NOT_INT; + s++; + if (s < send && (*s == '-' || *s == '+')) + s++; + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + } + else + return 0; + } + } + while (s < send && isSPACE(*s)) + s++; + if (s >= send) + return numtype; + if (len == 10 && memEQ(pv, "0 but true", 10)) { + if (valuep) + *valuep = 0; + return IS_NUMBER_IN_UV; + } + return 0; +} +#endif +#endif + +/* + * The grok_* routines have been modified to use warn() instead of + * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, + * which is why the stack variable has been renamed to 'xdigit'. + */ + +#ifndef grok_bin +#if defined(NEED_grok_bin) +static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_bin +# undef grok_bin +#endif +#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) +#define Perl_grok_bin DPPP_(my_grok_bin) + +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) +UV +DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_2 = UV_MAX / 2; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading b or 0b. + for compatibility silently suffer "b" and "0b" as valid binary + numbers. */ + if (len >= 1) { + if (s[0] == 'b') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'b') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + char bit = *s; + if (bit == '0' || bit == '1') { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_bin. */ + redo: + if (!overflowed) { + if (value <= max_div_2) { + value = (value << 1) | (bit - '0'); + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in binary number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 2.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount. */ + value_nv += (NV)(bit - '0'); + continue; + } + if (bit == '_' && len && allow_underscores && (bit = s[1]) + && (bit == '0' || bit == '1')) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal binary digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Binary number > 0b11111111111111111111111111111111 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_hex +#if defined(NEED_grok_hex) +static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_hex +# undef grok_hex +#endif +#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) +#define Perl_grok_hex DPPP_(my_grok_hex) + +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) +UV +DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_16 = UV_MAX / 16; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + const char *xdigit; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading x or 0x. + for compatibility silently suffer "x" and "0x" as valid hex numbers. + */ + if (len >= 1) { + if (s[0] == 'x') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'x') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + xdigit = strchr((char *) PL_hexdigit, *s); + if (xdigit) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_hex. */ + redo: + if (!overflowed) { + if (value <= max_div_16) { + value = (value << 4) | ((xdigit - PL_hexdigit) & 15); + continue; + } + warn("Integer overflow in hexadecimal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 16.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 16-tuples. */ + value_nv += (NV)((xdigit - PL_hexdigit) & 15); + continue; + } + if (*s == '_' && len && allow_underscores && s[1] + && (xdigit = strchr((char *) PL_hexdigit, s[1]))) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal hexadecimal digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Hexadecimal number > 0xffffffff non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_oct +#if defined(NEED_grok_oct) +static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_oct +# undef grok_oct +#endif +#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) +#define Perl_grok_oct DPPP_(my_grok_oct) + +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) +UV +DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_8 = UV_MAX / 8; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + for (; len-- && *s; s++) { + /* gcc 2.95 optimiser not smart enough to figure that this subtraction + out front allows slicker code. */ + int digit = *s - '0'; + if (digit >= 0 && digit <= 7) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + */ + redo: + if (!overflowed) { + if (value <= max_div_8) { + value = (value << 3) | digit; + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in octal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 8.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 8-tuples. */ + value_nv += (NV)digit; + continue; + } + if (digit == ('_' - '0') && len && allow_underscores + && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) + { + --len; + ++s; + goto redo; + } + /* Allow \octal to work the DWIM way (that is, stop scanning + * as soon as non-octal characters are seen, complain only iff + * someone seems to want to use the digits eight and nine). */ + if (digit == 8 || digit == 9) { + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal octal digit '%c' ignored", *s); + } + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Octal number > 037777777777 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#if !defined(my_snprintf) +#if defined(NEED_my_snprintf) +static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +static +#else +extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +#endif + +#define my_snprintf DPPP_(my_my_snprintf) +#define Perl_my_snprintf DPPP_(my_my_snprintf) + +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + +int +DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) +{ + dTHX; + int retval; + va_list ap; + va_start(ap, format); +#ifdef HAS_VSNPRINTF + retval = vsnprintf(buffer, len, format, ap); +#else + retval = vsprintf(buffer, format, ap); +#endif + va_end(ap); + if (retval < 0 || (len > 0 && (Size_t)retval >= len)) + Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); + return retval; +} + +#endif +#endif + +#if !defined(my_sprintf) +#if defined(NEED_my_sprintf) +static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +static +#else +extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +#endif + +#define my_sprintf DPPP_(my_my_sprintf) +#define Perl_my_sprintf DPPP_(my_my_sprintf) + +#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) + +int +DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) +{ + va_list args; + va_start(args, pat); + vsprintf(buffer, pat, args); + va_end(args); + return strlen(buffer); +} + +#endif +#endif + +#ifdef NO_XSLOCKS +# ifdef dJMPENV +# define dXCPT dJMPENV; int rEtV = 0 +# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) +# define XCPT_TRY_END JMPENV_POP; +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW JMPENV_JUMP(rEtV) +# else +# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 +# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) +# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW Siglongjmp(top_env, rEtV) +# endif +#endif + +#if !defined(my_strlcat) +#if defined(NEED_my_strlcat) +static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcat DPPP_(my_my_strlcat) +#define Perl_my_strlcat DPPP_(my_my_strlcat) + +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + +Size_t +DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif +#endif + +#if !defined(my_strlcpy) +#if defined(NEED_my_strlcpy) +static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcpy DPPP_(my_my_strlcpy) +#define Perl_my_strlcpy DPPP_(my_my_strlcpy) + +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + +Size_t +DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} + +#endif +#endif +#ifndef PERL_PV_ESCAPE_QUOTE +# define PERL_PV_ESCAPE_QUOTE 0x0001 +#endif + +#ifndef PERL_PV_PRETTY_QUOTE +# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_ELLIPSES +# define PERL_PV_PRETTY_ELLIPSES 0x0002 +#endif + +#ifndef PERL_PV_PRETTY_LTGT +# define PERL_PV_PRETTY_LTGT 0x0004 +#endif + +#ifndef PERL_PV_ESCAPE_FIRSTCHAR +# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 +#endif + +#ifndef PERL_PV_ESCAPE_UNI +# define PERL_PV_ESCAPE_UNI 0x0100 +#endif + +#ifndef PERL_PV_ESCAPE_UNI_DETECT +# define PERL_PV_ESCAPE_UNI_DETECT 0x0200 +#endif + +#ifndef PERL_PV_ESCAPE_ALL +# define PERL_PV_ESCAPE_ALL 0x1000 +#endif + +#ifndef PERL_PV_ESCAPE_NOBACKSLASH +# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 +#endif + +#ifndef PERL_PV_ESCAPE_NOCLEAR +# define PERL_PV_ESCAPE_NOCLEAR 0x4000 +#endif + +#ifndef PERL_PV_ESCAPE_RE +# define PERL_PV_ESCAPE_RE 0x8000 +#endif + +#ifndef PERL_PV_PRETTY_NOCLEAR +# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR +#endif +#ifndef PERL_PV_PRETTY_DUMP +# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_REGPROP +# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE +#endif + +/* Hint: pv_escape + * Note that unicode functionality is only backported to + * those perl versions that support it. For older perl + * versions, the implementation will fall back to bytes. + */ + +#ifndef pv_escape +#if defined(NEED_pv_escape) +static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +static +#else +extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +#endif + +#ifdef pv_escape +# undef pv_escape +#endif +#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) +#define Perl_pv_escape DPPP_(my_pv_escape) + +#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) + +char * +DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, + const STRLEN count, const STRLEN max, + STRLEN * const escaped, const U32 flags) +{ + const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; + const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; + char octbuf[32] = "%123456789ABCDF"; + STRLEN wrote = 0; + STRLEN chsize = 0; + STRLEN readsize = 1; +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; +#endif + const char *pv = str; + const char * const end = pv + count; + octbuf[0] = esc; + + if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) + sv_setpvs(dsv, ""); + +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) + isuni = 1; +#endif + + for (; pv < end && (!max || wrote < max) ; pv += readsize) { + const UV u = +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + isuni ? utf8_to_uvchr((U8*)pv, &readsize) : +#endif + (U8)*pv; + const U8 c = (U8)u & 0xFF; + + if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + chsize = my_snprintf(octbuf, sizeof octbuf, + "%"UVxf, u); + else + chsize = my_snprintf(octbuf, sizeof octbuf, + "%cx{%"UVxf"}", esc, u); + } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { + chsize = 1; + } else { + if (c == dq || c == esc || !isPRINT(c)) { + chsize = 2; + switch (c) { + case '\\' : /* fallthrough */ + case '%' : if (c == esc) + octbuf[1] = esc; + else + chsize = 1; + break; + case '\v' : octbuf[1] = 'v'; break; + case '\t' : octbuf[1] = 't'; break; + case '\r' : octbuf[1] = 'r'; break; + case '\n' : octbuf[1] = 'n'; break; + case '\f' : octbuf[1] = 'f'; break; + case '"' : if (dq == '"') + octbuf[1] = '"'; + else + chsize = 1; + break; + default: chsize = my_snprintf(octbuf, sizeof octbuf, + pv < end && isDIGIT((U8)*(pv+readsize)) + ? "%c%03o" : "%c%o", esc, c); + } + } else { + chsize = 1; + } + } + if (max && wrote + chsize > max) { + break; + } else if (chsize > 1) { + sv_catpvn(dsv, octbuf, chsize); + wrote += chsize; + } else { + char tmp[2]; + my_snprintf(tmp, sizeof tmp, "%c", c); + sv_catpvn(dsv, tmp, 1); + wrote++; + } + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + break; + } + if (escaped != NULL) + *escaped= pv - str; + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_pretty +#if defined(NEED_pv_pretty) +static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +static +#else +extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +#endif + +#ifdef pv_pretty +# undef pv_pretty +#endif +#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) +#define Perl_pv_pretty DPPP_(my_pv_pretty) + +#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) + +char * +DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, + const STRLEN max, char const * const start_color, char const * const end_color, + const U32 flags) +{ + const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; + STRLEN escaped; + + if (!(flags & PERL_PV_PRETTY_NOCLEAR)) + sv_setpvs(dsv, ""); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, "<"); + + if (start_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); + + pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); + + if (end_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, ">"); + + if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) + sv_catpvs(dsv, "..."); + + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_display +#if defined(NEED_pv_display) +static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +static +#else +extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +#endif + +#ifdef pv_display +# undef pv_display +#endif +#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) +#define Perl_pv_display DPPP_(my_pv_display) + +#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) + +char * +DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) +{ + pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); + if (len > cur && pv[cur] == '\0') + sv_catpvs(dsv, "\\0"); + return SvPVX(dsv); +} + +#endif +#endif + +#endif /* _P_P_PORTABILITY_H_ */ + +/* End of File ppport.h */ diff --git a/perl/t/sixel.t b/perl/t/sixel.t new file mode 100644 index 00000000..6c946b12 --- /dev/null +++ b/perl/t/sixel.t @@ -0,0 +1,62 @@ +# Before 'make install' is performed this script should be runnable with +# 'make test'. After 'make install' it should work as 'perl Hello.t' + +######################### + +# change 'tests => 1' to 'tests => last_test_to_print'; + +use strict; +use warnings; +use Test::More; + +#use Test::More; +BEGIN { use_ok('Image::Sixel') }; +BEGIN { + unlink "egret.six", "egret.png"; +}; + +######################### + +# Insert your test code below, the Test::More module is use()ed here so read +# its man page ( perldoc Test::More ) for help writing this test script. + +subtest 'encoder' => sub { + use Image::Sixel; + my $encoder = Image::Sixel::Encoder->new(); + isa_ok $encoder, 'Image::Sixel::Encoder'; + can_ok $encoder, 'setopt', 'encode'; + $encoder->setopt("o", "egret.six"); + $encoder->setopt("w", "200"); + $encoder->encode("images/egret.jpg"); + ok -f "egret.six", 'output file exists'; +}; + +subtest 'decoder' => sub { + use Image::Sixel; + my $decoder = Image::Sixel::Decoder->new; + isa_ok $decoder, 'Image::Sixel::Decoder'; + can_ok $decoder, 'setopt', 'decode'; + $decoder->setopt("i", "images/egret.six"); + $decoder->setopt("o", "egret.png"); + $decoder->decode(); + ok -f "egret.png", 'output file exists'; +}; + +done_testing; +#subtest 'foo => bar' => sub { +# my $encoder = Image::Sixel::Encoder->new; +# $encoder->setopt("w", 200); +# $encoder->encode("images/egret.jpg"); +# isa_ok $encoder, 'Image::Sixel::Encoder'; +#}; + +# +# +#my $decoder = Image::Sixel::Decoder->new(); +#isa_ok($decoder, 'Image::Sixel::Decoder'); +# +#$decoder->setopt("i", "egret.six"); +#$decoder->setopt("o", "egret1.png"); +#$decoder->decode(); + +#1; From 49c959f415337882b6ad3b61c5acd6ef4aa95db2 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 29 May 2015 00:33:13 +0900 Subject: [PATCH 273/451] Initial commit of libsixel perl interface --- Build.PL | 23 + MANIFEST | 11 + MANIFEST.SKIP | 4 + META.yml | 24 + Makefile.PL | 34 + README | 13 + images/egret.jpg | Bin 0 -> 18986 bytes images/egret.six | 7 + lib/Image/Sixel.pm | 28 + lib/Image/Sixel.xs | 183 + lib/Image/Sixel/Decoder.pm | 4 + lib/Image/Sixel/Encoder.pm | 4 + lib/Image/ppport.h | 7258 ++++++++++++++++++++++++++++++++++++ t/sixel.t | 62 + 14 files changed, 7655 insertions(+) create mode 100644 Build.PL create mode 100644 MANIFEST create mode 100644 MANIFEST.SKIP create mode 100644 META.yml create mode 100644 Makefile.PL create mode 100644 README create mode 100644 images/egret.jpg create mode 100644 images/egret.six create mode 100644 lib/Image/Sixel.pm create mode 100644 lib/Image/Sixel.xs create mode 100644 lib/Image/Sixel/Decoder.pm create mode 100644 lib/Image/Sixel/Encoder.pm create mode 100644 lib/Image/ppport.h create mode 100644 t/sixel.t diff --git a/Build.PL b/Build.PL new file mode 100644 index 00000000..68a5229e --- /dev/null +++ b/Build.PL @@ -0,0 +1,23 @@ +use Module::Build; + +my $builder = Module::Build->new ( + module_name => 'Image::Sixel', + license => 'mit', + dist_abstract => 'libsixel binding for Perl', + + requires => { + }, + + build_requires => { + 'Test::More' => 0, + }, + + script_files => [ + ], + + extra_compiler_flags => scalar `pkg-config libsixel --cflags` . ' -Wall -Wextra', + extra_linker_flags => scalar `pkg-config libsixel --libs`, + create_makefile_pl => 'passthrough', +); + +$builder->create_build_script(); diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 00000000..0e34dd5d --- /dev/null +++ b/MANIFEST @@ -0,0 +1,11 @@ +Build.PL +lib/Image/Sixel.xs +lib/Image/Sixel.pm +lib/Image/Sixel/Encoder.pm +lib/Image/Sixel/Decoder.pm +t/sixel.t +Makefile.PL +MANIFEST This list of files +MANIFEST.SKIP +META.yml +README diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP new file mode 100644 index 00000000..576aba7b --- /dev/null +++ b/MANIFEST.SKIP @@ -0,0 +1,4 @@ +^Makefile$ +ppport.h$ +egret.*$ +egret1.*$ diff --git a/META.yml b/META.yml new file mode 100644 index 00000000..bcca4ae1 --- /dev/null +++ b/META.yml @@ -0,0 +1,24 @@ +--- +abstract: 'libsixel binding for Perl' +author: + - unknown +build_requires: + ExtUtils::CBuilder: 0 + Test::More: 0 +dynamic_config: 0 +generated_by: 'Module::Build version 0.4003, CPAN::Meta::Converter version 2.120921' +license: mit +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: 1.4 +name: Image-Sixel +provides: + Image::Sixel: + file: lib/Image/Sixel.pm + version: 0.0_1 + Image::Sixel::Encoder: + file: lib/Image/Sixel/Encoder.pm + version: 0 +resources: + license: http://opensource.org/licenses/mit-license.php +version: 0.0_1 diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 00000000..04026199 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,34 @@ +# Note: this file was auto-generated by Module::Build::Compat version 0.4003 + + unless (eval "use Module::Build::Compat 0.02; 1" ) { + print "This module requires Module::Build to install itself.\n"; + + require ExtUtils::MakeMaker; + my $yn = ExtUtils::MakeMaker::prompt + (' Install Module::Build now from CPAN?', 'y'); + + unless ($yn =~ /^y/i) { + die " *** Cannot install without Module::Build. Exiting ...\n"; + } + + require Cwd; + require File::Spec; + require CPAN; + + # Save this 'cause CPAN will chdir all over the place. + my $cwd = Cwd::cwd(); + + CPAN::Shell->install('Module::Build::Compat'); + CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate + or die "Couldn't install Module::Build, giving up.\n"; + + chdir $cwd or die "Cannot chdir() back to $cwd: $!"; + } + eval "use Module::Build::Compat 0.02; 1" or die $@; + + Module::Build::Compat->run_build_pl(args => \@ARGV); + my $build_script = 'Build'; + $build_script .= '.com' if $^O eq 'VMS'; + exit(0) unless(-e $build_script); # cpantesters convention + require Module::Build; + Module::Build::Compat->write_makefile(build_class => 'Module::Build'); diff --git a/README b/README new file mode 100644 index 00000000..94820e89 --- /dev/null +++ b/README @@ -0,0 +1,13 @@ + +How to Build +============ + +$ perl Build.PL +$ ./Build + + +Install +======= + +$ ./Build test +$ ./Build install diff --git a/images/egret.jpg b/images/egret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb87c099057f832f99042efdab612676fdfa6704 GIT binary patch literal 18986 zcmb5VWmH?;6E_+PrIZ3K#l5AtYbf3p4M9q932wpNrHac#kYELhdvJFP5Zv9pw73Pk z{NH!obwA&8KAfDj&zhONXOCp|{2pc>RspY+-m$Q{(oN&?Eqpttj;I8*jS8!C&XCT#8?mA09pV5 z`%&2c$@~9aSWmDY<$Z?tI4b)J@Z<^B6C7;Z$NL#J4mJRQ^@JE3=k3$i{2$d#U2sVl zzsCN4CQw28?h~YAOmOXpOvcRh8~m8uJWEJJv(vq@>X8c7|7Gz1arhsVM;?zu{KQy~ z901t3Palc@-wz&#h;iQXKYdLi@KK$V(bVPlr`U?GV~?Z-Asr9%0D{Nw9%Uc~NCR$N zKICFMs-Mu(>7F=^l1fB1JR2Yj4~bP`Y0hOE!?k7ZWeI0y`_C#i+^!U;kOb?tnBM7NN`Ut zbHPu`{#Dw%eevhr1U_?TH0zdgqr%AyvsC>MmYL{Ys_am2>? zqRGMYQ^r)sRQ*%tk2VzPJNKuVvz=zePDj32qT-!eo9|DXLdC zsDmgB;_PzR60-)>xn)x|+2XToVnJ9bGFw8KTiC+H1u0BIU-SI4)Pb2>Pe?z?))40q zGQS;z5q+z&?UAqMz!t+7`tAA^|6M5>`F18#Q;R5Ki`wXel3b2ZxH=c1lryTffuSh=1eJ*zVB8OM0&%xTjRcY+}7LG|A<0=T2jiMrW#}XD8 zTt_hu@Pu>qB2*CX)E)n5-CcV!!FDe#=U#&&gc1V7y=%AwT#i zm4J#xsEJj-%~+QHEC*#1h3qJaY~^kuj(|RQ)~B~{bS!Uv(yK9U@-c3#H)8l$Pw*+R zUv)ph3d{UI)`q7cYe4`txyiGM}>AIoLcJ3_N8rS%Uw&4f#MS^nEmk@U=nw ze~-(PHU9dPomhoCLNTF25jSy*Q2`dKaz-}u`GE0@vRL@-hfgN6sj~&Lmy}7LY*g%l zZ%AZ?448j_WrZ!_@pznOTn-0NFz_AE&veSP(|~ zB}aJ6EKCuX6gvw?to-GZ;4fldgm9VozIrgY00=(L6aWIhlZ7~EX32l?G9bgig`P6T zzH9k1Mr!RBA6l%ObGiSC?%?U$x#!V+`KD$S0wHF&tlO`?wgDQM}z)T#SP6d-%GN&7^s zS#dxKE`iZIEc{+f=##GcZtrFlqD)LQcjuIO_yF2saOdu9- z^Xs){F|U&P*d(5sp5o>7s*Da$>V5%uGWD2z)&r8i>cHcSpU|I^gub4lup<0mC5ab`{UO;j0t z3r{-x$|2aY;)0N4a|qrvhBWqU7b7w;f` zg&y~J`$Cr45^a^M9~x$r2EUC~q5sXMva}Zy1Ie-NRl+;I@R{us;DF8T5sfb@Ed-JY zaQYqZa4~UyUy=#q`>>w3bcAA;BTe~Co?uCS;nLZDizOo)RZeqC7T(!TgZxZlLMZuy zE*VJM@wO&JYzHntsg?9Z$CBpMcdEB3@B?ZPWEE1e41SFduTg;z(J}X7<`-DpxnedzSg$rc@@z9$xk}HkBUc~u4 zG=!uK$9979G(iKUcQIvaD_?z|Ku11(y|fBCh5<*U zXKN0IVdnV4U@n(BrmC5~?Veuxz&vAi#nR0|+WI}%_-HSiVYKa~#c}rBZ3NSdm5g-J zIYV$@&pur%cJRvwfHjYDP)-c1-j(1%de&X%y1vc>pr&XWyv2n2>TOKTFhr0Tcv^b< zY@*dGbK`pb&suagm@2?f|L$e%2E%vyDVw;&XfYnx zM%Ql{LXZ4o7|2I$t2OrYj^DHHE|2W{+|}kas|R0_jE1p&026=0k0omTh9_kLcv5ac z@Rkqo#3y9Xd}y1tH+jL)1R|hp`_XeD$yT02j-A+ZNfHg=QyZ-BgO^Tl3zDLhIV~_` zR-oukq3zNTD{Z0n@m;Qn7f%jELz{5hi%l(zI?IKWRbo9BwV%#5gjM`+mn^2T+*o*HAj-$cO6%)oAnKmtc*Vw9K?gxvO^sV7IK;4QX?*l?df64` zt%u>Qd;olF76dV8%u5^A?RK-gtjuv^#B#c|pdqD}(snTAfuxdkI5FIbk z#OnB7W^GR}KCvBhfm0^XlbVMr9f`J1SVlAlYN6^zJMpD+vGk z-GTen(Ox-zp z`2AMw^bnIZ*T98U7V#X{e+M&@y&4ANvzv)oiQ|0f`GIYGWe))F=5RemALHtpMj8F& zwgJRwqe8)nmSgL;%jyd_hCZkT=I_|t6kqjq<#6RRGaBYS|31-RPtlGwiSC+}c6OO- zELhp8gq4h~Elx^2=AOony?1dZF1SmfAo2c2_HME@Vl7B!Z$n5w%~<=6I5|g6D{Mw# zEq&}B&(8Vd=7nFV`84u=IIm*3Ij1(r{FF%i-~m9ks%Ip{pE;5Pn*l1`@{U6pChxnp zW5THJmi^Vpy=8#x9M1h@O!vwg_Qbn;hPBbi^*qp>nd7XfpkL7HDAR2rNU9~ z?dmzJ36lE?VxJ1HOweGHKa{!UXJhM61Ir~>f7p)g))w8&ul|Pa*3C2Yd z8B(oXS6F`kfhh7zx~6oW)0q^De8Pl_Lo$o?W&Hi2bIafXuba&rpYlL&GI5bRBsNkH zlvx@dMZ%|C-^T_14R*K5aqE@qN!H$*os85B-^O1^BCX|z(EV^2r0vzFZMPfR<}nv} z3&c(97_>Iq#@6A*5~VtQkwi%QW7FEqshd;P)Qw8ik+y?c_d3$&D|nD+;n6+%gm2^h z&%S7T*q_?xKw`heDt&Mmn)P3xT;ABmU2wx6L-1XP3T;0|UD_V`#f3AR|Km|>#SiQ{ z>jUc|>?(HajSxVjPTa|Q7d=cT;>gI!{Ne#%67-B8Mk>5Kd(%9peYAFz0epYG3BMh= zC##FFDhAcbJJ=v~w$l4may8On(V$RJj222x1e(nZUp7GQF-CTZ*UU#|_ zdk^DvHr%;HH{HBhhd|$3o^rLp6pxv*$D65Efhdq^i?vO4_iTbd zC#~Lq2|eFm7_N1lj6w+4xdn#NOF<1&=G9{m+HPBuCvp;T*Lw4`%UzR@dZywg0UyIu z*eSUCD8HNcq*~!d{{8-@`d=_td|{>lrBBMmjdHqzVtw;S#eJw`&WVV>`7}(a{x%rQ1oC z093W~&*f=n`(&E6WZ`-5ma5%0@08;$gkHtK%YU&0X6D5? z`pluvv}*tKV3BQ}zDz zKt$sQBAffl5_q=Q(*`tk_z4?DzbfwRoU*H#IJEJ(QM$#X(frSdIBZ0});4!o8Fp^t z&Yxn(BKRfR7aYxeA{%~etrJ#1CM!IqZrBbDUqML?go=dm!8xXb;w%57aUH1{oP+zw zQT};+4q+YSF~2cgNdnF!aiNn$OCo9)JBAt(uIT(ZL-w!A+Q=h9O!_ml5++TbP7Jli z#zgqNt+pIeS^)9v?9%t$Q@FHB#^56L`aA1A_2XS_Nqk)8E`z07qcvO9N-s2yZhqbf zcUNQ51q)FmHSV-R21ZxH6IwdG38>fyT;zdWu$w6_%1@lDY34XGANa>zqxfR)I4LJ0nBF5 zk+S?_-DS1W;1jTo)NVn^kuiil0L*FqooG{1``>>uPS9{PW>i)D-o#tkUwQ@q76+Y& z5>(n|A~ROEmbaL#`?fEtz&{O-hh5r&c?|3J?PBI>sl!U(W9#u-m0O0B&9NB_w1L@8 zyg6NEzG-EYiF&z94y5i}#p&@AWz{1HLmm1+8*OEsCRJ6=?I`j_z8H>pm^U4xnNO!w zp5Aef*20l;%mU-ecd0Lc#yD~UsTc^FT zTg!HKJp)AV+7U#Z&Cy%9wXN0dO8dbvyb6;qt*Ep-c$a;uefZJBI?qn5inZ7pBi~W1 zPL)ea`+#p=Z)5UYP(r!>{Y+AR|L&FTy<|AG+C~@XWd}vwKKP| zLJIk~^ji(6T;iW;LoaG}`zDn{kLzts31*jvMa}Xu`se!cpXqn>*^8KLfAn`EL#6L=IA5L ze<{|yDf`J7AML@7hA{qZ{O|gbU)jH#hMiEchd+<7cAG&uIVyw?xR53~=o4ZJoJkXn zECGy-n7TR2g?H36yxx@Y`)&bjHQ5#{FK>bkiVLV>aB{K@hj?{lWQ?qIfIWLc`YmQH z^l@4RIyxZ)+sLVRE2B5h|4LPKEgkt^ne(ns4!nmv02)?icl;;w)5jQm9IIQJE9ypA zAl5534*>kD_{?17dYZK2p?8m(ASMT~c;Vg_+)VMJ#hPShzqvx5@-ZW>k`VPX{@ycv zEbV|EQ++0h(Yn@zqD&$u;NfuBfVjFdX}3{7k%O{tWJH8{LmVqSWso7>dsW2fdG)Oh zIO~VYuF#dxF!_4*?C+Q}g>*kRf(O71iFAnXg_YWrSRh5ts-d;+%t0D!s8!29G1$yh zk>nEZ+Ddi98kNO3?5qOu0EjF6L4B??hvBK3Pvg--K(;fqJP-HfiFi(GkIaS-vt3}c ztTiViO5F<6(2Xh>JuKNj5pmR}zZm4WKF`HbTJnA;5&UPMb!Xz}0no)@^)?J_(BpBv za|`itS&bQE4=g#`h|^2wadU3J_EfQNZBaFxe}99LXzc5O8ve=tH|+V>J|QXnOgTVQ zn3kN|Zpu60zl(PSDwN9q#%nM55ABpLkQWmQ`w3 zhDYAscjo+-_)oRg86la#E%mjaYZ+wWS3hraYO!&$+?eWgBv0U;uAX0cm7c+4u|{h+ z;>E_XGRO=k?#mnhV`ttyguqP)FZO_#rwyF;y_;o1Evm=+63(D6xt;u$J%$5MhH746 zN}3J8;m{$t_8L6n@v;`MhDM^(&VjkknuH zE8pJdqt?EuIR9{}x9Ss}0G@d!vd1_w)Q$yBw(n0+*3M@0DCpA`iwZ+>DCFieqDD-S&@=`w4EbXQcKNU5~> z_;CvZu`7y8u%kF+yNlBUs()-`tsMvD271eoF6Iku;Z6;-#{27#I6bSOe(6=c<&xT3 z0b9y&Ihf3rNHWamqILCbrdgQy-Aa8Cp#x2h#g6jjqOj8OUV!Iz(F&TYQOg#|r&5v^HZtQBDiRYk32qEDI)4PNIjK z(Frs$3Pz66QjUuYn2KJlY1cN9JHWq4P3t#zyIacaR2B7N}Vn06a(D`$pgE-AI;1yk(7G9n)%}z z#KlSg@;%AB->JyD@R|!?y`p^y7BS9{FoFf0It09=cbw`7_p53^Wc|uWJZ_kj#(`+S zBlY9c7b}+Ti2oiPTHO6!heWy?QW#6w7J^@(7;f?v?*?eqRJyX!`91k#>rExLlsaQf zKJzhlLa`Y=B`7%TFC}Q`E{3eh_EZcNgIKwdnJ^lR@}Iu@eU!q`87P_JQ99+^@*3(> z)m*7I{v6qGMs3{jmjh&bHH-wxHBYC4X`PMFRoV*o)#jH1?Xpc4@6O{O;U0bYcblmUhLEyLL03xWl@x4)_igdiF`X5-^ z+2sot1mWtfIIdz5q$@An?!J(f^Hj=KEbwhCZ$Js^sh95Y%Kn(k>eb1}<@_&sJ&}oD za?)@KDsctjd)>NIUg&!Xt)2YQKP}~PJ^xN@^}j8#a@rgTOHFh7C-dI<&?tP{UBBn1 z-9F6Tu{IQ%J?bsr-H7HaX_=_%@OMk}S58g#<+Pm^*7X*=KxiaR6X;cf&Pp7TH-=Ec za0l2q-B7eTgP`_q(}|-e>k%+O7Y6e( zEr?bf6?UrZ+#xmEj$DyVQs04w_1DbbHDbhV=Og3wF%c?-Qx@Ba{(>Epr8~(p_p0gS z&`Uee%FV&x=Axr@+;+wOiSsq@TtLdymYpMPQ}w=U@&^2uHft^O0=5>XH56NCtaPVV ziY}Ni{lUzw>L0Ds%Ep#+D^lyS|Ni^7(FTv9Q`JzSMCnCK?M-^jyxY zktA!}+Uc%j-Flp!z~)F^gcmxP{~M;sY2W59?jl2-$ne%!1FyBvLj3`N$=(zAa~0R- zyM{Zx()QhH7ent^9O}a3T_T8zYwJjtl*-##XAIPr4N`mnNDuVt-#h@AyWSHagKdJW z`g@AF?|q!4Wk+&QAs=%(DA8JRK$yn1>%!RIODPSBEiNKe*Fj{i6W*J*-)=)`1A441-0AZd8q;ahJ&o!mb zKBBpHiR?atr;E#@dqTeHTE!7*bW#d-!_oH3vo`#e8eMT3u}lr=;wr6o{sox#?_Vgp zmgSzhZbhAM-q9Fz9V_v!>M>6#y;jd%A3JGwlR=PKOl(EkS>-YZ?YT=CsQ>k>W3uFa z_V<*W!fvC8yqbZn>75gy0QVA)%Ufo}< zhGC$U@UrxfY;uD48yY-1H9KQtF?w)Yy|>}z(|?v~s7sd~02(SpRTl-tDVH&pj{k-w zwGB@v&}u&ibPWoXC~Y-PmRe$@ye;#G&~ZYUi6^S!lBG;-Eicwlj_N!vz-XkO3>|r} zekm9K`q1x5>E+#%CY`08Hu{>4@zAv^Z{8gN+;eK@ zA&80*YV%AKWmiz6n8%2=hP^wNdY;vlGcKx9<^x%HJUZn3=e>-wxsq@}0VVxC^h_(` zqPPN5J_jLo1MGz`_LcSf*1~hD2E1~k7+NVhwZLJW+BrF{m`hljtV4`)W51M>V4=k& z7?CK{=o-tdV=;d&IqZ=AjB*jO(DwB;;#4rjH!(qBJ&-#I)F2)0v3+<$nBqRd!dzLm zS<6Vp%z|KS?N2Uo`9pK+p)Iec#BaMpw#D>JxzevTegm(KASNh_d7lR1-kk6*SllD8 z>7To){|bC&j2K!kFh36o%s12#I8tEYMrhxrikaNnXB(*dwPiB5^b-0Ws0sNSj}|oU zA}60gnv|qv6qUff@0J~=ShwUp*4=`>jy+r4{c#(2B5Ic5K9rfdcZrRpO`NjUmPlA! zkAS%wS*0yatguPzzCFlp-jYQDf9s~EoMLd*I8sMsC= zIk>U698#OJMmu3k+BmZlPfB2MCdp*5#K;Mb_UZxUA1IIAk6AXbf7%jMt_mr9whSX2 zk%35aB>4AbC1_}LDrT;S(G@ElzF?>l)OGNmx;4a2dLYtb_Xh-oF zX41B_X9CA4+%O1d%sX(xP|EpGdVhG|3OavwJ8)_fW%S4PAcF(LA(2>OJOZ~0TB(*4 z&Y3|ghD?k^*@}1{?Qd`08m1xl_tJbkn!%E2@(dNcBEz{;17jxtRwvl0sw2cj6$%S_ z3?F{t4*8tcFU-zLl<$_qr>)b_f6VVk`{0OI!O~om(#3E0-o`E$LyJ=aS}u9#7^o1@ z`xY683`6IltUWca9}VRJ@K5ll!FonDgGp*@&s&v>9gNG4zOM8SDx8W4hdFnkaJkgO zq402NkvpV%EHFDA+)L~irp7A(R!dPiQx(3fyd}*4Rnp2FkdfWWpZ%?*aq#`ErV~?Z zgi}LL>OA-B)Gc%>lb=7n$hrMhsOj_;;$QUuyU}0dsbG5C=Y^gAa89QomIr`LwX^P> z;SQJVc|f|F9e?jMH&E2z0pQ2VTba#%1*{oDfV3mph1=#ekZ#c$z2fUBnH;ecMS^dB z%r{BfZy_<1U@(loboA2Ij3*(>FTEb}+ghl0rJ&r9v0g;W7&9heXQLBv%xz*9njA0&Q|C*HF(M0QC=mibPecblb{5?u)JXTNjda(gcah{^R{) zj&U`o*14Ihx>XkNbdb`e76-_??(uJ{W`qLBwT+k_`Kza0s6KUPQr@Gpvght@^SQedA_ zUg7%CvygV1fS;(sZ;Afi8-t}>a37kRu~vqzA?j2$aIlIu@6g2@LjY|(GukP!iFa?+ zF`sS?Pd{MC(<2(cf;u^4Y1lhLS`2;VmFZ&GNGq7|_f}-47(YWS8CAds`DGry~+>P?dH>ekaNz&A#E+b(BVr zw*E0OaaAoYVLI#DPv7cQH%C#9eUOhPPC5e<9H$o8Dw*((ub z6}@$J?1-=V>lKrqB;b)*)58KP((-n3(jvzqtLZ4;3+eALbLrV?-LnaVo>|SE=NVtd zvuN($aT4>#QR&e(YdZ)*s01eUlY=|rl3WF-C>GDm0AzkHXTLu4qn3+M@}P0)?g5~F z+F*Rh`R8u%(epGmC~T(SHOIh&9{>)d#+-8tZL(3vg+9n%aWQlr$nl|U!XiZW;tSO} z2VQw6f~a$cyFpX7o}4}Z=o0UVWr4^x&8PC}$4HsPEYvWV$eCo>}SH%+zE72h4 zDIfAeo>ss4_O4%^0aDYV*-WUoz8}cZe$dn&f`~NG$OpyiSNoBysf0 zxZKbz6`wT9YG!S9P4a+*dg9{{%ZCHttn$$dBkvUyMhzh>08Q}y~KtUrIRYfZ}+ zaks5%eOq65b9Seuppe@y%IgwLIkAuqP6uya7&AF!k15bGl_E(dx9*fYfL{ z@(Nw7_lJt)#m1BPu{1B;VckR{q#Ro)&aH`5e81aL>p*?~nbll3z*e`RX}{D%JNP*z z=9^kYDOsAOdt}c<=nAg|%icin=EL{QZg(h8suOWaUR0V8qPGss1 zo^^|hCR+_|=`6l7`4q3eYZzU37%lcswt@@AqS=WQdo24_0(Bk!Gz|T-$R?9$w2|kv z3=J{~cCy?k+DWAKuEg*>dyF1?pa$HjEjtEJDK(GYk|6bC{@Mtn;-8s?g{W-}bP9>XskuAij@6MSxP^DQ@6-})AYXLm0_HmISq-Kz;waebiDq}RW2TJ* zJNEPL`w#oa{a68VwR+Hl&x@<_Uy}9=v>c>(fa(;cOS&a0G4?*?8;133q$}UFJ$N%}3UY%Q>l0&7cTuiKeD=?k;i4_W!D z)8&G@6Id|sybD>|jJjt(YebJnoFDTDlx|g|x+a{uAA^4z_H!SmP851Zy?x4_FQPc_ z(#3!d5~OuQu`OCk-hi~ItokNzqdIw|Bp^}m^8=qDQsoO7` znla9QjnwNIaoBnM;2cEacDPecTHD{Mbb*+Y+9-2)8#l&Hmo)uOgGc--e^aG502oL} z_LK?3iLHoibGLh;+7M@iqY&2&yRP#0EXuxo;~XBq6ya@=IB;*SH6^$5on7R%ln`$M z#oRxnV-cmf;wK!gN@jbfYzS*Y7W%%E;}dMb*aLz{Uz&Pi_w8HF9w~ixOVvH*-9QAX zk&tBR7lKKGmA!WYm^PXN#EH%K(ezmYeHFXTXrR$Jysb{wS4{PJw=jHXQh}E@P*GIm zRDmZo)J~}0^0B^yjv)P2->I40c4HTA-!@NOo!HM+%6uYfSqs~WQNL-N=!*6XL$u|t zUb_!SZG>3GBlIjHg3OUXdgd7*k=A(5q|Su-MsCTJ+UdR!uE=0tb1$<6MR-bts%@cXW4mP&B_$Pi z2S)mT^U6H!wp5EZ#mRqTX&6FO$k-M<5kTo|s z4*LP1vqyTJJHm8vWwv0f;V(5~! zToQ8ZZc19v>yq0LBEuxhp%A8HbT3hxOg;n2^hPUGRWrkmgzc_Qp@&>YBhC2dFTI-9 zZ2@%N5HmaXctYOY%ii}v)hR7PYa@CljWb=m8i(E@loKvc-sY|ZFq3q57k5rGowrX) zn3d^Sj21ysew;*nKKJs<=yp#CuJ`HCN7k_#g`wjz=@_-nt)jI#_c=oWHp__}Rl%|- z*K-x=1YdgXn1x7}?hOQ3!a<3f>ADmO@)4>t5|*#~mlF7up5mLjD)B5&OffC#45g%WIvUZwm#P6ZbiU}! z3%*j#hO6rS*^coexAS5t?jVy?v&ph0JGtfqtB$7xh)E6`#u+0j&U|P6cK_8Pe{X{2 z>jL^~TtBThXw+XQqt$uzz_tN1=J`NTg(>FK_ox3b24G~EXNqa^>ESrIir)_@D^YmU zgZ3*n{^X&KjLU)M-iwx1VGELFK`_{Nuy5&HL%$5qYgvkIkr$c6n`ykl2c2Y8+NwcpGQkcA!?(&{B92qSoc2q-Zkc$pDshJ<`%t{*9%p)>{@^e?OEYXP1h#ryKq{EVCV@1qC5a>viB6BrO zoZ{u0zP&G$OZwZ3Q|axvKkPn_rH4j3X~I$1nHT|IM{Wlhf%nEZdmyqYV8MR(2mDw6 z%1`>nadsj%abMlytJdI3w0g1K=xVer6mqtR=CNx+a6t81D)-Z^{p{VWhM<@HK9;;k zGaUEUQ;&TX2m!cC{%OFlXDvdt(3bnL_&o>~K2y7)x3FfKcXmB(2{~M=16pOA6r}C2 z%ulBmr4|R3zV+LMva|crySsJ<(B}RjDI&>rEUEbg-@hzuqq!lR@Ehwtj0=>x9H?~~ zqhqAf_UF*X=yk=ZI2Lbv`t?p9I_X!^Zj8B~@VfgnRC^3u&Tb6C7bY)RCbOY2tkB#V zmueLopDH-K8k6hkyt9>;y34Iu1>2sCbMY)qS4CyQC!$9kkd?q8x_Yv| zEG6Y4-NjXQ-Mim(#7jxqF)HXlC#FoVVK}D{ipNRyb z{FSoTn`lg(2?Dk zjuk8G$9_kw^kRc3g;2ZsekRODH==`Lrz!4SVaxc(;!~Fq+X}QgkpoK@*R_U$NDzT> z@eNCm!T{7@fB4D{lT?in3)o%|q=@rs$dKwK>04iN3K+gHov&ir!}k2A;y=s=>fxRd z6xLWso)>sLEn4~{ElR>ZAf4iVuOM}LJH8nc;vC-H#^jR`A#VkwZS$F$O@zPnjI~ud zv=E7NEE#d1*Jh46ft;JG9=gxHPGAKgA-_H9hNEP07mITN?FnQ1a#UH{=nLT!Oo^7bFX*`ia zF?nVWPMdGR``|}bR%EN(?|Of^%b+3>awi@Dk02m?=TmDI2WifQ@~<8JO-6)S75XV^ z4YSpy9rO2`k3cxwl!JkgpE|0M2Pm4NUANVc?!R8*6*87k^#U5Rhyb3Ol#QRY%BGEW zR_9DSR;sMt8; z0%~`CRriE9Mn?!p-x-`-iC7i7)j(em=fu)_ae`Rv%lL~c*Qi;n+H>oP{k}ds8toSB zJOBW`UQn}^kCM$QzUoZE@Dl=VqMrK@eEW|li;`4GiBbcL;0*wfDFgVyxXZ@DCO0Nr z@dT@;{tLzDS6I+?8LZ!MA>t1|a7fADV0{Up&kWqUdYg4AH8P@6saJ_+S~(3O(CL?J zOU5Wy>YW$|i}}FrzOGil*e$zH#f*noX69oGZ;J;nw1tU@T*tt7-Z;OC_brgc9K2Kg z7e^eV22F`u4d;iflVR>o4bQy|1UXvm{Qiae7!4#x=C*L7Xqxs{G(S#|FAscoY(`HH zZfG{7oGA)e>}f->Q&zSu-5?7|9h)mwh|I~&8xT^71L(R^2wGmC?CEcrI8&U+52`Q$ z-f9u;IoKghF^@W+zf2S8roWJOjM2>INeP*Yw^puSbp7!YK1V^gz;M zG+YV(&mBcB+Snvs1&c4z3S{M~ZZ2D&KV#w)rqtJNobCp{l$o;Bha{dMm z>^+MS5OXx@Ev6sJ@f>E?`I)RFY}Z$iB(t{X?y-S_iO-@*z3BbZ_sQ06v0|51lH@_& zdIKlm8q%DL){@Xakw`nSYINUvH?nXkY*NZ9(_P=j&TsDNKG0{5 z5Hv-%lj1y~492E@)tN&5n)*%VKRiI@C!D9B#~vX?=C3IM(}SW|wdwi&bb1l4IaD&8? zhB|hS#7$A2k_(I|LhTJ%?QVeBf6Rtuka>2hVMmp7^_w=vtz#d#z-;GSC;=zij80u9 zyHp`l2wPh$H^lP~28YP0CwE^aajARdr1Vx#dVhdN@SHQlje;rh;;`;xuj&o&r|jPr zF_vxd5gJaG6h?W(u6`_IC1Qu1Y}0&@Wdk1yx{NMhSfqmo%$GEq%yYpAV3S(ox-vLU zS0~RQbYWPqLW7h}qG5wN$j3%Wzc#rzzE0h^A$);?L)K$^bSCHGf6|p7{#{A!Dnr)i zj}8c!mTw@2EQiy<>d%X5nUDWn-VssRt_Uh2Ja2wcYc7dQE2rv|5@tn*ihoz&GU_c) zP#>qV8b{aH<|=b7(J1qzhEzQOW(Q}%@ki}VdH zw$#W`81J1&PCR0(D+SztqH}KDlf5rZP<0dIaOGsYEc$q=&`2=l+X==nTh>B;UA}h) z^&Nbhz3?!trsL&PLAyd)bD1_ynWElR=1!fRQ0sV1G`)`EzBvzM3742o?039m3HC2i zb4<5rHXLGh_h55}^7iGyqq}5&t|4V;W0w&!W0#Ilu`t+#ALkLZLVVWpScAwCwE_v) zeQYmqczh`tO{?xMN-7ay;IVX}X@C3xC}NG}%*0u`hw;+IX1Nz_u~=k$lk1()3e2=k z*;7SF_lseY^TwAjqkoN6+V@es+8*W^p3a?`PSHx27*cm7g9F*EwR08?=ISxo0S7&V zq=9R@|^*e|GfiM`m1<|A1$kDuLxfrM4oH=sxWKBxdwPGo*khOzPns}S56gWi%ry_ z<6wiwng*XMtp$uuVyWMCc36M~lF6gyEZ};I{qAZM+Dq!a6pGs|2jIht{rSu}FZgXH zC8h%F(Tq7W$K*(V1cw%}GpgJDmVwGQe|3MvSYq*Ed0~Y-;t8Sc;{V}PgyOIO8F9wA z@>pJlSX@$LWxjeP_!z?R+>u&;FTQ2Fbj1K+KFm=)(j~FSA%7UY%qy0pSsSgFagwLJ z?EL3?$LJW_^hx<7u;DunzkK>ZkvfdgJXWghO_O6&I!Z(qLTgfK;nf&p&Nh%SSZ1}l zL0=MHpfaG+Mv_fpM8n%K)IR`^k@4rNZ#x|QBpiI)deCa{$6iY_HplMd>*sH_E3TV` z_OGBTMtwBLE2G)$EQf8ek#R>zmDn-XIV7Af)hP>`ox52%_w2Db#fduwYiY`-%e6=c1@9Q-*_l)`Enx1I&G1wxp=j-m!NofMp`+He) zQBlSTThh-WpCI;Oio*hnO$tg$n|~?U<8wgRaoV_Uj}X}V4_FZmo1SkD`2Gi~e|w1w z5YU1A2k4o#E5w%h)Y2P)UoFHuX@f79#i&b2pa?Jn07w`<@&U?8u)e=~1!z}(x+p_} z^*o+M_QNx0tnhX~_Jvaiv(canI}g&Z?E&z3Htu#DA#Hz4qTGqxU?o~{l`?Ef6!cTst5|g%6bg6hUuVbDvwPnV4&?8AbfQIM@ zKarS=WS&QGF2fGMAOIi%fB+!w9l!=1zyM_;I~5Qu6uJ;npsR^!&LyBJ0DuO-FU&wT zAO->eVz3(!F?tX%U?u_v0s!(PeZ{{5>D8 z{ts$-y`RzGnO= znxvPJP>rQ;uI7@8UqCZk$?e$bf~c=9hEYj+oA;y!xT9wAOX$pC>W!1wqgZuDiFJE< zBN)G_v|Yg>fkxxhZF4U&()fO5V@snT=AJn{m8IlkEHUr*XQbmu&n7P~L80e3^7g+& zDW$&Bze9Yuq_>iaeg-nOt))a9^5(wv=1-pOBT4n7l3%He{OuqnZS!?9x^~^S(|(B2 z$}6*v`tUMxSHCiTf6${BC4P6YmP)^itLsM6X)WD+xBmbmB&92KytfGFnzlsTlG#=G z9jY9Q&(FD*SjLw(t#@E~`6VRfPj+FM$*A4!D?8;Ix>ea(%b8WW>(I=r&DFIzx8%O3 z(D2PaxY4C8q}|E+o@R$m^J)`+mK)cJ^my?&<4N`E#3ZK{UQCMaj@P=i)Z=U9ywSWQ z+&s~!5kAbqZ+(q&y^eXk{X#1n>{>8`rf+Fb8a>bnY})Jqem<5W!qyim)?ENS3a%ny*6)oSoZa?>KerkR1;O0iS{<{_YGtxI+ zYH_dCo2Qv2`vwW8x!H>`-UZtgyBAJj|FH+m>H5*u^T_sdB}SEMJeH z(mrxfbrZE74lz&yE4tsRPoDwlDAfSu+e9p z(8DI5@p95%Ql-FhG4-CDDBa`-`u^?@p04V$q(G%lm7sx`-&VFHcj&?zN#+Y)cbj3jdV$RocVDk z{{Sj}R!OP1&*}Jb#Fg?wE3$X@H_MOV_tcsHYUA z`C`eHCaE>#6&Y6B9N8a6Z$9hjVJC5*h+E5Jc*#6!*~;GLxaG4<4y)!#_yIWNxljau zD6&d@Nj$FN#0(h#03rZZF)$9}M4^DjA%KPe7Ea0_U|K0XwlhU028oo6;>t`40a()j z5HJ82Z~zMc5CafCqF@3BOClR&SU0%4fb0Y?1TscIA7A)csr{eY>{0&!?_tT0?4|zz z>U@Ff`zxwiFKIY-qD@9I&lM*8CGfx0)N+)U^c3WsJL+1UzPl)+g=OvF{{X3LCwuKj zrX`o6@^0(E)){MK%Ey(rzmd}%o2%ThCZ3DUYCc0#T}~L}P5P#730f}E-Hu(&;U{R} z$34J#iXqk5z!aFT4Q))l2LN%jFkO74ROnDpU9}c+3>0JJb3y1 zR8{>=5{l@IUSAb!$T`=Ilx<>fw#Gj9%pOgtlVYXO(UYdwr9J79Ii&tBo**f7*|Qv% z;{JWhlk-pYGLzqC{S1tx+Vk`|Go>r+{F&1x*JVZ-C4Fj$uQx0mZ@qaKO+AkMsXxmv zlR0LWHtMJ=mnFE_&n}jCJXaYblQe1}9F5eOQJJ1cS46372W}~KObl^M0RCT*52kIvtXR1tv7E-20VwZGoaMoyDmnzQ474YmIOv~U<;llb)0c)#g;$Mt_h?Be;OYr0+ zOb)dF0LaoZ-^}HVi&NPYbt&(@%%zib*3ZQpt0!hYdt2Dc0VD(rso^ta^6vC{JGxhpl=mfoi;n_i!x4r;cf$+J$!HFfqPQ<8h7 z3wP$ql8*Z{{F#)SPrLOJB3InTcAttmZ=0!<(snc> z43{-Cn?5&EUSW~AJ6%z#oN~g~Ug)UtGsc@nDV=(#)TQKcy{yL7aF`f#Q`?{yYW{AK z52wrk^Gm5Qb^st!=m-D%?>`G0_uNHZ)sOX&`fe_tFayzx z%FMKpEAxOGlx>atOzMy2Ucb-)K)Cc?jNc#S05r>g_iN;8zmL!W3QuqKcan(...) + ok 3 - output file exists + 1..3 +ok 3 - decoder +1..3 +;31;25;22#11;2;31;25;19#12;2;28;28;19#13;2;44;38;31#14;2;31;30;27#15;2;47;38;31#16;2;28;28;22#17;2;25;25;20#18;2;47;38;35#19;2;41;38;31#20;2;44;42;36#21;2;47;49;28#22;2;35;25;22#23;2;49;47;38#24;2;41;35;31#25;2;42;41;28#26;2;38;27;17#27;2;41;31;28#28;2;44;35;28#29;2;31;22;19#30;2;38;28;25#31;2;41;31;25#32;2;35;28;25#33;2;38;31;28#34;2;38;35;28#35;2;35;33;30#36;2;38;35;22#37;2;44;44;41#38;2;53;53;53#39;2;63;66;63#40;2;74;74;69#41;2;78;82;78#42;2;82;82;85#43;2;93;93;91#44;2;97;97;94#45;2;93;96;96#46;2;89;89;89#47;2;85;85;88#48;2;78;77;77#49;2;63;63;60#50;2;61;58;56#51;2;56;55;49#52;2;56;55;55#53;2;75;75;75#54;2;71;66;63#55;2;58;60;55#56;2;50;50;50#57;2;33;31;17#58;2;50;49;45#59;2;69;69;69#60;2;94;94;97#61;2;91;94;97#62;2;69;72;66#63;2;49;49;44#64;2;22;20;17#65;2;88;91;94#66;2;89;85;74#67;2;88;91;97#68;2;91;89;97#69;2;66;69;66#70;2;39;38;35#71;2;83;88;89#72;2;72;75;75#73;2;63;63;63#74;2;47;47;47#75;2;85;88;91#76;2;28;22;16#77;2;72;72;72#78;2;88;88;94#79;2;35;31;22#80;2;78;82;82#81;2;66;66;66#82;2;25;19;16#83;2;24;25;25#84;2;85;85;91#85;2;82;82;88#86;2;35;41;35#87;2;82;85;88#88;2;80;83;86#89;2;85;88;94#90;2;20;25;20#91;2;52;55;50#92;2;64;64;55#93;2;78;82;85#94;2;82;85;91#95;2;78;78;85#96;2;16;19;16#97;2;17;19;17#98;2;75;78;82#99;2;75;75;82#100;2;72;75;78#101;2;72;72;78#102;2;69;72;72#103;2;69;72;75#104;2;19;19;13#105;2;19;16;9#106;2;24;14;8#107;2;66;69;72#108;2;66;71;75#109;2;22;19;13#110;2;19;19;9#111;2;69;67;75#112;2;66;66;72#113;2;69;72;78#114;2;66;69;69#115;2;69;69;72#116;2;53;56;60#117;2;78;78;88#118;2;66;66;69#119;2;63;66;69#120;2;75;78;78#121;2;63;66;66#122;2;72;72;75#123;2;78;78;82#124;2;31;28;14#125;2;60;63;63#126;2;60;63;66#127;2;56;60;63#128;2;56;56;60#129;2;53;53;56#130;2;50;53;56#131;2;75;78;85#132;2;60;60;63#133;2;75;75;78#134;2;72;75;82#135;2;61;64;69#136;2;47;49;53#137;2;19;16;13#138;2;25;19;13#139;2;75;78;75#140;2;56;60;60#141;2;58;60;66#142;2;50;53;53#143;2;63;63;66#144;2;47;47;50#145;2;44;47;47#146;2;75;75;85#147;2;72;69;78#148;2;60;63;60#149;2;53;56;56#150;2;17;14;13#151;2;69;67;69#152;2;47;50;50#153;2;13;9;0#154;2;83;60;44#155;2;67;55;44#156;2;66;50;30#157;2;39;36;20#158;2;89;72;49#159;2;78;63;22#160;2;85;71;35#161;2;69;56;19#162;2;60;53;22#163;2;60;52;11#164;2;44;42;19#165;2;50;50;53#166;2;25;17;20#167;2;31;22;22#168;2;25;25;11#169;2;28;27;8#170;2;24;25;16#171;2;25;17;5#172;2;25;13;6#173;2;42;33;17#174;2;82;56;30#175;2;80;60;9#176;2;56;42;19#177;2;56;49;38#178;2;44;41;8#179;2;17;22;6#180;2;35;30;8#181;2;28;19;13#182;2;22;16;14#183;2;11;16;8#184;2;16;16;6#185;2;86;61;20#186;2;39;25;3#187;2;33;16;5#188;2;35;20;9#189;2;44;28;25#190;2;88;58;8#191;2;17;17;3#192;2;16;13;3#193;2;16;13;9#194;2;25;13;0#195;2;44;33;6#196;2;16;16;9#197;2;78;50;20#198;2;19;13;6#199;2;77;50;11#200;2;71;52;8#201;2;30;17;3#202;2;13;9;3#203;2;3;3;2#204;2;9;6;2#205;2;35;17;5#206;2;67;44;17#207;2;31;25;8#208;2;16;19;6#209;2;19;6;3#210;2;78;45;5#211;2;78;52;6#212;2;61;42;6#213;2;5;5;14#214;2;19;16;17#215;2;13;13;3#216;2;49;31;13#217;2;8;11;2#218;2;11;6;8#219;2;66;33;3#220;2;25;6;2#221;2;33;8;3#222;2;71;44;8#223;2;53;31;9#224;2;58;31;6#225;2;50;56;56#226;2;14;13;14#227;2;53;24;6#228;2;49;28;2#229;2;55;22;2#230;2;49;22;3#231;2;47;17;2#232;2;42;20;0#233;2;16;6;3#234;2;39;14;3#235;2;39;19;8#236;2;49;20;3#237;2;11;9;9#238;2;41;14;0#239;2;13;13;9#240;2;9;9;3#241;2;11;13;14#242;2;13;9;6#243;2;42;25;5#244;2;8;11;6#245;2;16;19;9#246;2;13;13;6#247;2;45;20;3#248;2;35;16;3#249;2;44;17;0#250;2;69;72;69#251;2;69;75;78#252;2;9;9;6#253;2;78;85;85#1_O_W?WcGcWCYcQcAc?O_?OC???O?g?IScE{A}A|A^_NOfGRDHVHeHRCBGBC@!4?BCJ?BC@A#5!6?_#4???_?_?o?o?o?o?o?oKocWcW_}_}guxukNNNDNNDNNDFfBBP`@f!6v!11FBBP?C!8@!11?BB!5?@BB@#6!34?_?o?_O_?o?sgsgSgug}h}i|y~}~}~}~}!4~^n^b^J~B~@J?V?@?@A@#8?__GocWcY_wcYsIsGmWeOmGvGuHuKzCyDKa?i?a?cC?GCOGS?kQGSIOKaCYCQcgC#6!29?@?@?@?@O@Q`HQdIT@Ul@~DzVj~j~V!14~}!7~}z}z}!12~|z|~}~}n}~}|y}}[B_?O_?O#4!20?BFLFXFJ\v^~~t~~t~~t~z~v\z|v|~V~~V~~V~tkS[SKSSGOgW_wgO{~vV~nz}juzmzuzmjV~Tj~|zVlzTlJPhntZntz[tzlv|j|vlv~^v~^v~z^z~z~z^~^~V~nz~$#0^n^F~FZFZFjDJDJT@RdJRDR@JRdJPBD@JPBD@@A@?@?@#3!6?_?o?OgOcWewuxm{zs~{z}|!6~^~~~N~NvJ~B~JvJnJvNrNZfZf^@^@VHEHR#5oO_Oo?oO_WgOkomYkW!6G!11w{{m~z!8}!11~{{!5~}{{}!34~^~N~^n^~N~JVJVjVHV@U@TAD?@?@?@?@#7!4?_O_[_s?{?}s~g~}~}|}~^^vNZfZd^FZDJDJV@F@NPFGVHEHBCJDIR@^@VHVJRnVjNfJnRLvJtNrLZDZLZVZn^~F~VjVnRnVn^vn^~n~^!8~}~}~}~}n}l]ulYti}hQ}?yCgS?S?g#5!14?@!7?@C@C@!12?ACA?@?@O@?@AD@@BSJTATj?jTjTnZvJ~n~^!8~{wqwewsaG_#11??I??I??I?C?GaCAGA?g??g??G#5??@a@_`ahAdADADAD#11???g?OC?SGCOCGCOCG?iS?ACgQCgQCgCOIcOICaGCQGASAGQG?_G?_G?C_C?C?C_???g?OC$#2???_?_?o?_O_OgOgYkISkig}skIsE{oiOg?w?{?{_]omWvkyugUXEkjSfWbWFHEP#12!18?O?OGC?K?CGCOCG#10!17?_Oi?oI_OaOGOK?C#3Q#13!154?_?o?_O_W_?o?_?o?o?o?o_[_SgSgOgO_O_O_O?_?_?_?O!4_??_O_?w?gSgOkOgO_GO_?O?_#9!91?_gSilISnSiSiOcGs?O?_#10!43?_?IQHaJQHAOIOaWAOi??G!24?A?_AQ#3!6?@A#5!25?_$#3!520?d?D?D?D?B!6?@?@?@?@?@O_#5!11?OC-#2s~s~s~t}|zu|v|z~z~z~z}zv~]~n~U~nU~F~VnZm^vMrNRDRCIOBC@A?@A?@#12!7?_O??_?O_??C?GA#5!18?__?oO_o_OoGoKvxmzs~y\vy^t~m^j!10~}~~}!4~^~n^vZVlZf\bNPnRnRnRnVhVJVjVjTnVxVkVzNrNrNrNrnVz^vJ~B~B~B^bZBZd]B[BUhFGQL_HAHACABABAA#7!8?_?_W_SgSiSgvWv}t~{~|}!6~nVNfZB\ASJ??A?@#15!11?o?_#7!9?A?@A??@!9?@??@A??@A?CHAHA?FOBS@U?CJ?jAJQdJsBkZd]`^lv\z^!13~}~}|zulQlQlOjCqHqLOiC?cO!7?_O#5!34?@A?DGODgAGS`IsJ{B{Js^lvz!9~|!4~n{{AOeGQcQKOdOCG_OGC!9?g?bB_B_B@A@#11!9?A???cHCODGAG`?GAOC_GQdGCPAG@QCI_CGCOA?@??T?G@??A???@??CP?H_SG?c?Q?@$#1I?H?H?I@ACHAGAC?C?C?C@CG?@???@??@!6?@??@!6?@#5!18?_OC?aG?P_GC`C_#12!22?O?O#10!5?GA??A??A#4!18?@??@#9!4?_?O_GcgQcWa[omOkOkOkOgUgsgSgSiOgEgRgCoKoKoKoKOgC_Gs?{?{?{_[c{#6cY`{b{hUwvlq^u|u|z|{|{||!8~^~^f^jVjTjVGfG@I?B?A@#8!6?OgO?CSalJ_VlPmOMPeGTAHQDA@?@?@I@IPEHeH?CG??A??D?D?D?DGQdI_H_JOcZ?QcOCX?C#6!40?@?@ACHQlQlQnSzLuLqnTz~Zn!7~^n!34~}|vGqDgQ`SBGC#4!20?A!4?OBB|nXvlZlrnYnzv^mvz~tZ~|v}z~T~[{[{[{{{u|~u|n~~|~|~~~Zuznyv|v[~u|nz^vlYvhAs@Slzt^zvzn|~m~~i~v}^n|~n~]n~zm~u^jv~Z~l~}~$#0@?A?A#3!20?_?O?g?Og?w?gOcO_GoKokiKzsn{z]|^m|N}VjVl^nVNJfZFHFHAJ?BA`CBCHAGA@A?A@A?A@?@A?@A@?@!5?@#14!7?_??_??O_O#13!140?_W_g?O_SgQkPmpmXvi|uly|}N}^}t}tmxuXu|zu|~|}~y~y~y~yvkYt]s^smXczcXexewj{j}h~zs~S|slYsJ{RcY`]_QGaC_#9!82?GqDiQD[bgUpJsB{BsJ_QGC#11!31?@???Ic?AG@C#10?A???B?B?A?GA?HAO??A#3!13?A?@#10!8?QG?cA#5!10?O!6?_O??O?_O$#10!46?O!6?_?_O?o?gSgQ_OgOCG_GS_U_CRGOG#3!440?@#5!34?cHQg$#16!47?_#4!23?O???KO_oCOZ{zu|v|}|~|}|~|}~}\^}LmNMNnNvNq?CPCH?D?GD?I?@?C-#3osgQSwQWESRoQDQQcATaORcbSBSB_R?VcZcv[rczQtJpWeOlRkRKbLQdID?@I@?A`I@IP???@#9!28?_O_?O?OgOcO_#6?G_?COCG??CA?iC#9o_WcycZsjSjsjSzSzSi\yD}JuLuF|Juj@MPlPidLpIuOdIpEhIrEhUPvCjSfKrElQDM@IJ@NCRKJ@ECL#7!21?_?O_SgUgTiSzkV{j}l~~}!6~^n~F~JVlRIDITA@?@#15!6?_G?Gs?kQcY_VCRCJOFoFGeGQcO_Wc?SA??o_O?o_O#8!9?@???@?@!8?O?O?O_O_#19!18?_O?_O!4?oO_?O#9!64?zCrSjcWfGUpUgvGv?SaGPG#4!13?T??~~TMDJE|yVn\j^vl]nznVzlZulZulZulZuj\uj\uZt^n~^~^~^~^}^~]~^|v}~t~z~}z^xsYpj~Yn~v]nz^u~Ynl~u\vz|m~\vz^u~\~zu~^~V|Z~~$#2NJVLjFLfXbKJDy@lBXaLJcJOJoJgVGvGBCB?BCJ?@??CA?@A#5??_??_??o??o?o?o?sAPgS?ACHasYpmo|!5{}{~~z~~z~|b[ju[Je^SjkfQlZlV}dZuXeztztyTyTrJ^dZDZcJSjSJSjCjCJTADI@CHAH?A?@?C@?ACP?Q?D?HQCGPAT?HQ@I?JSBGRCHQDiPaDOc?BGB?CG@A?@?@!4?@A#8!38?_O?W?cGAC`Q_?GCQcITaH?A?@#18!7?_?g?k_cG_G_O?_??_?_?O_gw!4?_??_#7!28?@A?I?AChAk@lAlJuLzEZl^Fn~Nn!4~NnN^ne\zUlYtilYdzeHsHUgDiPCaOH_S??_?O?G_#5!34?PA?S`MhVGvG~j\vmv!13~i~~??ipysxADgOaS_GQ`OCOgCQcHQcHQcHQcHSaGSaGcG_O?_?_?_?_?_?_?_!10?_CIdIS?cO?G_OC_H?dO???aGCAP?aGC_??_!4?_?_$#16???_??_?_G?C_?g?O_?O_?O?_??O?_G??_!7?GC???C??A!8?AG??I#12?C!5?A!33?_#14!7?G?QCHaH?ACI@gD?GC?A#6!14?_?_?o?o?o?w?sGSyomOiCY_MoHeGpEgS_KoCgcGo?gO_Go?gO_[ocYowcosypyo~}~}!4~}|!11~^~n^jVhViTjCRgBS@Q??@#13!9?_?O_OgSgTitylYti\u~|^u~vJ~RlZD^?z?ZOfWFWfXVlZN^FZnJTF~N^n^N^N!9~}~~~}~}!8~n~n~m\nT~|zU|R}Q|QsHqCxcQ_W??O#6!7?O_?XaChQdITQdYCXuJuhVyTmz\nu^j~~^~n~v^!29~CzKjSIdWbG#11!64?@??@?A!10?@??@??AG@?I?C?@C?A!5?@???@!7?Q?H!10?H?A?CH???GAc$#10!10?_?G???G?G?CG?G?G_CGC?_W?OG_GO?k?oIcPiOkPKr[QlIDyLEdITL??C?CA@C!4?@!479?@?C$#17!14?C??C!5?C?C!8?G!4?C?A??@G#4!9?O??o?OC_?Y@wcAh{xyu\JcMPNA!5B@B??C??C?A[bSHbSH?JCRGDA?A?@-#3~Oq@ugRokRg?vgQgRsApQcX_Z_X_Qs@titjSjDa@a?`?@?@?JQDI@?@?AC?@A!4?@#9!11?_?O?_?OgCgQgSgSgSgSiSgVg]isJ{RkYlyT}sj[yUxuGokOi}Wv]|^}^~N}\~]|^~N~ExEhUHATAT?TASAS`SHATASBSjCjSjCjSjCjU`MPm@mPm@mP#5A???@#7!12?_!8?_O??O?OKoDyCxExe|i\v}t~|~}!9~^vnPKaLOBGQ??@#15!7?OgCgTa[`]?n?PAD?ADA?oC?S?C?H?O`CO_CAgACOC@G?O@??C!19?C#8?dG`I_ITi#7???i?IOAS?tItItItlAQx\Kmzx|GidOIut~z}tmxfzexehV`]hUwDiWa\?i?PGCa@OCO#9!28?~?~?iU?lJoESqeOjS`KPI_H#4!13?H?~~T!4?~~~`^uXf}hVylVylZulZulZulZulZulZuZe|jUzuLyVyVi\uj]j|^uz|m^zmvz\}nvz]nv|zn|vZn}v^l~uv|mzv]zn|vZ}nz\}vz^l~Z~~$#10?i?sGQgCQgOeGOcPkAxGcXcQcXcYcHqGSISjSYL]PMYjUxIz_C_@sAY?H?CG?DA@#4!32?@?A#6!22?A!6?_?_?_?o?_?_?_?o?wExUhu|i|i~i|j|j]ju|i|i{jSzSjSzSjSzSh]pmP}PmP}Pm|~~~}!12~^!8~^n~~n~nrNyDzExEXATaG@I?A?@#8!9?_GOe@OA_C_D?Qc?C@A??@#18!8?_?OgCgy|[wx^Nz^j~Z]u~M]zN^z\V|Znz]U~m]oqhsAxCq@GC@gAPGA!5?G#19!26?AOlCAaPCCAvOIdPG#5!67?T_HQ_CXaLOnSj]rmt^u!13~u~??i!4~???]_HeW@UgDQgDQcHQcHQcHQcHQcHQcHcXAShCHqDgDgTaHS`SA_HCAP_CPGCa@OGC`OGACOAGcO@G_???GAPCG`COAGc@OCa@GC_Q#11?c$#16?DGA@C?H?C@G?BGA?GCAGA?L?E?DGAKA@!8?@?C??C#5?ShYsIx?|siyU|q|Yv}T}}u~z~~~|~^~m~^~nVzVlVjVjVjVjSjTgV`TJsBkRdQDi@JSbDhEHvLQnT@fG@A?@???@A?@A!4?@!21?@#13!89?GqLoNwVg~lY~z}|~~}nVzVi\b]@~?ViT?A@?C!7?`??@#21!11?_#13`?@?NLQJ|EzL}vz}V|mv|!5~r~Yv]t^tiT~~~T~tn|j~ItItItIOl?A_P??A#6??DOIc@I?C@IPEWCXEXUg]`UhFyTf\a~T~mvz\}nzn!28~?~?~?Hu?SJ_H?H#11!111?Q?H$#2??DG?@C?@?CP??@C???C??A???A?@#4!8?_O_KoCOGEOC!5?CcA?P@_?G?CG?i@@H?C???A???@#14!42?@#20!167?_A?_??_!6?_??_??_??_!6?_$#17!7?A??A??C???@??@#12!23?_?_#14!16?_#21!235?_-#3yDiOMOlQcRkPmObChUGQlOLQKOHA?AS?P?DGDGCG??A!5?A#9!9?_?_?_?o?kOiSiSiTiti|j|j[ZuLynYTi|YsnWviLuLrJuHv@~@lJTiVgViTiTjTmRlUhVkRiDYbEHAJTaDIPADGA?A_O??CG?CO?cO?C?_CO?CO?OG?O?G?O?G?O@GAHAGAD?D#7_GCOGC_S?s?s?s?cWasGqGsGqLSiLyTmXvi\u~|zu|y~~}~}!4~^~^nnZdZcHaGQDOD#15!11?OkPM?NOBGCI@!8?A@???@??@!6?@?A@?A@@??P??PI_COG_O#13?bNY~Vj~ny^uz|n}j~~lZ~~ze!4~y~yvm|j~iTmTzT?i?T?G?A#6!4?Ag???@?@??DG@QdIcJOfGVgTipEhU|Yd]b\uZl~v\nvz~V!20~?~?~?TgDQ?C#4!23?S@?S??~~jvNxvI|Ze|jUlzUlzUlzUlZulZulZulZulZulZulZulZuZe|jVkZvi~V|u|}~m^~U|}~\lvz~U|nuzlZulZtmtN}i^uxnyt~V|nuz\~mvz|n~~$#10DIDm@nALBkBE@NSJU`ELAfQdBjCTjDiFCB_?A?B?AC?C@E#6!35?_??_???_??_??_?O_GoGsGs?{?{QsiTgVgTiTiSiOkQgUgQkOyc[xu|si\ytm|yv|~|NnvRrVzjnZJfRr^ZjnZjn~fv^nvv^nvv^nuv|u|v|y~y^vznvz^j~J~J~J~Zf\JvLvJvLqjTqDiPeGTaH?ACHAD??@?@#8!4?_?_OOcYCRCPD?gA?Q?A?@??@#18!6?_O_Gsapcw^}vnn|~v[}n|vm~z}l~~l|v}|t}|tumvmin~mt^jnvNn^[od?gS?OD_HCAO@S#8??Qc??CX#7!4?D?DGPAS?TiPiCGiTTiifrp||~CTR~~~}~}~~yv}lYtZsnWvgViTMxUhAdY`[aHcQ?GaOGC?g#9!20?~?~?TiEWhcZ_]`UkPaLOd?QGCA#11!77?P??HA@?A!18?@$#5?_O!5?O???O??_???_!4?O??_?O?O???E?DGCLACAC?Da?Q_ggw{{~u\~Z}^~N~RnTjTjTiTITASASBcHQDOdITADJOFGDQ@AC?@AGA?A!13?@??@??@?D?@#19!16?O?GcG_CO?cOGcG_CO?cO??G?_?G?_?G?_?G#13!68?_GqKqlQlyl~|~}~~}~~~nRmPnOfGTIPE?@??O!8?O!7?A!7?GO?P#19!53?aT?i?TOKKAA?zgC#5!68?i?PaCZ_^`]hRm\qnY~lvz|!8~j}~j~~??SGoEGtAcXAShQChQChQChQcHQcHQcHQcHQcHQcHQcHQcHcXASgRcGT?gAHA@??_?_???_QGC?hAOHCQcHQcIPIo?T_HEODI?gAOHCa?PGCAO$#12?O??_???G!5?GO??_???_?_?_GOg?gA?A??A?@!4?A#5!106?G!8?G#21!122?_??O?A?G`?OAG!4?Q??Q?G??G??G??G?C$#16???@#4O?O_??Og?_???GO?OG?G?CQ?C???g{Wpwooqoxxxwxy\|l^VVFBB?HA?C@#20!223?G!12?C!8?A??A!6?O!4?O??O?_$#16!18?@!11?@-#4O?PAGqSApG_ADgS_@??GJ!4?_AO??AGn~~}~~^N^KFBbB?G??G!6?@#6!13?_O?_W_Cy@QGdAGtAhSiT_ItK}hUxulyd~kZu|}~\NelV|]ned~~EvmlvT^nmz^Znzmh^evZp|KyViVlSe\rFYfTjTnTjRmRlTiUjSkXeYn\tM{TmYjqMt[C^mQlQlQlRmOnQlQLQeGRcAHA?A@A?@A!4?@A#13!13?Ok?gSgSgSgti\y|}hVzmznzv~~~^tf\js@?A@#20?_?GA_C_C?O!9?@!18?C???_G@c?@?_?O??G#8!13?A???@A#7!8?@?@ChAGAtAY@laUZHl|RZW||RrnbVJb^BjBbf@JePzuLyc\sJSjQdI_ShU_SIP_COAhOCg#9!18?~?~?Zc?ZcgN_~?|A{@}@{?Qk@W@G?G#4!4?@?C@G?BbALZulZulZulZulZulZulZlrm\rmTzUlzUlzA@BA@BA@B}tZe|J|Rmt[vj^vYf|J}RntmZtnYvj\vZe\ze\ju\e[tYvjuNzUzVlZvi^bLRiRHv^$#3i@G@aDGTA??@ADGPcHODOdG@?CGAGQCO#11???@#9!20?hAgRCrCz?~?~OnYTjlYfIz?}hfYxvI|UjTiZtIr@UhEHQDY?RcHA@?A_HQgA`?@I??PG@Q?I_?PC?cOC@Q?PG??AA@!4?A@!15?A?@?A?A?@??A??A?@??@??@??@#8!47?A?@A?B?B?B??A@A@SgCPCOCG#18???_?W_SI{}|}^^Vvx^z\z~nunz~^z~\~u}l~u|n|~u~z]~|v~\~z|n}^v{Yz{}U^Nf~E?PegcQ@OD?@#19!16?_??_??_O?G@cAOH_cQAGcfAAkCOK_SG_S?[?WcOGC#5!51?cHQcHU_^?~A|B}@}B~lR}f}v~v!4~}~z}v~{[|qcHQcHQcHQcHQcHQcHQcQKPaKPiChQChQC|}{|}{|}{@IcXAsAkPIbGS_GcWAs@kOIPcIOdGSaGcXaCXaSHaXbIdGSHoChCgQcGT_[qkTGuG_$#10DOeG?Ga?GCIS_?ACGACa?AOEgBO`C_HA#19!78?_O!5?OGO??g?O?G_?O??_???OC_G?cI?@??D_A@?A??D?A?A?A??@?A?@?C@A?@??A?@A?@??@?I@A?@#15!76?I?A?@A@??_?g?C!7?O!8?@???A!16?@??A@???G_?W???G#6!50?G?OG_S?gS_[?YcPiCHqDZaJsjSlYt^jUh^jtm^zn|UnzV!18~?~?~?Ql?Q@O#11!90?@#10!46?C$#5?i?_T?@gCaP_GQ`GQshOcWdgTWcKqLocO!5?_o_rw{[{~v~~v!5~U{VkzKzC~?~?nOdICQD?T?D?CO?C!7?C!20?O!5?O!23?C#7?oCgOGOgW_Kw_WgSgOgSkOkOgSgOgOcWcO_Go?gOcSKo?_w_OkQlQlQkPnOlQlqlXvkZ|u|~|}|~}|!4~}|!13~lR}TjSjSjSIT_C??A#21!27?A???H?C?_C?a?G?Q?H?OA?H?C`?AG?a??AO#13!5?CA@@?_??p~eXVZl}ny~}~~|~~~}|!8~]~}ZU|VlItcYOL_CQ??c#11!216?_$#12?C?S!5?PCGO??A??A???AOA?@?@??@#5!140?@!7?@!7?A-hQCOIO`QcGqCxCOdZeWvGvi\a\itYlYtOwk}v~n|!5~v^jvZvlRmPmPnPmPeXAl?dI?AC@?@#19!18?G??O??_???O?G?cAPCgAS?IOCO?gS`IsApCgQcHSaGT_DWaChSaHO!19?@???@#13!59?_OGOgCOoSiPiTiTiTi~y|u~|!4~|~}~~~^nZdYlUHF?@???C@@#21_???O!4?C@?A?GA_G@?AG@c#15!5?OOG!5?_?Gc!5?CG?CG??G??O#19!23?I??aGC@_?C@_QGDO?iAPH__O?Nd?IdSHcQ@kRCiPC_O#9!46?~?~?Zc?zChIShRItITITaKpCRk?T_P?O?G#4!8?O??C_p~mP~UhvmXvYf{jV{juZu\zUlJELJM???O??T?_NNzsnTyvLyvI|Ze\ze|Zt}tz|u\julZulZtm\rmTzlUzlUzUlZulZlr]tjSJoiSHun$QcxjskYcZuLxEylY?ODGaG?AS?OAcOc?nFR@G?OA#9!5?G_SGcGQkPmPmOmPmXe|QNY`TkXa]_^_NOjCZdITaDIPEHQ@Oi?HQ?@o@?@Q?G?c?PC_?O?A?@Q@G??GCA@!4?@?A?@!5?@#7??CiTj}jU|A|iTzuhU|q~syS~SwU|qnYt]tI|iTyTi\mZuLydZu\qnYti~ytMzv}l^}!19~^nvnVznNjTmTiTiTiT?DAH?A#8!4?A?@#18???_OcWdQhuw~]~~Pym}^n|vl~i^~j]NT~v\^vM~|V}Z~ululjfR}h^r^E\QH~m^|nyvvzvzZVEeABP?Oc#7!22?A?CHaGAL?qIdTTkeU^Nn~OYytOjcQHsQ?gPCiXfLzsj]hvH}hUhUGvGqDwDoGaPCI`SA?gA_C?GC#5!13?cHQCOAS`AK`ITiTi\rMzkR~i^m~n~v!8~n~~j^M?Pm?hUGPeGdWBSgBSHcHaChQsxqsp~~~n~~i~^ooCJOiDGqDGtAcXaCXAcI@ICAHaSHQcHQcIPaKPiCQhCQhChQcHQcQK`ISjsNPHcHO$#10CGAC@ACG?@?A?@A?cHa?T?T_HaDG@A@I#6!33?o?SiPa[`]_^onSzcYti\ytmxul}fT~el~]N}~mlvvZXkiR\jntlzmlUb]sBxKyVlZui\ti]yf\zUi\ujTiS@ShA|ATiCHUhAL?JCj?jEhALOdI`ItATiDiTaPcHqDYcHaLOdIT?DIpCG@Q_@#15!56?A!9?I#23!13?_?_!5?_!9?O?G??C?G_O_c#21??O#13!9?C_pXh[k~nZ!18~t~~\tzyU\r{QlDoIi?PG_?O??_#6?D?I?QHcI@kRCiPEGqCJS`UGu@UhUhvGvLyFyNv\mzt]j|~V|^z~vz!9~?~?~?Ql?jS`IS_S?_?_#3!26?O#22!101?C?A$#3?@!5?@#5!100?A!13?@#20!149?_??c@O??OAGA?T_?O?OG??_??O??_???HQHAC?c@Q_C?HA@Q?@_AO@?G??C_?G?C_A#11!258?a#10O$#12!5?@#15!284?_-#5iT?TIPcQcHQlQlQ?~@}DyLqnO~Y|^l~y~~y~~}~~^~n^vlZvItITiDIPATAOD?A?A#7!14?_???_O?gOcGS?OcGq_g#19CODGQ_HOCgAWaSHcPKPaKOjSIpEPiTAcHeOTAYDqDoJOm@O#13!69?_OGCaGCQGCQgA|?}PiSjszl]zulZulz!12~nZtJuLRKB#20!4?Ga?GAODOc?A_RG@I?@G?C?A@?_???O?CA?H?P_H?GCA?Q?C?CAO?GAO@c?H?C??_G?C_OA#19!23?c@GaOCA_OC@C?I_CBOK_QHCQ?g@bOsRIodKAp#9!48?dIPeHuIYcHrCiTGqTdIjShEOi@}@M_O?Og?_?_#4!6?A!19?FDAFDAFD??OC?OD?OD?Q?CO?~}Tze\julZulZtmZEDJVynVzluLzUlZulYvmXvmXvmXvmXvluLzUlZulQHqLQ_ny$Ti~itmZlZulQlQl~?S@QC_H?i?dA?A?D??D??@#9??_?O_GQcGtItiTytm|i\niVxnOnOfGVGbCHQdGA?@_@???@!4?@!5?DOh?O@?A?H?C#7!17?G??_W?OG?g?_G?GC_?Omlz}|~|~T}T}z}|!6~tn\zV}T~tn\z~}|~|~|~|~|z}|z~~}|z}!4~^!4~^!6~^nvz\vzlvzlV|A~@mTjSJCQ`CHQcHQC#18!12?OcIsHqkr{!4~v\^b|nynZ~t^Kdkdh{fljFly_TXqYN]q|ne|kXsncIlrH^j}z|nzv|n}Y^uuzz^VFvqQJHp?C@#7!22?GAoCHaGQ@T?Z_KbRLdQhlVV}KlJGtDIQpM}~~~}|z}lZu|zmXeXuH}hUh}?y@}?yDWaGcQHOdO#5!14?@?PaCGPAcH?Y`SjUxnT}@}p^n~nV~^~^!6~|!19~wy|wy|wy~~nz~ny~ny~l~zn~?@iCXaSHQcHQcIPcxysgDOgCQHqChQcHQdGPeGPeGPeGPeGQHqChQcHQluLOdIOD$#10!17?i?g@QCOD#14???_O#6!28?_?OgCOlOnWvgv[zulYv|~]^}~^n}VnZvi~nZvLYFQniul\uezR|f\juZmrm\rnSjtMxeTi\BuHfiTdYDyFoNPm@QC@A?A?i@i@C@A!6?IOaCg@i?IOaC?@A?A?A?A?AC@AC??@AC@!4?_!4?_#15!64?_S!8?_?Q?SA??O_O?UGAC@_?@??O?ACA?Q`OGC_?@!8?@_?H?C_GO#6!56?A?c?IO`K?@???@AC@QcHACPeXeHu@UhU@~D}@~Dyf\vZlunYn!8~YtmXuHsdISGrCgRCi?S#10!128?_GT$#21!280?G!7?O!27?O!4?C#13!12?_GHLcsM~z}!19~Z}vTlJxULrkyitCZoK_QGcQ?g??O#11!204?A$#23!283?Q?OA??Q?W?CHAcHc?`G?O?A?A?O@O?C_-#5{k{k{k{s~zl}Z|v\~~|~~|~~|!9~nVj\e\jQlRm?I?CG@A#19!14?_?GS??G_CO?aT#7?iSHcYCiCy@{RsiTypiXeXuh}lzu{sm{Z_G?S?_?G?gOOi_OGO`GS__Og?QHcAC`IOOiOsGOtkaTga[Sa!45~^nvP\nhdU}RJkUVgIdOn?^dYdIDOdIPAC@A#8cG`I#18!6?o?GsAsGdys~]~~V~\tm|Z~U~n}zNVIfJmh@csPPlWlZK|v]Qv[IIty\wl\kYNxyh\zv^}vMnz}fz~fyz\\vXZ~G?_yNA@OG!5?G#7!15?@I!4?@AC@cIDoEIjTCqHlSURjNffuyxsq!12~}|~|ZulYtiTytiTydWfGqDgQHeOISpCo#9!17?@!8?@??@#22!6?G??cA??O#4!14?OE?gA?gAOC!17?DO?d?Q?@@@?@@?@N^ItnWwOnvZluZlugQdYdYdJoEWaTIS`]_?iTrEGrHU`]`UWBOGpm\i}$BRBRBRBJ?CQ@cAGa??A??A??A#14!9?OGCA@#6!8?oIsA{a\qlqlYtm|z~Yv\~fbznuVRj~XG}TjuZdzTzD}BkJTiDITeXeHU@QCHBIPBcITeHuDZcjU@iCPNOfGUbKRM@UHsA[`YC@m@CJ?fGAPGAT?bG#13!45?_OGa?OAG_?cO@g?ToIdO~_YdYtynYtm|z}|Zv]t!6~N~vJ|JvYDJ?@#21!4?_?O?C?H?O@C??@!36?G_@G#13_!13?c?ez^D_x{nv!5~v!15~}t~~~zm|ymPsiLoS?iXCq?h_CO?G#6??@CA@!12?@A?AcHQdITiDITiDYfWvLyVluXntjMzN!17~}~~mXvGrMw~?}?vGQcH??cIP?O??_#3!12?@#22!57?@!7?C!9?t!7?_???G#26!5?PAC$#9!35?_O_WaSlQkP~tNpB{@\aLQLQdIPAC?dGA?O?CO@GgC?C_@#19!16?C!11?@???TaXaHYcRS@mDPM_fGU`GRK`UhcAX`YCpm@Sj?vGAPKaTGbGT!48?Ka?SQG@GcQ@gADOI#20!37?_??g?AG@A_?_!4?OGC?C?A?@??A!6?G_C??O??@_@O_OCOA@O_C!4?P?C@OC?OD?a??c??OC??OCA#19!28?CO?@OI@OAH`S?aHCQAHgCoOWHCAHK#5!64?PeGvKpE?~?~GvlZuv~ZPk~nn~^!12~mx~V|~V|nz!17~yn~Y~l~}}}~}}~}o_tIOfFnOGcQHcQHUlYdYdYoJxf\itj]`^ITiCXvGS@]`U@f[jTI???@$!69?G!8?A#24!134?@#15!53?A#23!9?_?oGO@SiOJcGQdQcR??@g?bCPICA?A?@_?C?A#25!22?@#11!230?C#10!13?G_?C!5?_?_$#15!278?_?O_O?SI?Ic?A??_A??@G?`c???E?AA@_?CCA!6?O??G??G?C?aGA#11!251?aG??G???CaC?_P-#5~~~}~~}!15~^~n~N~vJnj]tMzDYdYCXaHC@#7!9?_O?Og?sGQk?wCyCwcYoWskYskynynynyry|~}|~~}~|~}|~}!8~|agTQkaXTRKtRGicT}{|\[Nfvu~~mfrYMFbzz~vrz{keut||kv~V~n~^n~~n~^n~~n^~^~n~^~n~^n~~n~v\rf\z~Tnv\uj\uLrKuGza[bHUhAGQ`ChAHQ?@?AC#8!6?a??@#18O?o?ShCRkr{~}m~|^|j~|zn\vyl|ny~mz}lxXbQ[LI{l}|ftJIyzk]vYvrn|fk\l|Z~m\[h{v~z^z~U~L|m}v\t^mVr@@@_?EA?APG!4?@?@?C#19!17?OC`?C?A_DOI_Ca@OAtOGK?gCEA`_??C#6!13?CG??@aKPA?cHQcHqDjTItJuHuHulZ}V!17~ZulYtn[zExExEgTiCWaHQH?cPAOA#14?A#4!12?Sk???k#22!16?_?_?_?_???c?c?CG#10!17?A#22!5?@?_!8?A?O???@@?O#26!8?A$#4???@??@#9!15?_?O?o?GsOS`IPCYDYDZELQRGUH?@?@?@?@???@!5?@!5?@#19!40?\AgdPKagcRGcVPIg@AAA`oOGH??POGD_wWCC?GGCBPPGIAAP!52?@??@!5?@#25!35?O#20?A_AO??COaGDQ??@!4?A?_???O!5?G!5?O_GC?CO?G@_O???@_@?@???_C?h?Q?@??AG?O?C?A?@?_C@#7!31?CGOdGAgDOJwCidGIdrr^Rxx[]Nvzz!13~zv~~}\rm|~ZulZuLySitIsHuHuHQc@g#5!17?cHQdIObCxExExViTxfLsluvZm|n|~|~~^~^~^~^~~^jRj^nRV!15~^~]~^~^~||X|XlXdzjvkqmXui\qmXui|iTyTjUzUHUHvGvITiThEhCzEwEgDiShSJs@gP_$#6!34?_?__?___Ocguhu~}~}~}~]n~nU~JvlR}FyDzEYdJfIRdJQDODODODGDA?@A??@?A?@A?@!8?A?TAGAPCAG_AG_CPA?@??A!10?@!9?A?@???A#8!57?_??_?_#21!39?C?A!7?OC?PC?O!8?O!15?A!5?c?O??O?G?C#13!15?G{{}]~Xx}|mv!4~}~}~z!17~nzYvjYt\QidSBXSIt?IC?_CA?`??GC#22!78?A?OA??G!9?_?_?_?_??_??S_O?g#4!17?@!5?!5AQaQCSGRLPeHTaLPeHTATgDiShCgUHuGVGtiDiShExChEwFiPISbSHuEGVl~$#19!67?@??@??C?@???@!7?C#13!43?_??G!5?GC_O?C!4?C???G!5?G?g?O?_O??O?_O??O_?_?O?_?O?_O??O?GaKWaC?iOGaHSaHqKrHuC\a[UhU\uL]zU|ul~}~|z!6~\~~}n~N~jUzkRKB?@@#23!13?A!7?ACShA_PA?@AOIs@C?B??_G???OA?A!4?A?A#24!84?O#11!168?_#10???_???O!4?A?O!4?C_AG???OC$#15!277?@?CAGC`Ac@A!5?s@C?@?@?G???OA?A!4?aCA!8?_AO@G_A_@g?A#11!243?O!6?O??@??_AG@_GQ-#5~tJ}Tj]dZ}TzmtZ|nVj\jUj[b]`]pExEpCZ_JSaT?O?O#7!6?_?Ga[AlA\aLyTj[jsZ}T}zn^~]~~}!33~mMM~}mevp|srT[QqX|[]n~vrrXx\{UuRz~hlsunSqZh{mRxWm~nV|m^jv]j|nV|U~^unnZv~Ti\vlYtmrmT~n^qlRkZdYdZsJ{ALiDiTIDQGpI_ACOd?T#15!13?O??O?_?O?O???_??G?_??G!8?_!7?A@?A?A!4?Q??A?A@A@@??GGC!6?GDA?@?G??O?OA???G!4?A#19!38?OA_CQ?_G?c@?I?CIHCCA?L@GCFB#6!24?@I?OcHqChUgQdITiTiTiTi^t~v!8~n~n~n~n~ZulZulZvkRkRkRkRgQDY?D?WaG_#14?_#22???CH?AS_Di?iO_NOJOI?o?o!5?o?o???I?I?ACG@iSgDA!4CA?OOGCCA?OOGCCA??__O??@???A??C??_@!4?C?@???A??CA$#9?Is@iS`Yc@iCPIcAOGCASHCBK@M@MHEHA__OO`O_O_O_Oo?o#19!64?PpO?@POGEAHKA`lCCAB`??GGKCEAA@HGC?CQAH?AHCCA@GCE@#8!41?_?_?_??@sQCYCa@WdQCODW_?O?_?o?o?o?O?O_?@#18?GcBOHqCxas~~^~vt^Zn~q^un|uj^I^yn~Y~l~{un{v[zm~xcY|xm[ukYuzUtQztn~tzvRw|}}vvivf~n|FJP_f~r~|`_O?CaOGCA@G?D??@??_?_#7!17?O?h?QC`I?ID?iPSqJxlQq]bXW{^n~n~~^~~~^!13~}t~nZuLzUhVlYtiTiTiTiT_I?G#5!8?O?O?O?O?cHQcHQcGRkRkRkRkVlWcVi^f\v^~^~~~zu~|j^yT~TlZoNsdd^N~N~n~n^N~N~n~d~d~lzf]TjVi|hZypkZedrjWxVmDrYpkZuHNitj[qlOl?Z_zCISiDyPiOmOLsHSjGl?ISA$#6!17?_O_?_O_O_O_?o?oKZCNcILInNnNnN~N~~^~v\b|Q|a\qDiSbSJc@i@CO_?`??@!35?`???@?G?A?GA?H#20!129?GA_C??D?HOAGS_T??O!6?G!4?C??A@_??P_GOCGC`A`!4?IC?CA?@?G?@?G!5?A!6?A#9!148?_?_O_#4!19?AC?_?IO_!4?O?O_!4?O?O?O?O?O_???O?Q_@GPcH?CO`Cg@_C`GPcHU?DISADAL?n?ICRCi@ICI@M?fAHcBS`OmP`kT~$#13!118?G!5?_???a?_?O??C?a?_@g?c??Q?H?OhC_Q@OcA`O?OgAP_SG`SAOgAh?_HOOcG?iTaGQdIPKPi?O_LQkRCYDYCJsAH_P_PGsaGdIdYdZnI~I~N~N~N~n~n^~}nvZknULjELJ#21!8?O??_???@!4?D??d?Q???O?G_?O!17?AO!4?_!6?C#25!5?GC?@??C#22!151?A@G#11!59?A???G??A???G??A!4?O!6?A?Oc??_P??O?C?@??_A!6?_$#23!271?_!8?@??@?@?@?CGDAC?@?@_??G?C!6?G#13!7?OG!4?ookUW?G??[^n~z\nvz|}v~y~~}~~^~^!16~nl^QllZUtZsytTi`CoAOl?_Sa_?_O?O??_???_#10!139?A!6?A!11?_GO_O??P?G??S_@_O_OGO?Og?Q?PCIPi$#13!305?G-#5~A\aLQdIPiDqDwBsAdGRcHQDODQcIPaCjT??A?CHO?O_#7!5?`GCaGTa?hU?zUhvlY|vlZ~~vnv~u~u!30~^~n!4~v\nz]v|nvzz\n~znv|nzUlZulZul~u^z\ujSjSze\juHu\ivYlvYlvYluZlZu|Vm^nq|VlylR}d]tYvlYvi|A|aLqDYdRkJyszkRIcH_GOID?Qc@S#15!12?CHcAOG?O_O??GAOcPI_?G_!7?@??OC#20!15?G???_?G???GO!6?A#15!5?_G@CO?dI`?G?@_OG?DAo?G?A#7!25?O_CGQ???g@QcH?sOCPi@UgRkRkYtj]dYdYntvz|]nv|^u~~z!13~}|~|zulZtiVkZtI~?|AsAH?G#5!16?cHQcHQcHQk@}@}DY|j}tZ]lzTM~ZN~~~j^juLzdZM|ULxJyPvl?~TiU|vl?lZci~aRqnUprl?~QU|rh{h[YVepjzEHjPe\_^a[aXcXeHwSBwDqMGel_EhUlQHeXaTgPC?A@?G@$#9?|a\qLIteTiDyFsB!10?@!6?A?@#8!73?_?O#13!4?GaOC`GAOGC?aO?COGAOChQcHQcHQ?H_CaHSjSjCXaSHuHaTGdQGdQGdQHcQcHAgP?OLA??@A?@??A@!4?DA@?@O@G_OgA_C@?A?sJcZCJs_ZcJsJuhVlyd^u\vl~zuIxNa\aD#20!12?A?G?C!4?CO?A#13!17?G#15??A@G@?O?O#13?G!4?C??B!9?G[SNA@___o{M~V^|V~^}^}!19~n^zvl~~^QmlZuJJdYeTihVkRkRdIS`YdYdOI?CA`OGA_H??C#6!13?@A?ACHQcITgRcIt?~A|J|u~v!16~ZulZulZulR}@}@ydAS@Ic@QCiP?cO#4!9?O_??@_A_@aGQ!4?hAGQ!4?T?T_HO`AGQ???hAGO@S_CGPAOCOC?G@?C??AHA@COA@gCAG@OA?QH?Q??dO?CG_CAqHgScASIv$#6!5?_O?G?OG??GG|YvkZulynykZtm\zSg~}|~zun~n^!5~]vz\vi\~Uh~ChUGQdAGQc??GOG?H?H#19!47?C#8!53?_???gQCOk?Y`GcGQdGO?{A[aKqDICPS@ICPk@OQCrc@YcHOI_HUgQDY_HaGQ#18???PC_TaLIn~~v|nZmt^~v\~v~z~}t}znnxnz~~v}z^}v~~l~}vzv}^{uvy~dnnzu~~~|y~~{~^v}zn~YtQbbo{]NVNI@@?_??G??@?@#19!26?_DO???s?I`G?S!16?G#22!85?_???_??_???S_SHqCICpAgQCSCK??~?iT!4?~QcZ??GGC?GGC?~?l??CCAAA@_GGC??_?C??A??@?C?A??CA!5?`P??O#26!9?A?G$#20!249?O#21!18?@G!5?OC??G@C_@G??Q?@?C?@!4?C?A??C@!4?@#20!12?C#25!7?O#8!5?_?_?_?_#11!186?C???C!8?A??@_??C??_OS??A??@?C?A??CA@wCAG`O??UH???GcOASG???qDgItIp$#13!269?A#23!25?@#10!256?HA?aW_X_[_O_W_Ho???@oC?CG??_ChQ?AH_@APk@COAP?_CG-#5S@QCHQcHQDODQCPe?CHAC@CHQdI?HA?ACG@A#7!10?_??OiDgQdYdYdYtJ{jUlY|V!43~\vmZ|n^~nZ}Vl~U~~v~}Z|nu\jtmZtmZsnTyVmxVlYvi\juZ{z]tnZnvLyvLyvLzu\zu\zu\ju|nz]tj]jsZvkZuj[vlYehUhSjcZScZAkRGcRGb?IODODODO_!5?O#15O@C?A?APG?aG?T?`CO_??I_CPG?C?OCaWaS?O_O?O_!4?_!13?_G??G_?I?OAcG@g?dA`?@C_A?OG??_I@O?c#8!5?QCOdGPGPGPGP#7!5?O?OdGPAS@S`CHQcHQcHaHsBGjT?~?zUlZulZulZtmZun|V~\~~~vn!9~u~un~~~i~i~iTmTzUhUhUoDyChAHD#5!16?cHQcHQcJShA|ItiTzA\Ge^Hc}Lmurzn~lZulZulQnydtn|bRqnYvmLbcWMJmjmBaxPIXR?}d]FLzmraXGi}IpGCKbOhSRcjCQhUgR_IpB}?[BsJTS`iSAPMpAx?_O?I?dRGc$#9jShQcHQccIjgcJiH#8!96?aGO_?O_?O_?_O?_!51?CGaCHaSHAOC`IS`SJcGRcHSbGQ`WE`QHSJ_JPcXAcRGcPKOd?iAgAgALOaSgDi??OcGO_#18A??CO@_FMjBA~~t^zmuzzunx\f[j~f[nvmN~z~]^n|~}n~\~m~v~~^v~~R^ut~n|Zu}V~Y|]xoo[W^NV^C?_?C#19!43?OCAG_S?i#6!35?H?HO???T?T?TiPiChUhUhNyDzU|uy!16~ZulZulZsjU|AtITiCxAtG_QH?Q@GC#4!14?IOAS_HOD?PaCPcOC@S@cPAgCAg?@Y@Ga?PCOa?S?TAPGaCbOHCP?hCO@?GT?GC?A`GA?i@S?@G??G?CODI?_OAKbGZ?Tn$#6?iChQcHQHoCQHoCO~zu|z}zulYt~u|~|zv}|!10~^~~nTyVlYdYdYdIsBShQdAg#13!45?@CA!4?C@GA?H??G?@cAOHaSIPcIPcJOiDgPEgQdGTaSHcBC`IOcOGqDGqDGqCHa?@!24?C@OGCa?OC_I?cPGcRGeOnOnOlQlQlQn\jVyDn}jZtn\kv~Xf}IwOOg[#21!18?@??@??C?@??A?@??A?@#13!23?CMIBd!4_z^T}j~Z!5~lznYvmvmvmvm!5~n~nYvm|j}j]zulZulZuLqHsV?iT?~ChQcHQcHQcIPcHOAg?a???GO#22!71?C_AP?cQ@_O@GCO?QcHQcHQlODY???GGC!4?OOIA@_O??WGCC?_C~??__O??GGCv@@?GCaPOGCA_G?O#10?AgU?AcAw?W?S@s???@iSaPE_ALQ_PCIO?O?Ci?O$#20!257?C!7?@C?H?A??@??G??G?O???_?O???O?_?O?G!6?c?H!5?@!8?@#11!189?C!6?G?@_O??O?C?A_C!5?O!4?C!5?CaP?GCA_GASAhC?@_GP??@cA_G??i?S?@K_?\?_?DMPdG_CR_Ti$#25!258?@#13!18?A#25!41?A#10!194?_G!14?P!8?C??@!4?_#26!16?C??C#22??@!6?I#26??_!5?AG?_-#6om|{}{|}|}|}|}|}!8~z~z~z~z!11~|~u|ZmtnTyVlyTmPnOdY`ICPA?A#8!11?O??O??O???_QGCQG!16?OCQ?L_JShATgATgA_O??_!7?_!14?O!28?@A@?QGDa?HaODAOHeOdIOiCRGCRgCQdOGj?Hs?TgAgAGacICOdG_DQcOdW`Y`IOh?O_#25!13?G!9?_#13!35?_???__owM}Jtw~Nvz~|~|~i~h~j^zvm\zV{V{VkZsJ~j^yvm|j^}n]zUlZe\rlSzd\qMXsIt[c^c\aSIPCA@?aPAK`GA?A!5?A#6!4?CG???A?A_???T?T?TiSATgVgVkPmP~iV}!17~n}l~m|m~iTmPmPiTIPeHAS@a@?O@#4!13?S_L?T?cAo?HCGA?A_@G?aGQ??hOCGPA@S?@?GA?K`Q?D_AC@C?QHCOA?C?POG_[?OCW@Ca@O?gAH?C?A@__P?@oD@GaCPmP$#9A@AA@@A?A@A@A@A@#5!8?C?C?C?C#7!11?A?HAcPIOiDgQDiPmOnYd]tzm|~l!11~n~~n~~n~~~^lvzlv!16~nzl~q^sjU|iV|iV|Vj^tZf|Uj\uj\uj\u~luz\}vLzuLzUlzlRn\qn\qnYlr]tjU~lv}Zlv~}|}~lvy\~u\ny|nuXnYtnSzktzkTylQlbSjsI|iToDOdO@O`EGQCG?HA#15!8?C@G?PK?O@G_G?C?S@AG`C?hAsBGRGaDOLaSGdQChC?QC?T?AOC?T?Cg@?g?PcIOI?HC?C?o?SA??OGC?A?A?@?A#7!9?A?A?A?A_?S_DGPAS_@O`ChQcXaKOiCWaKpcItGaZ_Za\jtmz|}~\m|r]v|~|!5~|!4~zv~~~|~|^~~~i~i~iTj|iVgVgRmPm?Tg@#5!17?O@Q?PAP?TiPmPmTidkXSsji\[}NkzmZulR}TjUxVkj[QV_kItBXSgU`^hUYDePqKVlEljcMLajZujUhZ_M`NoKPb[_YDcPId\a\aCB?B_B_?cGWCjAT?sAhQlSM@M?M?I_C?G??G$LO?@?A?@#27!60?O#13!59?GC_ICWAhSaHSAHSaH?QHCa@GqCHaChQCQkOaLOaLOdQK`ISh?QG@cQG!22?@??A??A@?GAS?SA@A?ALQlQLYdYhQdZqlQlYf]d]tnUzmU~krulye\So_??o_#20!5?_A!4?C?G_??_??_??_??_??_??`??_!4?@??_??@???G??@#8!12?S?S?S_CGPaCg@g@gPcHS#19!19?A@?A?@?A@?A@#22!97?OA?aH?S?a@_QCPcHQk@iShEgR?B?_IAP?GCaA@???@?_OGC@_?O??R?_O!6?CBO???B???A@??A#26!6?G_C???G@??@!12?O?_O!4?O$#18!250?@?A?HACPAbNZ~jE\v]z~U\H{VkvXyfQ\jVYlZUz^lz^i~\nz]i~ZV}~V}mZTNt]uJ^BE@?_GF?_#11!182?_G?P??Ca?@?W???_OGC@_?O??O?_O??C???C?O??oA?_GAHC_QGcOAG??@?O_\_ACOaCo?X?kAhOC?A@??C?J_SbGbIP$#25!312?_?O??@#10!194?G???O_C_SGCA@???GA?A!4?K?_GS`O_??K?GOKO_O_G?_@G_PaKaSJ?AKPaIP?ICcAP?SAhOgOM_Z?COIODOc?e$#3!590?_-#6~~v|z!39~^|vZ}tj]tj]d^_^_ITgT?T?O_#8!19?AHC??A!23?aP_K@IcPIC`ICQHCaHc?GaO?CO?_?GAO??_?O@cOGA!24?`???@GAC?HC_QG@C?QGCA?CPGA?aO@CQ@OgPaSHaKOcRCaODyA_]?Si?TCxEpcISgTiShQcOCg?_?_#18S?G??@BEDBA@@ADJ\ANADBIDBALBEBMDAFIBEDANAFHFDA@??_?OGA_?_?O??A#7!21?O?OCOd?IOAs@ShAcGtAkPmA[`ITgTATgVkZkZc~gvwt^y~l~vY~v|~}!6~^~n~~n~n~N~~~Zv]tjUn^i^i^itInYdYdIdYdGTaGaG??_#5!13?dIT_TItOdYcZCjTiJuqZ]}~v!4~u|zulYdZmxflQt]tIdQzaLBohEpIUGf_XSGuKPkOSGon]lbItA{@mIDI@MPC?I@_PGD?@OA`??OC@ADGCIH?GC@AS@CQH?EOH?A?@_O$??GAC#7!39?_AGc@IS`IS`Y_^_^tiVi|i^nYn~~v~~n!12~|uz~~l~v!21~\m^r}tZmtz]tzluz\uZ~v\m~zl~Z}v\j^uZ|n}Znv|mztzU|iv|]vz|n]znv|^u~Z|]~~~}v|z~uz^lv}z~lvz|~zmv|~\n}zl}nVm\ju\rmZkzSLy?l[@uhCwaG??G?O_#15!7?@?AOCAPAGCA_?G`A?O_G_QCAL?DAcDacDAc@C`AD_DC@AD?D?E?aP_GCQ?CAo@SAO#8G!4?CG@IO?O_DGPASg@iOIOaCi@i?IOd#6!53?_?O??O?O?o???cG`IShO_T_T_TItOdYdYtYdYvi\v\v~~^!13~Yti^itInYdZcZCiT_HC_@#4!13?O_???O_I_I`?c?W?cBOGC`GA?R_HC?RC?i@CA?@?S?G@A?P?_CO_?I`?S?C?AgAC?GChA?_G_AP_CC@Q?g?Ag?C`G?a@?GS?A?D?QH$#27!64?A?_?DO??G??O#28!17?O?G#13!43?@??A?C@?_C_HCA!6?PCIChATGA`GCAO`COGA_H?cA!41?@???Ha?DOB_HAPFGrExEZdJViTjUlZmzTnZ|Mhvr|^}sWwwl]u\go__oowWoOWwoOwwOowWoowwwoowooWg[uzL~jtL]j\nf~~|~zv}tn~n^yvm|jV}Tntn\jTmPnOnOn|J}jU|ZvI|RmP|b]tiVi|iVgRcRcZ?VGFI_D?Q?Gd?GA?@#22!77?_O??S?HC_@?G!4?HACHQdICPEWAL?@?OOG?C_OGC!4?`OGCAa@?_A@?a@???G#26!7?O?_??_???A!4?C??C!11?A??g??_$#25!270?C!7?O?G???G???G???G!8?G!5?A#10!200?CA@?@A???@AS?C!4?OG?G?C?OGO_Q?`As?[?SIpI@cOCOALAp?TGhSAXA_HS@Q_GCApAgS@iS@_AW?c?WdA?HChOi?c$#20!296?G!7?G?C?@#11!200?G?C?OGCAoG?`OGCA_@?_AP?i@C!4?S?G@a?`??COI@YdgOgEwAoAhOaSLqIsGTaPoGs@AS@GQLoEpJSeWtiUhUiTlQ-#6!41~nz]v|j~uzmTzmPmTiTiTiCj?hAGQ???OcGqCO??O_#8!38?C@OC_Q@G_DOA`GC?Q@GCaP?A?@??AG@a??@#13!5?@??C??@???@??C??@???@#8!12?@!8?C!4?@??C?@?@?A?C?A@?CA?@I?QDGQC`Y?CY?lQMqOlAkQdISHuGtIPi_Ip?PCOCOCOcG_?_?_?_?cG!4?Oc?_?_?_?_!8?_?_?_?_?_?_?_?_?S?S?S?S?diCQDgDQdODoD_HAgQcG`IOA#6!53?cHQ??dGPASj??QcGPeGtASiT?TiTiTjSntYtJsnTyn~|}!14~ZulZc~?~?~?}@IsASH_CQ#4!13?Qc???IOACG?QC@cQ_L?aH?A?@GAOb??@?A??@S@SGC?Oa??GCQDG@aOD_?@_O?CAP?G?Ca??GACa?OCH_?Xa?D?c?Q_G?QC???@$#7!41?OC`GAS?HCPiCPmPiTiTiTzSnU|Vl~Z}fZuLzn~~n^~^!36~z}nz^l}v^yn|]vz~l}vz\m~|~}~~|v}\~~}!5~}~~z~~}~~~}~~z~~}~~~}!12~}!8~z!4~}~~z~}~}~|~z~|}~z|~}t~lyulzYd}zc~OkpChAO@cGO_!4?_#15!7?A?@??A@?CPGAOD?H?A`ICa??S@C?S?GAPGCa?GaOHCA?GC?T?GC?QG@#7!9?O?O_?O?_GAgAGQcODG@QCOd?TiSzcXeGtASiT?TiTydYtiTyt]zl~uz}|~}v!17~Zul~~Yvm|jS~~lZvmXvI|jTi~iTiTiSjOIdIsJOiDO?A@#5!14?cHQcZ?~?~?~@mtBxhuUZhl~~iVi~iVmTzUlZSzUtn\Hc}LJkA_ZQSGSa[BkRCICXfGVgEXeH?A`OHCHSaP_G_O?K??I?S?D?PG?cAO@G?C?O?G??_?SA?CO?Q?H?C?@$#27!64?O??_??c@G?@!8?_#13!147?@??C?@?@?A@?HEOlQHQdJuHvITmT^tM~mxnynzlYvZmV|Ny^uZt]tz\nZj]z]j]v\mvz\~v\nUz\~Uz^i^uZ~Lv]~j~j~j~j~ITjLyFyLQlQLqLQlQdYdYdI|iTjCZeXvI|jTi~iTiDYdITiDI`CQ?HC@A?@G#22!88?O?GCA?H_CQ??TgT?TgPiCh??jCh??_aQ@__QOHC?a@??@!4?@!6?@#26!4?G?A!6?A??A_??_!17?@??@!4?G_$#18!291?@?@!14?@!4?@#11!192?O@??O?HC?_H?aH?_O?H?Oa?O_@O_O?u_Og?iSaHcG`W?KODY@]_^_|ITeY`LiTmXaKyCycJsA@COJilHudYdYdyTmtY~tM$#10!517?S?S_[AcOcGCWeGSgEGaG@E@u@?HSAPCAdQ@i?S`I?IA__G@SaO?PaT_@PCJOAHsAHcO?Q?G@QcG@iPIc?Ip$#26!524?_-#6kzul!4~}~}~}~}!30~}z|}~t~]z|~iTylQ|itIOtIxAX_IsAgQcGOdIc!4?T!16?`!4?O?s#8!24?A!95?C@?CA@?ACxFy?EwFgAtIt?ZCjIsI?vGVGrKrKpMoItIoIoAcGt?TgPIOiOIOiOIS_S?S_Cg?Y_Y?Y_Y?Y_Y_ISg@yTiXATAPc#6!72?O?OcGPiCOcPcHuGRk@iTiTiSjOeXfWvgVwfXuhuxU|yvy|v!8~i^yV}Ti\jsnOnOnONQL@BOCgOAO#4!10?O_G`I?AS@CHOCHA`C@AC?Q?I@?O_SA?D_C?GAXCI@QC@AO?H?cOC@AO?`GQ@_?O@?O!11?hAC?`O?GAS?G?S??@??C?@aG@QC@AB$#5RCHQ!4?@?@?@?@#7!30?@CA@?I?`CA?TiDQlATItnAtE|A^tJtVlZvnWTZ|~u~i!16~]!4~n~J!24~|!95~z}~z|}~|zEwD}xFwAtItIoCw?t?Tg?O_#15!15?A!11?A!5?A@??A!6?@#7!15?_G_GQgQcHQgAgQcWbSiXa\aXa\_\a\itYluz]tzmztZmr}tZmtzu!25~n~nZvmTznZmZuHvkR}TiTiTjSnXeWfGVgFWeHUHEhADGDA#27G#5!8?T_Dg@iTaSJONOmOnoLay{niRf|Mn!4~lZuLzd]t]tn|JMjugZeTShIx?zCitSiD?BgTIPI`S?_?O_?gO?Ca?Q???_?C?C!9?@!14?GA?@!10?A#3???OB?@`Ahs$#27!66?G???c???G!5?A_?A?H#13!158?@???TG???N_BS?J_VGfGvKrKrMpNtItNtN|XvI~iVmtnTntlTntj^h}j^xV~d^d~c^d~d^d^tjV}DiTe\a\eHVlZulV|VlZf[jTe\a\e\a^a\aTIdQHC`ICPCIcPK@IcPICH#22!91?_?@???_OC??PCG?`O!4?QcHqCI@A!4?__O?F!4?A?C???@#26!4?G!8?@C?@C?@!7?A$#10!498?O!6?_?g?Oo?x?gC?_SITG@gOAOI`SAhCIdAG`HCc?I?JSGbGQ@_CY@iCgASaSHQcIPiCQCOhQCHaS_HaT_I@UgCO`IS??cG?G$#11!501?O!4?O?I?C?AC@O?I@_A_SA_K`SAg?Q_OGOe[aXQlPloItGvGuLyD}DyVli\julZtmTzlQlQlQc\a\a\a^`}hUzlYtiLsYcYsSG-#6Vn^j]r]tn|n\v\vl!4~j^zV|V|V|~|~n^!5~n!9~}!5~}~~|~~u~|yT}ju\ytmXukPiTiPaCGO_?`CGO_!4?S?S?S_CgA`A_?_?a?a!46?_?_?_?_?O_O?_C?C_?_?_?_?_?O?S?TiO?O?O?O_!5?O?S_?_?_?_?_?_!5?o?o?O???_#8!8?A@A?C@QHCAGTArCxItGTaKbGTa\cZcXQdQdISpEHqTiTIpU`mPmdYdiCzCheXcjSjcZcjSjcRwBcRsRgDSjOdASG_#19!5?Q#6!40?_?_?_?_?S_S?S_S?S_S?S_S_LoDiT_TITaKPmTiTiTcXe\i|A{@}@}tI|Rm\rm|u~~n!4~z!8~T~Tj\jUhUjUHQdIPcGCBOI@S#4!8?OcG@I_IOcGDOHCP?D?AC_AGHcGP??@c?AG@C_SI?AD?Q@Ac?@O_C@G?S!24?GCOd?A?@?@?@!12?A@#3?A?@a@$#5gO_S`K`IOAOaGaGQ!4?S_CgAgAgA?A?O_!5?O#7!9?@!5?@??A??H?ADi@CGaDIPeHQkTiTmTzVi^nYzVnZ~v^~j~j~j^zV|]|^~^~\~\!46~^~^~^~^~n^n~^z~z^~^~^~^~^~nvj|iTnzn^j~f^~~^~~n^j^~^~^~^~^~^!5~N~N~n~~~^!8~|}|~z}luz|vi{KxEtItiXqWsiW_Y_WaKOkOc?GOcG???_CG?O??O?O?O?O?O??O??O??O??Og?gOg?GQ_IOcYShaShqDwdguHuhUhvI|zu\j}l^|^u|nzv}z~}~|}~~~|}~~~|}^~^~^~^~j^j~j^j~j^j~j^j^qNyTi^iti\rmPiTiTiZeXaTA|B}@}@ItAkPaKPAH??O#5!4?C!8?i?iSaShUhOhudYPmIvrwld{ij~~~j~j^iXu]DNphWciJAbIvGpKpGS`Q?BCiBGAHOcOI@??_G_G?cO?G?A@??A?@!32?A$#27!67?O@!6?@A!4?G?_D?OC?_?C?G_!92?G?A???C?_C?G???_???_#13!46?@?A???A?C@CB?DA@CBC`I@IPjEhQDiTiTI`]@mPIdITjCjUHeZCjSJcZCjSJCFSJCJcDY`CJ?hATJULyFYDHuHUhUGtACHaS@Q_A_HAOCG@C?@?A@???A@???A@#22!89?C??G?c?P?GCAOA@S???S?S_DA@__OCCABO?cO???A#26??A??C?O!11?A??@??@??@$#11!492?O??A@O?cOG??AC_?O`O?H?i@WcGqdQI`SgpYcGqKOkOe[`]`]`\a\zUlZtmZ|vm~T~i~Ti~iVylZeXfWfWvktkZsnTzmZuZulZuj\ivxn]Xe$#10!502?cGoGPIDGE_Qc?ScQPCG@cOI@CDOQD_I@IPaK?Y_SaGaChQcIPcAGP?i?T?iT?TgDQcPaGAWdGQGQcIOiCPcHcHQcHS_SGCO_CW-#6GfKbM@JU`YdZdNyN~N~nT~Tntnlzn~n~HVlJ~JUh^vnV~VnV~n~n~n^~v!11~}~~~mz\mzTmZsZcZcIcGRcIcHQCOdG@I?IOASi?ICI_IcG@ACG??O?O?O?O_!8?i?i?I_IOI?I?I?I?i?I?I?i?iCiOiSgTqgPeGtIgAgaGagAgUhUhQtQoLa\A\a\qCoDoDy@eWAWaWAWa[`MOl?lOlQkXiSgSiTgDiOaS#8!12?@?CAG@CHADADAPeHU`[aTIdGVChDYaKhBQkBgWdAiHSM@iEXCePIeHSEPiQHSdITgDiQKBgTGcQ@i#19!5?CE??G#6!20?G???O?O_???_?g?iOiCiOiCgTiCZcXa\_LQl?|A{A|A|ItItJshQtYdytJulQ|QdyTityT}XvuZjvp~zxvz~z~z~z!4~n~n^tnTyTnONiDY`IChA?C@???@C??A#4!5?QcHAcO@OCAP?A@CO_GH??G?@G?G?h?CO_P?C??GC_A?gCA??@I??@!27?@!8?O_?O??_#3o?o?o?o?o?Oo?OsG$#5vGrKpmSh]dYcYoDo?o?Oi?iOIOQCO?O?ugQs?shU_GOg?gOg?O?O?O_?G#27!11?@???@?a!7?O??_?A?G!5?G!19?_!62?G@?C?@!4?@?G??O?_!5?A?G???G?_?H?_?@?C?`?AO#13!46?A@!4?@?GA?C@ASGD??DA?HCA@?S@GA@GC@GA@GC@C?B?D?B?D?@CA?@???CHSLqCQ`?GF?CbS?COG???@C?C#9!78?G?C?K?CCGC?C?C?C#5!4?O?O_IOiDiOn_Twd]srQ||z{u~|uyj~h\un\jlZedRbyLysImX_YdATaSJcRKaPCQ?Q?HACI`Ga@?G?C@??GAC?C#29!58?g$#9?O?O?O_#7!65?OC?PCiPcJcJcZTZtkRtZulzfYv}t~tn|jT~tzt^tZv}\zv~~n~n~n~n^!8~T~T~t^tnt~t~t~t~T~t~t~T~TzTnTjViLVmXvItV|VTu\R|UhUhUkIdNqLa\a\aLzLyFyD}Pf\fSf\f[bYpMQ|AnQlReTjVjTiVyTn\j!12~}~z|v}zu|y|y|mXuh[a\itYugrSy`[pAsgR{QdYsPsipiSpcyPisPsipiShugYoiSyOlqwTiuZl}PujqLzhW~vo~z[j~znv~~~}z~z!5~v~~~n~n^~~~^~V~TnTzTnTzViTzcZe\a^qlQ~A|B|A|AtItIsJUlIdYDIsHQlAlYDiTIDi@eG@cOGA??A#22!23?O?A??@GC?A?AH?AG@S?SaHOaS??OOGGCA?@?@?C#26??G!9?_???_!8?_$#11!491?G?C??@?_?CA@??aOH_OGaPKAHQLHESgtQcXUWFSjSzKuhQtiti\j]tj\vlulZu~lzV~i~TynyVylzU|zT~j}T~j^un\j^D~J}F|J~D~mN~FJt$#10!495?_?GCO_W_IT?CaSBcOCaPcC_Q_HA?GRC_BOhOA?p@Sg?PISaS`ISaGQHQcH?QCg?T?iDODgDQCgACi?S@i?C?H?aS?I?C@GAC?I?@!4?A-#5~|i~Y|j}Ti\u`YtYDYtiTGsjchuleteEXQlyPMxIPmPMtGugTiDoDyCxa\?Y_ISg?GO#30???_#7???A???G?BCHATgDoLqExAtKRlQf\juLqLVi^dyDYvhUlZvj^rujvYvxvlV|VlvlZeXf]tjUhV|V\R|V|B{D^tJTiTaXATALA|AtIdRCJ?DIODQCHQdI`CQ@?~@}@eHAHUHe@IdYdITiDiTIdHEgVGfGaL_DIPCJ?jCRHbCRC~TmT~SntI^hvn~~nn^n~n^n^}~~~}~|!6~}~~~|}~y~|~|]v|mz[nyvz~v!4~}~}~z}|~z}~z~|~}~~i|~v~|~}z|~}z~~}~~z~}!10~n^zVlZ~nZuH^rmTnTzD}@~@}@~@}@~@}@eXAcHuHeXaDi@IPIDGbSHADOAGC@?AdOA@G??ItAGaOCA@#5!13?Oc!4?hAgA\aTIOnYtjuLzUn|n}!7~ulZvmXf[lZEhToDDkEd?U`YmPEpGOcQHOCO??_CQ?O@G?g?_C#26_?A#3!12?g?g?g?GO!24?TgT?TgPiChUGQdY_ItA|OfY|$#9?AT?dA#6S@iTaHU`IdYdITiTJSJUHQHIXpEhQDiPEpMPmPItHViTiNyDzE\a^d^tjV~vn^~~^~~~|~|~uz{Zu|iVyLqKxA|GrkQdWaSHqLqgS_QCYdGShQcGO_CGS?CGCGQgAgQGQcXeW`IShUgAgAgAgA{@Y_IOiTi\e|i|q|A|ItYkzs~ytnylzulYt]zl}~?}@}Xe|UhuH}tYdYtiTyTitYewVgvWe\q^ytmzs~Szku[zkz?i?i?iOAS_CGO???O?O?O?O_#8@???@?A!6?@???A@?D?A?A`GAPCbODGC?G!4?@?@?C@A?C@?C?A?@??TA?G???@#6!23?O_CgQc?OcHu_KPiOiCy@}?}@}?}@}?}@}Xe|ZuHuXe\yT}tmtyv[ju|yn|vz}~|Yn|}v~~tI|v\nz|}!13~nZ!4~U|V|a\itnOdISHqChOAO@#22!7?HQcGPeWb?__S?AG_QPOG#26!7?A!5?_?C@G#29!78?aG$#22!12?GC??_!4?a??O???O??G_C??C_?C_??_?A!4?O!7?_!8?_#27!8?A?@C?_!5?A?@?C?A???G!8?@?G@_??A!4?C?G@?G`?A!20?_C!4?A_??c!39?O?_??O!13?O@!4?P!19?P??@?G`?Q!4?O?_???_#13!66?A??CA?@C??@??C?@#4!144?QCHAgCQG@gApGC@?_GC@AH?c?I@iS@?Hc?cAOA@I?HO?_D$#11!490?O?AG_Q??GE`WC@?oG?hAlOE@IO_?QcHlIseTUSZQLoLqnYvi\ulZlZU~T~Q~tni~T~j~U~l~Y~t~i~T~~T~i~TiRi}iTiTzUhvlYd^tI|ALOdA$#10!493?@!7?A_OM@AsCO?AhOc@IUh?QAO@H?g@_CaLQGOdGTaHQcQc@?A?D?A?T?i?S?h?Q?d?I?T?i??i?T?i?C?@?AC-#5!11~Vmvm^j|l}mzl\|z|l]}UrZxl}mzl|neU~l|neuj\t]~mVvlttzhcyCPAOhQCG_#30?_#27!5?A???C!5?C?O??@?A?G!5?O!5?G?@?S!4?G?C?OC!22?A??A!5?G!35?@???A??G??A!5?A?@!8?G!21?C???G!7?@??A!10?C#6!43?_?_?_?_!15?_?_?_?_?_???OdW@qCgOGQcY`M`GQdYtJ{jSzkR{jS~lynyvY|mz~|~}|z}|~|~lvz}Z{~|v~z}|~t!4~|~~|~~}z!22~n^}~ZvJuH}@~?}@s?iPIC_CO??A#22!7?HQcZ?u???OOG??PCOGC#26!4?A??A??Q?C!5?O!6?O??C#3!16?S?S???@???T?T?TiPCPCPChA!5?dGPeWbKpEgU_SHQgQcGtAsJcXvG$#22!11?gPGP_S?Q?PCOa?C?Q_@GGcCQ?PCOAOOh?OAOOHS_I`?P_GOAG?CQ@?g?C??_#7!12?@?A??I@QHAlRk?HCPeHUhEHaTIcRCzC~@jUlReTiZejSjSJcHU?I`UHQdITaLqLqNoLqLOfGTaCRcRK@i@Q@GCA?AGC?D?HC??c?GCA??C?A?C??C??@??@??@??AO??G??A?@AC@ACAC@!5?@A?AHA?AHCA@?i@QdATiDYdYcYfGRmTjTnYvItIzn^znznznzv^~^~^~^!25~^~^~^~^!15~^~^~^~^~^~~~nYf}LzVnvlZd]p]vlYdIsBSjCRkBSj?QDODGdAPC?A?@AC@A?A?QGC@cB?AG?C@A?I!4?A??A??@C#5!22?O_@?cGsHu@}?~@}J~Tmtz^zn~~|!7~ulZc~Hi^yFetjeGjaPGfWf?OG`?OH??_PGcRGAHe?AO@?C#29!20?_??@?A???g??iS??g??g?O!6?_G#10!8?@A?D??@A#29!4?OA$#6!17?A?@??A?A?A?@?@C?A?@??A??H??A??H??A!4?G?AGACQHCzE|jUlZv^~^!5~|~~}z|~~t}hulQkQ~szeXuhUxe\itZkrCy?iShQkPiPcHOjSjsZuh~t]hulYti\qLqLoLqLonWvi\rkZkr}T}l}vz|~|vz~y~uz~~Z~vz|~~z~|~z}~z~|}~v}~|}~~|n||u~~|~}|z}tz|z}!5~}|~|u|~|uz|}zT}lQ|iTydYdYdWtkPiSiOdGtIpCO_COCOCOCG_?_?_?_#4!199?T_Dg@AOGaODaO??OHcASGe?cPICA???c??OG?cAO`GT#10!39?cHOAc$#4!30?_#31!179?A#11!279?G??OC?GCaO??sG`GOHc?g@IcRGc@EOlPlIKbIpA|jU~lYvi\ju~lzVj}HnyumXu~iVi~?@mzEzmRUlZun|ZYVeXf[rMxVh]hugVlYtI|JsJcGv$#10!492?C@!4?@GfGA@SAd?QHEO_PGcRGoHAcAO`GSAgASh?QdGTaSH?QCg?@AODGOcH-#5^VNZvL]W^W^]nEV]?^?^_^A|B^aTKrLQkZcJKJCjSzTMXmXuB~dZtiD|lZvnT}}rWLdw[h{?{?yCgS_S_S?S_#7!4?@??A?A?@???A@?A@?C@C?@GACR?J_RGE@QHA@A?@A?A@?A??HC?Q@GCA@?A??A@?C@A?@?A?C@#5!19?O?O?O?O?O?OCOcOk?kOcOCOcOcGSgC_GO_GOg?gOg?g?g?g?gO?O?O?O?O???O_#7A??@?@?A@A@A@A@A@QBG`QHEhQNsNsNsNsLzD~D^lzMrnR~Rnrn^j~jVjZfZnZnZnZvLzd^tjVyTnTjTnt~JvJVlZd^t^tnTzFyLzE|A|B}@}?~@ITbJQDRK`ISa?`GCASC_HC??@#9??kOk?kOKOcSgCgSGS_S?S_S_CgSgCgSgCK{k[[[sK[CKCKCKC{K{SkoS!9?CKC[?KcKOK?KgCKC#32???C???C?CKKCSK{#11!9?A???A@??@_?Q@G?ShACaCiPChCPI_J_]_[b[`[cYcZlvYnylZulYvlZb}HVyamTrmO~QlYsJgZeXdZmPnQ~PnYdZATBTIdRCjOJCBOHBaHA?A@$#4___??_`b_B_@?`_@[_{?[_[?{?[gQKQl?CGcOCgS_?gOCOcG??OcGO?A#6!5?@?CbOIDBU@zB}DzVi^j^j~j^!4~}~}|~|~}~}~|}~|}~z}z~}v{zk~s^kvx}lu|}|~}|~|}~|~~uz~l}vz|}~|}~|}~z}|~}~|~z}!19~n~n~n~n~n~nznZnR~RnZnznZnZvjVz^vn^vnV~VnV~V~V~V~Vn~n~n~n~n~~~n^|~~}~{~|}|}|}|}|{l{t]luxUkoJoJoJoJqCy?Y_QC`KOk?kOKO_S?SgScWcOcOcOcGqCY_ISgDiOiSiOI?sGsgQcY_I_IOiCwDqCxA|A{@}@~?}ti[slykr]tj\~]vz|jz^uz~~}~~RnR~RnrnZhVzVjvj^j~j]j^zVjVzVjVzrBBbbbBrbzrzrzrzBpBHBLj|vn~^m|~|bPbbRA@_`A@?B?@A@qC?ICCgOG?o?G#4?AKCKCKCYKISHCI?KStKKSLKS[gUk_SiOgPCpC?I_I_I_S@SaG@Q_#3!13?S?S_CGPaKOl?lOdIsPcX_YcPkOk?kOdYc|i{itYkzSnsz{nu{\u|yl}~$#10?GOCGO???_?_OG!8?_??_??_?_?O_#11O?_O!5?_#30!33?@#27!13?@!6?@!13?@!35?@!101?A!10?A??A!5?@!12?_???O#7!105?A!10?@#31!13?O???G#5!10?A?A?A?AGO?_PA?AWaW?kPIRMp]rSzQx}LzzDrrRfRbBrBb@qxrwrxdrtHczs\?IAaOb?q@_@?@AH?DAGAGaPCOD#26?@???A?@#29!21?@!4?A??A?@?A??A!31?DO$#3???_?A#22?C?C???OG?b?B?B?@A??@A@???B?BOB_R?JCA@a@A@{?I?ADy?QcGOi?@GCaOA_?AC?@#31!361?_O!16?_O???_???_!5?_#10!23?@_??GOAG_?a@A?OH?P?CaOAGcPCO@SBGaG@QcHCQGdODQcHQdGQcG@aG@S?G?@!7?C??C???A?@?A$#11!15?_???_#22!448?OGG?G_O?G_O?@A?B?A???_Q???q`??@#26!4?A???O-#4VNs?O_@ObLPK_]_YDS?z?}@Qk@yClRGS?@G?@c??Q?g?HC_J?`A?PC@iO_GAC??O#6!4?GC@aHCHaLA|AtIvItjUl~n~n~n~n~n~n!4~v~v~v~v!20~v!12~v~~~n~n~N~N~n~n^rnZvnzmXv^v^vnVnZnJ}JuLqNyTiNyDyF{JtITiTiDiRM`^@}DYfGVgRcREPjEpFgVGVGVpE|A~ITi^a^jUh^i\vN~N~n~n^~n~n!4~|vz|}~~~}^}n}v}~u\zt]jszSzsjUxvg^uXu|qkP}tylux]titiTjSjsZc~I|Rkq\ulYvyluxuxUx}tyv{zu|u|yt}tz}v|^z}~\z~|!5~|!11~TiT~DyD}DzLyFyLYfItItJdITZD]djli[{x\^[~K]NENEFEFfX|[\BNDHB?@!4?ENFEFAFFHBIDJCIL?G#31@#37_#20_#12O#4A?O!6?_!7?O?o?_GOG!7?_A_@yEtTjmTxCpHk_N_Y_T_T_T_I?O_?O#3!9?xASG@qCwBkPeGtAt?YcQgISiShEgQLOd}~Z}n|^ze\jv}\v}Znt~~|~~$goA[`]OcO_?_#22??@C#26!6?O??A!8?_!10?_#22@?@!6?@MGBoA\_DgC?O?GC?aH??_??O?C#5!49?G!12?G???O?O?o?o?O?O_KOcGOCPeG_G_GOgOcOs@sHqLoDiToDyDwBsItiTiTyTkp]_}@YdWvgRKZkxmCpMwV?v_vgKXA|?diT_\_ShU_TaGo?o?O?O_?O?O#7!4?AGCA@???@_@O@G@?HaCI`SJCjCJShEGV_HeHALRm@IDQHE`ITITiSjSJcZ?tAkRLaHQdGDQHEHEhE@IDGBCHAHADI@IC@GA_C@?aC?A!5?A#9!11?iTi?yDy@yCqDwDqdGTItIsITICY`ISAT!9?o?oW?w_GCA?AG?IUCNEMDNC??O!4?O!8?IC!4G?O??!5O??__???_#11???_??_o?iDA?qLCwOQCX?ICPiC@IcQH_^_^_^_^_^_^dYvLulZulZulZCtjUsLyB{RmXvI|IudZcTtaTjUxVlqnY@?c@OA_CXaSG@aG@cOI#29??A$#5??@BM@M?C??B?@?@?A@C?@?C@??@??d?@U?T?RGD_C@RCQIcM]HvKrmS`VsLxa^iVz~nvry\Squ\Q|AlIpGtIShQ?O?O?O?O?O?O!4?G?G?G?G#22!98?_!4?C_!4?OG???g?G??A_???O#5!164?O_!4?O!4_?O?O!4?__!5?G!8?@?C!6?@A?AH?GGGLGGCKDWCID?DBEFFF\MN^!5N^YY\NxxNnxHWWuG@wTapaLaZCGc?_G!4?A?CA?Q#29!41?G??G??G$#10??G_??_JGQkO^_Y_AhA?B?g@QC@Q??A`I_QaS?bODOCCq?O?o?SGaGO#7!361?`!6?`!8?O!4?O?O?G#4O!5?O#30??@!9?@#2OO#3!5O#33_#10?_?_!4?_#6??D?_?C#26!12?G!5?@!9?O$#11!10?A???C?w?{?{?Eg?wCgQkOIsGDGiGSiGjQg?HCO??_#33!365?ABEA?B?A@?@?@?@??_!4?O#16_!6?OO#43___??_?___#46_#47_#41_#16O#40__#49_#50_#51_#2!7?_?__#32!4?A?A!5?A#10!8?P???@EG@?A_O???i?O@CO?D?I?I?I?T_IDGaHQcHQcHQcAG?`I?@C!8?@??@A?@$#31!421?_??_?o?_W?G?A?A#3_!6?OOO#41_#35G!6?O#22?A??A???A!7?@!8?D???CAO?EEDF@FEF?WCK#30?O$#4!423?O#36!5?_?O#32???_#2?_#10_#14?_O!7?O!6?OOO?O!9?_?_!7?_#3??O$#24!441?_#37_#19G#39_#34G!7?O#48!7?_#1!13?_$#38!443?_#40?_#31?@#44???_??_$#42!447?_#33???OO$#45!452?_-#3~|~~|}|y~sz{QkqKoCg?GO_?g?g?g?GO#5!4?@???A??C??CB?@A@QGAEGraWMZe\huhUjVn^zvm^~{uZh_qkZu_vGtQdWdAdWDGtAoCOdGt?TgT?TgT?TgPi?gOcWaWqCOCOCOCOCOCOCOCOCOcHShU_}@}@{@iSPEWdY`YcQgQcZcYD]xe\yd]huXe|ivy\}v{~y|}|v}z|}vz}]zb[tZzVt{ri}j|{ZzQ~]kfYzktqx{zYlhudYtYDwCyDy@kOdY@KpAS?Sg?gO?O_??_GO#7???@!6?@???@??A!4?C@A!4?@??@!5?C?I?CA?@???A@??H?D!4?@#5!14?_?_?_?_!21?O_CGO?_CgQGT_?S_?S_GO_HAD??OAAo?@DTT@@C!4?@#37C#60O!5?o??WWGKG??CC??GA!7?_??O!6?CEAE?C??CCC?S??GggWGG_?_oo?__??_#6@#20O#66_#11@!4?@A@CCK`Y?dIOI@IcXeGvGeXCzCzCzCzC~TmtZulZTulQlZQuhVyTmTzTmXviTmXvI|jTmTyV?Q?cPGCAhSa@GOA`GC?QHC$#4?A??A@?D?A???A?@?@A??@A@A?A@??AC@?D???@?g@??@Q_OGCg??d?o?CPaOCHaCGO_#6!9?@?CQHCRcHVGvIlYfYlYfYvI|NznYvI~iVi~iVi~iVmT~VnZf\fLznznznznznznznznznZujUh^@}@}B}TjmXfYd]dZlVlZcZdY`EXaDY`UHeXATGDa@GB?DA@AG@CA@GC@?CGAGC?GA@C@??A@C?D?@Q?D?BGDA@C@QCHQdIdYDzDyD}RnYd]rM|j~jV~Vn~n^nN^fNnN~Mn^nN~Nm^~~}~~|^~~~Z}|!4~}~~}~~^~~z~t~z|~}~~~|}~~u~y!4~}!14~^~^~^~^!21~n^zvHeXATGDaHU`ITaHUdIodOlQDX?KHAI?A??A@#35A??A??@#36@#20?A#61O??O??!4_Woo_OsOoUY}cue[e?iMy}wqsWowowwG[?__gGGI?O??_???O#58?C???G#10C??A??@??@??CAG?I?dO?@cO?@A?P??P?aCX?rChCQ?iPIcHQc??OG?_C@$!6?A??HCBkPKQC??HaCOC?h?SAh??aGaHUgACPCi?i?HCq?TiDOk?u!5?O?O#9!16?C#22!79?_!13?_!32?`?S`A_C_GAGS@S?A_Cg?_@W_COAGCA?c?Q?G???_A!9?_#9!13?Oo?O_Oo?oO_Oo?oO#5_!6?_???_!12?_#9!71?eXExAdqGUhITiHU`ITEWiQliC[BEC?GGCE@C?BB?@@??B#58?A#55A#10@#48A#33@#24@#37@#52@#40@#42@#43@@#67??_?_?_#68_!6?_?_#67!5?_#43!4?@@@#41@!7?A#62A#1@!6?A???C???G?OO?_G_#26!12?_#3!26?_HADACh?UgDiPiCiPeGTiPeGtASiPiDg~l~Zmvz|Uj\}vn|]vz~luz~~$#11!12?@?@_JyTuTiLyTUTiTUtj[vWugV{zCyTzSlQ_DY?OgA@H?GC?_#4!347?__?OOO!6?C?C?A#12A???@@#59?A#53!40?@#54@#55@#56@#37@!5?A#3@??A??A!4?AI?G?CCGA?_$#26!47?G?_?C??O#22?@?GD@_??A@EHSgO_CGP_?AH_CQH???G!7?O??_#19!311?@??G?A?A#16G#41O!8?C#34!50?@#14@#0@@!6?A???C#57@#35G#14C#43?_#69?_#23_#22A#0?_$#13!411?_#51_#40_#66_#44!5_!4owgWWW[!4KCEUQEEEA!4B@B@D@B@@B@DD@D@B@B@@D@B!6AEAE!7CGgGGGOOOo_?_#31!6?C$#3!416?G!4?C!4?AA???@#46!47?A#51??A!5?C!7?O$#52!416?O#54O#10G#7A@#49G#48G#46G!4?C!5?A#2!48?@#20A#5@???@@A?A?@?D?KA_@?G?O`Pa?cQ?_I@COA$#24!419?G#63G#14??C!9?@#24!51?A!4?C#17C#39G#65?O#47O$#43!419?O#51!5?C#45!5_?o___??OW_GG[K?KKG??WGW?WY?O??CKGAG?GC?s_wWWO_ooo?O_OoSO???_#48G#64???G$#39!426?C#4!59?@!4?@@?@?C?BA?@E?U\iWaPS@GITcOIdWcXeGvGeX?aCG?Q?h!8?I??_O??G$#9!486?A?@???A!5?C?GGOO$#42!486?C#12@!6?A???O??O$#40!487?C#46??G-#3~nVv^NvV~^^~^^~NlvlFZflVQnD~UN|nolololodycxaSg_g?@O_#5!4?@?CA@CbIQC{HViFqgzeJVm\j~~}l~~ulytmXvkzuJ|uwi{r[rkR{b]pnWfXuhUwqlQ|a\itYdzSzdYtjSzcZsjSz[j{vWn{yTmxulyTm|ZuzkZsju\j}|fz~|~}z|~~|}~~}~|!12~^n^~~~^~^~^~^!19~^m^!5~{}~~}!4~|~zm|YTqlitZW`Mpm_nOMtYcZcXaKoDW`Y_ISgSgSgSgS_S?S_S?S_S?S_S_CgOg?gOGO?O?O?O?O?O?O?O?O?_CHsH_Q?cOCOCgOcGOC_S_COcOc?S?c?S_S?S_GOg?g?O?OeAIO@@D??A@G@C?AA#38C#4?@#61?G??__G?wAsl???A!4?a_aaA???A@qrrzu~V}LEZFMOFiDAeDID]dYLuJ]tErVvARFJrQReBFReEaUeAeUaQEAEAMEMojUUWs?g?Oo_O__???_#11@???@??@D@AFN?siOGs?wOooOooOoGqHeXEXEYDS@gATI!5?_!10?_PC_GAOH?cAOHCA#76??S??C?G$#2?O_G?O?g??_??_?_O??O_?O?G?O??_#11??CQCQCQCI?PAShASD??cHUg?vGpIpKoGoDwA?_?G#6!11?@Q??HQDIPeGRCHsAHFTBKbKRkB[`MOfWeHUhFLQlA\aTIdYCjCYdISjCZcJSjCbSBGfOBDiPEHQDiPAcHCRcJSHaS@AGC?A?@CA??A@??@?A#4!12?_O_???_?_?_?_!19?_O_#6!5?@!8?A?CPAdIDQDIcB]`MPNOnPIdZcZe\rNyf]d^tjVjVjVjVj^j~j^j~j^j~j^j^zVnV~Vnvn~n~n~n~n~n~n~n~nQ[B_I?UGdQCRCiPEHQDiPIDQCRcIPIcRRJBBJbZVNV^V^l~nH\dFAAADH@CAA?B@?@#24?A#16?@#45__???@A???_okK[MrrPVPXpvRRp}HGGCH#67?_@?@??@!9?@?@!9?@??C?@?@??C??C??C??C!4?C!4?O??C#72?@#60OGG??_#10@!6?KHG??ySoC@g?hI@CqIiCdMII@NIHrLUXExExDy@iS`It??wCw?G@U`IT_S_G$#29??G?_?G??_??_??O?GOg?W?gCOg?gO?O#4!11?@??A?D?A?@Cj?UIpGQJODgA@c?T_DO?O_#22!97?O!61?@!6?A@??@!10?_G?O??c?O??O??_#9!64?lBwU@uHdYHjgjPEhQdiPM`YhjGJPm`ZGk?KgcGC?_?_?_!6?G?_GA??ADC@??@?@#41??A#33@#70@#56@#71?@#78!31?_?_?O?oO?O?OO?_?_??_!8?G!7?G!8?OG!9?__??_?_#24@??A#16A!9?O??_#14?_#6??O#29!27?C@G??C?@?@?AG!5?@?A$#1!5?_#10!10?A?A?C?A?@?A?@?A?J?J?J?JODICGATHQy}HUgRSG_C?C_?C!4?OG#79!300?_#31O?O??_#33!5?A!5?__?OO#35_!7?C#68!41?QwCW_NGDiLHiDi?YCqHS`IxKgGsKoOKkcWSg_GwGgGwGgGCgSgG_Wo#44??@@BAAEA?CC?G?O#4BAB???A??C???G??Q@SJD?TAG??cG?_???_$#1!24?_#22!40?@?A??OGFCHSgPaS#19!304?O!8?C???A#3C#60___oOw?O?G?_O!6?O__OKCCGCCKGkkC?CCC???G#65!4?_?_??O_O?_O!12?G_?_??G?gO?O?O?O?O??_OgOoO_?G???_HG#73@#43O_?WCOG?_oO?_#80_#49_#9C#17O$#14!385?_O?OO?GOGG#43_??O!8?A#45!71?!17@FCGG??S?CC??G?O?O??_#38O#74??_#29A$#4!388?CC??A#52_#16O#70O#44___OOWGkCsK[U]UmD|JQ^NBPB`?GG?G!5?G#74!71?@#75A#46G!4?G#53G#5@??AA@?L@IGAcO?C??_!6?@!4?C$#7!388?GG??C#41?_#55?O!7?A#59!101?A#2@@?AAC!5?O!8?_$#10!390?_??O???G#37G#54G!9?@#64!96?@#56A#77?C#14@@#1?C#3CC@C?G!4?OO!7?@?@A@C@E?DAC???_?_?_?iOAS_?z~EzE^tuh]ti^i^t^mz^v|nu~Z|nuz|~~j~~z~v~$#2!391?_!9?AA#58!107?C#35C???G?O??_$#17!396?G#48O!4?C#68!108?_#50?G#20G#22A??C!4?AG$#1!399?C!4?@#48!110?O#76???A$#46!400?G!5?A-#1xacpSw`aP_T_Pg`a_`S@?_PGO_I??O?_?COI?cOA??O???_#10?FADiCPD?G`?Q!4?Q@I@aTGDA??_#6!13?@??A@?A?D!6?@A?@A?TA?J?DOGA@GAPAGDAODQC`I?@AGAS?HC?A?A?HCA?@??A@?A?A???@C?DA??A#4!17?_OgCgSgCWaTIsYcJsJkCZCjSJcZSJcjSj[BcjKBkRKjcSeOf?vcsGSgCgSGS#6!11?A??C?A?@?@??AHSASHQDiPIDQHePIDqDyDY`UHeHUjEhUJeXEhVHeXEhQLa[B{B{B{BsJuJuZuJuLA@!5?P??A@??A?@?A??A@?H?CA_@?C@?C??C???@?D?A#42O#56G#60_??_???o?AA@?@!6?@!7?A?@#78G!6?_#75!10?_??_O___o_osoWWuM[USYGOSSOQOSOOWWWSOY{wswaoq_i_eaaUaqqoisogOO_G!8?A!7?A#43?@!4?B?CGCKO?Wo??_?_#16???O#76!5?C#1_#22O#29??O!20?@#76!23?A$#2EWPIhAYSgVgTiCYSYSGqkQcQcPOhU_QHO_?_!4?_#11!10?TAk?ntIVkZviTgS_SG_?_OGC??_#4!82?O#22O#10!39?_?O??O?_!6?_!6?O?O?O???O?_#22@GG?G@!9?S!7?X?SGAHGS?A?@?@C!18?C_???G_O???S??_#9!32?pMoNoNPiEx?UgBxEgUhUhTgU_FyHUgu@WO?AWQLAL?VAE@EB#80G#45__O?__GpW{{wy[^}}\OO?BIAEFFDDA?@?@@@!5B@?@?@@#78??W?G_WIG@C@?DE@?O?G??OC@@C!4?@@?@!6?@?A?Q!14?_?OOS^SMYE!5?@A??@!8?G??_O_?_?_#82C??G$#3?DICADCHEGAICRCHCI`KRKAdJCdQhNcUjYdSzIls^ilu~Z^vgTy?xAwO?O_#5!5?@IPiDIDIdQrJyKZUv!8~}~~|}~|~y!6~}|~}|~i|~s~ynv|}v|m|vy|nylz]t~}|v|j~uz~|~|~uz|~}~~|}~|~|nn~}z~y|~~|!17~^nVzVjVzf\itJCZcJsAxCjSJCJcJcZSjCBkZCRkRKrCRJWfO~?YJvjVzVjvjj!7~e~jt|urj||!4}z|uj|julyTmtyluXmtyHYDydUHeXuh?xUHsXexUguXexUlq\b{B{B{B{JsHsHcHsHqKoNoNomCxE|gV{CxUhShUgUhUw@sHUHy?AG@C@QD?I??@?@#43??G?C#61O!4?_??DCa_?@_ni}{TwWgwwg{e}^M]MKCC[cIFADIC@D@LDHDD??@?B??C@#85!11?_?_#61??@!30?A?@OD@@AGBACD@ba@@A`@QAOCa_G#10@!4?A@A?A?@!9?DAA_FOj?RCqSiDA{@}?}@uHsGsIShSd$#29!16?@?A??@G??I?C??H?C@I@CPAH?TAH?c?GOg#4!4?A?ACG@cGTiC_C?O?aOGd?ODOCg#22!121?@!4?@A!4?_O#14!154?_!5?_???g?W???@??@?@#53?@#65!15?_?_O!9?__O_???_O_o_yOAoQ?AOOEWMGG@AG@B?J@EBIAIDLAJKECCAJD@EJATHLHTTHXThHHLIDBITMhMd@__@_?w?_?wGoGGG???KeC[koWO#14@?@@@!6?O?_???_$#26!70?O#22???GC?B_@G#11!128?O?_O???O???O_???_??_??G#31!136?A?@!5?A#83_#2?O???CC?A#81?A#43!24?O?O#68?_o_OO?W_WoWkWCYCIcA?E??FGA??A!5?@?C@G?G@GAHCA?AAHC?A@?CGC?C?IOCG?SC?DOGDA@E@Ag?I_?wE|SkDa?A?C!6?_#41?@#49@#47A??C??G??O#11@?@AB@FBFBNB@A@C@_@C@c@C@?Q@A!6?C!5?A?GOcGQgDgQcGQcGTaG$#4!368?CGOC?G#19?G!9?@#59C#67!35?G???C??A#84!16?__?!11_?_?!7_#60!34?@#67O?OGsSO{}{QWg#60@!7?O#0A!7?O$#79!369?@A?B#16_#10?O!6?G#17??A#44!131?@??A!4?G???OO?_#37O$#7!369?_?G#33_#20??_#70_!9?@#45!135?C???G#4?B?A@A@AC?M???C_?U?W@C?C!4?G$#36!369?C#34_#24_!5?O?G?C!5?A#70!134?@#46O_?_???_#1C#54O$#3!371?O#35!4?OC!6?A#37C#53!137?A#38A??C!7?_$#49!379?_#46_!8?A#24!135?A!5?G$#44!381?__oOOWGk[]EMD@AA?@?@?A?C@??D@???A?@#2!110?A!5?G?G?G__!5?G?_??O$#38!381?O!8?@#69!135?C#6?C!6?G$#0!381?G!6?@#3!140?C!4?C???OsGWOO?gCoIGi?}Gy@iTg{@}@~@}HqJuJtjSjQnZvlVyVlZvlZvi\v~|!6~$#5!529?@??CC??S?GGO_?g???G???O$#40!529?G!4?_$#51!530?G-#2_pQpSr_psq_xcQpwL@T?E\QLWHMCNGE@sGqSGC`Q_@_O_OC_?O_???_#4!7?A?HOa?HOcQwOgsoopgdWRKo!4O_O_O_O_!8?oo#6!7?@!6?@!16?@#4!6?ooOoOoOoOoOoOoOoOoOg_gcgsgSgsWsgSgSgSgSgUgRSidItQLqtItqTigUpUGsIPDiA@LAI?lACAT?LA{PmQpSgpShuOdySpI`MPItB{?{?kOKOaOaS_#6!12?A?@?A??A?@?a??A@OAK`QG?@GD?AH?C@GA@GC@GA@GC@GAPCi@Ci@SaLAdIDQdIDG!10?_???_?O!5?_???CE@A#33@#47G!5?@#69?@#61g__CSWMMdeNgOyT^FJ!4B@@@?@?@FABBAD@B??ACAC?A?@#85!7?_#88?_O_ooowoow?KGCIO!4?AC?C?O!4?q_oowwGsGoGOO?O__?_???___??O#85???_#78CAD?A?C?A!4?!4GKGKKkYSOGA`_?___??`?`?O_?_???_#91C#3CE?AAI@LDIlZ]JcXEHEHUhEhuhUlQlQlZE\jULzLrm|r}tz|!8~$#1VMDMBKVMJLNEJLMFa]i~x_cqfa@xorw}AtG_boWcS{QeXAoG???O#5!15?C?A@?DADAHFIDYFkQNNnNn^n^n^n^!8~NN!7~}!6~}!16~}!6~NNnNnNnNnNnNnNnNnNnV^VZVJVjVJfJVjVjVjVJVhVkJTITADALADIDI?D?I?@A@?A?D?A_DOAGRG?hAO@A?HCA@CAE@MAC@MpMpItAsB~B~RnrnSfSjTZ|z}z}z}zu|N|~}~|n^|~}~\^~x{mlrUkvv}fqzlsuzyv|}vz}v|}vz}v\mzT}zT}j\q|YtylYtYvlYvi\juXmJDmTiLze|zUlJEC^E@GCD#38G#83C#35@#10@#45G??O_wOWQOG@!5?FF@A#75??oo_??__o_o_!7o_o?___!4owGkwsW[??ECDEEF!4B@#85?oOoGSM]IF]Li~yvNudBd!6?_#94!10?O?O??O??O_??O#89???KI?C#68!5?AAAB?AEBE?AAD?B@C?CS#67??G??G#43?A??AGG?GC?G#5@!8?O!8?__#29??_#4!18?O$#0G?g?g?G???O?O_??O_!7?O_#29!5?@??@??A?GA?H??GACi@GCoGOGo?O_??_#22!19?@#10!98?_!4?_?O_?_O?GO?G?T??C?Q@Ci?OGs?@ODO?gPAA_?AG?CG?AG@??@G?a?CO?c#22??G!8?HGH?IcAC@C@C@CHAo!5?O_!5?_?CA@O?G@?G?OGCOAH?C#14!13?_#9!17?_?QdGTaSHePsY@iTACHACHQSWj?HI@A?A#39?C#86A#43CC#80A#59A#46??@#67??_!4?GG!4?G!16?CC?IKKC#84!8?oO??__owWwWgGGCKCCIB@BDB@@@DG@?@?@G_HYkYD^NLDCEIUMUMMMmMKMKGGW?OWGW_O_OG!4_GOGO!7?_!13?G#89???GG#45???@!5?C???O?_#11C#37O#48_#56_#17O#96_#14??_#76?_!5?O$#3!21?AH??C?A?C@?GAD?CB?HB?L?ElBTzC]`yLShuHugTq?S_??O__#11!121?G?_??_??_?Qh?h_GoCoDoIo[_i?t?cgSOl?_P_AhSAgOG_O@G!6?G#14!102?O#4??O#31!4?_#3?_?O#34_#24O!5?A#42??A#37@??@#68!5?__?O??_O_?_?GCKCCCMIADIEMGC?GC?A?RD?H?AD?DA@?@???@#87!4?O?G??GCCM?A#95??_?__?_#94!7?O#65?G???A??@#85!12?_#65??A!8?R@?J@NBN@FDCC?EO??O@OO_g?UXQB`[\ApQUO[}?S_S_O_??__#10A@C@E?IDQC@CJ?HEHEHEHEHUhQlQlQ_o_O_o?o$#76!26?O!8?IOGC#10!10?@?A@?@!7?o?C@D?C?A@?dA@AGCQ???_???_#22!104?G#26!12?C???G!16?C#19!133?@#16??_!4?C#65!15?o?O?O?GC??_??O?_OO?O?P??G??G???_YPOH?ILACABA@@A?@@A?@#93!8?_?o_?_OO_OO#75!11?A?B@?!8@B@BFFFNLFFENNNLVGOOSo_o_{!4wsoCoo_o_???k__GWAAATCc?d??i#46GC?G#0@??A!6?O??_#11!4?OAO_O?_O?O!8?CHACHACAK@AK@ICA$!51?C?AAE@EHFILLJQmWjQLWkAGOGC!4?_???_#2!278?_!5?A#78!14?_?O!5?_O??GwW?CKICG??@G???O?G?KACH!5?CGEALE?A?@#87!34?O?_?___o?OO_O_O_???_??_?_#67!12?@???@???A@#44!18?@?AAC?GG??O?_#60_#83O#33?_#1!8?_$#14!364?O#0O!6?@#43!38?@#68!78?@???A#61!13?@?@?@?@??@?B???C??@??A@?I??C?O???O?o??O#77O$#81!365?_#44_?oow{oiKkIEEFHHBE@@A@#47!148?@#54@#70@#16@???@#66G#4@@?@CGAO???_O?c?O!4?O$!366?G??@#68!169?O_?O#92??G#8G$#70!366?O#60_!5?Oo?S???CA#42!157?A#55A#1@??A??GG$#41!367?O!6?@#35!166?A#2@???C$#1!367?G#59!174?C$#90!542?A-#2TjSATISlJcXASbMpA?_??A!7?A??nTiTeUKTmIxIyTTulI[PWDI_T_G?O#10?@?@#11I@Q?ATgD_Z?Bs@egUgQCOGCQgOgAo#26?O#11!8?_?_!38?_O?_O?_O?_O?_O?_?_?O_GOG_OG_W_W_Y_SgOmOkOiShUwVGQHQGR?ePk@eOl?`MZUlYvI|ItYlYsJ[bS`KAT_LOEPISBS`KOkOKoKOhGOgQG_?OcO?G#22!11?IDA??DAs@AC@C?DA_#6!31?@?@A?@?@!4?@?A#9?C@AG@C?HaC@?BCA?@OGGDAB?@#61O???__og`OOIGDcMDCCKCE?A@A@???@#88?_!8?CwSG??WoooWOGK?CCEEAMGAAAEBAB?!6@?@?@!17?A?@!6?@???@@??@@BBBJbvFVSU||eCESS\GKHWC[s[Acc_o#78!12?C@?A@@@H@D?AEMD_QHSPGAR_A?@?OCWO???_#5@?A?AA???CC?G#11??CGOGoGO_OGO_O??g?O#29?O$#0iOiTiShQcXa\a[`IsGTaOcGOdIShQCGO!6?_#3??@??@?A@ACBGDAdQiTuhE|it}tyl}|iOiS_Sg?GO#5@??D?dQGCB?D?JCB?C?S?C?A??CPBR@HBBbBBbBBbBBbBBbRCCUCESEC_AG?C??I??@?A@??H?A@??H?BB?CA@??@??A!4?D?HA?@?@A?C@?@#3??oCoCoCgOiOiOiOiS_?_?_?_?_?_?_?_?WaWaWaWaG_G_G_GO#5?A@?Q@AGA@AD?RCj?RCRCJsBlRLRnRnVta\bNqLJe\z}z^iT^!7~^~^~^~^~!8N!8~}z}|~}~}!4~}~|~z}|v}z~u\z}~{z|~?C@C?C???@#60o_[IBKFG#78__O_OGo_O??jHA?E?A??@?G???A@#85!10?_???_?O?GG?G?K?SCCK?CC?@IACAA?B?B?@@@A?@?AOIHYJTB@B@BCGK@A@BA@A@A?B@AASkOCG?g?@?A?G???G_P?OAo??__#65!18?@?A?!4ADTGOA\dqjEQhc??_O??O?_ooO?__#4@?@?AAA@P??CGO?C!4?G?_?G$#1?C@g?`A?OAC_H?OCHtI\nXvnYtjUlxvnOiTiXhRiPsEtCigG?p_caoOG#4!10?C?@??FOJCjSJuHEhU_ZGcr@OlQdCrk~z~j~z~|^~Zm{k}u{{[{{[{{[{{[{{[kzzhzxjxz^|v~z~~t~^m~\m~^e~\m~^e~[{^zl]vnu^nt^f^bYdQ`Si@iOl@iS?EgFhEhFgVHCBSHDATI@?GO@G??DG?O?I?@CHEPdGFOfXeTb[bKrKOm@KoFOcGQlCJOFGbKbSB{AKqKOkOg?W_[oGo?W_???_Og!8?_?_?_?_?!8o#14!9?C#0!30?_!9?@#37@#46@#65!7?_?_O?O_Q@?_HC?C?A@???G?@??@#93!14?__OoOG_WOO?WGOGgG{cS[I[CMCIcQeiU@b?uOJsQDSISE[_[AT@IDeccEDMSMsMk{gOkoSGOGGG???!4_?_o__?_#68!30?G??G!5?`C??oSg!4_#60C?G??O#10@?A???K???pQ@A@A@ACBC@E@E?DiS?SgG$#76!17?A!30?O#29??A?G?D?I@UhASI#10!16?O?@G_A@?gCA?W?G!80?C??CGBCOC@AO?Ag@!17?Oc@AC?TAOACAC@Sa!15?A?`A@_A@_CQd??_OCg?G_O_G?O_?_#4!84?I@?AAGC#7@#45_?CC_?G?OOMKCCAA@#67?@#75_oOOogGg{{}}WUFNMl}qpo@!6?!8@#99??_?_?_??_?_!6?_???O?O_?O!17?_???_O?WO_#84!14?___??@GG?A?CBE@JBIAKIIVN^n^Kk[k[{{wWOO#61!21?DC?AIGA??G?_???o#11@#2CKC@?oG$#5!218?@?@#6!131?CAA#47_!5?C#54A#68!10?OG??IIHA??C@?@?@#85??_#87???_!8?_ooG#95!7?_?_O??_?__O?OOo?W__O_WOGSGKWCgSKuHlc@c_??gw_[_WAQsGGO?gGOgOGoO#94!9?A???O@O@?A#67!48?O#46@???C??GA!6?_#35G#3@@?D??MDytititJsjUhUhViTjVjFvn!8~$#34!352?O#14_?O???C?A#84!22?OoO!4?E`OoOO?KMN}zFJFNvEMMMEMEAFBB!4@B!4@?@?A#100!31?_#87!23?@?A?Q?I@?A??C!4?OOOG?_O_oO_O_#43!29?A??AGA???GWG#70C!6?_#16G??_$#10!353?GC#31@#44__OoWgGYATSB?E@B@B?@#98!43?O!6?_!9?!4_!5?gOG!6?__!6?_??O?G??O_?_#75!18?@!9?!5@!5?!7BFfjm}|{}{s{wy_p`oAGC?gCOGIGHCS#45?@C?C!6?O_#50??_#64O#29A$#2!354?O?G#3@?A#1A#44!187?@@??A?CC??O???_$#38!354?_#55?O?G#50?C#47!190?@!4?C?G!4?_$#43!357?O_G#50!192?@#20@!6?G$#0!554?@@??A!8?_$#40!554?A#58A!6?O$#1!556?@???C??GO??A$#14!556?A!6?O?G$#54!557?C#53?G?O$#96!557?A#97?C-#0~\SuzxKmzgnx{}Jc~|zmz]tz|ju|iTzcZtiTiOcGP_@_@???_#29!5?@??D??H?Q@?G?O#4???@!4?AGAc@??AC@SAIPEGASASBGUGViUlRmRlZdYVlZlvLzLzVj^jvJ~J~TnZVjTnZe\bMPeLQnTYF|A~DYDZEXFYDZDu@^?nQLALQLRc?A?GAC??A?@!5?A!7?@A??@A#10!11?@??@#4?@??@A??@A??DA?AD?CA??AC?A?HA@QCJDaHE?VGDiPMShS_Mh?n|Qh]i~nY|M~]y^}hEpM@uHm@YdWTItWnu|mz{nuz~z|v|z~s[k{u[{[!8oCYW!8?A#45__?O?CWCH@CAA?B@#80_?_?o_O?W?_#95!8?_?O??G???GGOG???O?G!6?CCE@?@@!4?A!9?C@??A???@?@???@?C@AC@?@@?@A@???@?@@!8?c@PCHQo?G?g?GC?CCA?M?T`CQEA@AC?C??_#88FFCCCKAKG[GW?OO?o_oC#75@@@BBBF]N\xooOW`GOX_O_?_#61??O@?DJRVI{ico_G?OO?_???_#59?_#10??GO?G@_i?A@CC??CAG$#1?_@?C?P??@?A@?S@?A?OC`IC?SGADiCJcITgPeHQmPmQkRcj^~lztmYqOYD_OG_O#76?_g?_#10!12?QD?_I?@c?@S_G@G??@??@#5!27?A#3??_??O!4?O_GO_?_?_?_?g?g?g?g?g?g?g?gOcOcOcOcGO?O?O?O?s?s?dGPa[ti~y|u|Ytmxu|i|}t}}y|}m}]}}]i}uxmty|ulyTisYdwTy?gOg?gOg?O_?_???_#26???@??C#5?@A@CPAT?A???@??DA@?@D?@EPM`UHEPmDYFiTIFOHAPCBOHC?CAGAC?JbRBHbBb!8NxdFgL?I@@???@@@#1@#61GGCQ?G?KCCCA@?@@#78?@A?A#93GGGwO???_oOOG?W?C?CDEK?KOGGG??GKCKEBB@A@?A?@A???A@A?@!5?A@?@??ACA?BD?A@??@?@!20?A?ICjULJ\?GCSC?MAIPF@fIEAL@\A\J]Zz}WWowoo_o_O_?_?___#78!11?@?AAFFf?Q`@?B@CA??c_??_!5?O?C?_#37@!8?O?_#83?o#17?G#5?GG??_#29?A$#2?AG??A??CQ!5?I#76??C@!4?A?@?O#2??O???ACHQd?MOLQkZS??QCIPcLi_gQC`?I_#11??@?DAGCA`KPcPGUlQlZSj[Pmwa\a{bKR_V_ChAKPKQCYDgQcQGqCqCgS_SGs?s?gOcGSi?cXa[`MPaLOIdWA\?QdQcPeOdQcQHU_V?HaXaHaGRe|JulZezGvI|QfkT`IT?DAHAcGPEG?TA@I@@DA@P@?@@_T?HEOGDAGODiOHdWAi@|ReTzUlRUhUkZSiXUgvgSiPgPiS_Y_O_O?hS_S?O_?_?_?_?OG??_!6?_???_#3!32?A??D_I??A@#60_??O?g!4?CE?@?B#85_O#88?_!9?oCC{WUIMAC?CC?AAA?@BABA?CE?EABB@#77!7?_?_G?O!8?_??_#100!14?_?Oo_oeoYCW[Wy{_gSAg??c?O#85!7?CA@C???A??@!13?@?C@F?G?G?OGO_?o?o#65!17?CGGGfKSieOkJpNvJMUkGS??C??WG??_g_??O#96C#86G#4C?A?@???`?A?_C??O_$#82??aH?CaP?COCA@_O#3!40?D?QLaULc^VVm^y|uz|]rkRkRg?gO?_?_!8?ocG_GO?O_?_?_?_#10!65?H?c@?_HC@G?AGOAG#76!25?_#10!23?CH??@?C_CG@?_OC?PG?aOCA_??I@?CI??CA@!5?O!6?_?OG?o?O_???_#22!36?_O#14?OS?G??GA#38C#75O!7?_Oo!4?KG?IMDE?BBB@?@@@#99???__O??G_GO??OO?O??OO??W?GG???E??FA@A?A@A@???H@AA?A@?CNCBG^CIEKAY@?IKGGC?H??D??[?gSQzZGcJ\IOiO_??_o_OgogOWoKg_W_Gg_g_s?o?_#87!5?BBA@C@AACAKJCGEKAg_gGO_#68!11?AC?GAOKOGO@gQO_g_o#43A@@AKCI?KwG?O??_#11!11?@?@$#5!91?@?@#6!245?AQD@?C?@#44_OGgCUQBH??B?@#87??_?O?o?OgO?sC?AA?a???K?FAAB?@!7?AA?B@#48O#102!14?_?__??__#88!54?EBAAA@@@#84!23?@A@AD@BDBCJVHRLR]Uuk[{w_o_#67!9?C!8?@A?CG#46@@?A?@!5?O#1A!6?A???A?S???O?A$#10!341?_?O??AC#59G#43?C!5?A#84??_?oW?W?SK!4?_!5?A??@@@B?@@?@?@???@?!4@??@#103!15?_#72???OG!4?O!5?O?O??_?_??o?O#84!34?@?@#80!26?G#45!50?C??AAC!4?_#53??O#76!14?G$#2!342?_C!4?CA#24A#40A#68_?_??O??G#47!10?_C#85?OC?g?CgS??G?G?C?C?A??C?CC??C?C??A@#87!75?@#44!80?@???C!4?__#97G$#9!343?A???@#56!4?@#65_?_??O??G?KCAAAD???@!4?@#98!8?__OOW__o__?G??O?G?O?OO_GOC?E??C?D@D???@G@AI@KDK?IBOgWC?WOWPGCKICQEOJC?EBADABUAhDCcRZc_Pc???_???O???O__?_OO??OP?O?G_?_!4?_#60!57?OOO#16@!4?A!4?GG?G?O$#33!343?G?AC#46O#41!5?@#67??O?G!5?A@#42!5?G#100!16?__?O!4?!4_???_!7?GGGK!4?C?CCCSEMCC!4?CC#54!131?@!6?G$#17!343?_#16OCG#78!9?__#46!13?@#101!28?__??_?__O__oooOwWsWGWWwgAOooOgoWowog_?_o?_?__??__!5?_o___#41!109?A#0@@???C???O??_$#70!344?_#0O#37O#72!55?_??_???OG#50!158?A#33A#3@?@BB@DFCFFFCA@D^Weoh^~z|v~~~$#35!345?G#42!224?C#2A!4?KG?O??o?S?O??G$#69!345?_#55!225?C#14C???AO?_!4?_$#47!572?G?O$#5!572?@-#0~}~~~{}~~x||!4~vu^~}~fv}~z}~|y~tszmhupG^cZsPIdy?@A#29!9?AO?D_A??O??CO?C??O?g??G?G#10??C???@???A!80?@?A???@A?@#29!4?G?C??A#11!34?A???@??A?CB?B?B?B?BA@AB?@B@IAQHtBaHRAdAXAiP_EHCjOHeGaLaSi@]_]_]`Yd{`]_{dYc?_?_?_??A`?A@?A?q?__?o_???GC?GC?A@#44OGGSCAB@@#84??_COOAIE@A@A@#100?G#95?KW[O???G??A@???A?@#102?C?OO?S??G?__q?@??AK???_?C?A?C?C??bodW`@dS`?DWCGSGO?GG[Soo?oo_Wwgw_wWOqOk{cc_!4?_#100?@?H@F!7?A?A?GSGb?@GWCKKGKGA#48???A!5?C?O#85!8?A?@A??@A@??OCG?O_Og?_#75?@@@BBAFFNNLX[XOke|wsow?_#44!5?@!9?@A?AA??!4C?!4G?!4O#17C#60_$#82?@???A@??CAA!4?GG!4?OG!9?I??O?GC_???G_O??_#3!11?@??QGPCJDMRJfZj]lnS^}c^c}{ykq{qkqkOno^_~Ono]sisYcwDwcWcwCwcXcxCxShqKolQkpItgsHqkQhUweWugUwSj{j{jsZkzkzsZkuxUhu\u|i|{l{|k|u{[m{\m|e\RjVXExVhVj\b^`^bMPvI\b]hTNSjLlVlZF|jV|Lz^vM~n\~Zkn{^kn{^[|}{{|}{{t{huGsGsGsGs?s?cGO_O?_?O?O?O?O_#10?P?O@OC?AG?TAO_GQ?SA?SA?HO?G?_OCGC?CCG#31??O#1O!6?G#60__?_!4?AA@#87??_!4?GK#99O??O??g?c??OO?C[CGG?CC#103??CC?CC?O?[G?CC?GA?@@[A!8?AAA@edOFQfUmQb[lwcWcGA?WOS_g?GoG?WcCS?GC_CGEQAW?Oo_O_O#53?C#99!4?@A@?B@?C@CB@?SKFCF@B@@ABCDAJQHPIhgS`GAOAOG_g_O_G_#123?O#88!4?BBAGCSKK???A#65!6?@!4?ACB?KAP?C?G?c[O_Ko_g?O_?@#43???A#47??@???A#2@!9?C!4?G$#1!5?@???A!7?@??@?G?@?C@?A@?A@?@A?A`?Q?BcPA?mYtjRhRgOmXa[_YaKtCQ_w?gcO?C??O?_#76?O_O!99?_O?_O?O_GSGcXEGUGSA[?]?[`I?dAG@QA_BCQAGAcWASgAoC_Go?O_?_#29O???O??_#10???@?A??A?@!4?@??@?@??@#26!18?@#5???@???@??A@#3?g?g?g?gO??S_SG_!5?_?O_gG__G#104__#23_#43_??_??I#65S??W?CCG?C??@???@#48G?_#80?B@B@AA!6?@#100!6?!7@C@#107WGO?CYAI#119?_??GWG?O_#107??CIWYK?G???GG!5?O?O_#114!14?CC?C??G!7?_#98@???@?I?AHeASAE@A@GUH@OgG_CG?AC?BG@?DCEDQBAGSkkwcOOO?G???C#87!7?@BBBA@MESS[s{w{wo___#46??A#78?EBPGABJEBY?mOo?GOg_G_#40!8?@???A#65_??O#3A!4@B@@@BF$#104!18?_#2!11?C?G?COCHCQ?HcGACGDOCGSkUkRnPe\`MdW??g?C?o??G_O_#4??A!9?@?C?G@??D?I?A?I@A@I@QDA@RCB?RCB?RCB?BCHADAHAC@GR?ADQ@CHA@AHA@AH?@?@?@?@?@?A?@?A?C@A#1!20?_?_?_?_?_?_?_?_?OcGO_S_CgOgO_O_O?_!15?O?_?O??_#4!10?C?AGSAcGQGeHSIVhUjSNuHvLqLjD]`M_N_M_Y@U_I@GCRD^B\VJTnsMjTiVLzDZVRZFJZB@FHBEBF??A#61O??OGG?CCAAB?@@#98__???G_gOOO?_A?GOAAWc?c_??A?@#114?_?___??_!6?_???G?_?S?C[s#112??O#101!10?AAA@@ABDIDABABHBD@FABB@BRB!6@BRLJFJEJvaUq?gS_GcgOW_WOc_aA?Oo?_oOoooOog_??_#41?C???@??C?c!5?O#80!12?G?O?OG?_#68!20?@??B?LBKACOCOOO_???g?W_W?OG?_O_?_#109A#43Ow?__?OO$#76!48?@!6?C!8?@?Ah?A@#11!5?@A?@?@B?B@B@RKBGRDQlOI_T?lOD_HS@cHAwEGbWFgBWeGAwEgQCpIOcPIsACJsG@kQ_DWd?TgDaSASASIcQCQCHcQHChQG_HATAAQ@ARAG@B?BA@A@A#124!129?_#22G!5?C#9_?O_#19?O#105O#33O#0G???@#75_?!5_???IKC?A#77__#117!8?G#87?@@@#42@#69!16?_#115o??O??__?_???_??_?g?GW!5?G??GO!6?_?_??__#107!16?g?_#72!7?C?C?GgCsOgSOW?k_WcgO??_???O??_!5?SSgoGo?O_O_#84!24?@A@@BHBIAE?CKWWOoo!4_#61!6?C@?@A?BTAFJENm^~~{S|c[_ygOWWgC_Oo!5?__$#5!323?G??CC?EOACPGG@?@?@#68_#78?_O!4?O#85?_?_O??@E?AFC!4?C!8?A?A#118!12?O#111??CCG?C#113C#118??_G!7?_w_#122!11?O#72?A!8?@!4?A?@#108!7?A#115C#93!20?@#95??@!9?A???A?@#77?_#93!8?C?A?@A@IBHDZd\fIxL}}|]s{koo__?_?_#45!34?@!5?@A?A!8?G#67O#115C#116C#37C!4?G#35G$#76!332?O#79???C#6A#55G#20C??@#59@#67?G?WWG?B#88_O???K!4?@??A??@!4?@???@@@#108!14?G?O#112CWO_O#121OOO#40C#69?w#100!20?A#77@??DAD???ECICGC??A???A!6?GACW?W?GO#93!22?A#95!15?@?A?@?@?EACA??S?a@??_G#60!55?CCC#75_#49A#63A#0@??A!6?C$#12!337?C#110C#7@#45O???CC?A@@#68!4?@#93OO?GCC?AF_???KCE??A@E?A??@#72!22?C??@#114!24?_???_#120!68?G#56!76?@#24@#64@#104?@#105@#20A#1@@??AA#41G#4A?A$#41!337?O#106?A#10A#71G#89???O!4?OK#101!4?_??_!7?___?__?O_W?wg{YyyIAMEIABEBBB@@???@?F@BBA@B@?@#9!176?A#88C#78??_?_#62G#10A$#47!340?C#92A#72!16?OO?O!9?O?_?O?O?C#34!213?C#96?C#50G$#77!370?_!6?G?O?_??Og?G!4?_!8?@?AC??A??@?@?@#104!181?C$#41!370?G-#0~B\jTJ\b^jVj^jVZ?Yd@IRDT`T`DZrBvTTlZ|{]}~~~{{~~}nco}gOk_SoS_S_O_#76@??A?C?`???@GC???DGQ?@Q_@AGSc?CO?O?O?O?OCg?g?O?O_?_?_?_?_??_??_?O?_?_??_?_?_?_?O_O?O_O?O_??_??_?_Gc?Gc?g?GC?SGAGaGAGaG`AcH_EP?@C`GCBS?T@cAT@cA`IC?_QC@C@?aH?i?@G?Ha?SA`GA?Dg@Q@Q?T?CO`?SGA?I`GAH?_C?O_?_#4!6?@??A??C@?I@??C@?DG?C?I?C?G?SaC@CAH?DAD?DACHCOG?A@i_???G??BA@#133_O#95O!6?OO!5?G!4?G?O?CW#107?_???_??_O#115?_?_#114?O??G!4?KC??AA?@??@@@!4?C?@!9?A???C??C#81!5?O#128??_??O_#127O#114??A@?A@??_???cGSHC?_XK?KO?Kb??_??_W?_O???_?O#98??_?_?A#100?@??@??@?AG!5?A#98?@???@?BCGE_B_eXESs@g`a?OC_???a?O#85!4?AC@C@OA?W_OOO_O#75!4?@@BEFDMMNMN[y{wsoagooo_OO__O_?AQ??gCCAaG_GkC$#104?{ASISA[?SgS_SgCZcYSTgY_]_]ocGsG_GO_#1?@!5?@!5?JC@UaRMhJ`]`YdI{~\tlyTItyiqPgiI{qsgOcGSgS_GOgO_?_?_?_?_O!47?O_?O?O?O?O?O?O?O_O_O_OcOS_SoCoCwAsIoiSyo]ti{i|isY|i{Yt[ti|Zkzsz{v\q~?~QtmsXuhsYcxuwQ{_[_Y_Y_IShAs?s?S?S_CGO_#10!29?@???@?@?@#1!14?O?_???_!7?GG???@#87_???O?O!5?E!7?B#101_C??@!5?G?A?DCAQ@?@B?DD@B??@!9?_#111_!4?_#107_!5?O??C!5?C@@??AA?@#112!14?_?O?O#107!5?OG???@?@!5?A!4?_#72?@?B?@?@@A`@a@a?T?c@??@?AHC@??QU@DG?LISJ[`SgQsG#93???HAKQCXiDITh\pHvJ~V~^lwww}cs__O__#78!10?@?A@!4?B?A?GCSB??BQ`ATGaCg__PAObX?CAA@?IC$#137??_!5?_#82!7?C@?I?C_I?I?I?CG?IaACAA@@???AB??@OOJ?@C?O#3!13?@G?A@CGAPCPBGBDnYdJUhVbJViN~N~N}N~NjV~U~n|n]~Z}\~]~Z}|^}~\}n~]~\}~^}\~]~\~m^n~n\n}nN^}L~m^n^fZnvJ~F^fZnJfXfHVhFXFYDXATHCjCJ?AP?@A?I@??A@GA?PAC@?I?AG?C?T?kAPACHAHCRCHADALaLdIdZdIUhB|JtIvhUzVj]n^}\~~}~k~y|}|u{z{ytylux}tyukqmOmq[a[a[a[qkq|yTy|iszCZKRmTITOHq?OTEC@A@#75G?S?O!8?@@@#98O!4?GCBBCKE?IBHF@?@O?O!5?A#125_!5?_!4?CEEACAAAG#127G???C?Q#103?OGGK!8?AAA??@!9?@???@?A?@?`!5@?ADA?OGOKP@Ki??U@KCOWg??gOO??O!10?O_?_?_???_??___#48?@!4?A#95!11?G?DG??CAICGC?G?_O#88@EB?JG[CMKG_O_ooC??_#65???G?@?@??D?FAJHSEMGKIkGQCWQWGaxDW_wWoSoQoo$#106!4?_?_!8?_???_#109!18?_#2!14?H?@ACI@IDITA?aGQ?aOGC?Cc?P_#11!14?@!5?@!6?@??A?@?C@A?@?C@A?@?A@??@?A@??@A?@?A?@!4?A?@???@A?@!101?@??@A??@?R?CA@?HB?AD?CQHA?I?@RGPdPGbSbG@XaHPCA?g?AOH?A?Ac@GC?COGKF#57A@#44_??GCCAA#68GCC?@A?@#94G#139_#72_?_??_!5?BA@@@!4?@?G!7?@AAA#52?_#81?O#49_#135_o__???_??o#130O?O?G???C??_#102?A!9?@@@!17?@!9?@!4?@?@???@LNHK??K??W???_?O!15?_??_#115??_#53???A#99!6?@@LGVXexaHqDQ?Oa`IO_?O?_?_#80???A!5?A#84B?@A?BCJCJReM[wW!6o_#68?@?@???H@C@C@?CHA?CDG?A??C@CHA?@A$#96!5?_!10?_???_#29!50?C??P??A?C#5!232?_!5?O!4?o#0?_#2O???A?@#84_??GO?GGK?CG#99O???OO?C?GO??G??G#112?_#118_O???_??_O!5?G?GCC!4?G?G??H??C?D?@@@!5?@??BFJHKG!7?@?A??AB??D!5C_A?OkWs__ogWc_c?_c_?O?O?_#101A?B?F?BCJCidIEXE\lI}J]iNIU\CRM^TCHSIUHQsIs_Y_O#41!11?C!4?A?C#87!13?@@?@ADNKJCJokWO_?_#61!20?A@?@D@?CC??A@?@!4?@$#76!313?_??O_??G??@#12?G#40_???C?A#34@#78o_??E!4?A#131??OG#77_#103_?_??_!5?ooOOGKC?JKHMNEK???CCABA#107A#102@@#40@#112OOG??G!4?_??a??OG!9?A!8?GC#77!38?A@B?E?CKQCICGCWCW?O_?O_S_Sg?O?O?IH?GO?S_?_#123!19?O#84!71?C??G$#10!314?@!9?_#55??O#60O!7?@A#41?__?A@!4?AEB#134O#100oG??__?O#119!4?O!6?_?_???GG?OO??W?YG?OOICSD?@BA!4?@???A??CC!8?CCE???@AA??EC!5?_!4C#108!27?O#114!22?_?_??_#43!98?@$#124!320?BEDA#42!4?_?O#70A#47GGCC??_A@A???AA@#122!7?_#126???_#77!4?C?IAO@CO???C!4?@??@#141!4?___!4?_#136O#116?WOGCGae???O#125_G???_O!6?__oOOo_O$#138!321?_#58!6?G#80_!4?G?__???_!9?C!7?E?CE#120?A#108?__#102!5?G#121O?W!5?GGCK?A@!5?GDA??A!4?!4@G??Og?O??WWOWGGEAMCCKCKGGGwgwWWGWGG$#105!328?C#46O!6?A#85GGCC?K??G???G#132!24?_??O#126!13?OO???_G??OQ?G?CQ??G__O??_!5?O!4?G??G??_O?O$#24!329?C#123?_#49??@#43B?@@??@#88OO?C!7?@#73!21?O??OO???O??C??@C!4?A???C#132?_!8?OG?_??O!5_?O??_G???O?_$#65!329?G#93!11?O??O?CC[?G??AOG?OOGC#140!14?_??__?_#129!19?GC??_?_#73!5?O??_??G!4?G!5?__O$#48!342?_#120_#53??_#42A@@CB#128!25?_!24?_??A?O_O$#115!406?C??DB!4?A?DCC?A?@?@?@@@??B?AA@?AA@AaQAAIE?QDAAQaAIQOCo?_OO?_??__-#0T?@AP@?E@AOHACO@??@DI@IoC@?@A@QDA@?cJASJSIuHvLrfGBELf^unVmU~ny^}_?c?G?OG?O?_!5?AS_Sg?g!8?_?_?_?_O?_!22?_!47?O?O?O?O?S?S_SgOGqGQgQGqCXaKAgAKA_!4?O?O!8?GOiOIoIS_O?Sg@AC#3?@C?A@A?D?@CPCbCOAHC@a\ADQM`NtJtNtJtNtJvl^l~l^l^~~n^~n^~nnN~n^~~E^jTmVjvoI?IO?A?@#40O?OG?kcooo_?O??OOO#154?O!5?O#151G???G#51o?OOO?_!5?_!7?O?G!5?K?G??C?C#36_#57!4_#21OO_OooO#121@@??A#116@?AUYKKIKKKA?Q??oOgGOOOGW#126@?AC@?C?CA?K?G?GC??O?oOG???O?C?C?GC#103?`??A@??_A!4?`A?A?AERAD?ICSGbOkIHk?WCI??G_#98???@?@A?@RCTAAWpMgVC_G?s_WWGCO???c_#85???@A@ACB?KOgOg?O#75!8?@@@H\{l|Z~n~m[mk}]|{ygcP??@ADADD$#104A@A!6?@??O???RHKIdetBBAfAH]DA|MlIc\ISJsHsGoGOcgO_#1??@??@???D?@NBHFRNfRnLZNv\zu~wgJHAuRF}VunRxT]^]^]^]NbXL}|y]\\]}\^x[]~oz{ncjwNKzWlaTwz\SuxzT[vtwNduxzw|}mdvx{~|{mf|ryUmvUnuVmbmJvJjfj@lbHI@ErKAcAKaCWaCPhDdPH\^n~NfnF~n^n|~}~VaCL_EP_JF{aA[gpz}z}tmwvW~szkrKyJlcry\Alyk`]oAsIoIsIoIsGQ_Q?Q_Q_!8?O?O#11!5?@?CA@!4?O#12_#1?C??@C?@@#41A@!4?C??GGG@@???@@#48@@?G#108A#103A#111CCC#59AA?AAEKC#49O!4?G!9?A!8?C#126@??@@#58C???C?CC!5?G#145o??_#136?_!5?_#52G??O???O#73?AB?@?A#127??W?O!6?_!4?_#112??C???_!4?OG?_!4?G#101!4?B?@?@?@??@??@!7?A??A??A?ACa_F_DITkRc^[?_[cO?s?_?o?_??_#95DA?A??O!4?Y?COcW_O_?O_#87?@@?AAKNCY}WScW#78!12?@@@B??A@CRGepwwTw[WW$#137_AGPa??@EOHOGO`qC??O?G?C?CG_???O#150?_#82A@??@??@!5?G?O_O!6?@!6?KQGcOGCOAcO?_#76?@?DBSaTHCw@gHOkCi@_@_@_@_[Cq???`_a_@__Ca`?GC?OOOCOo?cOOg?C?aH?C?a?GA_OG?CCA?POGCA??APO?GChPGhOHgPKPcGcSGSiQGU`UHC@THT@THBCHACQGAcA!11?A?@??LPATHCJSgBHTaTIC??@GODGa?I?AGO@cOQGC?_O?@O??G!20?O_?O_??O_?O_??w_OgOgSGJ_XPaIH?A#48C???C??MEAOO#87A#50_#155?_??__?oOOo??O?OO?O#21__#81C??!4G#128O!4?C!6?@A?@!7?A!5?AA???A?A!6?@GHCAACAA@?ACCHI?@?!5_WO#118!6?@@@!5?B!6@!4B@@?@@@_aQOUoO!4SWO[SGMCC?A#107_#59_C???O?GO?_?C#72!7?A?@?BKW?aX?aGa??S???O?O??g#88!19?@?BBEEMD{_ow_??_#65!15?A??@@?A@CRGIDA??@?A$#105G!8?C!10?O??GwO??_?G#109!12?A?AC?RCHAW_GOgOg?O?_?O??O?_?_?_#2??GACG#3!14?A!10?A?@AD?A?@?A?A@??F?B?JCB?BCBALAF?aH?E?i@GADOI@E?B?@?I?A@?A@?GAC@#138!22?_??_??_??_?O_!6?_O?oGOg?O_O!7?_??_#4!81?C@ECGC?A#46O?C!7?G?GCCC#147G!4?G???!4C#73GG#163_#40?GKC#20__#102A#107@?@@#91_???O#38GCG?C@???C?AAJA!5?CC!8?C???CC?GO!6?O??o!4_#132??AA@?@A???c_K?WKWsAOOAS?W?__!5?G!4?A#114??@?`??A`?a!5?G??Wqo[K?_O?C_g_?G?@??@G?O#108??O#53!5?A#100??c]??GgG_!5?_#41??A!9?G#84!15?@?@B?BD@fJZf}}}uaBQAc?O?O_OO?_#46!6?CACGA?A$#96?gSgCItGOgCaC`ICgcQ_?O???gOGS_?g??O?O?_?_#138!24?o?_#109!135?O?O_O!16?_#138!88?C?_#5@@!4?A#10A#0@#54G?O!4?_?OO???O!4?G???G???K??GG!6?G#119G#121C?@#37O!4?O???gO???_!8?CC!8?OO_#129?C?C???OO!4?W#121!9?A?B?B@BAFBBA?K?MSIU?[[KwKksWoOK}ici[SGKK?KK!4G!4_#107!17?@???O#99!15?@??@A@HFE@FGI[SOG[cccacas_?Og#68!51?_??__$#106?S_CGcIOg?aC`ACG?Q_!8?S??_??O?O?_?_#51!277?_#66_og_OK???G?G?G#84@@?B?A#93AAA#159_??_#101A!5?A@??@#99@#50OOo_#55OO?OOG!4?G??A?CA?@?C@A#23!4G!4?G?GW!4G#86O#125AA?@?A???@?@?@A@@@BEDFCD!5CccW?og_o_Go_???__#114A#107!8?_!7?@#102!7?_A!9?_OWGKYZDP@fSKOPS?P`HOW?O#48!16?G#93???@BB?@B@BRHJ\JV@NRnZe\m\yk[ogO_O#61!39?_$#150!5?O?_!5?G#153!303?O#9OG?@#92__OoO!6?_?_??_??O!5?O#134?A@#23??_#62???G#133?A#118E??ABA@#142C!4?@#20_?O?O???OO!4?OGG???G#140A#73A!6?@@?A#140KO!8?CCGGO?g?oGGGO??G#119!9?!5@??!5A?CCCA?@OOAA#77!9?@?@?@??@?@@?@?@???A!4?A??ACA?D_LaSiO_?_$#6!318?C#105C?A#43G?C?B#47@???DE?A#67?C#99!4GAAAE#120@#115A!7?@???@?@E?C#103?@#63_!9?G??_O??_!9?C!6?Gg_O#142?O??_?O?__OO#73!25?A#128?__#73!11?G#115_!6?O?A`@?a@???I??c?_G!5?___!7?__?_$#44!321?G???A#42?A@?@#85A??@!5?C#77?GG?G?@!5?DA#122??@#56???_???_OGAI#52OP!6?A?@#19_?O!6?G#103@!5?@#49A?A#149C#152G?G?_#127@?@???@#119!60?CCAAQO??K$#155!324?_#80!4?@!9?@@#146??C#72??@?@@?@#58!10?_!4?__O__???G??k[#13_#91??G#25ooo?O??OO?_?_#55??CC???C#165!5?__??_$#68!336?A#117CCC?CC#160_#161??___#162__#69!11?C?C#73?A#116A@?@#145?A#50G?C!6?C#148C#121A???A#118A?A#100@#107@??@?@#51_#91_#132??A#141!7?@$#158!337?_#139@#156!10?O#100A#112!11?A@#125??C#140??@??GCD?@!6?@#141@A#56C!8?C!9?_$#74!369?_CA_#70?o#24_#35O#125@#143!8?@#164_!5?_#81??A$#144!370?AC?A#86??_#132!10?A#157?OO#34G$#135!387?@#112??@???@@???@$#69!390?A-#96A?A?@A?@?C???A?GACG?ACI?A?C?AG@C@A@GFgDOEO?O???gS_W_G_?O#109???A?CA?A?`a?IC?Y?W?Oc?OiOgS?Og?_?_???_O_#2!22?A??C??C#76!35?G!4?A?HC?A@A??@C!7?A???A!5?A?C?G!12?A!5?A#2!5?A?A?BB@B_?_??G??POPOOO?OoOoWwwWwGCKK?C?B?AAAa#29A??A@@?BB@@#2A@H#106O?OOO!8?C#171CCC#82A#14@#28C#83@#16@?@@?@#3@#5A#26A#171@#154A!6?!4@!9?@#161??__!8?AG?OA?E@A@???_#164@@?A??C??CCCBB_K?C??A?H`?I??_???AA??S_G#92CC??G#20@!6?O#116A!5?@A??@??oR_OOYOYHCKCCGDWKcs?O?GG#112??O!4?A!6?C#132?@#107!6?G!7?A?@?@#101!7?C??C?A?@???@?@???@?AL@J?BYsLQlOlQKxCgcG_CgGO?_?O#41@??@?A@C?ACQ?gA_C#88@???IH]k???G#75?@?B?@!4E??abFN^^}}x}{w{{w{xk$#137|w{{}!4{yqZ}|poSWoxoopWpYwwOosyccA??QG_gc?_OGg#150!5?_#82!10?OgUGSgOhO`O_Gg?@#76!13?A???CA?A?HC?BGQ@QCOK?cOK?c?_I_W?G_W?O???O???O???O#2!25?@#138!9?_OGCOAG??_OC?OGDA?_@???A?C???OGAcB?C?OGE?GG?_OG?C?CGC?KGG!4?ADBG?I??G?E?E?A?@?@`_!6?G!5?CC?A!5?O!8?A#158!5_o???_oo!5O??W?wOWWWKFEFBCEAA???@!7?@??GG#92OG?G?G?G?O?G!6?G#21?B?CC@CSGWG???CG#178@_wo}LDQ?C???CP?G!7?_#179o_#91GS?S??G#145@???GoCKWwwwWO#52?@???A_!4?OG?G??G#125?@??@d?CCGC#118?oo@WWXlLKKCOo]UEz|\rQpzgyTkmSCgW[GGECA#77???C??C?EA@@@?@?@?@??@AESIScIOgO_?_O#48?@??A?@?@???C_?C?GO?_??_#95I?P#123?O#80?@Ao@!7?O#78!19?@?A?!4ABAAB$#106?A?@??@???C???A?HACAHACAC@AC@AG@A@?DGD_EOAO!4?S_W_GO?O#138!20?A!6?A?_A???O?OO!5?_?_#109!77?_?g?s_]?iOjkQogTYSkr[pkPyTidOtGWsjOjTohV_VGN`U???SO[OC!9?A??G#167?_#170!13?O???O!4?O??OW?W?WG?KG???CC#154_#160_!8?_!6?_?Oo?o?!4_owww{wwksMZrizryzzq]}~NSvnUZvUc[cOaG_?O?kocCwGo#157A???@@CC?@#57A#163??GOEJ?A#195_!6?_#157?O??GG#177??A#162???G#23?@??G@??__#136ACKG!4?C?GO#128!5?@?@ACAB@@BBAB?GI}?C#121A_qojLJMfdeAAARPBB#103!9?CA@A?@??OA_Cq@wDeOAoaHYCgOiGeYSAABASX??g_SG??_#99!9?A?@???ACA??Q?sACh?IP?_#87!7?@?@??@BNZev^}}[s{o_???O#65!7?@C@@D@@C@CO$#150?D@A?@AA@@HC@?KA?@ACCH?CGC@ACD!4?O#1!41?CA?C?C@IDHUbMbM@CHUJ?@SHE?rK_D?K_JAbQJAbQJYLPFbfvBFfnn^nnn^nnn^nnn^n~n^n~n^n~n^n~n^~Vf^n~NWeQqLOkSl]IaRiDsB]?L?hC@?GDA?G@?@?BG@iDA@GAcI?_?aGU_SGE_UG_!7?ULLF@@AC?@??BBJ@BHJ@DAC?EIQqkZ~{C!4?c!5?A_?O??CSC???I??A??@@???AA!8?A#109A?@#76@#177A#172@#173@#40!4?@#185?OG?CKCCC#174@??@#155???O!4?_???_#175???@#163?@#176!5?@??A??C!9?CAA!5?@#186C#179A?@?GG#79_#28__#15_?_#37!8?A?!4AMG_o?___#73A#140?@!4?@@_P?JCL@C?AA?C?CQQ??GW#73`#126@???AC!8?A#115_???g??A??I??C?AO?i?CA@C?Ao@`P@P__??_O?GC#107?O?O?_?_#72???@?@?ADANQLaEwEWdYgSakYSg?Go?_#85!15?Q?PA?O?cG?_$#0!8?A!6?@??@!8?@??A!9?@?ADI@A?@AC@ATaCjDjTNRlE@@A@FDANCNFTBX}jTjS`Yc@[PKPmHuHcZ{JsXuGr[qlqLolOlOlOlOdOcW?W?W_W?O_O?O_O?O_O?O_O?O_O?O_O?O_O?O_?gO_O?ocXcHqlQhQ`SHCPAH?@`ODAO?dAOgD_QGaCOaC?OGe?P?@OHC?@??@_P??`?c_a___o@A??C!6?@!4?G!7?O#3???A???B#17___!4?__#181A#3cC???OA?GB?GC???AA?C@AA#154G#124?C#79C#166A#157C#51C#170@??@#175!15?o!4?G#162!11?_??gO?O_G_???_@KB_FOCwW?w_O_Oo?wooS@@?@??_o?G?A?AA#57?G??G??O???_#86???@?C?OO#144@??O!5?_#149!7?A#130!5?_#132!7?@@?AB?Q@JC#119??_???Oop__GK?@@!4?`??C#102!5?@!8?GKGGKA?HPGCeO?gg{k{GeKoO?__#98?@!6?@?AP@O?QBS@`HRNcIJSiS[ogPOg_D?G#84!11?@???@_JAHXxx~n\[wo__$#193!11?_!4?_#104!17?C???A@?@@?@eTBIDBUDILjSySgogOhSgSGO_O_?_?_#168!16?_!119?C!11?GGO?G#76!5?A?IC!5?G???G???C?C@C?O@@@!4?!4C#64?_#12O??_!9?G#156_#155_!6?O#66?!4OGGggg!4G?KCKCCCA?@??A#159!4?_!4?CCCK_???B??@C?@BB@FDET}h]OAWO!4?_#124?@???AAA#169!8?_OC??b?hO?KCCC?CKG?O#63!7?CP??C#132??A?AA#129???A!4?AGGGC?___?OogoO_#127!5?_O?C#107!4?O#114!7?G??_gOCA_KCC?P?gP?hOE`?q@w@GOA_A?O@o???O??AC???A?O#100!19?C#93!9?@??@?A@EK@DMQlVy{Mk}cs_?o$#105!15?C?_!5?`?_??g???WWgqo?OG?GkIcO#166!178?@??@#29!7?O#166??O?!6_O_?_?_??_#109!9?_O??O#90??_??O#171??___?_#26_!7?O!5?G#21G#105!6?A#185__?_#190!18?O#155!30?A??G??_!4?_#7@#180!9?OGGA?O??@C!8?G#35!10?C#74@?G!4?C#38???@@??a?CCC__???O??O?_#108!59?C#59???_$#110!224?OO#171G#168!13?ECCACCC?C?C?A?AA?@_??_???GWGGGW?KCC?OC!7?BB@?A@@#167C!9?@A#92?CC#0A??A#156!49?C???O?G_???_?G!10?G#21C?C??@RBO_Qq_CDJPVitisw_w#142?AC@!5?C?Cem}[K!9?_!5?_$#82!225?A!4?A??oOgoogw#171?G?C#166!21?@#10@!4?A!6?AA@?A??G??!4C?C??@???@#183!4?A#184A#54C#40C#177!54?BG!5?GW!12?O#155?C#192O#51A!4?!5@BA?A#152!9?@!4?O?C$#167!225?@@#179!40?O???G??G?G#0?C#109C!4?S#181???O!5?G#174__#173!68?A?A#12A#36@#191!16?O#25!5?O?O#127!19?@#126B#125@@@A$#167!267?@@@B@#22@??@#16???G???A#28_#166???!4G#182GG!7?A#25!64?A!5?@#194!13?_#168!7?C$#194!280?_#76O?@!8?@#2AAA?@@@#79!68?@$#173!283?_#169!4?@@#189?O#15O#29??C$#188!289?O#187!5?G-#137~B}@~A|JtkRlYfYuHbI?`APCAOdADI@IdIRHjTKSoQqoSsSsAO?O??Oa???Q??O#109??@A??C!7?ATA\v}lytmTyTmp^qlQ{jSlQlOgoLsGuGS__O?o?gS_OgCo?gC_?gC_OcGC_OCgC??gCO_SGcOCGoG_GO?G_?CGqCHQcQ?qDgS_Rox{{~o{YuzTr~r~|~~|~~~}~|~~|~~}j\jvlzju\QiuH}IA?C?c???AA?@!7?G???G!4?C??G#26O???G!5?C!5?A#156?A!6?@#197_!8?_???oO?_C??CK?!5C?CID??A???A#163!11?OgwwoMoSafcxaKiUkWGg{w_O?{S{{G{wgo___?_O??_GA?_O#180E@??g?WF#36?C#203{Ku}{{wO#0O#25g!7?H_@??Ak#24@#116C?Qi_O{Wmal\MDB!7?_?OOGMA@#140@#132??@Q`???g?__G?O?G?_g#73!12?_#103G!9?@O?P_PG?e?bO_POO_FQ@EXSiC`AQgRCkW@KAGcO?GS_O_?_#99!7?@EGfSA`k?CcAH?O#80O!4?AC?W?Og!4?_#84??`B_bCrdUxJrZVm\kprpppooo$#193?{@}?|AsIPkQdWdGaWsLYCkY`LY_YoKs???c??_#96?A?@?@A@A@GBK`YC?gPC@QG_??_O?O#1!15?@??A!10?A??AG??Q?AGD_J?aHI`UGAHSaGOChAGVGBgRCJ?jOFgBGV_JOjCRcRCJtATaRAHcRCHQcGRCaHOEGB_@!7?G!30?A?C@A??Dc?_?A?QOOO?@@??@!7?@G?GH?CDD??@BA@@@B@#176C!5?A!6?@#174??!5_q__?Oww??_!5?A?OwGOW?g?_?@#175SGO?OCGKAmNmIeKSKCC?K??A#162@???@?@??@?A@?HgcA`?@_@CQIXEGY\MNFB!7?A@#169?@#124_#157W_#138G#3A#213oG!4?_#33G#21P!7?CA?B~[#86OA#145@@#136@?@#142?!4@???_owwkCANBJB#125_?_OGMGAp_gGGG??GG?OW?G!4?G??GG!8?__#126_#107??@??G@#102!7?@?CCEBA@B@?HKXEJDZY\lVKh?__oooWgwc?C#53???@#100!7?_#48!4?CO@gAO#41?C?cA?O#88A??IEEJ?OgZO???GG?GGgKO?C??_#65!7?C???C$#96!9?A#150!5?@#196SC?_?p??S_?K?D_?Gs?O?I?_#106???@?@A@?@GBGdG?PcH?H_?G_OGOG_#76!30?@#138??DA??@??A?SGC?C???C???C??OC??OC??_OC???Oc???C!5?_!5?G_CO?_!6?H???@?C?A?@?A@!4?C#104!27?_!6?G#171W?K???C???A!4?A#169C!6?C#205_#106OO!6?G???C!4?A!5?@@@#194@#188?@#173@#159!11?A#156_#206???_!7?C#159_??a?oO_QPO??aA?POPXPo@sWoGBABAB@@!8?@@ABC??CF@@A@?@?AD@A@OC?@#178_GCCtNNNw]lO???_@#173B#28@#5@#7@@#13@#20@AC#218_#164Eeuo???@?XG[#34?@#4@#58C#52O#128Sk??_?_OW???A#52?@#130C?iH_WCKA#126_?__OowKO??q`a?QOH!5?o?O#107!35?C???Ag?O!5?C_???O#77BCA@CDAC?@gPkOgSgS_S?_#93!11?A@?TGd~l||xo`@_DE??_#75!11?@!5?@ABMKMIMJJJ$#105!18?@QCGA`GA?P_?Q@Q@kAS_RJLlKMiGgG{es_Q?`???__#182!5?C#82?A?@AHQDIPID?P#76!44?A#168!51?GC?A??C?@??G??G#138!27?@???@_?o?GCO!7?@@!4?G!4?AE?AA?A?@?G!6?A#2@?!4@#210!24?OGOOGO#66?@#161G??G?K?SG?A!8?_!6?__!4?_A@??@??B??ACC??EQ?W?GAAUA??CCWE@A#164_OoWRG_O_?_OmB???]#215O#202?A#204??A#1A#177@A#57??O?AC???O??_#16??A#63_#55G#165A?@?@!11?O?C?C#127?_??O?O?CC?A!4?G#73?_??_??O#59!45?C!10?_?O#72!6?A@AA?@AAA?@AhA]hUHeWbgA#95!7?@G#85???AC@W_Sg?T_?gO?C?G#78!19?CC$#104!52?C?ASCI?CCULaVIcdfQ\ulytitg?g_#110!144?G???GG?K??GA???G#2??@??O#172_!4?O!9?CC???A#171?A!6?@#199!20?O_kC__g!5?AA??ICGU#211GWG#212!18?_O?G???O_?__#160@A@??A!6?@#155!4?@#21_!5?_#176?O#195??@???S#191k#153A#217??_#193!6?C#23@F!8?A!4?_#91?W#125_#126_#129?C[CAA!4?_OGCBBOoO_OOLND@@#121_???K@UDUTVDFCD_?_oK[?oSSC?gg_??Oo???O!4_!6?C#101!26?A?BCA@A@@EO@GALTGTi\A{@S?_O#87!22?A@ACNVN~rUsVSR?IgAsKCgO_O$#0!55?@A?QG_@ATG?@G?G_!4?C?OiCAG@QCIPgDiPM_LQlBShQkOfQL_Js@qHSJDqDY@b\aBXFhRQLr?rKBGrON?jORkR?ZcJ?rGJgRCA\aLcTQJgRChQdGhSCiPa[?IC@A?HAc@CaG?C?A??A???@?A??A??@SaSGQCSH?lOGs@sOBBAB@b@`@@O!5?@@@?@H@GP?@?HG??AAA#66O?O!4?G!4?C#211!28?_#200GOO!9?CG??CCCIEAC!8?O?C?OKGKWQE[oCGO?OO#192!33?O#194@#214!10?G#163??@#157GGo?@A?Cq#144!5?A#130G#140?O?G?C?CQA@#149!13?A#128?C?A@A!9?O!9?G#98!63?A!4?A???@?AGO@?GPKQVxH{qiA??A$#150!55?G#168!170?O?G??C?AGAGA?C?AA?IEA???E?CA?A?@#82C#182C#185__?!4_OoOo?WwGWGoSsgSOSS[]C?A?EFDENKAAA!5?B@?B?@@?_??_@``?@!7?A#201!54?A#207C#178!13?G#36@#179@?A#192Go#76_#180?C#38!9?AA!5?_OGCA??@#112!15?C!9?@_!6?_?O!8?O$#64!226?@!9?OO#170G#182!5?_#82O#209_!9?G#155O???G!5?C#29??A#190O_?o_oGgGSGKGG??G!8?ACG!5?B?A@#173!93?CG#124o?C#118!50?AAECEAA?BABbaABQZvDBFEBB@BMUStoOck?_I?Eu?PG?G?GK$#179!227?O?C???KCCCKEGAKCEC?CAC#76@???@!6?@??A#205C#10??@#212!32?O#156??A#191!98?@?UG#114!53?A??@@!4?@??@??AC?H?GA?@GGGDgO?h?OG@?OaO@OG__KO!5?O!9?W?G$#82!228?_?_#208G#166!4_??_?Oo_oO#198_#29?O#3?G#216_#162_#174_#160_??!4_??_?OOO_?gGg???CCC???!5A??FLD@?AH??@@!7?o?_@!4?_`@???___???O@@@B?@?@#169!67?A@#138_#119!54?@?C?ACC???sCCCGwgG?SCCSO?!4A?AC?Cc??G$#106!228?O#97!6?O_?OO#180!9?_#194?O#181?O#158__??O?O?OOGG?GG?C?CCC?!5A?!6@O!7?@??!4@#168!100?G#116!55?G!7?G$#83!237?_?__?O#124!11?O#104G#10C#17C#198??C!7?A#171!134?C#115!56?@@???@???@O!8?OGG??@??CI@QI@AoG@G?g?cE?O?_a___?_$#156!256?O#177???G#3AA$#154!262?GG!4?CC!4?AA!5?@!6?GOWG!8?AA-#193Ono^onO~_^o^onoN~p}P~P|rkR|r{zcy_spSOg___WS__?Q_A?G#96???A??A@A@I?E@A?@?T_A???_G_#109??IELIcJDJBLbNBMBlFNLFLYfYLJELyDzCytwsyTyulyt]tI|U{ytwpubRr^NFNJN^DACJCIP}_oIC@AKAFMKMNFNnNnM[mikUBHJFLHFBJFCLJBLDnNN^NNNnn!7N?B@JAHBABAH!4A?C???A#160_OGG?GGGC??CC!5?A??@@@#210!4_?_?_?Oo?O?G!5?C??_!4?G!4?CC!6?O?!4O???GG#206?O_!6?O?_#174?A?@#156!10?O??O?__#212???@??GI@AB@LG#162?@AA?G??BA#180_??GCS#36???_#180!8?_??@??G#21?o!9?OgOO!7?on`B#55o#125B?_@?_#142!6?@@@???@#121?_?_?OG`?_GO?aCaIaBAPAEH@OEDABbJbAAE?FjAFvJ\N\GPROP_o__oOo?_oooO!7?OOo_O_!5?OO#102??ABA?CEDE|@Eb]k??o#72???C`?g@NHcUXaWc?_#41?@_C@aG#88!7?B@?@!5?GENFYEyB?NE|?W?e?C??ooo$#137nON_NOn?^_N_NONo#196?M?m?mAKAkAKBCIDPI?I`QSIOA_QHS_GS??G?_#106!4?A@A_I@A?@C`GQ@?C_G_O#168!36?A#138@!9?_#168??@??A???C#1??O??O??I@?CA@G?DGCBC?BK#90OOO?O??O#179???_???_OooOOO#182?_???_#82???O#179?___??O?O#191O#1_#168?O#2_#166_?OO?OOO#1_#22_#23_#155_#40_#158_???o!4_oO???G!4?CC???!4A?@@#211?__!5?O?O???G#222?O?G???G??CCOO!5?C???A#212???_#229_#228_#230_#224__#223_!6?O#229_#212???_??_#163?_???O_??_OgQHUZUEFBB@@?P??CPB@P?@??AFF]TGT@?@!5?@?@#191!16?@G!4?O#57_#192_#105???_!7?C#57_?_c#36??G#91oL#38_#116EEWG\}M^iMSkw{YM^C?A#135_?_!5?_?O#132??Gd@OTCK@aWG`a?KK_O@O?DGC?O?___?_#119AGKCE??O!4?O?G???oxhhIH!6?_gOOO#107!4?DC@?@HAH?C_O_O#101GALqDdYQu@}OcQg_#48C?@?O#93??@qOTAtnV~n^nwkvepqOqooo_!4?_g_#84@A?AC@K`IjBMB$#105!18?@!5?P!7?C@I?IC@CHCHC?AHA_iDoAZDhIhKGK@S_gsoW]_Go?W?O#1!43?@!7?_#110???C??G#170!4?G?C#64??oO#138!7?A???G#2O#64O#214_?_#97O?OO#110!10?C?GACGS?GA?CGAG?OO?O?_O???O???O#104mGM?C???C??G!4@#2AA?A@@???@#166@?@#221A#26A#189A???@@#156@@#219!10?_?_?__?___oo?_??ggGGCKKKCCC?C??@#227!10?__???O#224!6?__#162!19?Go__SG_a#223??A#195?C??Sg_?_#164???sIsXm_?DA`__?_inUPfVBJ^XU?RsG??@o#168C!8?O!5?G??@#86C??OQC#152A#149S#130G!8?@A?AA@@?A@#119!4?__OwWO#127!4?O??K?_??O!4?O??OG!4?O?O#143!9?@#115??G?@?A?CAHC?HC@A?Q@U@?@?CA?R_@aAD?i?_SH_OO??OG#77??@AL?LaY`CGS?_O#99@?E@AW_HA_?H#95C?tIOg?O_O!6?_#94!20?O#75??@$#137!30?P?I?C`C@IPE`AHUhCTHTqF|CwUtSosOS?GS?I!5?G#82??@?A?@!6?O!5?O!5?_?O!4?_#104!26?G#166!12?_#82!13?_#166?_#168@!8?@??@?C!9?@#208!10?O!4?O??OO#214_!6?O#226O#106???OG???@#105C#82@@??@@#182@!4?@?@?@#154A!4?@#199!16?OGGCCK?ME?CAA?A??OO??A??__?o!8?OO!6?_??GO#155!19?_#176KKKA@ELD#161!14?@#21??a??@!6?@!5?g?O#76!7?_#203O???BMX^^~}PN#4@#164FJJC???oO@#63???G#225?G#140oO!4?@?@?_O??_O#126?__OW[]LDMFCElf[zC?C??A?G?Ad??D_???cC??_?@?GS?O?P???_#114??@I?D?ICA?F?AC??C??GDIA@G@C??@KAgC_O?cO??_??O#59!4?_#100!6?@#53A#98??AG@?WdA^E|]U?iG#85!8?CQGOIGDGHAH?G_G?KC?G?G?GO_O$#104!60?_?@??HCa?ADCebZEVLnmtxqdYsgO{_[okO{Oo_Oo_???_Oo#170!58?G!4?_!5?_#97!4?_??O?_O??O#196!6?_#193!11?_??_???O!6?G#184G#208G#192C?C#138AA#190_?oOoo_g_!4w!5{}}]]]^^]^N^M]NGEED?A??@!7?_?__?Gg!5G!10?CC#160A!6?@@?!5@?B?@@#178!12?A!4?IyK{qc}gS]oOw_g?_ACOCKALMEJIED?@!4?C?EhNkJu??EN#25G#177O_!8?O#51_#28_#157G!5?AB#127!5?@?AC#125!13?OO?CB@AA??B@AG@?@?W_gGPOCC?WOGOOCC?_`w?OGG!4?_?___#103!5?A?C??CA?C??C??C??G?GA?A!4?@?B@???A??gOAi@K@AtOA?W??G#123!15?G#80!14?GC?G!4?Oo?o???O_?O?O$#150!62?_#0O!7?GP?C???OO???O@?Ac?Q???`?AGOAGAdWdQCHqDyCzDIDIDiDGQDI`ITAHADI@EHSgK__oo_o_?Kzoxse@YDpwyt_@G@A`__!4?@A@DA@GAC??A_GCOWAos_a!9?_?__???@??C@eKLGLEDCCCE?@A#15G#156?G#185_Oo?_??WOW??CC!4?A!4?@??@???@@?F@@AB@BB?!4@!7?__?O?OO??KCCCEBCBFABDEEE?A@A??!4A?@#21!16?O?SG?_#157!19?WoWo???_???GCW?G?__#106!5?E#202_!7?_#23???_#13C#178?C#176C#124_!5?O#129!7?G!6?C?@AC?C???A@#112!4?O#128!9?O!4?__!4?G!5?GG#116G#112A!6?A?A?G???@!4?_#107??G!13?CC#112_#59!14?A#87!49?DADED???D@DOR?O?fdbGRIdSK?K$#104!166?_?oOO?OOOG???__?O!9?O???_#82!12?C??G#66!7?___?!4O#209?C#194CC??A#220AA#150?@#206?A#174A#29@#224!26?OOo!5OG#174!4@??@!6?@ABBA@#231!4?_#200G!6?GW??OGWGw__?_oSe?kO?C#177!6?G#164A?OO?_#169!21?OO??G#194!15?G#124@#204_??C#213@E???@M#18?G#79???O#192_?C#3A#25@?K?C#128!4?@crA@o_OoG!4?__#127GKKB#73!21?_A??_!4?O@O#118???c_!5?ECCAIWF]CLGJp@?@GaxI?U?o_ea?@GT[?NmK_gSOWGgOG_$#214!184?_#166_#198!24?_!6?OO#188?O#173O#177O!5?G#155?G#181A#172AA#212C#10@#159C#209???@#212!28?_!5?_#211?__?O?GG!4?CCC?OO?O!5?G???GG??O?O#161G???S?O?GOG!4?_?_hHO#57!33?O?OOO?i??s_???O#208???O#171C#169O#215?A#96G#36!8?A#173???B#138C@#137G#5C#7G#12G#126!98?O$#83!210?O#218_#196!9?G#191G!4?C#201!4?C#195C#162?C#197!34?K??AA?@@!4?@???AA?AbA@??@??B??@#222OO???WW_!4?_#207!70?A#217??@#162_#155!8?_#169!4?B#153_@#14G#20A$#12!226?G#228!45?_#206!4?A?!6A!4?@#221!12?!4_#171!97?O#106G#191O$#200!279?O!7?_#109!116?A#202A$#175!280?_??OO?_???OK?G?!4GKG???@@@E!4C?G!4?KGOGEIHV@EH#215!75?O$#156!283?@?@@@$#159!285?O?O!6?G??C!9?@@A?AFCCC?E?CEE?@!4?_??_-#193~}x~}~~}|~x^~m|!4~|~~}!4~\}z|~Sjx{B|gCTu[yhdu|?O!4?G?CgC#104!4?@!8?DBA@kyP@I_WMBBbZ]}\NzM]|V^x}T~i|~j]xukWgwWGwgW_WgwgOo?__!8?oO_O_Oo!9?_GG!8?O!6?C?GgOw#182A?A?AA?A!8?A??A#54G??_??_#160?GG??!5C?O?GAK?C?@?A??@#224!7?__o_o?O!4?WO?S?G???CE?CAA?A!4?@@H@??CCSOO#199_A??_?_!8?O?O!6?W?Gg_!4?GA#161AOP@@?P?A??B??@#51O!9?O#21_???`Cag_OO#57?_!5?_C?IA?C@CEEAECDNDIW@BI\oos@?W#192@@#195?K#162@#155@A#124G??G!9?C#20_?AA#39GE#116w??OopIOHAG@?@#132SaAGC#119?OghPAO#125!4?_?o?O_?@OG?cSa`bOIi_IO@_?AO??M_E`AfAM?G`po#119???A?@?OC__Dff|WGH!4?CDC?GEEC!5?GKC#103?_?@?C@iOCO?ScaH__gCG#108O#99!7?HCKE@A?Y@cieHqComGs?gO__O!7?O#80CCC@GRG#85O?AG?C$#137?@A?@??@A?A??@A#105!12?A#137!6?A???@i??@?AG@?hATiDQdrGBqPj`GI`??O???_?O???C???I_?G#196?O#109?@??OCP??G?A!8?A?@ADFFvFVf^eUFVnE}^V^~n~V|mzMcZcIcGg?A?AGJFLLVbHHGGGPH?HH@F?C@@BFEEFC??C?GKGIAKC!5?@@?@#1@#31C!4?A#218@@#159GG#174_!4?O?W!5?CC??A#219!5_ooowOW?WG_gGgK?CES?AAIFJA?FBD@B@BAB??G!4?OO???O?O!4?!6O!5?GG!6?C!4?@A#159?G!5?AA!4@#92??O???O!5?C!4?_#164G?G??C_g_O?_???@@@??@@!4?@!5?@@!4?ECA?kAEGGOOC___?___?AO?GC#63?O?_#51O#92G?@#140@@!4?O!5?@#112!9?O#118_O#127!9?_O!4?G???A?A?OA#115?_!6?@#127?E?E??@???G#73C#112!4?@?CO@A?@!5?@!5?O!9?C#107!11?O?I?Dg?G#77@??XEoShOo?O#48!5?@?CG_#93@CGSHOLON@FHBDJFRNIVfJ~D~MzjZyuce_oooww{}$#196??C!7?C!8?A??@!4?_@CA?jSCB{AUPiHaDSQG?Ak?Cqc??O??_#96???C!4?H?AOAGC?A??i!6?G#82???A!4?A!4?i?CA?S??GOC#106??_#168!5?@!4?@#171!19?ICGCAC?A!8?MEECAC?A?A!8?C??C???C#154_!7?_g___??!5O??GGWWOCGCCCA?@??@@@#175!11?A!4?@???@@#197_?__OoOO??O?_GoGWg#206GO!4?C#231?GGG!5?C???A?GG?CC?C???A???A?AA@#212C?__A?@@?!5_#176_??_C??A?@#160_A??_GOGO??_#163?@#178@?BC?W?O@@B@?A#35_!4?__#86@???___?_!8?_#177?@!5?A??CA?@!6?_#179??@#91OgSA#125OE?DEDACaCSPSS]I?@BB#107!5?_#132!10?A??I@D?@???@??O??S@GG!4?@@!4?@E?AGHOg#143??_#118?_gw[[qOW??ECJ@DfBQrjaxXXhXXHxvQZMMe[Ig#102???JiFJQ[UU??G#98@??A??A?e?R?PiTNcwP?Oe?i?Oo?oO_OG__G?O?g!4?_#88C??ONNKFFBB@$#239!11?_?O#105!33?AS@iPGHQKbSHMS]voY~~nuu|Lg_pkP?K?sOE_og#179!58?C?CG!8?oo_o_#96_?_?O#214_?O_#64_#96!5?GG#237_#242_#106C?A!4?O!4?CC??AAA#104@#2@#220A#150@@#177?A#226@@#201@#185!4_!8?GG?CCAAB@#222!8?CCC?C?_cA???OO???GH???!4C???GOOSCO#185??A!4?A`?_@?@??__?_?_?O_O_O_?_#211??WgGOOO#174?CAK?I?GO??G#177!5?g!7?@A#176!7?BG#180AC?KM?S?KC#4_#1?O???G#157@?@??@!9?HG??@!6?_???_???_??G??b#38!4?_O#49_#121?G!7?___?_?SgOgtGVCI@lWiPICPEGFCNCCEABA@???@??p??QP@GGG@!8?C?ACJQlk^yNE@BA!4?aoooGWWGGGCC??AEEAEE#101!16?@??HEOAaCkHYchIO_?_??_#41??A#95A!4?@???AGACGC???O#123_#87!8?@?@??@$#106!64?C!4?H?AOCGA??aS@?@OC?C_??_??_??_#166!47?_!4?_#191!8?O#97???_?__O_?OOoOOG!5?O#191_?OC?A?A?@#48O#66O?O??GGG??C!5?A?A?A?!5@#211??_?o?GWGKG!4?CC??!5A?A???@!9?GG!9?_a___`@`_#221G?G??!4CAE?AB!9?!5@#200???CCC?___#155G?K!7?g???_COc?A?C?AEA??_#186???@AFB??A#36_!7?A#179A!4?OO!5?_#178?@A??HCOCGC?A?O#156?C#173G!9?A#69!6?C#55G#73?A!6?_!7?C#128!19?oO?_OW??SOKcCK???C??AACoG_GdO[Oh`O#114!13?G!6?CA??_??O??_?O__O??`?pPG_SQi?D_#72!8?@@?ABCdJStHUgQ_O?O#123???@#41!8?C!5?T_GC?Q?`?O#42???G$#0!75?O?@???D?@?S?C_@?_??`??_C@??P???`C@A`Q!8?@???G@?G_?O?gAPC@JCJTJFV!5POOoQ_CEEFFF??@?O??WIGIK_?`?@?GG!7?@@!6?@#198???A#233A#181?A#180!6?@#164@#156@#92@#197_??O??GG??K#212!16?GC_C!4?AA??@G#174??!4_O_?o#229@?@!4?G?G??CCCO?!4O!5?G?GG?!5C?C!4?AA#228?A@@#160?G???C??A#195!28?@??@A??A#173A?A?@#97_!4?O#90o?GOO?O_#180A!4?B?A?_?OS?KGG??G???S#25O!6?OC?@#148_#130??__#129_#126!8?_?_GOcOIf?ACKAfTmtZmHvGH?I@!9?@??AA?A#130_#112@#126!11?AC?AcDQO#115!8?G?AC?A?ca??_??P??_???_???_??PA`@CT_O?O_??_#120!16?G$#110!145?GA?C?G???Oo!5?OO#138ACA?@!9?C!5?C#153O#174_#158?!6_o?!5OwkGkccssOQ?AGJEAAG?FABAA??@#229!13?O?O?O???GGK?C#200!4?G!6?CC??CE???@#238???G?G?!7G#161@#224@!4?GG!4?C??C???@A???@#154?CAC!8?O#25!26?_!9?C!6?@#168AA?A??Kg?_#171!14?OO??W??A#204A#152!8?@#132??S#128AHAK`LQHEII?@@#116!21?__O_?g[?K_O??C@GGcC?sq?OWOWG__OO#69!18?@#126???O$#214!145?_?_#97_?_#106!11?G#82??GGC?C!9?A!4?@?@!6?AA???@??@#190!12?_?_?OOO!6?C?E!4FBBB!5@?@@@#199__?_!7?O!8?sC#210A??O#190A?A???@`@?@??_#234?C!4?AE!4A?AAA#227C#190OO???O#158!5?G?A#163O@!6?@@?@#124!24?O!4?GC?C???A#170O!9?OO_#28!15?@#15@#23@???@!6?CGC#127!5?W?G#140!39?G#73!4?@?C???O#140C$#64!146?_#90!21?_!7?!4O#192_!4?OO#208A??C@#188G#28G#209CCC#199!18?_?O!8?C#228!16?O?W?G???C??C#175!5?G!7?_??A?A?_ABA!4?@???_#220?A??!9@#235??A#206!12?O?O??SOC#169!29?KGK!4?C#16_??O?G??_#21???_!9?OA???@@A?DAACEEAB!5?OGGB@#129!54?G#119_!4?@$#168!168?@!4?@#226??_#166!7@?@#196?G#11O!8?C#210!19?!4_Oo?wo?OOOWGGG?GCK#200!5?A?A#210???@@@???@#159!5?OG!4?_#228??G#227?G#236!6?CCC#206??A#159@??_!4?_??_?_?_#156!18?CGGGOW??WCCG?@?b@OG#79!16?_#207O?G#196??_??O#17?O#14_#83_#169!7?C?CS!7?oaa__?OO!7?G!4?A#142!62?_$#181!177?A#1??G!4?G#168??CC#155O!9?C!5?AA#185!44?_?__O??O#161!4?_O#212AA???@@#197!7?_AAA??_@!6?O??O!5?G_!7?CO#162!6?C?eaCiEegREZkZ[[badLx\V]Q[SOG#12!7?_!8?G?GKG?G?WC#36A!7?G!9?@#191??O!5?_?@$#241!177?_#193???O!6?G#15O!9?C!4?A#223!80?A#235???CC#222O!6?G?G!4?CC?D??__#168!43?O?OO#21@#110O??C#194!32?O#51@#153GG?C$#105!182?O!9?@#177?G#232!95?@#160_#200O#174??_#175???O?O_??O?O?GG?O#138!44?O?G#109?GGG#207!33?G#216C#57?_??C??@A$#207!182?_#243_#156_#179!4?AAE#227!99?G#210!7?G?G!6?_#23!53?A#64_#192!36?C??A$#237!189?GG#150G#240!170?O#168!38?_@oWK_$#110!189?@#202!211?C?@$#79!401?@O-#193VFdBFTBlAO@L?P@WVfdVFdfRNfrmFTFrkJC^cj[JuVVvFzFqGPcY?hO?PADitIPg@?C!8?_#0??A#104?@?CA@GI?dXEAiDPIARHIeBJAhXHdvffU^bfl{zskv{}t}|u|Vm|JsySkDvJHQIAB!7?C?@#160_???_!6?O??GG???CCCA?IAB@?@@@#161?_O?O???C?O???G?C??C#227???G#190?@???O?O?O?O??G#159?_?_?_??O!7?_#190ACA?C!4?A?AA@???A!8?D@BB@?@??@!8?@#228O??O?O!7?!4O#206G?G!5?G!4C#195?__#156_!5?@!7?@#226!6_#12?C?CC?C??AAA#245C??C#97CA?C???G!6?G#104G!5?C?W#110O#34_#169?@_?@@!4?AA#36?C!4?G#92_?O?A?A#142CCC#119_?_O_???C!4?@!4?@#128???___???AGeIBIHH?M_EKRDP@CAOY?WG!6?CCWIOIPioSACA#118!5?@!5?O??WSA?OP@??AHBNH`@P`@OGGYuQTsM\II?aO#102!4?GWPXnvDt?wO#72CCB@CAAtLUPYPi\gydwoGoGO?OG_OGO_O?_#93A?DkO[TY]|rn^|~j^vm$#196g?W_W_GOChEoBkAD_GOGoGOG_OG?OgOGRcZ_JSBsHggGwCwLtiZduSjlisgO?_cAWaOaGCO_C_#106!7?@??A@?I?AOD?iCP?cO@GS?CA?QG?OG_?G#82???C??GA?G?A?A??AO?C_#105?_?OQG?G_???G#2O??@#153O!7?CCC!9?@#208??@#174O#197___O?_?_!5?GGOO?O!4?ACACC?DdA_@?@!6?!5G?_?_OcW_k_iA_A_??Q`o?O?O?__O?oO_??P@_A!8?G!7?A?AA?A?Q!4?AAA!9?@?@#189_!4?_#235_#186?__#228O!4?G??C#79?_#162A?@!4?@?@??@??@?@#96G??GG??K???C???A@BA!5?GG???C#90IAEB?A?ADC#157?@@???A?C??C???AA???A#16@#132_!5?G???IGg_O?OO??O?WGGCoYCG?GEC??@?__??o?O!4?GG??@??@#129_MYEG?O??@_#132!4?H?O?g?E_Op#112??@?GCa!4?@??G??CO#114???EA??A?BO@?@_A@o_TsICiT?ahC@?C#101!4?_BkQzCsJoSGq@mCgS_O?O#120!6?G#41!5?@???A?D?QG@i?`AG#85?_??O_G@$#237?g?W_GO?WEwA{AkA?OG_GOG?O???g?g??O_?O?_#137!9?AC??HACQCGO!4?CAG@ODhASG?W?P_?a_?GC?OO??_G??O!7?_??O_#1!36?OO!6?C!4?@#158__?oOooOWGGG??CCC?AA?A!4?@!9?BA@@??@?@#219??_!4?OO??KCKK??ACCCBBABABBBA@?@@@#200?G?G!6?G??W?GGCGC?GGGWG?C??O??OO???CC??C??CC?CGGG?G???AA???A#178_#195_#243___!8?_#230!6?O#164?OO?OAC?m?BCA?AC#51@!7?@#57A???@!5?`!5?O??O??_?_!4?O??o?O?@?ASSAaA_?QGSSOO!4?B#49???_#39OA?@@!4?_#112!6?H?@!7?@#116???O?owSSOCCDAEL?A@ACGAcqs_cuAQP@pRmlzbcDcdcCC#73@?@??O#143!5?O#119?@HHTb`gkNfemxHduwo_GKGSgc_?_GCGG#107??_?OGCa???O?_???O?O#98!5?A?CHA?g?`A??A@?DJbFPF`N`FhVcQMUXdWQ?D_?D#88!10?O$#239?OAC?AcA`!5?O_G?A??A?c?GCP?A?C#105!25?@ADITIPcTiLqQlJr^f^m^|\]}rw{cctOC_w??_cW?Co??og?C_!7?O#196!27?_G#166_?O!8?ECCEC#173G#96@@@#174_#185_ooOoWwWWWwkWOWG[GYK?L@LLDDC#206_???OGCCG?AA?A#210!6?a`_AHH@@#206?C#175o_G?WCG!4?OG?cSSI@WGC?O?J?@?P!4?A??A?!4AE?A?C?ADABBA?A#199??A?A#159?A!4?@@#163O??_#199???@#26???_#155?O?O#216?!5O_O_O?O??OGG#26__#7?_??OO#193_!6?__w!4?__o#106_#105__#14A!5?G!5?G!4?@!6?O???O#164??A!6?_?_#20???__???C#63?A#118?_??O!7?AEAC?A??!4@#140!7?o!7?OSO?@??@!6?C!4?_cGc@A?O??@#127!4?A?a#115!13?GOA?OO??O?O??C!4?CGSG@Q???_A@???dO@?iTCA_E?O#77???ACAh?wGoH_!5?C#99@ACCGA?CGaGQ?QGA?IC``CW?g@_A$#96!83?@?A@?I?@?T?I?`G_?PG??C?COG?O?_#182!31?Oo!8?G!4?G#170?AA#180??C#2?@#190_?_?___??!4CAUCQMAM!4A#156_#154@!5A??@@#230O#185!10?O#211?!4_o_o??SC#185?G?CKOKCCE?A?`???@A!6?A??A!6?@?@@@??C!8?!5@H@@?B!5?@@#223_??OO!7?G??GG??G??WGC??GA#21???A?BC@@???AB?B!5A@@@#16C!4?A?A??G???O??O!9?G???G_#21!6?O?A!5?_??O???@#69??O#81?W#73ggG?O???O#126!8?OG?C?C!4?AIC@?@#52??O#129O#130!5?@#127?_?a??@?G#121@#126@#38_!5?O#121!12?O@g`LiE}Zm~uqCaKCA?_???Ea!4?OOo_???CcC?G#48!39?@???CO?C_C_COC_?G?G??_$#0!96?C?AC??CO?A?A???G?OGOA?HA???A??G?gO?cA?H?Q??c@@??@!6?AFCD!9?A@??@#82@#106@#173A#205!4?@#180@#176@#199?__!4?o??o!5?G?C!7?A?A`BaaqP?BP?O!5?S?WC?O?O?A?oW@@bSGCBWlBF?@Q@?@@OA?AO!7?EGI?K#206GG!5?C??OC??O#210?C?!4C?A???E#15!6?_#156o?o#15!11?_!5?OOS??GG#13?O#35OSCKG#0?G#90C#218O?O?O??O#25?@#104COB?CC#83A?@CDH@HAA#170G?OG??W?G@A?GG???G?[CC!4?GG?CG#114!7?O!4?_#127C!4?O!4?_??_!5?C#49!6?_#142!21?CC#126!17?G?PGQDG?c#69!8?@??G!4?G#103!4?CAA?A?A?@?@???A?@?@?GTGQ`EGa?GiIL?@#93!17?A#95!13?@!4?A??A??_??CO?A?C$#109!103?@!5?G?@?C?A@?AP?@@?@?@??@??H@ARGGc?csDCGG?AAI!6?@!6?A#196?A#194??AA!4?@#175!8?_?o?O_??OGK#174O!4?A?A?@@@#212!18?@?@#211!10?OG??C!6?CECCC???!4C?CKGGKGH!5?A#156G!4?!4_??__#189?__#173_#219!4?G?GCGGKCKCE?E?A#178!11?AC?DC#177?@?GW???GG!4?@#91?@#182?_#2G#170C!5?C!4?A#138_??_#36?_?__!9?_!4?_#25!8?_!6?_!5?@#38!4?CA#121_X??O?CeDHhZEL]ME]AEAB?@JDDB?B?@!4?__?O$#191!144?CC?CG#194_OO#138G#156_???O!4?G!9?A!6?@#200!10?_???GCKGC!7?_#161!37?_??_#222O!7?G!5?_OOO?Oo!7?CC!7?CCCGCG??G!4C??!5A@B@@@??@A@#173!7?___OW!4?A?E#70??CGG#83O?G#150O#82??o#239G!5?G#153O#76_?_#90H@@?CCG#79_#12?O!4?O?O?O??@?@!7?g!8?CG???C?@#103!4?O#74A#112_#128@!4?@#73!11?O$#179!144?A?C#64@!8?A!9?@#207???A#212!20?_!7?O???Gg!5?O#206!35?_?_#174??__?_?@@?_@??@!6?__???G!4?G!6?_BA@#175!4?!5@?@?@#18!4?_#163!14?G#25???G#6??_???O#37?G#14?O?CC#198!4?__#164@#168A@!8?__?_!7?__?__!7?A@G!5?G?AG?IBAEGCC?A#145!7?A#116C@AD@$#97!145?@@?@@???A!5?AB???@#223!29?_#224_!5?__??WWOG?G!5?CCCAAA!8?@?@#210!14?G??G??GCG!4?C?O?C#224_#161???_?O!8?CO?OW#178???O#212O?WG?WOGOg?C!5?C?ACDFA@ABbBBBFGB?A#2!6?___#25!4?A#166?OO#157!4?A#86AA???@!9?G?AEAE@DVCDA@!8?O!4?O?O?O_??_O#192@#91O???g???D#152!4?A#125SGG?OO??___?__?__owM_OO??G?GaG`G???A_KwOgOcQGHA?G?@!7?GAOIOIPAgl?SE$#110!145?AA#29O#168C#106?G!8?@#164?G#229!34?_???O?O?O!6?G#159!44?OO???@#219?__?_#154!5?O?_?WOO?O#176??__!6?!4_??_!6?OW???G???G?GGCCG???@?@?C!7?A#204!11?O?O??O#246G#196O?W#109O#3O#35W?G?B!4?C#37???A#208?C#179`@KacCG?_aG{CC@?G??G??@!4?A#130!10?A@#141A$#209!146?__!8?GG!9?A#66!28?@@?@#228_O!5?G!5?G#154!42?__#158_#212??O!5?_#54!4?__#66O#50_#177__#155_O#224!16?O!5?G!5?K?A?C!8?D#57!9?O#28C?C#203!14?G#183C#169@#110??GG#124?_#34??O#4??O#145??C!4?A?@#245?C!5?C#215!8?@@#191!4@???@@#126!12?G$#171!146?G??S?G?G???@!6?C#236!32?_#222OG??G??_??CCCS??A?GA???@?C!7?AA???@#206!24?_#159!10?C#158O?O??G???G#211!13?AA#189!33?G#244!17?C#241G#20???@#9!12?O#20OO#124??_#55!18?_!9?_?OgGK$#220!148?_#96?B#216_#174_#192O!9?C??A!4?@?@#231!24?__#160!77?G?G?G!7?@#25!78?_#51!31?_OO?CC??@$#207!150?_#150???A#154_!4?_??_!4?CC#23!230?O?G???@$#201!154?O#198G??G$#243!155?O#176O!9?CC$#214!157?A#155O!4?G!9?A$#179!158?@-#196ASASA_GQKO?C?CHSaSJCgU`SICaTIPgEhCPCi@hQ@GPiT_TItI`ZeZa[c[A?AOTipQWZ_lYShYSiSiOaSKQKOcG_?@?a?o???__???KcWOGC!8?CSK??O#214?C??CC#160_!4?OO?GGG?G???A??GABCE?B?@#222_???OO!6?g__!4?C?O??AG!4?@@!4?aAA??!6_oo???O?G!4?C#154?G??CK!4?C?CC??E?C!7?A#161@#227!6?G#230!5?_?_!5?___?_!9?OO???OG??G?C?CC!8?C#206A#234_!5?G#194_?O_oooOo?_o_!5?!5O??G?GG!8?A?AA???A??G??GGG!5?G#168@@??@@?@?BF@?A@?A@A??A?AA!5?CGG#90A??G#38@??CC?GG??_#132C?IA?AA??C#38_!4?GGg?o?O?G?_#127!4?C!5?@?AA!5?C#140@??`G?g@?OO?I#127C?C?E?G_?WG#73_?G??_#143!4?A??A#119!4?A?A@@A@??S???GK?AYAC#102??C??AA{goAOUaVSC!7?_#98!4?C???C?G!8?C??GC?@?A??I@WJ[WUGlB@#41@#85@G@G?C$#193g?g?GS??_Cg?gO_?H?_Q@?GB_PG?_E@OQIIPCQSCmbETiNiTAtMcXc\bZb|~{laDKcCcS?_?C_!4?CG#208?_#104!7?A@?A?_CAA?@??A@??OQP?A@@BPHB_@AAHGA@?A@@B?@@BB@@???A#4A#20A#50A#190_#188@#173@#155?@#159?A??G??O!5?G#219?O___??G?OOO??CGGGAA??C??@??A!5?@!8?O!6?__!4?O!4?Oo_?OO?OO?OGOO?OG??G??C?!4C??CGCC???C?S??O#223OC!8?GG!4?C?C?_O!4?G??GC?C!4?A#178A#201?_O??_#188?CC?C??A!9?G?GG???CC???G!5?G@G#162__!4?_?_!5?___?!5_??___#171O!4?G???_?_#157C?CCA??@C??O#63@#91@#55@!8?AA#69@#73A#126??C?G#52!4?_???_?O?C?G?G!4?@#132!4?CC?A?AG?C#38!4?_?A!7?A#121!6?@!5?@@D@BBmFLj^XntZ~h~z^l|t[{QwWEqaeAEAAE#107???@#101!9?KCGG?GGHITUhVGIDZChZ_\aXiPuLsZ[nO}KWSOsWk[?S_?_A_?_#93?G_OC[}}rypyx|{$#237TiSJsHSkRgShSHUhSjShUhUgTITiTgUhC`?i@gA@O?g??O?_G?O#105!9?@A??A@B?B?@AA@A@@@ITHQLonZv]y[gO[@VR`@@ao~pWAdA?KCCK??KCO?o?O?O#191O#186_#173_!7?G#199_?!6_!4O_O___!4?GGCGO!6?AAA?A??_?_@BOooOPWHw?wKsgcOo_{sWSDWCGB?h`?GQTKLC?AEPA@!5?@@@??@!7?@#212??GC?C#155!11?@@#154@@!4?A?AAA@#231_#232_!8?__?_?_!4?OWO???OO?OGWGCoO_#189@#187?oGGKW!5?G!4?O#171O!7?G!6?C@A@?A!9?AA?G!4?!5G#106C?C#76C#204GGG#4C#13C#207O!7?G#138A#57H??G?GOOWQKWOs?_O_#140@!5?A?C?E!7?O_!4?_??CA??A?C?C???PA!5?W#73???G#142_?__???g?OA?O#126!10?@???@??AA_?@gOC__OGC?C??_#118??A@?CCeGHHWlHd@X|dwIeOA@#77!6?GC?G??QSI`QgP?O_AO_A?Oa?A?aIc??c?_!7?o#131!12?__#88??CCEDAAB$#239?@@?@AB@?BBABA?A!9?_#246!7?OC!4?g#239?C#137!20?GO?G_?GQChOChSiS`?a@_B???@D_UH`MG_WGWGG??A???`_?_!4?o!9?G??GG#185_?_??_?OO??G?G?G???O#200?_??_#206_!5?C!4?G!7?C#230G!5?CC#212???C#211!5?G???A?IGEBFC@??GDD!4AB#224!5_ooo__GWggGwggwgOgGWG?OG?!6G?GKK?C??KSSOW?S[CCGG#58?A#216W?o?__!8?A?_!7?A??AA!7?D!7?A?@#209CG?K??EC?AC#164_???_#176_!4?O!4?_???_?O_?O!5?O?O!4?O!6?O#173O#9?C#3C?!4C!4?A#35A#12?A!5?A?B?CSG?_#136AC#52C???C#121@@??BD@G#129!10?__OO{?O??OO?___!9?O?_GG_Gg?o_O??COO#132!8?WQPA?eoKG_?O?O?C#115!12?A?@?@??@?_?O_??COPAg?Cl??@?@??@#72???@?GC?EDACXECWaLCPK?O@?`OJ@QbjiBaRaCg^US?B?Ba?A$#246???_??_!6?_#192!20?_?O!4?O#106!49?C???G?OAOD???@???A@OaCGA??A?@?A@?Q@?A??AG#154O!6?C!5?C???C!4?@?@?A?AA@@#185@?C!6?@!6?@@!7?G#212!8?@#185!5?AA?A!4?O!7?@@?@?A#222?O#229?_!5?_?_?_?_O_O_O_OoOOoOw_WgOgggC_G#155???@?B@?@@BC!9?@?@??@@#229?C#238O??O!8?O#15?@#173A??@?A@#220_Co#198C??A???C?@#182C#214A??A#30C#196A#105A#109A#138AA?@#26G!8?@!4?A#212O#79@#57@?A?@B@AA?AACAC#203G#36?@#194?O#191GG!4?O?_#164??C?H??@#14?A!4?A??G#116@??B!6?o?oo_OGOoOWy[Y[?CA?CM?K`l\UCXryhhx_osocGG?OI?ROFFKfjAmhJJ^?O?o#118!9?C#112C??A??A??_?O?C?Q?G_?g??OC#114??OO?_???@_GdOGQ?P??A?@_#53!11?G!4?@!4?_@???A#99???@??D?@??@@?@?SCS?D`TAWA$#184!11?O!25?C#150!58?C??C#96A!4?A_??A@O!6?ACCCE??A??A#174_!9?G??G???KCKG??ECC#224??___!8?O?OO!4?C!6?A!5?@A@#197!14?A`?__o?GGG?E?AAAB?@???@??@?!5@?@??@?@?A!5?@!9?AA#227!4?O?GG???_?O??G?C?C?CC#235?_!5?!6_?O??G?GGC?C#195??@@#172GKG?OGOGG!9?G!6?C#180G?G???G??G!8?A???A!4?A!6?O!5?_??C???K#25?@??@@#86??@#180??_#124G#109C#37A??G?OO#125@@?K?OGi?CBCcBM?E???@?@!6?A!5?C??AE?BGB?ODVCDC?C?G!7?C_C@dIE`leS}??!4O!21?_#103!5?O!7?G@uhOkBU@oa@S_b___???_o??_#53!24?G??_?_?_$#182!97?CC#0!5?_?@!5?AO_AgG??@??HGC@???@AA!4?@#156C!8?@#161!4?_#54!6?A#228__??_O?O???GGG???G!6?C!5?@#174!17?_!4?OOOW?CC??GAA?!5AC?EAAA?!4A?AA!6@???@!5?!4@?A#243???_??__!7?GOGOGG?CO???O!5?G???O??CC??C!6?@A!9?_#195_???_??OOO__??_OO!4?O!6?O#201?G#173?@?A#169???@!7?@!8?i@gCSOOoo_kCk__g???_#170[?_#96O#104_#128@?G???WK?O??S_@G@H@DADAB?@B@@BB?A?GICG@QO?DK?C@?Q?BOR??G!4?@?Cc_?piY?w???G#48!92?A??G@G$#110!104?C#208G???G#150??_#97_!6?G???C#156?__#188O#179CCC#207G#153C#162G#109A??@@#158!5CAAA??@@@?AAAB!4@#229__??O??O!4?G?G?CC???CAAA?AA!4?@@@#200!12?G#190?@?@?@@?@#156!4?G#155!6?C#160A!5?A#228_?o?_O_O_O_?__?_?O?O!4?_G??Gg?OOO!6?__OO!4?oOGGK?GCGG?GG?C#221!9?OO_?GG#26?A#3??A#106A!4?A?C??C!7?@#104@#220?CC??C??C?C#157??@?@@B!4?@!8?A?A?A#179!4?B?A@!5?_!4?_!4?@!4?O#58C#110_#127@#74G!4?_#119?@#127???@?H?C?A??@#149???_#130???_#142_o#49??A#121!13?@#130!10?O?O$#191!106?CG??G?G#110!6?O!8?C#189O#177O#197_?_!7?O__G???O?WWWoWSCWSGKGEMIF@?C?CCECB@__?@???@?@!4?CG??O#206!17?_?C???O!5?G!4?@??@!5?C?D@?C?C?C!4?A?AA???AA???!4@?CCC!8?C!7?A??A#176AA???AA??A?A??BAAA@?B?A!4?@#20@#31@#193ACC??A@A!7?@@#187C#216??OO???O#192A?CA?A#28?@#164?_?A??`!5?O!4?O?A?A___#170?@!6?@#21??@#36??A#183!5?A#142???A?AG?G??O?_#52!52?C$#109!109?O???C???@#171?_???_#182??G#198O!8?A#196A??@#210!5?O!12?C#212??OO!5?G!5?O#231!4?C!6?A!4?@@#158!24?GGG?!4C?C#156!7?CCC?C!5?A?!4AB?B?@AAA??A#50!7?A#156??BEIKJDEB?BA@B@???AA??@B!11@#164!5?A?A#29?C#218!5?C#76@@!4?G!4?C#124C#213@#202@#233!7?C??C!5?!5C?C???CC#153!4?G!6?GGG?O!4?O#16??@?@!9?A@#35???C??O??_#56O#144_$#193!109?_#182??O#245!6?G#194_?_???O!8?C!8?@#161!19?CG#190?@@@?A@!5?_!5?O?O?o?OO??C??C?A#227!23?O#222!17?C#177!30?C?C!5?@?@A#231?O#154?@?@#92@#205_#248___!5?O__G?_O?_#177??@#201!11?o__OO!5?O??G??GG???A?I#163_!6?_!6?_?_O?O_?O#161???__#105!7?G#186_#202O#201_?O#193!18?O#165?A#86_#70_#145O_?O$#192!121?_???O!6?C?C#159OO??O#175O!4?_?_#200!19?G!4?_!6?A??G#176!90?G?OOA?GAC#247G!7?_???O!7?C?KCG#181!17?@HGG??G?C!8?A?A@@@#11???@??@#243?G#192!13?CGG!7?G?OOO#130!25?A#129?C#149A$#82!127?G#193??G#155O???G#201C#195C#105A???@#174!24?C?C#210?`!4?O!5?___?_C!4?CKGAGA?O@WOGKSKSA#235!64?O#15!4?@!6?A?A!7?A#227??C#153!25?A#186?_!8?O#209!9?C??C???E!5?C?CCC??CCC#11!5?C$#191!139?A?@?@#211!25?A@!7?A??_#189!97?C#238??_?_#224!10?CC#138!29?@#207_!6?O???C!6?G?@?@??G???G$#175!173?A_?A?@!7?G#109!140?@#204??A#137@#178_???___O?o_?_???oO??Oo?oO??o_O?O?OA???OOO!8?_!9?G!5?O$#159!175?A#242!154?@#216_#241BB@A#21!10?_#186???G??G$#173!346?O#124!4?@??G!6?A!6?@??@@!7?A???C?C?G-#193i?G@_C`OC_?@OcH?i?I?I@CH??Qd?GA?QH`?Do?@UCQgAPSJ`ciQctJWdYnnMlS_\aXEgDi?TgQC?AOCW?G??C??AOA?G__O??__O?OOH???CC#176o??GW??KAE?A@!5?!5_OOO!6G#178C#224C???CA?A?AAB#230?@#210??O?KCGCK?EEKBIDJCKDNFFJFBEBBA@DBDA@#206AC??@??A!4?@#199@#222@#243!6?_#249?O!4?_#223?@#232GWGW???!4GWO??K!5?___A???_?__!6?OSOS!9?G??`?``@?`@!5?C#180!12?G???O!7?O?O@?OGO?A?CCCAA???@#57A#55_?cGO!4_?C?A??E?_?C!8?C???G#62OGg__O_O?OOO?O__?__??__???OoO?OOooo___#145O!6?@@?G?_w??__#130?O???B_?O_?O???O!5?O#128_A??O?_?`?`_qAAA@GGHdOCcOKGSQDACGO@?G??G#126?O_?_?I?COI?AO??G??G?CACC#143G#115!5?O??CA?H?kP@GYdkG?GgO?_#72!13?@A?@?D?A@!9?@?@MS!4?A?EGP#131G?AQ@s??Cc?O?_$#237TiTiThUHqLYsHQChDydIpm@qlQlOlQlQcQKOiDY_H_DOdI_CGP?HA?_A#137!6?HA???O@_?I?C?qCXaHCpcXAwEGgCHcA@O!5?GW!4?@??BAA?A#104?A#197__?wOG_KG!7?CEABAFB?@?@!5?Go?gO?CCG?CE?A?A#211!4?@@CCACBBA!6?@??@#231!4?_?O??O???_??__goo?OWowoSO?G???OWO?CCAAAI???C??CC!6?A?A???A?C?B!6?C?C??O#235?A??AA?AG???A??A!8?@??@!4?A??A#173??G??G!6?C!4?_!8?C??A#54__!7?O!4?_!8?_?C?CoG??_GG__!4O?O?O#53_#133_#77__#177!4?O#69?__#180?@?@??@@@#179@???AA#55O!4?_#241CC??OO#74EIG?OO??_#52?A#149?C#116!8?!4@ESvnnYSmuEtSDUTUVCh[|wEdeQNqRJrb?@OOOP@!4?G#119!8?O!8?`CaQ?__!4?__cc!5?B#107?_???C???A?C#77A??A?I?H?@?F?iCADK?\A{?E_SgTqdEGFGECYOObtnEb\Op#134_C#93?GSHUHUJPBtJ^^$#196?T?SAOGAHQ?G??AS?@Od?Oa?Ql?GQdOl??QCOACQ_H?DG_J_OAPcXASdYdOOpQa\a\ehUYTtiRlHzcLq?CA_h?WOCGSIcCI?OgM^B?@#22_#7_!5?G??C#105?@#156CO??I??@?@_@?G?O??G??OO?_?_?g?GOoGW#222??_OoOoWGK?XSOOS?WAGO#229??_?!7_oO!6oOwgwWGGS?K?C?C?IAK_CI@MGDMEDA?I?!4ADDD@D!8@???@?@?@@?@@?@#187??OOO!5?G!5?G?KG#220??C#186??_??__?!4_?_?oOooOoOOOo!5O_?O??O??_?@#124??o???O#21_!7?C!4?A?@???@@??@?@!6?@??@!5?@??AAA?@E??!4G?GG!4?OOWOGWWIGIC?KGCCCG#12@#90CCC???O!5?O#14O#116?@!5?@#52!10?A#149???O#52!7?G#125???_?_??@?@??@!6?C?SgcIHJ_gUJONBDj`G[SCCC!6?GG#73?G!4?C#114!10?C@KCsK@?eP?Y?o_O?cO?_!5?G?G??O#53!10?A#59!4?_??_#53!5?G#40?O#100!4?O#98gvd_c??_Og?G_$#192??a?G!7?A#184!20?c???G!4?_?OC??C#105!31?BIPESB@FPa?P?YDN?OP?CB#150MMAA?DB!5?@#216?G!4?@#174?___!4?!4GCGC?C@!5?_O!9?CC#229?@#199QOA?JBJH#224???__!4?O?OO?O#236?_#197!7?CCA???AA??@@@#247!13?_???__o???OO?O?O!6?!4O?SKC??CGC??!4CAEC!4?EEE??F!4?@!4?AA#187?ACE?C?A?A!4?@@@#188!10?O!4?G?O@O???G???G#23_???G??G#63G#155?CAE?AA???AA?AA?A??A!5?@@@B???C?C#164A??CC?C!5?GG?HG#139!4?___???___#168?A?@A#14@#16GG#38O!8?@@DE@GGYKCDBkJsgOohOC??G?G???@?@!6?GG!6?O#127!10?G?C?A?GO@OCA?I@??O#112!7?`?`??@??O?_?_@QC?A#103???A@G?OQ_Gad?RCWaTGgOWSAaBg`GOPGGgOG?g?OG?_OgKWgOG_W!4_???GW#99!6?QH?gAGC?O?C$#246!5?A?c??`?_?_?O??OC?OC!8?H!6?C?QG!7?C??G#104!26?_!5?_#0_!7?_!4?_???C?A?G?@@?@#124??A#194?@@#222_?O#199??C???C??B@@?@???A?AB!4?@#195A#161???C#219_?_?__``!5_o_oo?WoGoW?WGCWKGKKKMIKILA??D!5?A!6?@#228!9?A?A!8?GC#248_?_???_?_?_!6?!5O?OO?GGWGO!5?G???G??G!5?C?CD???AA!4?@@?@A?A#187!10?@#176CAC?E??AA?A!5?@?@#15GC#92!4O?OG?_aC?E!7?GWSOOWSOW?EQYOOCs??_?GG!9?O!10?O???O!5?O#36C#25G#69__#96A???O???O#37_??__#129A??A?A??OG??G?JWmmsh@GO??@?@G?GGG??GG???A?OO#132!9?___CA_Ce?OOCCQBIAOAGC?CG#118?AAUqO__!7?@OPC~zwooAB?MO#102!4?@F@?@DLD`tSsUOo??P_O__!4?oW!5?O?_O#95!21?@_AGA?_$#184!10?C!6?C#192!17?i??`G???A???O?G#208!39?@??@???JE#2???_??O#31_?O#15O!5?CC??C#200!7?K#159A#155O?O???_??__oO??_?W?G#163C#212!25?O#222!18?@@?@#236O???_OOGO??o?_!4?_?OWW[CEKC!6?AEE??CA?ANMMMEG!8?A??@!4?@@@#216_?_?o__O?A@AAIAWO!5W@P@???KCGC?KCKCCC??CEECCACAA?AC??A?@?A!5?@!4?A???@#162?@!7?@??@?@!6?@!7?@@@??!4@???G@@@BECCMCMEE!4C?K#57!4?@#86CG!4?@O?_???_#140!4?C?A@@!4?C!9?A?a!4?_O?`G@O?A???S_?C_A?G_HG_??B#73!5?C?_??_?O?C#101!47?AA?A?G?G?E?fCaDAATaSBi@DIDA@A@F?F@IDM@GAO`C_nGFA$#239!11?ACHOA!6?G!4?A!7?@!12?A#96!41?_?O!8?C?@?@#26_??G!7?A??@#210!7?D??A#162O???O!6?G#228C!6?A???@?@@#227!36?!4_G?O?GO?CC?KACC??A!4?@!4?@@!7?AAA?A!9?GG#228??@!6?@???__?_?O??O!5?_?O#205!7?C???O!9?A!5?O!6?O?@#178!5?A?@?@?@??@?@A??@@#73!4?GGG?O?O#59G#148_!6?_!6?_#69?o?O!5?_#178AC?CACC???G?!4@?@?@!6?A#245!4?A#104@#97@???AK#142AAC@?AAGISCC?WwW??BFNFEc_O!7?CG???AAA#121!29?_?_???_@h`hrjtztMtS?@KD^JXZzV}LYJGj#114!49?O??O$#184!96?C#191@#3!4?_#182??C?A#21?O#18?G#161_!9?C?F?Qg#211A@B#177??_!7?_#223???C#212EA!4?@@?AA#174!38?AAA@?@@#247_#238!16?__!5?O??_??_?_!5?_?__!9?O???A??OGII??G???E!6?@#173!9?O#195?O??C?GC?C?G???GCKAGGAGG??G??GG?L@?ECCE?AA??B???@#176!9?@#39_!4?_???_!4?_?_#163!4?@???@A?A?AAACAAECC@!7?A?A?A#164AAA#109!6?A#183A#35@?G!4?G#128!6?@@$#237!96?_#10!8?O#198G!9?@#190!12?A?@#154???c!5?O?OO#224!51?CC?_??IAAE??AB@@A@B?@@?@?@@?@#235_!8?O!9?W??G??G?G??GG#195!4?_#221???G??GG???CCC?CCC?C??CA???A?A?A?A??A?@@@?@?@?@#223?A#26?G!5?CG?GO?GWG?G#58_#50?__!4?C_GOKO??Cc?C?CO?CAC?C!5?C??C#23!6?C#59???_!5?_#169!12?@!4?@@@#83!6?GG@G??G#136B??C#56!4?O??_?_O$#226!105?G#6O#106G??CC??A??@#160!11?O#92!6?_!5?O#228!55?GC?C?C#234!22?___#221?_!4?__?_#249!5?_??OCAA!5?A!4?A??AA???C#223O??o__?OO??G#207!7?_?_?_??_?_?_?_???_??_?o?o_O???_#28??_?_??OO#156???C!9?@#140!4?G#81?G?G#23?@?@#156@#177A?A!7?BA???C??G#161??!4@??A??AA?A#250!5?_?_#239!11?C!4?W$#214!106?C#173___?o???G#161!23?C#200?A??B@@@?@@!6?G!5?@!7?@#230!27?OOG!5?G!7?G__?C#243!8?G?O!4?CGWG!9?!4_?aG?`!4_?_???O?_!8?G?@!6?@???O@!4?GG???GI?AA!7?G??G??C?CC!4?A!6?@#121!14?_#72!28?_#40???O???_#91!11?G??CGGG??O?O??_#70@Ac?_$#164!112?GO#185!27?@!57?@#216!32?O!6?O#234!6?O??C?C?GC???AC#195!12?_???_#194!12?C!4?A!8?@?@?@?@#164!4?C??A#223!5?@?@#177_??O?G!4?C!6?@?A#39!64?_#152O!4?c??C!7?_$#4!112?C#206__oO?w?CsIQOY@SG?CC!7?AC?G??A__?CcTkWGG?AA#230!79?O??@@?@?B??@??A?@???@?@@???!6@#173?@#176@POO??G!7?!6G#248!21?@#36!8?_#79??O??G#49???_??_?OO??GCOOW?W?oCO_GgG?GgcWG?_GG???G#214!40?A#237A#63_#130@$#97!112?@#222!28?C#201!148?C!5?A??_???___??_?_@`@?@___#51!8?_??oO!4?OG!8?A??C!5?A??A?AA??C?A???C!5?G!8?OO!5?O#244!18?C$#195!112?O#189!177?@#18!42?GG$#202!112?A#164!221?CC?A!9?@???@!6?@@-#193C?A?C???A??Q?C?i?CG@O@G@A?D??H?D@c?AWcOcGcHCXCHc?QIAkta@UlId]dI\A|A|AsIPgASJSdWoJA?CAD?CE?DQ?A#24?_#28_OO#173G??C??A#219??O#197??_?A?@???A@H@C#15!4?C!8?A#197!5?@@#236O?__OG??o?OoOoWOwooOS[?C?C!5?C_??CECC?B@!5?E?AA??AA!4?@@?@#248AA???A#235??_?_!4?G#224C!4?A?A?!4A?A#195?C??C?@?@A?A@A??@#171G#192_#232?A?@?@?@?@@??@!9?@#124??__??QOOg_gS_O?WGgOGG??C??A?D?AE?@??@#92OKKEEAVMEFBCJAE??@@@?@!5?_#73?GGG#59??ooCC??_!6?@G?OOGOHDo@??A??A@GWO??OO?_!8?O!7?A#148@#39A#250?@@#73A!5?A!4?G?C!5?_#130G?@??A?@?A???G!6?@#149??@#125!5?o?gO[AboZO}Gj\DHv`[IIQ_``@A#119?GO???OWO!6?GO!4?@CBHDDSCKCCW?__??!5_#112!4?A#102GO?GKG?@aOe]CGYue|_?EEaap_Yc`pJmu}u^EOkCC#98??abD~J[gEWX{xIh{Y|$#237zItkRkJslTYcJp]@[qB{AiTuGtqkRSlQ_ZcPaHAXAPaOaOaXc@S`A?Cg??O??O?_#137!6?@ACH?O?A?D??@@@?GG?AQ???G#32C#2C#15_??G#206?_OWSKYKMMKFKDEDAQWGAKHHA???C!6?A?AAA@???@@@#231?___#227??__?_?_#235_???_#247?_O?O!6?G!9?!4ACC!5?G??BA@!9?_??A?A???@O#229?A?A?C#171???_?_?_?__#223!4?@#172?_?_?_?_#243@???@@@#205??A?EA?A?@@A???A???A#26!6?_?___???_???_#195_#173!4?OOG{[CC_?C?A?@@#51O?OAGHKG?@#140_O#39ACC@??A!6?_?@!4?pLC!5?A?LF?@@?G#102?CGK!7?_??_???A?_?`__A?a_?OO??GG?G?_@g!6?@??_??O#116A!7?OCCOO?O?okWSgGHHw_AQQUkw[!4g``WpD@[E`AC?C!5?A!5?O#121?DKKWSC`BNU|ne`fd@@fbfbebbbae?C?GGH@AGG!4?C#107!4?G!6?O?WAO???O_O?O#59!7?O_GOCG??O?_O?@??OG??_#100!4?q?o`O!5?O$#196?@?@?P?H??@???@!5?C!4?G?Ac?Q?O?HC@?@A???A?A?AHc@S@I@UhQdY`ItA|A|A|JskRsjcjWfIS@AICGC!8?@#7O#11G#156_??o!5?CA?@@??__?O!6?C?E??@?!5A?@@?@?@#247?O?_#231!15?GG?_?kWKW[K][MaMAEG@@@OOO??OO??ECCBB@@?@?@??@?@???@#232@A?A#195_#249@!6?@@#232?G!5?G??GGG!8?C#221!14?_#172?___#171_O!5?CSOOWKOSSOO#76G!5?G?G?G#164!9?O?_og?S__!4?C#55G!4?O?@WWKHO?WIA???@_?_O#119C#125C?AAS??A?A@??@#119A???A!7?C???@#99??@#103__???_?_?_!8?_!6?C!4?__oooO?H?G#132?@!4?O#136@?@#129A??A@BFDCCQ?@CD_aAF?C!5?CCDCSMAE?A#127_???G?A_A@S??WCGA!4?O??_#118WWo__!5?OS?WWOO?[[SGOxWOQQAQPrR?}XPomCYOOOoaa_?_??__#77!4?@?@?B!5?@@?@??@?BCE!5?_@`PO@d#95!5?C!4?A!5?C$#246?S?QgAoA?I_HsI_SaGsAhS_GTAG@G_??C??GCOc?sGCHCGC??G?GO#239?O!25?_GWOG#64O#246@#104A!6?@#26???G??C@A@?@#161!4?A?@A#174OO!8?C?E#154AA@@?@#230?O!5?_?___?OO!15?G!5?A#232_?_#238??OOOW?OOOG??GW?GGG?GGKCC???EEA?EAC!5?@?@@?@#186_???OOO?O???O?OG!5?CC?CKEC?C?ACAAEBAA?BA@A@?B!8?@@!5?@@???@#138?G#29AO#205?@!4?A#171!9?@#157GOWGGOsII??@@@#56?_!7?__#54??@?A!5?A?A???@?OGC?QP?C\?GU?UGO_o_#77?O!4?_?A!8?QO!6?OO?G?G_OW?KCO!7?G??C#59?O#149@!9?A?A???G#165!8?C!4?@???AA#132!12?OO!5?O__o?KADDG?OAA`?C#143!5?A#114??GG!7?GO??__?_!4?_B?AI?OGCJCA?[?QKBCA?A?CaGC!6?@??S_GOCGOcO?G??H?H??CAA#72GOiTOG#99??A@Wc???cO@_$#192?_!4?C?O#239_!6?@#192!7?_??O???_G?Q???G?@?O_?@??Q?_???G#105!26?C??OA???@?@#10c?O?A?@?A#79??@#212_?O??O!8?C?OCQ#229_?__?o_o?_o_?O_W_!5?CQCKGOW{K[KKKMCM!4EJABBB@B!5@?@?@#234GGG?GG??G#221???G!5?C#249CC??CC?C#173O#189_?_?O?G#234!4?@?@@#231H??@#194!9?_??!6_?_?o?oO_o_oWowowwWoGWWGCGG#76OOg#1O#106?GG?O#11!6?G#180!8?__?OO_oogi_?A?AA@#25O??o#15?CA#58C_?_#155?@#38_o!7?C#49CCO???A?@hgK??_C??B@#115??_#118!6?_#250???A!7?CKKCWO??@@HDECHGCG#101??A!4?C?C??G!8?cOA?c#142??@!4?@?@@!7?@@@AAACC?G?HHGPBB?@AAA#126!22?@???BA???E??@!5?Aa#73a#69!12?A#103_??_!5?CC@?@??@CB?CGOCHCD?RHS@IH?GS`HWA]aGPCHAE@GG?S@!5?A?`AA#93!7?C?BC@E@EA?A$#184??G!7?C!6?@!4?A!9?A??_?A???A???_O#96!34?_C???a?`#82O???G?G#29??C#164O#176OGWkCGA?@@??GO??_g!5?A?@@???C!8?@#249!28?___?_?__??G?O!6?O#228!6?O!4?G!4?_!4?@?@#15O#156!7?CC#201_?_?_?_o__?_?o??OOWOWOOOWOOGWGGWKWC?K?KCCCGSCCEAEC!4?ABB`AeAaB?BA@!5?B@A@?@@@B@D!4?@!4?@#169@#23C?o??A#91_?O_#128??_!6?_OoGOOO???O#250!8?G?G#92!12?@#62@_@!9?KK#121CCC#69C???C?G#53C#251??@@@!6?@#119?C???C!5?CARIGCWGCC!4?__#127!14?O#52!6?_#112!33?C!5?GAOHC???C?C?C@???C?A?C???G#101!31?B?C???@!9?A!7?_??GOGTGK#131!4?A@??A!4?@$#239!29?A?G#183!49?O#17_??_!6?G#5_?O??A??@#216??A??@!4?O#155_O#222?ADH?A#227??O?O!9?C???G!4W!28?A?A???__!4?c?cCd`@ROp@@O#243?G?G?gg?_o_?CC!6?CG!6?G!4?!4G??G#247@?@#207!8?G?C??C???C?C#220!8?O#29_???G#188E??C?C??G?C?C_?C?@SO?K??CCC?C???@#26!5?A#21?GG?sI_A??@#50!6?_O!8?A?@O!4?OC???@#114?C?A?O!4?O???E!4?AAA?A???AAOGO!6?OOAOGGG?OO??_OQQgOC]GGKK?eGO?c??c!5?_#38A@HKK?IAA!9?D???A??!4O??@?A#115!25?G!9?GG?O??G?G???@G!7?_??c@??I?Q@CAHK@XD`?a`O@cqGC??___!5?G!16?G#134!13?_?_$#14!83?__?O??G!7?A?@#188CAA#224??!5_oO???G???DC_??OGOXGWGG?CC?KG?CCE?EIACIBEACA?!4A?A#243!12?O??O??C?A#224?_!7?__@#176???___??O!5?!4GOGKWC???OAACC#228?ECMAKECAC?DCECA!4BAA@A@B@?@?@#192!14?G#181OO?C?Gg?_??G_GGKOCKAKCAE?A?C#57!14?_#177!6?G#152_#63?OO#52!7?_?O_O_?___?_#62A!4?@@!5?G?GK#103!10?G#101C!7?`!4?_#122_#72!5?A?A@?DFCEEHAAEBA?@AA!8?O#128!5?A?AA??OG?O???_???_?OOO?@?o___?C!9?wK@PM``KHCl?bC?AA?O__o_#102!32?_!9?@$#192!87?_?C??A#177!6?_#155_#243!4?@#154!6?_#223?G?G?_??O??A?G!4?CC!9?C#228!34?@?@#223__?_?_?_!7?_??O_O??O?GG!7?C?G#205!4?_?o???O??OO?O??O!4?G?GG??G???C#26!18?_?A#207_O_?_C?`!4?B?O?@@A@??ODY@AAM?EADAB??@??@#148!19?H?@!7?@???A_oAA#40!20?__o_KWQOWC??QA?AGHGAC??G!4?__?_#69?__??C???DAA#107??_#145!5?@@#152@#140?A???G???O?oG?Cg?_!6?C!8?GOcG??A$#35!87?O#0O__C@PA?@@#181?C#228!19?__?_?_??_???_O?O__O_O_?_?CGG#230!35?AAB??@?CA!10?G!5?O#221??AAA??@#227!5?G!8?@???@#231???@#5!32?_#195@@#127!62?G#132GCG??GG!4?G#115!24?G#72?W#100!4?@#111@@???_#120!5?@?@#111??_#122?_#99C#139@@@?@#121???@??@A#100?_#125!9?A?OWGCCO???_!9?O$#202!87?@#1G!7?G#162!31?@#155?A???@@#177@#216!48?C!6?_?_O?O?O__O?WO??_O_KC__oSWUmWOIA#207?_?_!9?O#11!34?G#180A@#121!64?A?C???A!7?O!4?B??OO@??D!6?C#107!9?@#115!10?_#108!5?A#98C#115!8?G!5?O???G?cW?c!5?_$#33!90?G??C_#219!36?O!4G?CC???A!6?@DB@B!11@?@#234!38?A#177!4?O#230!15?G?@@?@D@C?@??C#124!32?C#81!66?CKG?CG!7?A!8?A#119!32?O#118!15?O!7?@@???_??_?__$#6!91?G??C!5?@#54!31?@#227!77?@#138!61?_#140!68?AO???OOC#125!61?@#121!14?OG_!6?_$#3!91?_???A?C?A#69!242?C?C??@!4?__??__Og?__gkGqeP?ABA@C?A#81!51?C#127OG$#106!92?O#52!336?A-#237~Tj{Je\iSNsnYntZexQntYfxVkWbC|B~?TgBk@QDiDYDITIC_?C?ACA???C@A@#241@!7?_?C??GG??CAA#173O#176O?O?WGGCE!4?@A?C#230???G???G!8?_?@?Oc@@o?H@d?GoOOxdgH_AECA?@?APbaCC!6?A_!5?O[GIGAK?G?AI?@AK?C!6?A?@#220??_!5?O#171O#195?@#181??O#201?W??_a_ORDU^EbBRo@xghwogOO_WGwoOWCG?O_??OO?G??KCK?CCEGC?E??DC#195c??G!9?GO??C?O!4?@C@??GG??EW_CghgpSxq@C#21_?B#58@w?G!4?WOG#132?A_oOS_wECA?O@S@GO!4?C#50??G#39E??AC#54?O#115?_???G?G??C??GKY?S!8?@@?O?g?L@A@_`aHG?AwgcOiG?AO??WcCE@@?A!8?@!4?_c?g#125B@EC@?GGOS@CK?OOO?`?oOAaA`i@PP_GX_`oOR_AC???@!5?@??AC??o!4?@#119?_?@@?_G???_OWG?cKKGgkKCECM[Wo_Ooo!4?E??@@#102!5?__``aajk}Z]^^NNNLFDFFFn~FCAbE#98O???@?@???@A?C@IAD$#192?g??C??C??A?d?A?O?@O?@O?G!4?A??O_?G@!8?G?_!4?CgOGOCG_G?O!4?C#90o?O#226?OOO??G!6?@#227_??O?_??GC?CSOoW?w_C?CCKEEE?G!4@SBAGaCGg?_G??G?_??C?KKGG?IyWGIW@?G@WHGGG?GG??CCA!5?B@B@@!7?B@C#173?O#194?__?__?O_o?o_?_???_o_wwGGGggwH_XW[gLeEDEDNVNLNFFEFFEBFKKLJKEDE!5BABAB?ABB@@BAB@#173EM??!4CG??CE?C?ALCAE?AE!4?B@?A???AEC@?@???AQ#25@O#23A?@#56_GGOW@??SC??A???@#125AoO?O?Go!7?CUGUUK#114!4?Wg?O_OogGQC!4?W`cG??AA?@O?@_S??AA!4?@?EHCEQXC?tXCa?_?WhX?E@?A#122??C???C#114???A???G#128??A?@???R??C?A???A@?A@AOP`OPO__?P!4?@?@#143?O???G??C_??_#112?@!4?A??CG_?@_G_@!4?S?CA!8?_G#103!12?O@?_???ICPgS@QAOTSB#77??_???OO?WgOgg???B??X??O_O?_$#184?A?@!6?G???G!6?C?A!8?D?@!6?g?O!9?ACACG?C#240?_#150?@!5?@@?a@#14C???A??@#26??G??C#181A#224_OoGOWOO!4?QAB??AA!5?C_cCS?CGAKICE_E?G???CCG???O!6?O???G?G!6?C?C?A??A#235??_??_?_??GO???G??g?G??G!9?G!7?C??@#207S?C#187??_???_!9?__#186??_#248??_???o?Ooo__O#232_?_o_??_??_G_?O_?O!5?__??_#31ACA?A@#36@#57??@#180!7?C???B??@AG?AAA?A?gG?O#51_G?E?O@G@#140A??@#49@A?_#118G#121G!5?CCAAAMAAAcyo_`?__@@WG???@@AA#125B@#103??AG?Oc??O!6?O??O???C!9?AH?@?I@?C_@??c?O?GgE@CDE@DCF`??IOaCWO#127???@???A!6?G!5?_?_???A?A??P__P?@_?OC!5?@?@BBAA#118??@@???CC??CCC?C?Kcwo_@G_p_ZQOeC@@@pPpbFNHLHJhvaf_MCGQ@o?CEG?KGG#72!7?__??_#103?O?OO??G??O#100?@!4?@ABN^Y??@$#246??SA_XaOJo@O?O?cHAk?I_GC_QdGo?{?IGAs?yCw?O_go__O!4?@?@d?A_OoO_???C?A!7?@@#11_!4?G??C#230_#22?@#229??__?_!9?C!7?_G?O???dO?_@O?G?_ODi??Q@_!9?_?O#238???AA!4?@`!4?_??OO?O???O#188_???O!5?_???O???O!7?YUUOGGA!6?C#248???_#171C?CA#220??A!9?@!5?@A?C@#172@#171??CCC???C#220@?@@#248?C?E#243G?_??OOo??_OO_???_OwGo_G?W_GWGW@CEG@GED_!4?A#164???o@A#63G_BG@#52??__?__?O?@#81G?C!4?C!4?@??_!4?A?`@?OIAECD@?A???AA#102?oqaA@BIBC[??`eIggINIE@#119_GCA@A?uoo!4?_O#118!10?E!5?@!6?!4@A?c?wW!4?_#140?@A?@?@?@#73!5?G_?G!8?A?A#141!4?A#112O#116!4?@#73!8?_O!8?A#143!7?C#115?_??@??AO@?_??a??_?Oa??S?G?W?@q?o@Ia@?K?CC!4?C!14?oG#118G#72???m?D?C?G???GtIyCtgZ$#193!4?O??@_!8?C!8?ASH!4?A??O?gAO?CA@?@A[kWgwOgOa_@?DEEEB@@BC?C`???A#166OSOGG?CCCAA@#206!4?C???AGGG@c???A?@@@?@H@#176C#228!10?@???D@?CAA??C!4?G!7?@??@?@#206CC#176C?C?A#229?@???CA@!6?@A#205_!8?c??_GKCC?C#173GG!9?@#172!18?A???A#235!7?O#192?A?A?A?A@!5?@#207?G#235!5?O#216!4?Og??GWGOG?GwO_GG?O?GCGEK?ACAC?OCK@?GO?OC?G?CO#57@#207K#13_#18C#37O?_#55CEeACC@DA#142?C?@B@@?@@#119AA!5?SOCG@!8?c`W?CCC???C?@#77?@?@!6?q{WW?AEC#69?_OG?C_CQO!4?o#102@CA@C?AXK~^BBA_oOGC!4?AA??IA?CSW#132@@B?C??COS?k?GO_QIg_O?O!5?C?KIICAAGOG?gI??c!4?G??S?C?C?WG??`?@?AA!4?AA#103!9?@?@?Q?A#107!16?O?GC?_!9?O#119!17?oO$#196!25?@!8?C?AC@?DA@?CASG???E!4?G@OI?GGWC#97_!4?GO??G!8?@#189?G??C?A??@#236_!9?W!7?aA?QG_a_???O??!4OC??H!4?@@@bc@?`_???_oO_o?OO?O???@?@@D@@??C!7?A?A#26__???O???O!7?CG??GGCD#205?EEU@VB?A!7?W?OO!5?O_O?GG`Go!5?GGgOgW??OG?W?S???gCO?A#176O!8?C#28A??C!4?A#186!8?G_?_O#223_#212_#178??O?OK?CHE#124??K#177?C#91C?O@#50?CA?AA#116???I!7?@#140_?__!8?G#59!10?OwgO_?OogHCO_?_?GrbL?C@_?O_??@A!9?C!6?A_#101!10?oG?___gWwGc?s?G#121@?AOC_wo_g?c?g?gOcCCKkKK?CCC?GC?CCI!4C?M?CX??hS_c?g?gOGo??AbNKYYyuXXw]o^OPENZIFBC]?__!6?G#101!26?@!4?_?_?O__O_?g!6?@?_mPnYmy[so_ctIoCpGQc$#239!28?A???_?O!12?@BBB@?@??@?A!4?_??OG??A?@#237A?@#182?_!8?@#18!5?A?@#155@#231_?_!4?O_wG!7?QGAIGG?@O!5?AAa!5?AAA???@??CD?CCQAa??o__x???@_OC?A?CC??C??C#201_#194_#223@??@??!4@!6?@@#172?_??_?___#243!34?_#187??_#186!7?O??W_oO_w?oWg?OgG??__#124@!8?@#228?_?_??Oo_Oo_o_oO_O_O?O!5?_#38!9?OA_O@?_!5?C#127?_#73?CWWKGGGHOC@`@`B?M!4?@?O??!4A!5?@#107???C??C#40!5?@#101??C!4?@#121?oOoWWKKK#72!22?o_?GO#77?_?O?{?g#119??A?C#116???AA@@?A@AA@??A@AA@A@@?O??_#114!53?@?Q?A!7?E?ECAGTG?pICcICPGOBQ?O?G??@?@!5?A?A???O???cK$#242!49?O_O#105!5?O!7?AA#245O#137@#252A#35??G??C?A??@#223__?_?O?_SGG?C?CG?E?cHDC@?@??GGGC!6?O!4?A?E!9?OOO?OO?O?A???G??!4C!4?AAC?A#228!7?A?A?@A!6?!5A@A?@!5?@#209!44?@#26!24?G?@?EAABA?@?G?@?E???!4@?@A@A!7?@@#128!20?C?__P?C?QA__?_@_#49?C?_!6?O?OGG#118!9?@#101!7?@#72!12?C#118!8?@_??O?@#107!21?@A?A?@#108?AO#112!11?G#126OC!4?o???_???O?K?GGC!9?IC?C?_hJUjUYuQ[?kPNwyCC?p?`!6?A???@#102!13?OO$#96!64?_!4?c?A?_@???C#167O!8?@#156!4?AAA?@@#174@#197!4?A!5?@#234O?O#243!17?A@#247!6?__??c!7?@!4?@???OGW#248?_??_#224!12?@@#216_C??S!7?@!4?B@!6?A??@#181!58?@#180?D#11?@@?@@#5?@@#227O#157?A??A#144!39?G?G?G#69!10?A!4?G?WO?@@!4?__@?`!4?CLC?C#99!53?WWO#100GO#73!16?G#49A#129!8?@#69!71?G$#183!64?OG???G#64???C#2_#82__!8?C#228_!5?O??G!4?A#219!4?@??A#235?_#216!31?O#249?C??C!7?AA!6?GG!5?O#247!10?A!5?C#232?C??EBA??A#188!73?A#230??O???O!9?_#145!38?O?G#115!17?K$#153!64?GC#83__?O?G?G??E??A??@#234!14?_#243?A#232!6?o?_o?_#243!45?A?A??_O?G!4?G_G_GGOO?[_[OOS?G_GW@A?O?AA@ACABD?@A@?@#189!66?G?C#223??_$#244!65?O??G??C??A#214O??G?CCAAA@#249!21?o#238O?O?O#232!44?@???o!4?_O_?_?OOSc?CK#189??_#187?G#248G!5?CC!4?C#231!79?_#79A!7?@$#208!66?G#104!11?@#1@#216_??_O?G#221!74?@#180!23?O!5?O!5?G???C?G?DA$#30!79?_#207O#29GG!4?A?A@@@#186!98?G!4?G?C$#235!81?O#201!112?GG#221O?O$#192!195?_-#237~Dq}hUKrC~iTnqlyKzlUxNuj\alYftYmOLQKQ`oAS_sI?Q`???C?A?ED?a@_#226OOO?GG???@#243OOG?GEA?AC!6?A#212!4?GG#223???GCGGW!6?C!5?A??AAA#189O?_!4?_?_#243???CGA?K@IGO?K?GIGELWI??EG[CGA??CC?G?DC!4?C!5?GG???G#235O#172!8?@!5?@!7?@#188_!8?_!7?_???_!5?_!6?_??_!8?OO#26O!4?_?__!7?_?_???OGO?OOO?OOO?OOO!9?OO!6?O#25O#7_#34_#20_OOG???__#55@!9?_#132@#130??G#125?@!4?@??BAA??CG?SSC_?oO_#115@?A?ICCGAABA?@?@?@oYwASAGCGCGCaAP!7?@D?CC_??CB@@@?O?O!8?OO?GGgCcQDC?ALOAA#112@!4?G#125?AAAEDD?KAALGASP[OVB?`Dc?oG_?O?O?_o??oG__goOOCcCC??OgC#73??@#112??OC_?O?gOO!4?O#132?@#73?@#107!13?O#103GI_POPQ_AXPKhLO??@AG?A?C#100!11?_??O??_$#246?OK@AGrCX?T?OHACR?AgA_GOATQ_?Gd@jqdplIFLHB@PF?IAKC!7?@#214G??_?O?CKMEE#82CA@#247OOO!4?C??CC#223P#243!12?_???O!5?A???C!4?G??C#15?_#249???C#231CA!4?A??@??A!4?A??@?B!4@!4?@#232@J@JA@??@?@#173GG#180?C?_#247_#221@!5?@#187!12?OC?C???C?E?CA???BA@?@IAB?@B@BBPO??@@@#186!6?@_?O??G?A?GG??@??C@A?@!4?@#228A@DA@E@BB@?@@?@?@!5?@A?A?@B@?@?@!6?A#28_?_#21??C#36O#15EA#58@??_PO?O!4?g#116C??AEQ@#129!4?GC#55??O#49?@??CA?G?G?GAO#118??C#114??@@@?AB@@??@@!6?@@?B??AA@??KGKSLpRPOPWqxrHLphGwOsg@CGG#107!6?ooCIyaC#114QOG`I?LOAGOG#119?CC#73A??G!6?A??G!5?A???_!7?O#141C#143??A?C!7?@#118!18?@@?@@??p?FAaayy_LTT}{WYW]WHple_`H!4CHC#101!4?_?Sc[O?s_XoIkOmS_[hShkIID?I\?nOnPeJuJ?VgVitIt$#192?a??S???a??a??O??C??C?@?_??DOA?OC?GA???O??AC?@!4?A#83_??OOGGCC?AAA?@#188?OO?G?CCA??@#180@#236_G?SGG??AEBA!8?@??CSOO??GG!5?D!6?AAA?AAGABFACC!8?@@???A#228??C#180G!7?C#248A?@!4?@??@?B???C??___???_?o_o_?OG!5?GG??G!4?CY?GKIMWS[[]!5[IGX^YMC\]NlW[}?EIFFF@?@C!7?CC?AA!4?O??O#188??OW?G?OG??W??G#25_#15_!9?__O?o#20_#63_#51_#163@#178ACO@CA#9???O#63_??A#52C??GA?C???GGCOO_cCAA?CG???GC?G???O#121AAA!4?A?KI[K[O___cW?OWIMIoAA!9?B#77!7?C!4A!7?o!4?__??_?_@?@!8?@#121!9?@?WW{[TcGPGp?o_qoo_?_`G?A?G?SOQQHE@EIICHE?K_D?CD??HGGOPaRSHCBpMon}lzY}m}UMMKCGXHH?@?AAA?A?CC#102!9?___?Oo__`OOKHBAD@HK#59A#103!13?@#95O#99_#53??C!7?_??@?C$#193?G???@?G!7?@!9?G#239??G#193!8?CG?_??__g??AB@A@A@?_?_?@?__#171_!8?A#186C#230G??G???A??G??@!6?_???_!4?GGG??A??@D??@!7?C?@??@G?@?@NAM@?@??C?@B!5?C?@@#238A#195!7?A#171?_!4?_#187??C@!6?O#232!16?O_!5?G?O?C!4?O#221?@???A?A#205???ca?_?a__?QbA?UoCG??_??A@CA?A???@??@@!4?O??OO#124??O#79_#180G??O!8?GO??G?GG??C???KK?O???O@#19!4?GG#56__?KBAGC_C_?Oo?C??G_oo??__!6?_#81?@!7?E?G!8?OGCo?_?o?I#102!4?@??@@!7?A??G!7?A?A?@??G?IAFBNT[C}_IE@C?@@C#126!15?a_PO_OG_?O???OO??_`?g?G??G?AOEG@@BC@ABAACB!4ABPG?OkA_?WC`MO?A!9?G#107!6?C#77!20?_!7?__W_GS?PcJdAC?GC???O@@!7?LOmHC@CI??_??C$#239??@??_#184!5?G?C??_?O@?O?C!13?O??A!6?@#244o!6?_??A#137?_#14???@#106OO#205__O_#235GOG!7?CG#224__?oOOWW__GWWC???A??G#249?`b@_#247?!4G??K??C??C??M??CCC!5?O?O@CAA???C!6?GEA@FCE#207!6?G???O!29?@#186__O??O??_!4?_#232!13?C!4?A!4?@??@??G?A@?@EBDADF@A?@??A@@??G?@G#195!4?C#31_?_#13?__?_#232CBC@CC??A#173OOO!5?O??O!5?_?AB#13?@#91CC#38C??G@???_?C??o_G??GCGYQAO_cswOOOo?__#69???!5@BCA??COG!4?KAS@C?OH_E[GWuwSySyPP_@???_!4?C?_O?C?CA#118A???O!9?__??O?g?KOxoc_dLs}bb@@#132AA`G`?WIG?G???XGA?h?cUIi@LC@W@_cg_GG_K?aOWCKC?ABiH?hER_IO??@??C#114?@??@!4?C??C?Q_g!8?OAOHECOGHI?AHCCOC??A!4?A$#239!39?_!6?C!4?K?C_AE??B#209!4?O#201__#182?G?A#138?A?@#231?oOoG!5?CCC??@!8B?_?_bbA?QO?O#235?OOwWoCO?_COSG_???G?!4_O???__k_I!7?G!7?G!5?D!5?O#243!31?!5_!8?_?___?__#173!19?O??O??OOoO_!8?_??_?!4_??_#76??O#28_?_??_?_#124O#207G#21_#23_?_?__?_#195AA@?DE???CGEEA?@@#51???_#74OO@!7?K#125@#141?A#142GG?GQO??__O!5?__??_#119@?@?@???KA!4?A?G?C??K?C_??@kCC?_?c??_?_@?_!6?___??G!8?A#101???C?_@?@?@!6?@#127!18?CCC?A?D?C?A@C???C?O!4?_?_?_?O!7?OG???__#119!21?_?A@O??O!6?@@e`b_deC!4?A#107!11?@#72???_!5?OPjPbXbUjEOCOID@aXOa??OoGOtgUGPIpI$#196!41?S??G?O???G?C???@#241OOOGGKKEAA@@#181G?C???@#228GKC?`b?@@_?__?_O?Oc?ow?O??G#238???O_@o_o#221_#205_#228C#26_?o?_OO??_!5?_!8?O#232A!4?C#194!8?__?_!11?__??OGKU?@@AQE?A?@BJ@JBFA@A?!4AEB?C@AA@?@B?@?@A???@#26!22?__#189O??O???_#194??_!7?O?O#189_!4?_#227!4?C#186!5?CG?KAGAGKK?MCC@!7?KG#23_!5?G??CA@#144HGA?O?_??OO_#73???@#116!13?C!8?_#112!10?_?O!9?C#54!5?_#59@??@!4?CAgqM_?@K!5?AGQ??g?S?H#111!9?G??C#128!28?@@D?E??C#116!16?O??O?G#73???O??C#115!22?@?Q__?C??G??G??@??@A?GA?POCAA?HC?AI!4A!4?A$#202!41?G#240G?O??_???OGG#150G?O#232!12?_?__#249___?_?O?O#232!19?_!7?@@@#224???A??@??@?@#205!12?___!4?__!7?O!5?OO?W?OO??AAUA!4?O?gSSCHG_GWOC!5?___G??_??WGOW?O?O?wsoO#176!29?O??O!4?!4G??GG#29_#223C?CA?@???A@!7?@???A@??A#177?_?_??_!9?__#157??_??_OGG#24??A#37?O_CCcGWW#132!21?@?C!6?GA???O__O!6?_#103!27?CK?C?A???C?A?C??S?__OIAy?]C@I@@Sa?AR?_AAHOA_#112!19?_#116?A!5?@#128!12?O??O!8?_#69!21?_#103?_??C??C?O?_#98!30?_!9?A!4?AOc_Is?A$#153!45?C#105?C#242@??@?@#150!16?@@#109?@#216??CA?A#229A?_O!5?C??SC!7?S??C!9?@#216???!5GgOOOW!7O_???CGO@O!5?CC?A???G!6?CCAA#26??G??G#220!30?@#192@#238???G!7?C!9?CA??C?G??O?C#243!8?G!6?C!5?C!4?KCCAIC??M?GOAIA?G@A?A?@C?@B@D??A?C?C#124GG!6?O#164GGA?C@#142!4?A#128!4?@??@A?DB@?C?@???@@@\?@A?C!5?O??_?_?_#59!5?@@?A#102?@#40!27?G???G#121??O#112!77?@?@?@#135??@$#137!47?O#217?OO#96?O!8?@@@#207!12?@#173??@#238O#227G@AQAHHG_CC?_?C??SEDJB??CCGCCEEA?A??@?AAA??@@G@@_?GG@G???C??@!9?A#235!59?C???_!5?_??_?_!4?o!8?@!7?G!4?O!4?O!4?G??G?O#205!13?G#235C#216!12?C???A?AA???G??CC#140!12?ABAA!8?A@DC??MAIA?G?GGW?O__?O$#204!47?G#183?_#64_??O#188!64?_#206@#176@?@!4?_#188!9?O!6?O?O?O?O???O?OOG!4?G?GOw{!5?_!5?H#187!65?CCC__!6?_!6?O#249G#230?C??C!4?A#28!20?O#164O#207GG!6?O#212??@#145!14?O#49?@??B#73!19?@@EACCGA?KW???O?__!4?O??_???o$#208!49?G#16??_#97_?G?C?GEC!4?@#234!51?C#173!23?O#186?C??W???O?O!6?O#216!86?G!8?GW??KGC??A!7?CC?@CCCEC?@#188!12?G#201G#223A!4?@?@#54!47?@?@$#201!145?!9_??_?!4_o__o!4?DErgRAHQaaOC@UdfMwC]C[wKU\fx|GSPCAA?DGCJ_???C???@!8?@!4?O?@???_?GG@#171!4?_#207_!5?_#201?A??A??O#195A#21!34?_O$#195!145?O#238!102?A#195??G#220!4?_???O#247?G!6?G?G!7?A?A#176!17?A?@@?A?@@G??G$#181!258?_#221O?O#13!37?_$#171!259?_-#237lRKalQLAlQH`Q@e?n?cXONG`JcNGMTJm@?HADIDN@AE@b_@???IGK?@#198KC?A@@@#243O??GO?GKCA??@G#212???G#156G#176C#235O?G??G!6?A#187O#248!7?_?S[QA?B@#181!4_C!5?_c_?Ag!4?G!5?O!5?O!4?OOO?O#191???_???O!8?_?O_?_???_?_?_?_?_?_O#31A#172??GG??GC??CKA?CKCCE?CACAC?A?A??A??@?@??@#138CK#11CG#4G!4?!5_!7?_#24??O???_#55C???CCK#15?@@??@#21@#74!9?G?G#56??K!5?G?G?G!4?C??C!8?_??@??hG!6?_?@@BB??@AA@BCA?AFD@C?E#140?@??QZC_#49O_@__?_#143G#118?O?_!4?_??C_OE!8?@#72_#102G#115!5?@?C??@!5?C??G?GAGc_?OGoOA@_O_?@?AC?H??G!4?G?GA#126??K?E?@CoH`Aq?Sp?oC?C?CC??C#140!4?@?@??O_CP?`_KCG#73?A#121??G?@?E?O?HgIdJPvW^lz[jXRzXY}Ueu}SKG??OO@!5?O#107??G#102O?_?cCkidcS?B?CAc!6?AA#98?_?OAESDO@KACG#100!6?@$#246QkR\AlQ\AlQIdQHvON@cboVY?XOQpiOOENEKI#252O??GC?A?@!7?C#171O?GGC#205K??A???D#229O!7?C???O@A??A?B?A#236??C?CCA?EC#235!6?___G??A??@#218G#193G#166C#82CCG#106G!8?_#194?__aEEAABB@B?_!7?C?!4@?_!9?@???@???@H?G?!8G?C??C?CCCGEEI?CC???G?A?CI??GDADBBD???AA@A?B!6@?@#157A?A#23GGGEG?C?CAC??C!9?_??A?G??X?P@P?@@`@?_!9?_???_?A#55?OOooq`aoqKAO?_??@_#74!5?O@??A!4?Aa_CCMKGG!6?@?_#52A?A#116?CG#73???OOO???_??DDBD?A@#59?O!5?___oo_KEO[qtmc!7?R_G??_A???O???_!5?O#112@?CA#121O_!6?B!8?KNBNHJcGHo?!4@E@C?C?C!7?C#129!8?@#127!5?O!4?OACa??C_#73!4?O?_!5?A#118?CCC!6?@AQS[|d_yuRZPp@OEAGC???OO#101?G?gSGXgHYULY[o@G\SBmLlHgGH_@gP_JOGPaSiTiTiPkA$#240??_#202?O???O#252?COGC?G?OI?C??C#204_!9?__#242O#96_#241O?_?_oOYWWCM?A#194_!6?AA#106?@@#249OO#223?_?O!9?@C???C#238?_?c??gG?gg?OGW_KcCjBA?@#188GKC@???O!4?_??ACG?GN?O???WOO??GGOKG??G?GIG??KC?AMEGCCIIBH?CGINIG!6?A!4?C!4?@?C???AA??@!7?@#192???G???G??G?OG?a?A?_?OA_#105OO#0O?_#9O?OO!9?A_#76@#31??@#63GG??O?O?_!4?_?CCC!5?A???O?@??_!4?_!4?OOa!4?E!7?@?A@A??C!6?O?@?Aa_c!4?G???SOO_g_Oo_#91?_#128@@@?QTMBE?C#119?BO??G!4?O?A@GE??HPEHDIFA?@!7?@O?OA???O??C??CogCG#103?EL?BB??O!5?K?O_GM#77_#73!6?O???_??_OA!6?G#112?C#128???A?A_@GPAHAWCoWGoCI?K?CYBa_MP@#126!4?A?@???D`GsI?c_?C?Sa??_??_O#115@?@??B?A?C?G?CGIC`?AAW@WB???A@#53!5?@#72@??_Goo_g?O_?o??_GOPIECeEeCa?GCG?kAp$#218!6?_!7?O#192??_O?G!4?A?C??C@G??@?@#196I?A@#166??G#14C#203__#202_O#153_#183@#105O#207_!4?G!4?A#227?_??__?O??OA?QP???GG?C???@@@!7?A#249!6?@#205G__?_#29KL?C@RO?_CO???C???G#221?A!8?A?@#124?G#243G#106O?_??_??OO???O?_?o?cCOQ!6?O!8?O!6?GG???G???G!4?G?G?G!4?G?C?C??C?!6CK?G#207?G#79C?G#21C??G#18G??A??SAP!7?P#50CEAA?AA#56???GKC#13@#18G??`!8?_#91!4?G?C?C#20???@!4?B?A#92@@?A?A!4?C?G#148_#144C!4?G!5?@!6?A?@??A?ACG??G#55!4?AO___#132???G?HU?_!4?I?_#54G!5?_??CH?AD?@??@!5?O??O#77GG!6?@@!6?A@_#107??GLG???@?I@#101O#81!15?O#132o_SI@CEQO?}A?o@pH?_G?C??C??A?AA!11?O???k_HGCPWLhcQSA?CGA?A!4?G#119?CD@@H???___??B?@!5?a!5?G#77!5?G?GS_PO?gQd?@?@?@S@A!6?_?_PoHpGXHSaPaTAPK$#244!7?_??_#193C?G!5?A!4?S??@!6?OO_C??C?@#2???A#150@???CA??@#137@@#247?_#232___?A?ADEBB@#234_!7?o__Oo_O?OW??QW??G_?_??OG???D#187SC_#26GA??@___!4?POOOQOO??OOO#192__?_??_?_??_#172!6?!4_?o#192O#105_??_?_?___O!5?_o_?oOoO_?_OO??!4O!8?_??_!4?OO#193??_?o?o?_?OGO?OO?_#181!5?A!9?@@#188@#37S?CGGGCG??WO??_??_!6?_W_O?O_?__?_O?go!6?_?___#25@?@#86?A#155@??@#91GGGD#50A!5?G#70A?ACACD@KCG?OW?WGOO?O#20??_#58???OOO#129!5?G#149_#125??@I`[_FA_!7?K?A#114GG!11?GOAOEBLIPQm}igCs~c^fyjYcbJ??O?[G??C_o!5?ADOggOe`O_??O?_#125!6?O??oA?KkC?_GIIAqHB@IQ?IOA_cYCc_EICI?KGCO@Bpc}BTqSxgaAUQ#112!6?@?O?@!4?A??G?G?g#114@A?AGC?GccAE?@Gt?gAOA?A@???@#100!10?G???G!4?B#99QEEAC$#240!13?_#202!8?_#239???__#240??_#105?_#198O#0!4?_#83_O?GGC??A@@#246O#191_#218@#172O???C???A#228?G_!5?_?CAC?K!4?@BB?B?@#248???O#194!18?O#220?OO#172OO!9?__!4?_#248@#207?G??GGGO?C???A?I@!7?C??CAI?@!7?@A??G#173CC?!4CAA???A???AAB?@?@#26???@?@#180@#171AA??C???CAA!6?@!6?C??AA!8?@#51C!8?A?EA?A??C@??AAAC??AO!6?_???A?QQ@AD`GDZFLUIEKCWs`??A??@?G?OA??C?G#20AC??@??A#152???_#142!4?@?@???@?GH?ACBAO#121!11?G?HGF^Fb?O?GDC???GH@EI?E#40!4?_G__???G#121!4?_!6?O??OOA#73C#101?A@??A#118???EMNJKK?_BBEP?CFNBBR@@OO#127!11?G!5?G?oWoOGq__oO#143!39?_??_??_#103!7?@???G!4?g?cGO?dPDe@g@SQPAa_EAc??_?BEEC?A#53???O??_#48?O$#153!32?O#202_#214!5?O???C??C#240?O#217_#192?O#96?A#193A???@#186?GGK_C@?A@#230?GkIKI?ACEEA???@!7?D@??@?A#22!14?ACAA?B#76oOO?GK#187A??a_?@!6?@#209?_?_#198??_#187!11?G?G#186A#193_!9?_??_#201@BA??!4@??@???CG@???G??A???A?A???A@@B@?@@@?@!5?@?@??@!8?@?@@@#24?O#5_!7?_#16??_#2_#34??_#91G?G!4?O#20?__?_#38!16?G?G!7?GCG?_G?GOOC?o???C???HOooo___!7?@!7?@@???A?KH^[sKK#81!9?S??_?A?_A?@!6?O#118!19?A#102!5?@!7?AO?OAdGC?_#119??Oo?O??C??O?Wo{kc]elbo#116!21?@_@?H?H@_H?TH`PoarQ@_GC?G$#226!41?_O!4?CG?C??G#242CAA#216_o?OO!4?_#224?O?O?OO?OOGG???C!5?@#249??A#189!22?A!4?@?@@?@#124G#216@#205C???GCH@?H?CCC!6?A?A?A?C?AC!4?G?@#181C??A@?C#205???JA??A!8?@DCG??@!4?A??@!4?A??@!4?@#184???g!5?O?__???_??_#3?O???_#34??O!4?_#74?G??C?G#56??C#155???@?@!27?@#18!6?@#7?@#128??G#149G#142?G#177???@#39??K?O??O#81_#145!6?A?O!6?_C?g_???_C???G#112!20?G#69OG_O?_OSe`O?O__OOW??KO!6?@??@F@??G??C??WC???_!4?O!5?_#73??_!41?C??C!5?A$#97!41?W!6?A?@#244??@#124_#181O#26O#173O?O#201CC?C@A#231!6?@`!4?__?O???GGCGCI!5?CG@?D@BA#209!10?G#198??G#182GG#10A#79?A#11A#173?@#235?@@?P#220!6?_?_!7?_!9?O#198!4?O!8?O_OOO#195C#187G?H!4?@@!7?C#220?C!4?G!4?G#235?@#191!12?GC?G?G?GGG?G#31!4?C?G#177!4CKC?E?A!6?A??A@@@???!4@A?B?A?A?A??@!4?@?@?@#23!25?@???A#121O#86!6?C!4?G?G?O#115!34?CO??O??_WA@Eg#54!31?_#72!4@$#182!54?G#195_#176_#220A#235!5?OGCGG#236!6?_```#189???G#221?_?O?o?_o?__O?o?o?WoGOSG???R?O#30!7?A?A#137G#171!5?C?CC?A!5?O?OGO@OO?o?__Q?O!8?C?C?OA?@!7?O#28C#186?A#235A?C?C#176A!4?A#198!11?G!6?G?G!7?G!4?G??A#28!7?C!4?A!8?@!5?@#38!5?GCGG?K#54!46?CG?O#125!97?C$#206!83?C#247??C???C??A@DA@?CAA#27!18?@#138?C#201!7?AA?CC@?D???C?AEFDDDCDDHJAGI?!5@#109O?OO#26@!4?CC?C#104???O#221?G#109??O?O#207C#193_?_???_?O_?_#208!5?O#220!19?A!7?A#12???O#26AAA#207!4?@#13O???A???O#92!8?A#69!51?G#37@A?C???ADAAG?IU[CCS?CGKO?ooO?__???_$#243!87?A?A!9?@???@#32!16?C#76!44?G??G#180!5?C#243G???A???A!5?@?@??@!7?@?@#188!32?A#1__#15G???A#58??G?G?G!8?GGoCoOOOo_OWO?ACMkmM[]]]CMCCMOqUqq?OQ@S?AO_??C??CCC??@__??@!4?@G?W??`?_$#124!166?A??C#216!16?A???A!5?@?@#7!40?G??O?O!4?@!5?@#49!61?G#140_??O$#11!167?G#189!20?A#196O??__?o_OoOoooOo_O!4o__ooOo?O?o?o_?_O??o?OO_?__#35??O!9?__#19_A??o_O?_#62!57?O$#198!191?_#20!55?O???OOO$#14!247?_#26!4?@?@-#246Tii`SIgTQLqhUWVgFQBVIfQ^@J@E?ABA?@#90A@#96A#194_#207_?o!9?@#180@#221C???CC?CC#224??OO#176?O?OO?O#194_?_#216O!4?GG?G#187O#106OO#172!4O!7?G??G?G!5?ACA#246!5?O!9?O#137_GGgGGG??GG!9?C?C?C?C#208!5?COCG?C?C?GO?OGO#137@#198!5?@!4?@@?C#237?_#184?_O?CGCG??G_!4?AcOGA?AD?A?@A??OMSG?C?OS?OCa@_??Q??OC??_?C!4?_#58G#24_??_!8?AA!4?CA?C#0G!6?O#19G!8?g?GG?__???_#91??AGCOO??@GHA@??LOOOGA@??kBAAC#52GCsK?GG?O!6?G!7?_?_#125?CGBG@?@#81@@!4?A#40?_[CW#77O?G???A???CCMI!4?GG?G!4?GGG?CCKG?IK???@#121!4?_OO#54?O#103!6?@?@@#73?O??cYC[wOA`G_O#141???@#127??aBh?C?A`C@A!4?@??CA#52!9?A#127!6?@!4?H?O??_?_#112!7?AC?C?C??A@???O#115??OCQ?G_@AI@_c`aQAO!8?O?_#108@#72?GOO???AL?@#114?G!4?A??ABAA?A?A#72??@?O`O#100O$#237i@PSI`TALaLQHFgFO@CG@OL_GCC@?@#218?_?OO??G???C#228_!8?O!4?!4O?O`!9?G!4?G#188??O#181OO#198??_#196???___?___#191_!4?_??_?O?O?O???C!6?A?C#109?A??@#172@@@#194???@!6?@#191@???@!5?@??@??@??@??@?@???@??@??@?@A?@?@???@?@A#237!20?G#239??G#105!16?A??GO?@B?CICGQGOAA_oS??_!5?CO???_!5?OoO??_?o?_??__#3?O#51A#58@@#24???_???_#13!4?O#58@?@EK?O!4?_`?G?K?O??_?GAFGB?_`_!5?@?@@??A?A@@??AA#128!4?@?A!5?@!6?@#59???A???G?A?B?@A?@@?@@@B@!8?ACA!5?AC??Wh_#118!5?_CO?OQG?O?ECCC?A#121X[WCO_?N[[O??DIC?q_#128???SgCwO@cTjWRk_DDIHSQJ@AEaGwO__?Hd{AYSK?O_?_#119!20?ABBAAQ[KOC!4?__#102??QWGGGLDLt^H]Inc_??O#59_#98!4?@#53!5?@#102G?A@?KKCC?CKSKWCc$#218?C?A???_!4?_!7?C#196???O???@!5?@???@#232_!4?O???OO!6?@?@?@@#216??@#231??!5G!8?AECCE!5C???A?A#201GG?G??A!5?B#196O???o_g??wwqsoOoW__!4?C?C?OCCScaSkcS_W?WagoGwcsogsiKacmWeWkOCICa?OwsgowSwoSOKwcWsGwNC~PQra\fTJ[uJ|OGBsOlOoItWeWtM`_@qDy@m@@NQSKVmOciSiqkoKsgOK_g!6?_??gWo?o???O??_??OO???OO??_#177@#56@#90_#63A@@@?@??@@A@BFEEIGOO?_?__??_ocaq__??o?G_#142!6?_#128?G_??O__O#49_??o#51C!6?C?G?O#49??B?RQ!8?O#72??_w_???KGC?CCCG???A?GG#121CBB#101?G?G!4?G#72GG!4?Oo#81!9?_#77!10?_#81??G!6?@#125_?ABEcOOgK??XwSiQiCKQI_S_c?C?A@?H@OA!9?_?@?@AQ[cXhOo?_#118!19?CKKLbbhHUAMcOC_#101!7?G???_?_?BCACKTgdYPMTQlQDa_APCOo_Wg?g?_?_@XkxkYln$#244?OC?_S?G_O???_?O?_O?O#193???A???G?C#242O#203@?_OOOGCCA?AA#235GGG??C??CECAJC?AE?C?_`?@@@!6?AA!5?G?G?GGG?G!4?C!4?@#184_!7?_O?O?[?CCGGG_G#220@?@#96??_!4?OG???O???O?O!6?_#184!9?A@???AA??A?CA#246!56?G_#109!6?@#0!4@!9?O???C?CG?O?G#37@@???@???@?B?EB?A@@?BM?MWUKyDAA@A?@CG??GCO?__?_!6?YO!6?o_O#140!10?__!4?OoO?Oo!7?@?@H@?CC?A#63??_#69KLdC??I!4?C@?@!4?@#87O?o__oo?_?o_oO_o___Oo_#119?@???@!6?OCI?di`@BFa!5?x`abB@aAE#126!4?@??@P_KF!4?@?@#140!7?O?_??O???g?GOE?CGD?Q???_?_#121@A??CGDILomtrMB~|jnY~I~nt[{Wp`_#114??A_hSOIDOKQ?C?c@__!5?@??O?_#108!13?O#59!5?@$#240???G@?A!9?gCG_?G_?_?O?A??@#213OGKCK?C#106O!4?C??A#26CEAA???@#247G?AI!7?_!9?CSS#209?_#193_?_?_?_???_#205GGG???A???A!4@#193_?_?_??O_!6?G!4?WsOSooogcoOg??_?GgKcWcGCGE?GGKQI?_?O?aG???_O`?_???@C@i?@g`o?G`ACBOi?ICGSaGaSa@SAdQkA@QdAdGbGdAOMPICO@S?iO?G@_?O?G#1!4?@@@??A#4A#20@AEB@G!7?@!4?@AAA!4?C??ECEE???C??__?WCWSC[[WOGOOo__#55@@@BNCQ!7?ABB!8?GGCG?OGO?S!7G?wwWWwopOaE?O_??_OwSOO#114A?_?_P@A?CBA???@A@?A???CC?AB???FECFDBCC@@AE???ADQGaHD!6?EcoW@ZWrIqEC#132???_G???`?cWJicAQ@WCCA@?@?AG#129!6?O??!4_!8?A#141!7?@#132@A?ACHDYDOM@?GOo#107!21?`?O!10?A?A?A???G$#239!11?C!5?G_?_#202???COAGCC_#241?I??G?E#209O??G#240@@#212!6_?!5_?___#249G!4?GG??CC!4?C#192_???_??_???_!4?OO?O?__O?O?OGO_O#209!10?@!4?@@#104?G#183!11?_!9?_!15?O?O!4?_#104!74?AAG#9?@???G???@B??A???C!7?G#104O_???_#192O#5G!7?_#34!5?__?_??__#51?@?@@EGK?O?GOC!5?G???C#20O#152GA#116!9?O#50?_??_??_?_???__!6?CISg_C#148CAAM?_#62WG#102!5?C!4?A#99?C#93_??_??O#253O??_#84O#47_?O??O!4?_#93???o?_#102!22?O#69!7?@#116!19?O??_OG?FGBIYWOCAKcS|pLpFhTY~CYA{Cg?_#126?CA?A?OA@OIC`K??OO`?p?OG_?_#103!9?@?G@QLHAT@sAOqG_S@SO?GWOa?A?C?_?_??gCCG_Ic@A@?S@QGQCwA?A$#137!25?_?O#0oGWK#83CC#233?__???G#186_!8?O?O#243POO!7?@_@#186?@#221???_?_!4?@??@?O@@?@@!5?@#248?AAA?AB#198_!8?G?D?C@!8?C@??AA!5?@!7?@@@?@??@??@??@#192!12?A!5?@!8?G?C!6?@?_!4?O???G_?G@?@c?G?O?CO?G`??_@i?i@?c?`?AG?k?O_???C??OK#13@#34A@?O???O???@@?AA!4?C??CC#2??G#193O!6?_#38!22?AAK?XCEA??@??DKKF@!4?W[SOOOAAEEEIECCC?C???!4CHIACGo_!4?_#54???A?A??D??@?A#98_?OOWOWWW?G#103?CG!5?G!9?A???C#115@@?A?OGSQEB?@ACG?C_GC_G?G??C!4?@#142!30?_#73!26?A#77!49?_???BDI@ADI`mOg?QkQOBtKoHAO_OhO`@`@A?QCBCA$#204!26?G!5?__!5?G??A??@#238O?G?GG?G!7?GIIK!4C??CFDE@A@?BD?BB?ABAAA??@@??!5@??@#106O?GGGC??AA?BA@AAC?A?A?AIA??ABBA?A?A?A??A?A???@@?@??@??@#246!12?C?C#3!74?@@???C#19@#63C#51KC#2A#237C#137G?_?_!7?_??_O?_???__O???_#49!25?A#56??OD??LA!5?C?tOc@?BBb@@@!4?AA?A?A??A??BA?CG#39!4?O?G!5?O?AkG#73???@#48_!5?G#40!4?A@??G!8?A!4?A?A#102??G?AK_CEDA?@$#1!26?_#2_?O#97???A?A?@#244AAA@#153C#172G#188G???A!4?A#195@!6?_?_#230!9?G?GO??G#236??G??G!4?CC#247!4C#153???_#105_!4?_?_?_GOKGI??m!4?CAC_O?C?C??C?E?A?AGCA?A?!4A??A?!4AC?@B?@??@A@@@??@A?EIUIC?EMAEAAQAGPC!4?`?@!4?@#246!47?GO#52??O#14AOG?@@??C?CC???GG?G!5?G#10?GG#33G#23!38?_#144!17?@#63??!5@!4?@#92!13?GCG#121?@???@Q???A@#53O#80_??_??__?o#250???A#119C!4?A#69?@@???@@??@?@!6?O_ggWDIG@?G??C_$#105!29?_#104!6?@#239??@#217@???@#171C#124C!5?@#234?GG??G???C#227!11?W?G?G#234!10?@BBA?A@#207!8?C#220G!6?@?@#192!4?@!6?CC!6?@??!5@!9?A#55!104?A#49_#54_#35?RAC?A!4?CCC#63@#23@??@?B??@???B??G?CGQ?A?@A?A?AC?G#91!43?C??EE!5?C?O!9?_#58?_#250??O??C???G#101?C?C#54!12?C???@#42?_!7?O#41??_?_$#205!41?O?O?O?O#248?G??G??A!8?!5AaaB??@A@#243O!9?G#194???O!4?OOO?W?W!6?HB@#233!8?@@@#239!18?OGO!6?OO?O?O!4?O?W!4?_OcG?GOGk#70!81?@#56G#96??_#239G#33C?A!7?C#18@!4?@C?@???C??O???C??C#152!55?@@?@#134!28?O#115@!5?A#75!7?O#71?O#73CC#53?G?G#80O?O???o#48?O#98O$#201!42?O#198C#202?A#192A@@#194@#178_!9?_?O#220!12?_?___#188!11?G!4?C?!6CAAEA#150!33?G#140!115?O#202???O#4?AC#3?G?GG#12?G#70!4?A!8?C??O!6?O??O!5?_#88!80?__?_#81!12?C#88!7?O$#220!42?G#223_#246??@#29C???C#216A#163???_#205??@!8?_!4?A#234??C#209!17?O#171!10?C?CC??C#192!154?O#16G??G!5?G#4???G$#223!60?O!4?O?O??O?OO#1!194?O?O!6?G!8?O$#184!268?!4_$#13!268?@#19@A???A$#170!269?O-#246TIsA\bODtCQiaThcoIhoS{qzGw?O?_O?_??O?OGO?O!6?GgOgo__?_o_oo_?O?GGIGG#184???O?OOP?PG??O_?_G_??G???_?Q@GQGA#105!4?_!4?I?@WeWaWeWbWeGP?IEGAGYC]?[A[?OCOUgOCQCOTiWU?[IOK?GOK?OGCOK?[?W?K?O_?O#192_!5?_!4?O!7?_@?G???CP?I?C?H?Q?C?G?O?S?S?S?SGQcA?I`G_?A?@?P#191??@!4?A#246???C!5?A#208!4?C?CA#193?A!6?C??C!4?G?@?A?C#19@!6?@@!5?A?GG!9?G#56?O!6?CE??BADAMAA?C?CO?_?GO#125IOC?C!6?A???@#39@@#69@?@#59?@#40@#77@@@#101@#72@#87!11?L@?@BEBEABB@@FZRLIDIDEBB#48_??miGo#114B@C??CCCO@?y?PP??@@C#73_aQD[vAO@??q?G?_A?AGO?IC#140??AAAEKc?EOg[AO?@@O_CIP`IO???K_#127!5?A???GAS`C@AGG_#143!5?@#112???@?G@?_!5?A#107!5?_#102e???O?_@?@@FJP?GCW@bDEJWww!4?O_@#98?G!6?_?GOC??QA?a?ACI$#237I_A\aOLoIQhOTGCQH_OCg?HCOC_G_??!7G???G!5?G!7?_C??CI?K?A?A#183??C?!5C?CIA#193bBb@BCB@???_?g??_??Q`?_Q_?gWOWGOC?ICWeWeXeWeGQCG?@A!4?@?@_?`GOH_?GOGO@_@?`??`?`OOH?PGDOJ?T?H@GP@DF@F?GQcGQCPCgCBcIPCQ@?YCqCRcZ_AcO`Y_U_L_Z_U`Kb?J_BgB_A?GPcO?U@G?O?C??D!8?BGSKAHC#96G#191!6?O#137???ACA@C@?@A!6?GI?_??GOG#35@!6?@???CG?O#91??_@???A@???AC!5?H?C???G#52?@@B!4?AEGO!9?A@#48C??A#121!5?@?@#95O#85??CGOKKSC#98!10?__ooO_WO#75!8?A@#98?_?_???@#72PTKw!6_#102???H#121!4?GO!4?G?G@?T!4?@@!5?C?_#49!5?O#116???POKGEO_TnbAEAJ?pm]titytPMqgSPgS?_`A???O_?_#126@?A@U?o?CcS_?c??GO#114??G?gg?Hc`Q??GOGcQ?CWC_!4?O#100??Og_#107!4?_#115o#114o#100???G???O!5?O?GGCAK{uKmKGC$#244_CH??G?A?_?D??QHA@A#192!5?C!9?A!5?c???A!8?O?O!5?@@@?_`?`?_pp`o___o_OgGgGo?oG_g???G??CA??@?@#237???C???A#184!16?OGCGO?W?[?[_W_?_!4?C??G???C!6?_!20?_?_???_?_?I?C_G??CG?aCQ_!5?_!4?@_?@CA?B_BGB_B?@?GP_C?U@W_[?KaGOg?s?Og!4?O??G!5?@G@#0!17?A???@#10@#34@!4?@!4?@?@#104?G?O#58@?BWX?AWC?cC_@@AE!5?PAGS?O?C???G??G??_#69_#98_?_O??G???O#47G??CCIAAA#93OSCSiiumqBbr_`d_`???__OO???G?__WW!7?_O?O??_#99O#120C_#40A!4?G#119@?@?C??@?CAg?COGC_Q?Gg#49G_??G#116G#127!7?A!4?O@#129!4?G?__!4?Wkw`SwC#125!5?C???@CBGC_KDYPShSBIcScS_O#73!10?C!6?@#119!11?A#101!7?CG@P_EM??GoCB?BAECGSQ|vJf|mR{NeqaRpo@@@?@@B@$#218?P???C!4?C??a#239???C?A@A#202??_!5?_D!5?CC#191A!6?A#193?!5C???GMGG??AA#239CECCEAMIIIGI?A??C??A?BCABFBFDD@D??G?K?GC?G??GBCG#192!16?C?O!5?_#208!6?A!9?@#105!44?cH!49?@??@??AK_g?@U_?YgGhWdGsn\hz|izur}tr^~n~OOOY[iy_K_??k?SccowG_#17G#37@?ECCA]W_oG?PA?c??AC@IO???Gg?o??O??O?_#140@??C???GA?CD#88__?!5_?O?O_?__SO???OGG^]Y^]^~^QMNCK?G#47@!7?KAD?CA@#101!7?A#102@#59CM?G?G?GGOE??__??_#132???@!9?C?Co?`DHs?ID@?_#38!6?o!7?O#149?G#38!18?_#132???_?A_?@A?GKa_NCi?G?CGA#115?_??C?P?O??_QG?GGc_?@KCQCaO__#108C#72?@??GOO?_!11?sG?Og?OGCC_AG_??@#93???_$#240???_??aG?H??G???COCHA@C???G??O?_?O#217__?_O_O?S__s?C#173@#233A??!4A#201@@#198AA?A!5?_?_!4?@?@!5?O?O?W?!4Oo?oO?@#246_#137!11?_??C?A??C???C???AC!4?@?@!15?G!4?@??_?ACA?AC???A??AC?A#35!81?@#4A#2A#137O??@#96!25?A?@#208???S?C#3??!4A???C#4C#246_#2?O#63@?BC?`CJC?AT??@?C?E!4?S_O_#35?OO#55K@Q?C??S???G!6?@?A???@#253!30?@#48?O#41_?W_!7?_??o?Oo[#77!5?OWOOOWo__oC#81!5?K?_ROL_A#128!5?Q!4?M?O???@_?_DClTgaA@@GDAg!6?B!4?DI@IaPKRgeRHRYCcHAGGSW?O#119!14?@!4?A#103G??`?HCL?eOG@W@qHaWGOAoCG__?A@C@CCWG?x`B!8?@?@@@#99?GC??GOOoo#95O$#193!24?@?O?@?G?C#242CC?C#21@#216@@#178@!8?@#209A!5?A!7?@??@?@#244!4?A?IG?G#196?!4CG?CCGC!5?VgSc?uTg^vVBfcRdpzs`!4@?@?@Pdgr`o`pe`a_Ba@BEBbC@Vbb`baASaGqbSJAlbCrkbqjcpibsav_}iW}g^vLZVlZmZVZkPtiZdYu@qLPgHCZkZd]@^_^_]?^_Y`[gSGs?[GtkRcIDY`GudNaza\qmU~J}lV|oO??k?BodVvUaQaHO_S??S?GG?GG_?O?dccc?S??_O{{O{gWGG?OOO_#86C#90_#51???_!4?G#196???W!5?O#24?g#144@?@?@??G!6?G#116???O#93_?!4_o?O#75G#56@?@#42!34?CC?AaOc?OOg?G?KCEDB#115!6?B?C!4?A?@gI?`D?QI#125!4?_??f]~H?urNP[ioBLsOy^IgOgP?@A?@A@#121!34?@?BPGHoJSzRjYvPy]Shx__A@A!5?@@#77!11?CIa?@OC???A?BCDHAEGcA???A@CA!6?@$#90!24?A#0A@FAA#82A#137A#153AA!4?_C?c!4?C?A??A!4?O!7?OP?O?O@!4?@??@#191??O!10?GO!5?@#198!31?C#191?C!7?CG?G?CG?GC??C?G??CO#237!97?A#39@#56@#109?_#192O#104C#192!25?@#104!5?A#1A?AA!5?C!7?_#23???C#152A#38?O??Ga!6?@?A!4?C??C?I???OO_#148???A@B#80O?OGG??S?GI?OCCCEaA!6?_!7?_?_?O?I?Gc?@GCCCg?___?OOG?GHI#69!8?EAA?AFG??UCISAQg@C#140!9?c#52!22?O!5?C??C#73!29?A??C#118!12?BEA^CsCT]U?Q?OOBFcA?G_#98!7?A$#104!25?@A#196_GG?O#244O_O?O???G??OO?oOo?_#243@#242!4G#194??@@@#196G??G#241!11?C?CC#96!12?A#183A?A#237G#239!162?_#14!36?@@#86??@#20@!6?@@EA?W_!5?@A??K???@G???C!6?G!5?_#81D??@#114???O??G#42??O???KC?IC#253!41?O#121!15?@@#54?@$#105!26?C???C#233?@#209@#171@???A?A#201AA#194A?A?A#202??G#195?@#226C!6?C??C#191_?O?O?O#208!23?C#105G#109!201?A#0!6?O??_#193???_#34!8?_#55O_#244???O!7?_#17_!6?_#74O#50@!5?AIC@AC?FBA#59C#38A@#40?A#84O??___#118!58?A$#204!28?O@@#138!4?A#215_!5?_!6?O?O#186?@@#207@#218??C#244??O_g#241!30?A#16!209?A?C#0!19?g#96_??_#51!6?A?@#14_#64_#83?_#128C@I??A?@#129??G#87??O???G_?O?OO?GWgGGGI$#4!28?C#10C#173!5?@#176@!4?@@?@?@#216???@#150???CC#240??O#241??C#217O#9!242?A#70ABA!9?@!8?@GAG???G!9?__#53!15?C#58??@$#252!35?C#76A#181A#239?G??GG#183G?G_#184!6?O#14!272?G#246_??_??O#49!10?I@??@C?@C??H$#204!43?CC#212@?@#193!279?O#104O???_$#162!43?@#96?G#64!283?O#2O$#74!329?@$#239!329?_-#237i?Q@dOBg@S?I_DOA_S?gCAh?PI_U?GD@cJOaGO_?OGcGeOi?QAcOcHvGaKADOgOgSDYDgDGODgDwCX?W?W?O?S@?O?G?GOg#105??_GO?_G?C_HQ@_HQ!5?@?@?@#183!5?A#105!17?GO_?GOc?GO_CGO@g?S?g?O?g?GOCg?G??A?A@A?A@?@?@A@!7?@!10?G???G?O_?O?g?O#239!17?A?A???A?A?A?A?A!5?@#208!10?CO?cG?C#184???_#192???O#193??A??@?@O#184!8?@!7?G??C??OO#17G#96BA_#16A#23@#97A#208K?O!6?C???C#244_OG#150C?A#98O_G?_#95?g#85?CCWCA???A@?O!4?O#48!6?_?OG?A!5?g?CoSISkySK?]Kc_cs{SK{CwKWSkGCCWdXCqGSG?OG_G#133A#59CABAIQ!4O_#125???B?@GMXK@???@?GANwP[Oz^Ko#129??O?CU_?G??YdNpO??__??_!4?o?O??dW?A#125@?@?@?DKHKuvaahOE_#112??A@?gC??A#103_??_@@_d?LacI?oC@EWJIa?H?AB@CAAOH{LxzS#251GC#99!13?C??ACerQaYA$#246TjcYIdSQihTSIidSJhTPhSUjePGgSqIYPcHP_GO__OWOGg@Gk[GkWS?t[o_YiDAD?gCo?O_?o?O!4?_?_?_!6?_#198!12?A#137!5?A#192??O???G#191?A?A#137!27?C?@???@#208???C!7?A#191!10?@?@???@!4?A#239!4?O??O!8?O#198!5?O#191_!5?G#246!26?A#193!7?@#105??CGOgCgRkAcHQcIPcB@IR@JBtJbJQnoNqLpjDUaUiBAJ_O}DYeg?dcf`Rog[W!4_!4?oWK@{GiW{?KO!4?o#64?G#97S???@#61C#80CO#93S}V~zwC?C@?A!4?OC__APGOAG@C?@A?@DL!4B@@#53??O_?C__S?oOWOG?__!8?o!4?A?B??BA??CW#40?CGO!4?_#119C??G!5?_?A?w?gs#116!7?C??OG@__P`??@a^AC??AJURZAT^@zEZEBcBSZAFPOEZc???GO#73C???GW?C?GC#119???@?_??C?C#107!4?C!7?@?o??_??_!8?GC#112?_#59??@#98?O_cA?DAA@Ac@?@AdCg?GGLH@C$#244?S@cOAg?S?I_DOAh#252C?A??@#196!4?A#239?A#218?_?A#193?AC??C?M??D?D?F!8?@?O_??C?@?_?C??@?P?@@?`@_?_G?_GODA@eBAFBsLoKrKrKpNqLuHuHg?OC_ACQlOI?_?OG_S?gOG_Q?_CP?c@Gb@BB@B?B@@ED@DHE!5?_?G!8?hQHaHOdAHOIcTAsAL_DYDGdGeHcBSA?yDqChCydYCZsIlA[BkBsGaXCQKpCi@k?S?O_#191!13?_A!7?O#137!10?c#208!13?O_?P?CG@!4?A??C#104??@#96?A#193?A!9?O??C?A?@???Q!6?AGD!4?A#63A#56@#88G!5?BbZHEb??OXgghZKDKBC@C#99?@!5?I?S?G?COI?D?A#40???_#93??@??A??A!5?A#80!5?O#101!9?C#77A?HOOc__#118?A?A?A#39??G#54?O#73AO?PIDZD?}e@ODGaAC#128?BA??AA#149GGO_O?_?O#128!4?C#52!4?C??_WC?c??G?A?O!4?G#127???@!4?A#126G?EYG?O#118?@RY}WLiN]CIOGO_?@@ECA!5?D??C#77@??_?`?_!4?GAA?G???G#95!9?A???C?SCG$#218??G??G?C?A_@O?G#202??A?CA!4?C!6?GOcGO_GS@_??O!5?O#196??A?A??@?C!5?@?P?@_?C???CG??CG?cHCDGpCXsLOkIQDaKPCpIOC_GS?cFXdZD{Xk?ET|^|lS^j^VnV^l~^zm~Z}v[uk[ysmW}ugYyqawT{h{T[luV}tmxU|uUcsKskG{SkcYGsGw_FW`AdYaPSIwbKzDWCrCR?A_@C@_AO@c?wASHcYc`KqC{@}HfK@\a\zcXti\sWktYtlCyUkR|HukJtMZwmtGQswIs[SlON_LqKCIGK_@oss^n@wdWPzYYW[kDS__WW??_ogWK_oo@cCa??a?_C?_G?A#59_#69O#99O?_?O_?@#87!5?_owWow__#80??OCRGACJKAEABA@@#41!8?A?@??@?@?G@@?EA?AA@@A@BA@QBBBAA#115!13?@!4?@#121?@@DDCKO^MO?__OAcOG?Ok?Ae#127?g?__#140D}^LKO_??@?D_??C?HgC@i?ACxC`GRG_??_KcGcWG[so__#121!4?@O?`O`vtm}UGD@@A#102!7?B?SW?_?oIW_?oWWoww[}JG[EABAA??@#100_???BA_?A?BEEe`A@TxP!4?@$#240!7?@!8?O?g?Og?SG_T@hDOc#192!4?!4@??@_@?O_!5?_G??AC!4?O?O!4?OC!4?_?C!10?G!8?A#184!14?CA_A?_?OG_A?A?`??_??_#239!26?A?AA?A!6?A#192!8?A??_A@??G@?O???_!7?G`C??G?A!4?_???O?_?O??@C?_@?A?O?Q?a?@??P_?P_?P!5?@?A?@#137!30?O_?G?CG!7?AC#0!6?A@!4?G@GC!5?A??@!7?G#17@#87???_#41_???_AB#84!9?CLDKEDFA#98??__o_opwW{KCmS?qg[CCI?@A?@?@?@B?AA!6?A@A?@?@C??@GA?GO?_W?o?O#103??GCG#69@@A@E?GGOO_!6?_#126??A#132A@@O_??@@#55!7?_A#38@JSC_??IoGc_??[?_W!5?G?G_??_G_#132???!6A@GPCCbW@??G#115!4?_???P??aOH?cO@?SGA??@CCD?ACA?_!7?O#134!4?G#93!17?A??_?_o$#193!19?A#252!16?CC?G!7?O?_#184!11?Og?G??G?G??G?gCW?O?W?O?O?O_!5?_?O@??@?A#239!11?a??O!4?_!4?A#184!34?A??A@?@?@A@?@A@?G?O??O???O?_??CAGaCGQ?CGa@C!4?a@??GDODI?AD?DAGBCHaOA@GQ?H@A?@?W_]_K?CGEGC_JcRG???P!5?A?@O?_#237!42?@??C???O#33C#24@#239C!5?A???@!5?A???@@#149G#72_?W??G#94!12?A?A#120!13?_O?G#80!20?!5@#120!4?__??oGoc?_WC_G!5?_#102!4?@O?__#81??A?BBC??C???C#130!22?CG#52??W#128!19?B!4?@??Av_@?@OoG?C#114!14?_O?o@WcAQGAGA_PGHC_BO??D??C???C??O$#242!36?A??A?C!4?C#239?@?B@A!4?@G?@A@Aa??A?_EGA?A??_?CFBFFJAaIaCQ#246!23?G!46?@#192?@#246!35?O??O#137!56?A#246!54?AA#4A#63@??C#2??A?A#244@#104???@?A??A!5?@#218???C#14C#42G?A#40@#72!30?_O_o??_oOogCg_IO?IQ?_?G?G??GO?wCOCg???G??C`@CbVclFZ@dq__#114?CKKKGgOo__?___#127@#140A#142!25?A???@#55!19?CO#119!54?A#59@#101???Op?_???CCaS@JBkOWD\[XWwXWWWw$#198!37?A!4?A#244!6?@?A@#183!12?A??A#241A?A?A?!5A#86!235?@#51@#58AA#37D#74A#38??@#56@#137!5?OC?kOk!5?C#47!4?O#103C#77??C#49!100?@?C#72!113?@!6?_?SOPk_O__c??_$#233!38?A#209??A?A?A#109!271?CG#217!13?@#1?@??O#96A??Q?AAA??@$#153!41?@#20!276?@A#240!15?@#237A!7?G#65?G$#9!318?C#16!17?@!5?_#70???@$#184!336?W?gC$#35!337?@@@!5?@$#246!337?_?O$#110!337?AS$#192!337?G-#246TiCqHTI`[AiTDaYHdSIlHbUKXreCtiITtIiTSidSYiEOzLdYYuAn|iBhtcWOHqoTC_nOpg?b?D_U?AD?dGuGO??C?P?O?O!4?_??_??_#184??_!4?cGO??O?Sh?O?O?A_?A??A?C@!9?A???_#192!17?O?_???_!16?a?O??A?C???AOC_???OA??GA?Ga?C???A??A?OA?S?@???C?G?I???I??G??AC?_C?_#105@?_GA?QDG@aChQg??@gC?OfGAhQkuPV_Y`QTaSgEhV?TgDQ_RcJOiDQkOcZ`WaOdCWCC`SGoGON_AGDB#83O#93O???@?G?@?@C?GKMF~[w??oOgC]MIM@@???_#80?O#53?O?G?C??C!8?@@@GGG@IEHNLNAASC??A_QICCCAB!6?_#77!10?_`RrECCgc^_[CKWo#115AO#118G#121[YH?@N???@#49??AO#38_??GS?SKE?qqGGR_G??Fm_qNqO?CgTG@gI?Q_?C#128?@A?`VGtBC@#126O??W@CCO_#114??G?oOGH?CPcQHQ_Y??A?_?_?G?_!5?BOA??g#108H_#100A?CBCC?gO!5?o__c{KCDA#93_Wg~jv$#237iCqHSi`[AgT?aW@C?I`?ASG@aCGPI?T_I?T?I@OI`CPhC?Q?d?`OATgUGRcHqLAgQLOICQlOeOJ_\_GaGR?dItIP_CG_@?_C!17?O!6?O#105!28?@C?Od?AGP?i?OACG?@C??@!4?@#237!18?P??@??@C?@??H#246!34?_HO_?_C!4?G#191!6?A?O???_CO???C#208?D?CG#191!7?@?G#208!6?@#137@#191!9?G#137!11?A!7?O!7?@C@#244_?G??@#99O_wooOAGAX#87A!4?@?@@A??@@@?@#40!9?_O_OoG_GO?WOKOcc{{uQVA[tWuoa?hg?O_?C#101?G!7?O?O!6?_!4?_?GO_COgO?W_O?_O_#69@@@F#81@_C#125_oO_PKUBNKeE@#129_O!6?@@CA?O?@GGPKCOKciJSatIEtL?@`_?G#125?AA_FI{bmJ??BC?A#118A?GGOoJNFufbKA??_#102A?GGKWVbE`rZFzf??EkGhA!4?@#98!8?G??_!6?OGQPBB#85??OG$#218?@!6?@??G?C?Q???O#202!13?T?i@SI@COGE?Q?c??O#184!6?G??C?C?_Q??ACOCOa?H_G_?Q?@?DIPA??C?A?C_#239!17?A?@#184!54?O?O?OCO@c?H_AG_S?iCP?H?I?O_?@i??@??IOD??H_?_!4?P?aG_GO_H!5?GcQ@_A?_DOeG@SI`QsHo@Q@GQKPG@CGDO??@?A_!6?_??OgA!5?C?G!5?_??_??g!4?_??_G??GC???G!7?_?O#110_#96O#97??O?G#88_#72_!5?@??S?O?C#88!5?B?oK@F???@#72_??_OO?G_o?KACJBBB?JFE@BBHAA?@?@A?@!6?__TupR_Pqxo{W~n{_xUGicx?u@raNjFEKGg?GO??G_W#102?CGOG#73???oVM?H?B#142!9?_o?Oo?KKookNvMoO#149?OG_?G???GAS??_#73!13?GO?SE??A#112@?@C_C#115G!5?Ga?HcGK@dq@??GGG!5?GKG?ACWc#134???O?OG_!14?_#95o?G?CP?C$#244?O@C??C??D?AG@C_!20?_#192!4?@!7?@!4?S?A?@a!4?H??C?@?G?G???O?G!4?_??g??_!23?@?A!6?_??G??G??G???_?_?O???G??C#239!47?C??C!4?OC_!35?C??CH??@#237G_#137!23?C??G#193!7?@Cg#208!29?@!5?O_K??G#239_???_#0_#150G#64_C?@#41GC???C!5?@?_O?_!4?_?O!4?GAK?`#120!4?GA#102O_?_O#59O_O?g?g?Q!5?_!6?OO??!4G#120!4?AA@!4?@!6?C?G!4?O#53G???O_!6?_#119???AoaDA#132G??E#140g?_g?OH?KMCAFB??K??AC!7?A???ATO@??_P?QLAKPquL|[Go#132??O?cI`?AG#119!5?_DC!4?O#77!20?OOo!5?@?QG!8?A?G?AG?A#99!4?gCS_$#240??G?a?OA_O?_O?_?Y`SAsG`qCGPi?T_I?_!5?_??_??_#252G@?GC#239!7?AC#193??H!4?`!4?@!5?A??CG!5?A?A@SIO@iTYTiTYtITyTiTiTI?k?S?xACaHO?s@Qc?DQ_DOIO?Y??i?OAdGPaGOI?OAG`CO@c?HOaOc?HQCxASHOiCPGaTGaSHqCzCPCjC?GO_IOG_??I?CaCHsBs@s@CX_RKpKPkPcHcGbGeWdQHoFO_@O???OA_???A???HQCOa?O?_?_!5?C!45?@??Xa?G!7?AWAQ?A#203CA#35A#42A?@A#85?C!9?ACIC@I?I#99?O?OeGQc?P#103!4?_#77?G?SK?KC???CG???GC?C!8?@!5?KCCG?G?C#98??@CA?QPACP?S?GO#103!5?@?@CA?C?A???_#128!7?_O?OGSO`?HA?@#56??__!9?_?_#121!31?_Wcwpwl]rVBA!4?O#101!22?_!4?@A?AKcj?OPxU@np~v^|F^\ZBBB#131?_G?E$#193!50?G#196!12?A!4?G?A???S?AD?D?_?Q??C?TgPKg`HITiDiTIdITiDITiTiPdAuHnEhAXeNnJsLZtylTyjsN~D~nT~ntWvi\UjtnI|tUinSZnsjTnYjuLiElJeiDyIvSItTJaLP?iKqCpm`NIoDeXmiPTaWjsA[B[JuXeIkPEPeBKQeXvGvOBGkQLoNOI?fOaDOKBSJsLyvC_iDShfgIVYKzSLRzyyRrVnWfTSlQGa?ZdUli[iVXUg^iVQlVkZSnTYdRnR_[e[bYaDjBQjVFFN_[@C???@#98G_!4?I_?Q`AooP!8?O?__O?OC@JIAUHE@@?@#114???_?_??O?O!4?_#48!9?CCBBA@??@_@?@?_??AIC?@CP?AHaGT#114!7?B?@??@A?@BEKc#116!8?A!7?O@?H???@???@@!4?B??@@?@??_!7?_[AGD?_#127!9?@#107!12?_O!5?CO!6?CGS???c???F#59B#72!5?@!4?Sb_GAhU?C$#239!72?G!5?OO!6?_?GA?A?CAO#246!19?G_!4?C!75?O??O#104!118?C#237!16?S#246@#37G#48O??AC?@!4?_#80!7?sI?C#48!4?_??o??CK`EHE?DA!8?A#114!17?OG#99!17?hC?GAG??C??S#59!6?A?@??@?A#55!12?C???_!4?OA#149??G@?A#103!55?_?G??X_ADPcQDob??PUC?WCW_?@OdOc?Es@??GCA$#90!338?A#101_?gK?C?A__G!35?B#69?_#99@#250_!7?_O_?_??O_#40!39?A??A?@#52!14?_!5?O_?_?G?A?@!8?C!6?@??A!8?OAG?O#118!54?OO$#70!339?C#75C#16@#77OA#100??G?C#130!130?G#136O!7?O#119!78?G$#123!340?O#95!6?G??C?B?g!8?_??C#144!113?_$#80!347?@-#237CP?GTOI?dGaPk?Yd?aOGD?cOGDA?TgAOHCQ`CGPaCGPa?TGaT?IOdIt?tI`IsJcHoHqDGTI`M`EhBoDO@qHqHShUgU_S`OG_???O???_?O?@??@?A_GA_?@_!4?A??AO???Q?CO#239@?O@C#105!13?@??@??cH#192!22?CO?G@O?G_?@?A??_?G?O?_@???@C??D?G???C@???_???@CQG?_?G_D?a???G!4?_C???OAc??S_?G?GO?g#191!11?C??_!4?O!14?O???C?A???C??C!8?A#239!4?O_A?@@#56A#101CSO?O?G??aF@O!4?_!8?_G??a?_O?_G#53@OIGc_#250CIcX#54?eD[SSWCCoQ?@O@?_?_O?O#250A?G#72?@@^^^m^FJFB??CJCBEKE?DBC??BOA@OB@@@!4AD?DA#59???@?CO#121@A??O#52@EG@??A@#144??sO@??@???A#136@#149??O???WOk?D!4?`O?C?A#125!5?_GOkzg\QANEa#126O#112?I?D??A#115O???@?C@?QGG@C?HGI@_x?OC??B@@Eg__kA?@#72_OGCScIP?G???A#95?_?c[QmSoe#131mSyojSq$#246jCPaGDPI?TGAPc?ITGdQgQHdQg\iATxEqhKYreKXreC\iaTKivtnYOInIo]T@sYUDeGiQi_UO?oCWEgEgC?C!4?@!14?O?_?O#184!4?cHQcAhS@???A???_GQ?AGQG?O??A??A_C@gAOC?O!5?G?O??OC@O?@??AOA?OH_AG_AG_A?@A??C??AO?O?G?CA?C??CGOA!4?_?_?AD_??GaSICXc???@?C@A???OHqD@qKbKROhQc@?OIPAH?_@_???O?o?ShCQGcO@aG!7?c?gA_Ga?Ga?GA?C?`??_?O?_?_??Oc?O?gSg_Tc#96??GC#244WCA#102?G?@C!4?_#48???CICC?GOCO???k?C?O?G??C?O__?O#69!6?AE?A???CWGC@BQB?@???__?OO#114??C#77y!8?K]SGOGWO?O@G??ACG_@CG?O?GG??H?H?lQJUI___#69A??_#140@AGO??@#74!4?GGiaEqi]G#130!5?G?C@A#140O_w@M\??@Qw?PsHQPUU?j#132??A?gS?XC_!4?@#114???_o??B?EGCcbQOG?@CoAA?_OG???E?C?O??P#98??_ow!5?ACG??`A?A@#93gO_GO@aDJSjL~$#244O?aD?A_COA?C??@#202!34?G#192???d?O?@?_I?@_?O@?C?@?_C@!6?@_?O_!5?AG???A??A??A??A!14?Q?C?G?D!8?A??g??G!9?@_?G?O!9?AG_C??_C#246!20?C?_?P??@?A!4?GO_?O!5?O??O!7?O!11?CGQc@?O???AG#105!8?@??DAGADICI!4?@A?_HOAlZulJcHQDGTaHQcHQdGdAgQGdOcHQG`IPCHQdG@S??C???_CGC#41_?K#75A@#72_?@?@??Og}h_G?cC___OoO?wOsitPAH__?O[k_S#62!5?cgHwb`___qIG??GAIHJHIHg_#102!6?__??wowo!4_???_?_OO_O!4?_!4?_?W??O_!4?__CO#119@?KGO_#54_#38@FMPaOAr@@!9?__wg_{zelBN?[@?`C?@BG?@C@#55???@#73???CACg?_PA#118??WWGkwk]HRoswo@`R?GH?Ooo!9?A!6?KMI#134!4?GO`A#100?@HE[{]\n@?@#134@$#240?aGO_gC_I_Dg?YcOiTIdQlQGdQ?TgAChCQ`CGPaCGPi?TGaP#184!9?C!6?G?CO@?SG@AGA_@O@O?QGAHUgUg?_?@C?_???O#246!21?_??_???_C_??_??C#239!56?O@!4?_?G_?Ga?_??G_?gO_G_?g?_???O!14?_???G???G_#198!11?A#193!17?O!6?_#208!34?@??G?@gC#0??A#193G?@#121@A#95I?K@?C#53!5?Oow#114!15?_O!4?A!7?@?@#148???G!9?_#49??OO#48!12?@!9?@#114_#108_#98??A!4?@??OA@#100GA#108!4?O#114!9?PIIOoo#49?C#128?O?O_?@#63!4?EO#37GO#152?@?C#129!11?OAA?A?OEK?RGG#121!13?o?GL~tfaaB@B???KG#102??C!4?_aE??CC?MFbSlggwGBMM@@?OC?@#99!13?OWaC?JFHOH?C$#218?GC!4?P??O?A@!9?A??_#193!37?A???_!4?O?O?GAgCG!7?@???A?T?GD?GD?GD?GCA?K?PC@ODOGC@G@O`?OG_DQH?G@?gA@CQ_DQGaTGaPCGTAoAgAsAOChQCgPCR?xEHObSI`SAgDQG`I`U_IdAPI?gO@GAP?aDGASGD?G?@G??@C?H???@ISJcYcGDOEHQDOIOG!5?QG???O@???GPi@?S?_?_#137!57?@#104!8?`#37O#40go#88O#93GCo?O?G!8?@@?@@?@C?@!6?C?@#59C!4?@!4?A?O!4?@?A?@!6?A??@?BGIoA!5?O_#101?C??@I@CQCHQHKacJlysNKWESK]EDDLCIEIOd?G#115??@?K#132@#125@BAK??_#56I[_wKW?_?@@!5?EPCC?A#116!6?_o?MG_??c_AQCMH?A?@#119!13?SOC?@EKA???_#107??C!12?BA???o#59O#77@!4?_$#202!4?A#239!68?G#196??C???A?C@C??@??UHSgpIGDqGdAwDqGtAxNqVGQcHWAaQktQlSViTFGhSddQlExEwhVwLr[AtLizeI|E|FsJlJqEhyFkqKzChSjKaT[b\TqLtYc[`]`YtKdiELqeXGuPGvP?fOlUrKVQLUpGURkVG`@_A@IrGexQkoNonDQCgQC`CpCJCcZm|BcCgUiT]QLvTitJtjUzluXnYCf\QcHQCZQlQtITSlRSlQtIxVKrYLZelR]TizeHYf}AiTRiYVJRp?A#35C#134?_#98_?A?G?_P!4?CB@WOJYKIAIBCJ@?I?K?A#41A@#40???CaXXrsW??O??AAB@@??KK?KCC?ECECDdF|yC_#53!9?@A!4?@#73!33?AKG?__#142?C?KC?eA@!5?`r|WMBBV@#52!8?_OA!4?C??G???_#103!21?_??BGQG?OcAT_E@IXCpGG_OSC?@?O?Q?_?BB??A?CG__$#239!84?_A!4?H?ACA?TqGdAwDAGDAgCo?g!5?C?G?AG??G#237!71?C??C!8?A??A??A??A??A?S!7?_!10?@!5?A#42!85?O#99!4?@?A?PGGO?A@??AAC?A`G`OA?AD?C?A@?A@#39!15?G!4?_o??OoO_??O#103!18?O?_???_O?GO!4?_?!4_Oo__o_Oo?Gs@SI?C_#81?C??O#145!11?CSgKS#55!20?G#128_!4?!4_HSCQCP_@@#101!38?O!4?@!4?WKEB`JOc^Sqpb@$#103!339?G?c#85_#41!8?A!5?CC#77!8?O!4?E?B@?AA#250!14?C#92?__#119!168?o?C$#100!340?a?UAED!21?@#102?GKG!6?CG@#53!15?C???C$#133!370?O-#237\_SI`@CBOM`SIh?SgCOi?SigTAhSBgSBG?T_AH_SAH_SA@gCQ?OK`ITiChS`UgEpCO_HOcGqHqCiSGO@aHqGSGOGPgOaOIO?OiO?A_GO_?HO??AG#192COA_!4?Ag??Q!4?CO?@_??@O?C@?AO?AO!8?Q?H!7?G???_@C?_?@??C?H?C?a??Oa??S!4?Q?gAO?COG_AGC@G?AGCOC?_C??GCQ_CG??@?AO?A???OA?c?A?@?C??_C?g@cHAGACGAO?AO?AG#191?Q?G?A?_?G??O?A!8?A??C!6?_?A!8?C!7?CO?A#137_@#34_#37O#59_O#101_@S???s?iSgQcH?R???QCHCOCGOCOaHOAOICA@G#103O!6?O#69???C!5?AAE?AC?C?E???A@#103!4?@???S?CA??iAHCAaC?E?kQUAqA`g?GgcGcOCKQcOCCGCHC??d@T_C#69C?ECWO__#55@?C?CGG?G?G?G?G??A_#125!7?oo!5?_!6?Bl}WUWNK__H#112??_?OA|QC#115gC?_dGQHS`cO?A@AQROKED_?_?@BS!5?A#121KKA#134??hCIC@Fg?gAw?CI@CA#95?@?D?@!6?@C$#246a\_SAY@c@OI`SAh?QgCOi?SAgTAhSBgSriITkQJhsUJhsURhluaq]t_TZQjMhTPMIlJuDZQDUCx?AcGuGS@e@aC?CADGD?@A?@?`?@A@#105!56?C@A?D??D#246!24?_?S_?C!6?A!4?O!6?a???_S!5?_@G#105!43?c?@GOAC_@iCPcOAcHQDgD?IO?hQcHOAChCgQcHQdGQHOdQcGOg@ECSJ?C#53_#48G#72GA!6?S?jSDBA@?I?DLHABFGFDAF@A?cecrW[EAA?C?A?@#139???A#62???K@L?G?CG??C??C#102oOK???_A?A@?___C??O_pgSoooqQgggKC]UG_OOsOGO?GYjg_?G?OG??GIYqg?_#121@#81B?K?O?_#52?G!9?OAS?GO_??S?C??d??A??@G#55C#127!6?@#132___R[?A#143???CG#119??_yS#114OhCQ@K_JSGF?CA???aO?AL!4?K!4?wbD??C#99!4?@!4?KC[?woOyPh]cWa[YcYLidugQ$#218?A@?C?OG!6?A!6?@#240!15?_C#244!6?G#252???HC#184!11?G?@?O?G?c??HACGO??@aGOGOGOgO_OaOG??OA?C?Og?C_G!5?@??H?c???C@?GCQ`?A?G?C?GC?_O?G!6?T??S?H!4?C_?G_!4?SG??O?SGOaO!6?PG@?G@?Ag?H!4?CHa@?C?`?_?cO_@?@G@QHA@???@AOAs?G?G?OcI?G??P?_G_O?Q?@??C??O`O?`?Ch?Cg@_D??@_OGD?Ac!4?GcQ?gQ?O_O@O?G@Oa@???O?Ga?Ga??`?GA??@A?G?C#193O?@#56C#102AK_#77!9?gWs]kSLY__ooGoo_wg[SnXHP!4?H?D_#250??C_CEKGeWep_O__O?OOO?G!5?OE??G#77_?OaA?@bJD@CA@@BA@@?@@@?@?@?TC@?A?AQ`??AHU_u_V`Ys_#115??A@?G?_#132@#140@AC?GOOOoOO_OO??oGOCg?NohLQEDGVAXIIcr`Xd[O???@#73??_AT#126_DQ???D#107??@!9?G??G??C@#77??@??A??IcO_?_IBOG#125o#73A@#131!5?@!9?_??O?IcW`CP_Q?G$#240??A`G_IOe@SI`S?h?A@??A@#192!27?G???I?_C?O?A_?O???_??G_??O@?@!8?@!7?_C??G#239!97?O?G!6?_!4?G??G!9?CO?C#192!75?C#208!22?@#0?GA#96G#64A#77_#99@!5?A?@?@#103???_?_O_!4?_#48B?A!8?G@??C?A#54!15?@@A?A?A??A??@A#101!21?@??@??O@G??VA@?B@a``?@CPQ`R?A_U#119!7?@ACKOO__#128G???_???O??__?__???o??q_HG??w__TO??_ABkQ@eGFO#121?@ISyl^zfwAL#118?BjEQGc?A?A@#102?oW{hgKCaOo?WIP??A#72@@O!5?OGdQ@CG?G#103???@#93!5?_?`OB?A?ID?DAHUh$#244??G?OC_?G_!4?SA#202C@_C@_?T??OA?O@?CP_IPCOAH_SAH_CQ???@#239!12?_#193AC?A?@!6?AcGO?C??@aC?CA?G@C?@?CAOC@CIOC?aHO_Ag?\AgQGODQcG`YdQG`MOCIOcI`Y_[`CH_CH_IT_IPcHc?cHOI_GQ?cOJSAwBSIOmOJOe?OHOKrCGTgBGTi?L_@CH_@AD?P?w?EODOA@?TA@OhAh?GAPAs?wChCpKRcHcGRGdWcRGqCZ?RCIO?cO_P?_@Cg?D_@aCQ?GCa?hOI!4?aG???_??O?cG!5?_???A!6?G?C#237!11?_O#218C#80O#93C#103OOG#53!13?@A??QCG???G???_!5?CA@?D?BB?@?A@?@#39!8?@@@B?@?@@@#115!29?C?_!5?G???G#59!9?@!5?D?O_#73???BAK?O#142@@???A?AC@B!7?@#103!41?OH?Q`S_?QgF`?O?_G?`?OaP_A???W?C?O#98??_OICyoq??Fa?_???C?A!6?_??_OO$#252!16?@OI@SG??AgC?gCAg?C#193!16?@#239!24?@?@A!7?@a!5?_?K?C?CGOC?CA?C?_#237!89?_?AG_?G?A??_?_?_?G??GA!4?@!4?A#246!97?A#204G#239A#244@#130@#98?G?@??@A??A#40!6?_#99!9?@#102!8?_!7?O_?__#49!14?@?@#72!39?A???@#49!25?A?G??_#74??@#50_??_#116?O!4?P?O?K??H?AQgDCT?ICYEW_#59!36?C?@!4?D!5?C?@?C?@#100!8?wOOPR?EEJ@CGC$#196!76?_???C??@aC??A@GD?CaPi?hO`I_APhQb\UlVxE|AsVHvlQhYdU`GKrKpeZpnQ`]@MbSju\ju^_i^`mQcZuZqJsTVgvZi_B{BkJ`e@L_nO~juLaCiTaUgTA@U_JUPaSOKoRKSBMPBGFOmOa[_C?sQhEw?k@GFpErKbGPePvGeWFQKbLhCykRoJuHELiU\iQTjQ[UWhHuU`DWQDOTjmXDPHuDGViLdIbUdYeLWZUxDlRSlQTdqIYdXvnUwhrgOC@#100!4?Ab}~~GhS#59!28?_??_?G?C!6?WcWA]_[OGW?KGG?O??COGHOG_?OI@@@CG_O?Q??G???G#100!11?A#125!29?K?Oo?_???_??_#149???@@#119!62?GG!6?G!6?AP#251!8?_$#95!334?C#114!36?__OWOc??C??_!9?C!6?C?C??FOISCWL_?GOWOS?k?GS?GKGC?C???O??_!4?GC??C!7?G?G?A??H@]Wo_#38!4?A?EAEEKCK?KCKFLAGAFM?A#101!61?CCW_@aE_?G???GfO!4?E!5?@@$#40!371?O?G_?WhYIXWRo@B@!5?!5_oOgwGg___dBOF_CGSI#56!55?@A?@@@?A?AA?B#129???C!4?@A#118!65?O!6?_$#121!397?A??AA#63!75?@@@#69!78?G!4?_$#77!398?_#53!161?C-#237aG?BgD?aSGA`LOg?RKAPCAXCAP?i?SjgU@Ga?T?i?PG?AHCq?@QChQdWDA_QDWdAGbC`IPAShS`QcZcI?J_HaPeWaHA@AOeOdO?P?G@?C@?`C??@#192!4?OAG_A?C?H??@CO?@??C??_?O@C?H?O?G??C?_C???S???@CO?@?G???H???G_C?H?O@?O?D_?AT?AO_@?AC?IO?I`?A_??_??S??@GCOD???_?OC?A?`?O_?cG?S`G??AO??S@?_A???G@ACA@Oa?_?G!4?O??O??A???O!4?C?G??C???O?G??G?A??_C?c#191?A??A?G???OA#246?_#96_WC#77_oWC_?b???C?QCGTID@?A@L???B!4?DFKJEUAEkguIEEA@@@Aa_oooOWOO!5?GCC@CI?EDA@`???@@@O?`KL?qJJCOKO?G!4?_#115?@`_O_@_@`??_#114!18?C?C???@@?ACKog#125AGCD?@@?A@?DEGQC\CGpSkS?_DKq_IWCysG?eQLzdcDA#126G?L#118?owoq}zdFLCW#102AAKACcwYpG!5?@@@?AB@!7?@G#107?@#99??_O?@???_~LvJaHA?IPIqlRkdOGMdcuQR$#246TaGSBgTGaTGAoDAgCPkAXcAXcAT?i?SBgUtLiiTTiAt\SqXLuudyUkIby\LlifYhu[Y[tklhAAYCH?P_X_UCWCG@?O_Gc???GAC?C??I!5?_!75?_???G???@A!5?_@!4?OC@Q?A?A?A?_!4?_?O?G??`?O??C!8?S??C#105!23?_GA???@A??IO_@S?i?S?H?A?T_A?AGQ@cG@A?A?Ah?SdGPA_I?C?WK??@#98O!6?A#114!9?OgUP_aosICWd??_!4?G!4?G??OOG?C??GAAAaCB?i?Q_??O!4?O_?KKWSI_YiedBA_O?GoC?gO@_?OG??@!4?@!8?A?A#59!17?A@G@??B?W_GO_#140D@!4?@??@?@AC@??A?@??LJA@HO?BG?B@W#73?G???QqGT#112???GA@K@#115C?O?Q?C__OPA#77?C?EP?A@A?CA!4?a??B?B#100___g_?_O???_#131!4?oGSDQ_T?aDG?kRGdO?G@?c$#244G?T_?OAO@?_S?A?T#202gA?_A?cA?_?S?h?S@gAOD?i?D_A_HCa???G@!5?_#184!5?C??@??A?AO`?`QcI???H_?aOEGA@AO?GcO_@!6?c?Q!4?TI_I!4?O?O??C!4?GCO_O?HAC??_??C?C?D_?P?O@I?@?IO_??GC_ACOC_?c?A@??_C??CGA?W???_GCGS?p?P!6?G?GCHS@?H_S???_AXEGE?bGOGCGAH?@A???C?_G?H_??G?GOc?u?w@oGCGTGV?eP?BGCgCI_W_T???_O@_A@?A@?aGDAD?_A?_?GCO@O??_???_CPcaG?@#237G#0_G#73G?@#102W[C?Sw!4?_?_?_O_?[???C?AG~^IOoo__wwOO?TG@??C__!4?G?`__?Og?KOAG_O?GOG??A!7?G??a`@!4?_EFFfvwEYmUIMEJSMUKG|Ldx{i\z@P@?!4c?CC??@@AFUEe{{_O#81@?C???S?KO#54?_#128???DHA?ITMiPG_O?A?BPCRDGseX_ACO#121??o_~o~FDM@#103??Qg?_B?DQ@iGD`IO?wO??MG?@K!6?QSTW?A??A#134?Ia[@zSH?A#93?_GcXaTGo@Q!9?@$#240?PA?SA_CG_DGAgOA#252?_PK_X?_XKi@SA!6?O!7?_???H!9?O#193!4?O#196!9?GC!4?P?C?A?G@?O_G?@eOBADOCXCiTHIPCj\vAg@SPeXvIdm@nOrluXeRgJDIvcSxjSJ\aZ`ZaYDYeLakPsItc@MrKrAXShaHUXA\_]_^?ZdYr?T_DAtGFO_@aAK@iSa\dWv?Rc?O?sGS?IDqL?K?_?P_GQCb?Rc?uG_\bGrGBSb?UHudQdIBW@IDIDQbPaAgtGiPs_RSiOTDV?jJy@lCZGuSlGm?TgxOvLsZTmpRhmHExHYtm@Z?RHdfQDF?@#72CC???G!9?@#59??GC!5?G?Q??O???O!4?A@?PG@Ca??OOGG???CBDBC@A@!7?O!6?cOWIc[B?Q???OBA?G_??AO#107!5?G?GO??O#115!29?@A?C#49@?AI!4?A?AAAGO?W?O???A_??G#55??C#114!25?G?qH_XG@_?PA!4?A!7?@!5?C#121C!4?@#95!15?O?CG_C?C???A!7?G$#218?C_G??G@?AO???D#193!13?@#240!11?OG#244?A#193!5?G#192???@OC??A?O???@?_A??O?C!6?CA???@??_?C???@!5?G?P#239!84?GA_?AO??O?G??C?G??A!9?_???G?Q@??@!9?O??S??S!5?O#191!23?C???@!7?C?A!5?_?O#198!5?_!5?O#192!16?O#239??O#24?OC#16@#101_??`C@@DJ^LJVACA#115??_!4?OOc??_?_#72??@???@@!9?@@#54??C#250???C?C?A#103_?_?O?_???_??@_T!4?O?O?G?COjC@gOOG?DHCPgSP_Sa@gOcAQWE?Ta?wG_h@@A?C@QC`I?g??O#54???@#121@?A?O???Go_?OO_???_#132__!4?@??o???___!5?Do?AHGDA?A#119!11?C#107_O?K#101!4?C`mDluKOqGe_keTIFO`?ACQOACD!5?C#98!17?OIfpQYHGc$#218!41?C#193!33?G!4?_O?OC???@?OcG??G?Ga?a?C_Q?i?OAGsAsJcHc?TGPiOeGQGaHcQcY`GQHACiOaS_M_T_Y`GQHQcJ_IPmOGbCwE`QLq?eXaT?Z_U_IcGfGQ?\?_G@ACGs?g?@CaOCGdGQhEHA`AT_O@aGoAXAGD?`?OGcHAHQ@aGA?vG`KaHaGQLOdWf?s?oGcGCGT?APCI?DgA@cG_G_C?CGAO?`?AO_PGA?C!7?CG?O?OCA???S?cG!4?A?A#97A#53G#41A@#48A#115A??A#40!14?I@#119_#69_#101!5?GBC?@?@?C#69??_??_?O[G!5?A#72!10?C@C@#101!16?C!12?_!10?A!8?CAAQCQG?Y?_!7?_#119!5?A?CG_!6?_?_#116!6?@!5?OC??CGC!4?A@!4?G#72!31?Go??o?O?GGdG!4?A??CH?D@??W?hC$#239!80?C!7?C?CO?G@???Ga?aO?_OCG???G#237!80?cG??@?Q!12?_G??G?A!4?C?C_AOCGCA#125!94?_#56?A#103?_?W?gCyo__O_GoGE@GAODI@?@!7?G?C?A??_??CA#121O!4?CC#77!58?A!4?@???CcKQGQX@zYhzYswSoGgW#69!4?A?O#73?oYiuAK[KKWo__???_???A???o#108!46?@#98_??G?OO??o_?_??CCWqWIc\aE?AQ$#121!330?A#69@#122?O#53!30?@#115!6?_?OG#53?@#118!62?@#128!34?@#132??_#50@???@!7?A#129!6?A#100!52?C#134O!4?O#108?G#118G?G#115?@$#40!372?G??A??A@@@H?GGOg@[PeHrIiPeHaPqCiTI?C!7?C?_#112!142?G$#119!372?_??G?CC???C-#237GaC@IU`SGAc?hAGP?aOD_?D_?T?i?DIi?dOI?DOI?OI`CQH?a?SOdQcBG`ICR??pEO`SgDq@w@iTITITiSg@ATiSgSgUgPAO`O`GdIO?ITG??K`C#239!73?I?O??H!7?OA!4?@??@?a?GAO?a???@!4?P_???A?O?@C?@C?OC!7?@C?@?_???_!4?_??_#198!4?C#105@!8?D??G?ACG?A?D?I??iCO?CO_?GA!4?AC??HACI@MG@??@#72G@#103GmJEAW?O_@JfPF`SE_??O!4?O???A?C??@A???C!7?C!5?AC???C?@?E?A?@?C???@O@O!5?OC???_??@?YCgC?hCQ??T@K?BAG`AI?S@HSAL?DGBGEpGGG?SBShAS`!6?_O_#115@G?AO!6?GC?GSG!7?_?_O??O_O#126?C!6?O!4?@#118_gop\Q@@Q#102??WSg?G]DFFIFC#77@A?@?O_??_??O#108???G#251C#100SWKXEV[}}ko?Q#93_?_gQHuhqt[aWaH_???O#134??c??_O$#246TGaS`GI`SGBSOdAgT?i?Ti?Ti?T?Y_TDYIdtyiDtidSYjcu^TaimYLX{REtxk^VIwnMjRYKmASS_O__?@ADySg?A?B?@C?_?AGCO!6?aS!77?_??A_??O???S@??K?O?OCi?G?O?_?G???_GO?G?C??`C_?C?O_O?O?@??Pc?@C??O!9?_#191!11?G!9?G?A!4?@!10?A!4?@#153!15?A#208_A#35OC#118OC#101C@CG@A@#111??C?G?G#107?G#118!4?AA?O#72!9?O#77???@@@!5?E?BAAB?@@!6?C!4?O!7?G!9?A?G?G@GIC!7?G?G??A#118!7?G#77!11?AACECJ{jUljM~PNYs_O#40_#59O?ETG#119A?O??A?`?@B?ACO_??_?Ko?kSG?O_oo?O!9?_?CME#114_dO?_J?A@?@?@#122?O#100oO_?_o_#114!7?B#107A#98!7?COEPGB@@ADYKJM@!16?DpmJhdP_$#244a?OG!4?A@OGC?_C!6?O#252!19?@!4?_G@#192???_A!4?A??_?@?O?C_@O??@??G@?O!5?@?O??_???C!8?O???G???H!4?@C!5?@??@?G@?A??A!7?A???C?G??A??@?G?C?A?C?A?@?C???G@C??G?C?G@AC???D??@!4?oCP??AG???Ca?GAPC`?G?@?_DO?g?SG?@?G`C??c?OC_I???_??C??C?Q?DgT?DGDOChA?`?O??@Q?@?A?_!21?G!4?C!15?G#56_#115O?OO!6?K?o??_OO??GG@`SP?Ag`_WSaWOE?_???GC?C@??g??GC?C??C#69!18?A!5?H_#72!4?G#69!11?C#101?G?G?C!20?CA?A!4?O?O?mOdGO#114???APisk_#125@Oo#118!4?_!4?_#125?@?A!4@???@???@?BELL@AN@#112_?O?A@!5?@#59!6?C#101!6?W]@@op?GWfOkOc_tPRHjbb?_?_??O#72?@#131??OKV`cGQCGaPc?sQSjS_#100???AG$#240?CHAS`SI?cG`AGPA_O?o?O_?O__O_?_O_O???O_?OI_#193!6?G@!5?C#184G#252???_G#193!9?CA??_??_??ACg???A?@?@CG?GA?C??D_???aP??Q_SrKqGqHqLqSiOcWaSaSgDwDoCxA|AsHsIpIoFoLoHuGqDqPgDwBgTgEwBgTaSaOiPeOjOeOgPOnOGQsGOAsJ?I?Ps?@IoDG?T?c?GAS@aWe?G?TA?@?i?SAOIOJOI@I?PcI@M?jOi`Ao@GA?AGQ?aGA?OCWA@o?G?CG_GC@GOIC`?I?AH?AG?C?@?C?B?C@A??HA?C?GA?C!7?A#49_A#102__OopCCMbFACOM?MBhRVo!7?EB???A?gGLMIABG??C!7?O?GHI???g_?`@?C@?BHCA?O??O?O???@^VUT]c??@AOBO?@`p_caOGCdA?_@??O?`ojifkFhK@`pp_#72!8?_#102?B!4N{_#69?@?W???GNErYsico?O_!5?O?gO_!4?_?_#140A#115!9?O??AG?o?c@?_CA#72!9?KGA?E?AG!6?acQ#99!4?G!7?_O_A?GQ@?@??GAXALjSjIMPOSQMN$#218?P?_!4?`O?A?OC!5?G??G!5?O#184!42?@g?IDACICgO?@ASgCgSGQ?P?O`?@IcA?DG?@?_Q???CAG???GADGC?G?C?C??G@??G?CAG@?HC?@A?@?G?GC?A@?@???@??G??@AC!4?A?A?@!4?H?G??IcIsJ?A??aG`C_BO?P?_???O?eOCOA??a?R?AOCi???I?A@A_???OIOIOa@Io@G_???A???A???GCGA@?c?GcW_HSA`O_Gt?SG_SGaSAh?Ag??DAGO_Q?lQGaSHaHO_AOdC@#237C#96A#40C#114G@???_?o?O?o??_?_?C_MKgg_oCIPC_@`hGC??_?Oo@pAwW?GKO_MG_@OcJOlA[G[GmA{q{Aice_FZCIlAG@k__@?_Od@o@IoCPgOC?QOGCPQ?wPSAW?aW!5?_O?OO?G#81!20?@???E?o!4?@?B!5?O?G#118???_#128!7?@?A?@#69!8?G#103??_?C?K`ABkb_ygGdWb!4?A_O_OFOlJ^IK#95!17?O?C??CGA@C@C$#252!16?IHD?AD?AD?I?D#196!49?O??@!6?@?A??i?b?CWaOPgY?aTGCBKhUjGpDuHuDoGbOnReXbWjTqEwNrEx?tIsApMoLoMqDu@qLoKiUwFwUgVoFwUgXb[jTkPlOmPmT?e?dQc@?@??_K`K?AGQCG?aCGFPKbCH?HA?LOfG?CgC@O?`M_@cG_K?ZcI@c?`CG?S?M?VgVGtGvWDxULrAtkIuQlrQFTqIoEdPUGpbsSjoT`xUSxB|waXuc\huOlpXbsSojT{`OYC#239@#140G#70@#77AA!4?@#69!15?@?NHA!4?[???AOo???GCA??_OooC???C#115!21?___??c@o!4?_!6?_CAg?E?A?@@O??GDCi`eeHC?C??OO#59??_#121!24?C_?HD?OGC??PGKM[wS_O?KABCKMMG?WgO_?o_ow]|M^@#107!4?MMGOqCGOOO#134!9?CCCHCC?G!7?_???_?_???@Ic@C@$#202!17?C?I??I??I?D?I??D?I?D?I?D??COH???S?@!4?_O!5?C#239!23?@!6?CGC?A!4?D_???aO#237!82?AcH!4?_?@C_???O!8?OC???a???GAO?G@!7?_!5?O?O!4?G?C?O#217!66?O#240G#132?_#59!5?O_??G!7?O!9?SG?@?AC`ODAOs_?oG{?@@??_O_aWqaPsIO?@_?o?w???sOG@K?CJTAOEIO???A?AO_IS@G?A!7?__?O#73!41?BEN?_!8?B@AE?G?C?@?AA@@FIEC??_IG#98!30?QGG?B@$#218!322?_#108!8?G!4?G#119!12?E?C@??_G#121!11?A#40??A?C!4?O!6?`AOAPAC@?AH??@O??G#118??_#119!21?A#107???_?G?C!8?AOOO#132!30?G#49_?O#132!11?@GEAAA??@!5?@?GOOCC?E@A$#119!371?@!5?G#49!116?@$#101!373?A?@??@$#53!376?@-#237aGOCgQCKQHCaGeQhCG_SA?HcOA@OC_I?aS?T?I`OH_SAcPKAG@OhCh?I_S@IaH@?i@QdGtAShEW_Y`GCHUGRKOaSbS`WaXaHe@eWaC?AC_IOI@CA!18?C??C??C??C??C!18?G_??_??_??_#184!13?Q?`C?A?gO?A@E_F_AgDOGc?I_??h?O?_O@?AD?_OcG@aKB?_PaWcP_S_EG?aI`A?H?C_?_?A?_OGDOG?Q?_C??OCXEHQC`EGHcIPe?`IS_TI_TGQhCaPCHAhCQHcQHcQHcQHcQH#246_@#56OOA#115C[?}K_OgLdBGhPPGCcbW_bSCAMrGo?[`Qk?IS!4?o?CAG@?a?S_?_!4?_S_#77!4?OOG??O??OG#115PhGGgAO_GGO?LG?G??_OhGOTcaOSAgE???G?aOsOCCC_?qAOQOP?_#77CGK?G@?@?B?F@NYUlsWEr__OC#119@AG??_?I?p?_@!6?__??_O???GEI@H@#112??@#107!5?_!4?@?O?A@#101?!4_WsB@!4?swNI?gA[PKJCISVIZa]dQoA#98??_#99?~nAOCO???gOG??O?H?iS`QPoOG$#246TaGPCgR?cQHCPGCObSJ_HuOALoM`IT_\?jiiTSIeOJh\Iep|VyjUZU~TJisT[umfTukYRIlhAPdNdYuhQ_dc`n?@WAKAC??O?W!6?GOC`CO#239!21?P??P??P??P??@!18?A?GA?GA?GA?GAO#237!9?Ga?G!6?D?@C?A_?O!4?_??@C?GA?G??CG?PcG?_GA??P_?CO_?a???G?D??@C!6?@AOG!8?O??G#239!9?c#193!14?g#192??G??O#208!17?@#97_#20C#121A?a#103bD?A??@?A?@?C??_AG?AS?a?@#69?cEXBOl?wC_oOowK{Ylvun\[gCgWkcks[_?_!6?_!4?_?_?O`???O!5?@G!4?_?_G#102?A@H@H?Pp`?_?OD???OqATKCCCLMKLJbBvu}y}}wcww_???AB@!6?_!8?GC?KCM{kW??GG?C{E!5?__o_?o!4_!5?O__GcI?A??C#113C#100IkUkVfZBA#77O?C?g??_?G???_#134???A?A!4?T#131?OK@G`I_T?cqOdIcqTPi]c??_$#244G?@gA@?_??AP#218!24?a???C#244???P#252???_C!5?_!6?O#193O?G!7?_???C?Q_!5?@??G?C?C??O!4?@_GOA??`?OG`]`]`]`]`]`]`]`YcR_Ga@gA`Ga@gA`Wa\a\a\a\a\a\a\a\aD?HQCHQDGRCGRcGfWfWfWfWvdPKrdLiOiO?AoA_H?BGDOI_CI_?O`?O?_A@_A???@CAC`C`?GPaGCX?TGACP_I_O?I_CpI_G??_`I?tAGrC@A??@?GA??A?d???a#237!35?O#110O#63g#38C@#102O?I@@?@!7?G?B???@#118!8?C?A#59??B??IF@??A!7?B?B??A?@AI?Z@|WKJCFTJhCJE???C???C??C_???aDGC??C!9?G?`?@??A??A#107??A?G@#101!6?C!8?@?A?`#59!4?_??B?@??o!6?KCGE?GO?A!7?A#107?A#121?@!4?@@?@#77!8?_#111!5?_!4?G#98??Og?_G_G#72D!7?@?@DI?@C@?GD#93!8?pepMt^iVJDnYdZCiC@#98?HmIDb{Rg$#240?PcAOCGQHC_Ge?hEWbSJsHeXaLoMpITa\?T?G`SHaSA_?GA#193???C#192?_#202???S@I_@??G#192??@?c?O!4?O!6?AG??S??@!5?C???@?O??@??G???_#239!77?A?@!9?GC??c?I@O?g?O?_S@_O@?A??A!4?G?CAG?@!6?a???G???Q?C??c!5?G!6?C_#217!50?C#83A#73@#69G!4?_W_O#59!9?@??C?G#40!17?@#118??_???O!6?O?O#102!8?__#119_!6?_?O`?P_!5?O???O!4?O!5?_#107??@?A#40?A#69???_??G#118!5?O#108!9?G#40!16?GCGAgO#69C?O_@@PM?pA__?@???C!4?_??@@?C?A#122!22?O??A#95???O?OC#100!13?@???C@?GL|~~^i#95???GA#134!18?DASBg$#218?CA?@?_@?_O??P#184!57?ACG!6?CHO?Q??aC_O_XaHa@a?cG?A?_??A?A#246!80?O?C!7?O@?AG@O??CA???@!4?A?_!4?PCP!8?I?G?PC??O???_!4?O??G?A?_A?c?GA??@#239!50?G#125?_#72_#100G#118?_!5?O?cO?A?OG#54!34?O#40??@!9?@???G??AG#118!5?O??@@O?G??OO!7?_#119!16?_#114!34?@OD?EW?_!8?WAQ_A?B@LRUE?@@So!4OGGCW?CKQG@SbOL?HG#99!13?G#251!17?O?G#100!33?G??CV$#196!72?O?A???@!8?G??A???O?GCXASaKTAKpCOKjD]`]`]`]`]`]`]`]dZkZe\yE|Ye\yE|Ye\a\a\a\a\a\a\a\a\q\udXudWvcXvcXfWfWfWfWfG?KQ?W_SADiWsGXOCO?_A?@O?@SA?ECHACGcGOgEHO?O?O_Y?C??A?C@I_P?G?S@mOdGRGCZ?tIDUOdAXdCXiP]dYepSlr[hQ?ZtKP~]tj^it^ivDUzTmze|UzluZluZluZluZluM?@#144G#101O#132@#107?O!7?O#121!44?W?G#103!10?O??O!10?GA??@?A??A?@G??C?GO?A_UGC??@a???IQ?@G_@@I???aO?OO?@?D?@CI?COChQHcWCYCgQg#73@?DUSK#115?PAAP?P`?@@_QQ_@XG?ggEG@I?A??C?I?GDSIGDA?E??OC$#239!86?G!4?@??C!5?@GP_?@???_?O#192!80?@?D_G??G?CO?_A?DO?HSAGaCHASGO?TGA?aG??OCI?C@??A???_PC??S?AO@GA@CO?D!10?g?A_??_?G?O?Q???G#240!35?A#128??C#119!4?O???_G???_!5?_!6?KRHa?K?O!4?_!5?O?G??_?GO#102!31?CACA#81!67?CAGA?_#77!9?O#103CG?C??A!8?O?W_GOOCOI`SiOmO@uHO~\N^R`@??B!5?_tzVTbmQsqo_gC_O_O_$#114!330?EKEAOGeUGefOWSFWGbX|o!4?_??BCpJDGMEB@@!5?B?BCFA@BA@@^C}AeBCR?icCrCPMEEAE\mAdr`IocfDwvYFERBiPKEgS?_?][U[LIHD`hGTG?__ha_PAo?_!7?O#125!16?B#121G@?qC_#118!13?_?@?O!4?CCCEAAE@B@A!7?E@$#59!330?@A#49!151?G#77!23?_?_$#101!508?_-#246TGaDOi@S_ICPI_DI`k@iSAXDgU`QKbCXaHSqhDyDOdKqFQyH\uQJmx\VTWtmDioInIoYnIdSRLaDIO?_BH?OCWLY@?@?`A`G`Go?pGPC???A@?_?OG!5?O#237!9?CP??P??@??@??@#239!18?AG?aG?aG?Q?CO?C#137???_??_??_???_#184??AP?_HQC@?dGO???h!4?ITAPATg?O???PA?T??E@aS_DO@C@??O_ADGO_?TAS?cA?_???_@OcG?S?GOC_PaU@]@[`^?E_H_R_DGcI?kAoBgR?KaDgR_GoAgOaGoA_C#105hA#218g#64E#114G!8?{XH???CB?_OIdFPpGQJCAV`Go{??@#121EAE?AC_!5?OH_xGS?CGO?@O#102?_aOOOWG^GD!4?C!8?A?@#103@!8?@???Q_?QP?P??OA?_?O???OQQ@QEG@OGI?OCC_G_GOGOkOfOG?I?@A??@#53???WGO#115??A?A!4?@GIG??C?A?@#77OGQDBCA?BCBCHSo?WO???_!6?_#100_?_gw{|MFB#102?D?C!6?A?E@ICG_#77?O#100?O_suU~#99~i?~dgT?OG?aPI?PGDQ_EGaO??_OC$#237Ga?OiCSaITpI_DY_SAOC@gC_Q@GC`OGa?SaHCQ??i?Q@OgDSa?HcPCA?AdIPiTIt?tIdOdY`KqCgTiTIs?zChA_CoKoMOKOEOE?E?A_IpKPcGSHE?a?A_G#239!14?C??CO?CO?CO#237!18?_!11?@!18?@??@!4?DO?G!6?_?DA??PA???A?PA?`I?cHaS_D?_?O???AOd??G??A!7?S?_??dG?C?O??O!6?G?O#208!38?S#237@#70_#72_A#118_kR!6?_S_Cb_oWID?G!6?O!7?_??_I??OC?G??@C?C#114@!5?C??E?OAAIaS?oAGB?IACEA!4@BPB???HDCFBB@OYMr@Rh_GQ?}niwOYVbYAIM?HOKH`w?_?G#72!8?@!10?w?wswso_O__#102??C?WOOo_o@??_OoOGKCA#72?_WGWSg_G_#102??FAFBLntIVoM?J?@#98??O???A#95@#107?_o?_G??GO?O!4?_#72!7?O#134G?@#131??S`?WA_ydaT[CtiCqglZwTKb#134?HA`Oc$#244a?DG?@?G!4?C?_#218!28?G#202!5?Hc??A??_#192A??O?D?O?D??O?G_?G?_??C?Q?@A_!4?A!9?C!8?A!4?_G?A!76?C!4?GQ??@COC??PAT_???g?@ICOdI?_I?cH?S?@O_CO?g?A?DGO?CAG!4?H?O?AgC?I??PA??A??I??G??_???_H?Q?C?O?@O?@?C??C?P???C?@C?@C?@C?H#239???E#83O#56@#115oC@GrGc?AcS??b?S@AcOI?i?@dOQlGU`M?t?AO?O!5?_A@!8?_??@?EOT?L?d?__?gSGEOG?`CAQAAO?SAALA?@?COi?D@KGCCDEK???D?L?gCDDC@KCA@oO?@O#101?C??_?O?AD_A!4?_?Oc#114!9?@?EG??CCG?G?@O?GOGAHA?@#98!4?_??O#53??O#107!11?A@#122?_#72!4?G?C#113!4?C#108??C!8?A?ACGC?S#98!6?g#93??@M?ATIDITi@i?TiDQ?C@A#100???_OK$#240?CO_DOi?T_Ic@Y?TIPmPiTaYDgUhQKrC\aHCQgDyDY`CgD?a#252???O??_G#184!15?A???O?DIO?_Cg???_CoGOKOCOE?E?A?A_IPCO_G?GA?A#239!83?@!7?G???@IO!4?g?SG_G???C!8?O?C!7?G???O!4?Q?_???GCO?A?PA??C???O?C!5?C??_#244!34?O#97G#81C#59HA!5?O#103!4?@#102!11?o#103GC@#54!12?_!5?C#81A__oO?o?BA??_#59C?_A?_??CB?FOB?@@?A#121?o??C?GGG?!4_??OG#102???O???Q?_?A!8?_oo!5_??EkC`rJZZJFF@??@@??FB@#59!11?AA?SC?G??G?W?_#103oOG_GctAID!7?@???j?@?CaOIDgLo~S^E!7?owONwJalUfDeNt|x[Orr]hBSI?A#95!5?O#98!18?_PK~ULAjZ$#218?PGA???@!4?O#193!42?_G!17?@A!9?CO?A@???`A_?`GO?pG@??AG???_HTHPK@tLa\a\a\a\a?G_I?cQGcQGcQGcYdYdYdYdYdYdYdYdY@SaHSaHSAhCOgEOJSb[BSJSb[ATiDY`[AOGQLOA?Gd?aH_Ci?G??GtAC?S`_G???T!7?I?I?I@C@Og??AT_Od?\?u?cJ!4?P!4?_G@Cg@??@_A@?@C?A???@?@?C??C?O??P???C?P??O??O??O?_#104!5?@#125A#102C#107@Q_!6?AJ]#59!14?G#54!29?C#103!8?_#118!10?@???_??_#59!7?GA!8?_!5?_?O??_#119!7?@#59!4?E?A@O?_??C#48!23?_#69@@B@A??CC??A???@#101!4?o_olYcQdjCYsJu?G{_gO??O!5?_W^~FVBB!5?A?@A???@!5?@??@AkjdN@H$#239!74?O!6?C?A!5?A!8?@G?C!12?C???A#246!83?A??A@Q?C!4?GC!4?@???cGO?PAO?H?I?J?iASh!4?a@???_H???CH?@A!6?_!5?C??_??A???O?C?G#133!34?O#112?G?C!7?_#118!84?_?C!4?G?G??G!5?D?G?G@???K#77!5?AC?C_?O_WsiUkQnWgS}dZ}D~FIFJNFCKW_wwo___#107!5?_#108!11?@#122!32?G#115??O#112O???g#115!5?_$#196!78?_@G???O@A@G?C`A?G@GO?`G?COCag@U`UPc?OcRsGa\a\a\a\a\ze^pmZheZheZheZdYdYdYdYdYdYdYdYd[b\Sb\Sb|CzjExjsj[B{jSj[B|iTYd]_kjUc_isgAOeXcQ?TiS_?_?g??A?ADQcG??_IO_G!5?_?OiCDIO_?ALAg?aH?X?UhUPIcIPeG@mpBiTiK@W_U_I_X_^?]_]irYdzQlJ{Eg~aXyEg^eJ|Ej\eJ\UzUh#121!4?O??G?G#112!93?_#107!6?`C#118!55?@!4?D!4?CEBD#114!46?O#118gO?W_G$#119!327?CR?C@!4?WGGE@?_OoCMA?__?_G?@A?dG???O_?@OC?cG!5?_CHAc?_G?G!9?_Og_OX?HCkWCc__{?QSAoG?COg#81!66?@@#121B@??CCEA#77!50?@?A$#69!328?cRj?A!4?O?GC@!5?C!6?U?@IYSh|HD\zMjZpWVMANAEJwOpJYY`H?L?L?@!5?cOC__W?W?_W?C??[??OGog?CA_??C!6?@??DA#119!52?A?AAE??@@-#237}?dOIcT?iC@QC`GAGCAgDO?COAgD?OAG?T_AS?AhCOHcOI@S_Ah?C?_GBc@Y`UGe@gQ?QkQcHOiCH?VgOhO@E@Q?OGoKOD?D?OaSIs?GAG?gQL?QC?A?GA[?GO?_G?O??@??@??@??@??@?AG?C!5?C#137!7?_???_!8?_?OcQG?QcGT_I_TGaGP_?O?G?O?G?O!5?_G?_#246A?@?A???ACGOA??BO`GAd?ACA??A_CP?_OG@??C?c??G!7?A?@?OC??C?@?A!7?A??_G?_???G#237!6?_#105!10?C?O!4?E#153O#83_#69CO!7?@AC?O?G?G?O?_O?@_CO@_GwkrOwNLTIwqMVHF@@P??_cEcyOYLH\DTa_?AKa@C?BCAD?B@???C?`?cW?GCOHC?C@A?@@O!4?G??G!5?OG@??O?G??O#59!11?_#72!6?OOO???cGdkZK~~N{bF?BCIAYRRaO?_O!7?[?I?IDSiOJoNqLOgS?A_???Os!5?Gs?G?C#118_OW__oogC!5?_o?@#111?G#108Ac#100?g{}}~n`j#131?@[Q?@ADA?LAEIHtMU\BI@A#100???_Bq@$#246@Y?dOIgT?yChQCPsBWTAwFwBkPAWbKpEgATgB{SAxeOJdsiJ\sUzjLTu{Jmc]htP]Ulnl@HRun?rSr_CBABaOgChE`E@IOIOID?@?@AdOdA@??_@??GCO!5?G#237!46?@#105!22?C??C??C#192?@!6?A!6?A!5?@!4?EO?C?`G?DO?HS_G???D?@cOG@O?GOc?@cA?C?OcWA_K_WaG_???C@??O???CA???O!4?@O?@OCHC?D?OdG?@??@?_?GO?C#96G#115G_yDAZ_PK{Cpc?W_\?{D{IhSqLomOXc?BKBA?Q??@???A?a#73??C#118!8?O?A#115G?DB?@B?E@A?B?A???@!4?C???_!5?J__?AQO_PSEWAhBTGccHD`?G@X@H@I?`OQA??oO#53!12?_!9?_???B!4?@#101?C@G?WAgQkUiIuKq\b^cZtWiPnSJoLqKSGjS\oKpMGQ`iPfVALaC#119?O#115GcK?E?@???o__G?O?a#101??AtE@@#72@#134?O[?S???OkOgOg?__?_!5?_?gCgVGKGC$#240?`A?@OA?S@yChYcHsBgTAgFwBkTa[bKPVgITgAhSAHeOI@S_#202A@???_?@#192??O@??A?_??O?Q?G??C??C!4?GC!7?_?_!8?G!14?@#184!75?A???A!4?A@?@A??@?@!5?@I@O?A@g?H?i?E?O?G_?A@CPI_OI?A?c?I_B?BO??OGpA@??_K@ODGpC]s|gwUkjms\oh[v?LA{Bs?M_KA_?q?wA??AOgA?GAKBCE#137O#97?O#103O??_C_S#107ko#59!13?C!9?O???o_?sCGOGC#132O#54O??Q???O@?@_?A!4?GO!7?_#118??G#73O#112A#118!8?EA??C?O??KC?C?@_???O?_?@??O??OO?A?QOOA?_#48!31?_?[?jSA_W??_#103!6?!5@#100!6?A@C!8?_#102!4?A#114??A#251???_??G#100o?BBA#114_?OG???A?@?@#102OC!4?C`#99!8?A?j}alnQdQgTaSXcSIOhagTu$#244?COI?@?i!6?A#218!16?_!5?@#252!11?G?COAG??O#184!5?G?@!4?c???OG??GPgO??@A?O?OGOC?D??_OIc!5?GOcAG?QC???G_G?_#237!84?@#239!10?G!7?@C!8?O?GCOG??I???c?I???G!10?_GA???P!6?C@??O??G?A???G?_!9?O#246!14?_?g#241C#101_???W#59??A#102!22?A#121C!7?@A@_!4?_i@jURG???C_O?O!4?OoW_GoOWWGdCSyzyY]ArA_O?`_OG?G#103!4?_??A??D?C?A!6?A??_?C?@GB?`G?AG_??c??AO@ODACA@?G?@#99!6?O!5?G???_#102CCC!4@#53!11?_#103!9?A!4?A@G?@l[SKG!4?owLF??S?HE?BKJK!4B_XQKXIPA#98!5?S!6?G?C?OG?O??_??S?GTzVgVoDy$#218??G?c???@!8?_#193!35?OA!19?@?_??AC???_OGCGA@A?GOa?GH!4?A_OC?@_?G@iDPa?@bCBcBCBCj?gCQgCQgCQgCQG_O`A@aPA`a@aPA@AxU@IOcZ?[bKoKPm?Xc@HQcHQ@GACPACPAcGlIHcPIHcQLQd[_KSaSIpKOkHuSIcYCmPGA_@O?CAO_I??Q?EpI_OG?AAc?J?E??o??OG_A?@CO?B?C?@?A???_???G??O@?D?C@S?C?C_!4?G!5?COC?C?A#208???G#244?B#116A#119G!4?@!4?AO_?D?C?g@SAhCQA@g!5?GC??A???@!4?W?gS??`Y@i@AC??gWSig?@?_Dc?d_A_?CCD``WKX?KSOHc`s@?GL!6G???G?SG?cWKDCK?G???O#77CC?CC!6?A?G?KYfiLJL}hVYeYBCB!9?@@CCG@HUKAgSsGqKa?_Pc!5?_C???b?BShALoE`??A@A#134O_#98@ATG#107???BBBH?Op{oCOKOKK]C`O#93!12?@!5?@A?@?@A?@$#196!76?A!5?cOGC`A`C??@A?GTAC_PItOLA`EGOVc_@OiDSASRKR[r{jSzEzhEzhEzhEzHuVlU\yTMp]TyTMxu|Eh]tlZC|b[rMrmO^cJYcdZcHua\pMgrKtIROdqRk`uQl_kYa[pJSjSKrkRs?_cG@o?CO_S?GO`GaC@S_G_??C?@cPG@O`CO_GdMYdDASkXEO@aGa?AY_@?BAGR??B?BC??yApAGBy`ZQlZUHfA|nYtjExzqlP{rH`B#136?@#118C@??C!4?wGHDAOaO!8?H?E?O???_???G#81!4?_ogKEC??HG??CC??___!7?WOGG??OOGg!8?@?`#112G!6?@#102???AA#59!9?A???A#102?_!9?G?vLDN^}X^v|__!6?C#98!12?gSgoS__???_#108!25?@#112!26?E???A?A???_$#239!77?G???C?G!8?_?_?_!9?O!5?GO_??_??_!7?CO?CO?CO?CO?c?G??_?G_K?G?G_CG!5?A??A!6?@?A#237!43?@O?_@??_?G?E?O?G@?_@?@!4?CA??O??O?@OA?@Ga?H!12?G?O???C@?_#72!38?@#121C#114G??A?BA@?AGcA?bBAA@?AG!4?E@B???@??_??C!19?A???DC?C?A#73!17?@#114!4A??QQoo_ECC`pf_UOa_RXAaA__QcEcadgAGhOrG?aO_!5?A#120!20?O#108!64?G$#77!322?A#112?A@!8?A@#54!19?C#59!27?A!30?A#101!30?C??C!7?@!4?@CGO_?_?Q_@O?O_O$#102!324?O_?G-#237|PwEgTAhS?hAG?i?d?AGD_A@OC?i?DOCA`G?SBOCiP?cGCaHOCO_KQ?iHS_WcHqL?QcPIPiCpAShSGqKrKRcRkQkOcGdGDWdOaWaGcQgAg@?@A?GPaGP?AG!6?Q?@??`??@??@GA???_#137!15?_?IOdGQcHSAO_DgQcHUhShQcZcYdYcZcXeOdY`SHcxAXaSHOaSG`IS?H?Q_#192!4?@??_?PA_A?O?@CH?D??@?PCH_?@!4?A@?I?OAGC_GQH?IOjCQk!5?@O_??G?Q??@!5?@GA??C!5?C!7?D#246?b!4?@#72_O#115R_G_HGOA~tSIhSu\IhcZdQNoNshVOn?_G#59s]N@@@#39??@#73@G?A@!6?_?C@??@?G_?aOOOGGcQOSOaeDIOAc?C?_O?O!5?G???G#114O??O!5?GgGGxZK@cOQHSUhu_@E??_oDGg??g??G#72??O[KZO\Lnz^jJmDVFPNug??_?O!4?@@AAC??IS?H??_O@JS`ITiDoDiDOfGZ_ItA_W@K@#107?_???c!6?GLC!5?B@??BAK#101Kh#251A??A#134??C@RisOhA~aXCbQH`IdYCbsY@ID?CQE$#246Ac@WAgTAhUOcRS@Y?lDqILOm?jS@Y_IpKQcJ_kJPCmXRcXSejxlUolvSqjL`ZUCqzlHmsCPQM|aCJqD!4?G??@?B?R?Qa?AGC?@?O?COCOiO??_???_?O_?OA#239!101?A???@?C?_??@C?G???@aOA!8?A?C??@!5?A!4?G!6?A_?O???G_A!8?@GA!7?GA#237!8?CO#150?_#202OA#83B#114BCP!8?I`SaG??OQ!9?G!7?A!6?A#115!8?@#132!26?C!4?_O#119_!5?P?EAf`_cd`bkctL@fAA`???_??__?_???OO??O#101???C??AO?QObK?pCi_AO?_?C@A??I#41!6?A??A?c#95c#101?@@?BMTA~uJ[VI]sj]tIDYFYTOjGRCNOAHP??AsB?@#108A#115C@??@???S_HDpCAO??B`CGO#100?A\n~Xv^z}kO!5?GCiWks]sW_oG??coOwr?`ib$#240?G?_?A_OAhEXcjSdYAwDoQlOnOjSdYdIpKRsJOciP?eGPaHO#202C??GA?G@C??C#184!9?A!5?O_CGQKBCRcQk?c?cGC?DO`OaW_?h?g???C@O??@OA??A!4?@!100?AG??G?K?IoA_O_YcIOC_?ASgUgS_WcW_D?_@q@A?CaC`COh?ODQcLQK@Y?T@HCPEWfWdWA_TGVoIpIPi@?ODy_\q?QG#105AO?A#24_#86C#77_??A#107GOcJt#118?I_!5?@!5?OA??C?B!4?A?_!4?@_??_O#69!47?O?C?C@??C?@G?o??@CA#103?CPGA!4?@??@C!4?DO_?Cg?DGC?G#53???_CA_#99?C??O?G?O??GA_??cAO?O@OakGG#100???g!5?_!6?O#103?G!8?C!7?w][lrY?A?OOm?A?q?AOK?A???TarS_O?C#99!5?DJiU|?O!8?@BOG?GC???@$#218?A?@!13?O!26?A#252!4?A?@!6?A#196!12?G#193???A?@?@!4?G??@?A?Q??a??@C?P??@?OC?gS_@??C?I_@SaHcQG@gCOIOCIOcIO?_TGPCQgTiGtI_y?{@y@{@i?DQ?G@Q?dGDQ?H?C??A??A??@??@!4?I??AG_A?C?HACAHAOC_HQcHcJOjEwEyDWAk?SH_M`?OAgO?WCi?A_GACgAHS_Gc??`CA??@_?C_!4?@??CQ_!4?A?_?Gc???@?C??_@???A_G@Q`Go?OAG??OGGCK#97O#99O#41G#102GGtSERcG#119??@S?@?aSAH?GD_COJ?gCO@!6?_?_?C?@??AoaUtICA_?CXCiSAG?CiC_SO#81!24?@!9?A?A#102!7?AA@D@A@?Q@EAHMJF?AVRqV@g@@#98!8?O???O??o?g?_?PKrNX`n|bAI[Osq{o_#134???_???_!4?_?_?_?_CO__O_?oG?KpA?@#118_OG?|CuNF@B?QGI`kbKKKY_#102?@#113!5?_G_#131!5?D#98???DaPC@A?@ACGCAdQ@iFGCGPK$#244??E?T?GC#193!42?A?@!6?A#239!21?_!7?G!9?C?@??@??C?gC!8?@C?HC???g?S?OC?OC_??_C?H?A??A?C@!4?C#246!73?O?@C???A???OC???S???@AH!4?_G?C!4?_O?CO`?A??H?O???D?A???G_???A?c??_?@?C?_#208!12?C#218??_#240K#144G#122C#103_??@_#69!7?AG@!4?cQG?H_?Q?_?o^vH`?KQGBoW{sRG_!4?@?@??O!5?P!6?@#112!24?O???C!5?@#59!10?C!11?@??A_??G#77?SAu_nSbbA?@#48!5?C_O?g?cO@CRKO?K#93??KW#77!4?@?@?@??SBGD#98!11?I??C!7?O#114!8?A@?_G???_??O!6?O_#131!30?@#101!6?GO?O$#192!58?O??_H?C?Q?@gC`??H!4?_?O_!5?G!4?G!7?A???@!5?C#237!121?I_???dA??G??@gQ?S_?CO@OA?O_HQC???@!6?_???G???_!6?AG?O!5?G?O#101!23?E?A#59!12?_C#112???_#121!8?E!4?O??OG!4?C_OFHG?sWK@wIaQS@TCTGC?DbAGcjhdWGqtj|Z|z^NN~n~~~mn_x?IAJII?A?A?A#69!19?O#107C#103!54?_#77!19?@!9?A#119!4?wG???_!9?_#72!40?_?C$#196!82?G??@?Q?P??`O?GEG@?EGCQCAiPA?JQm[bKtLSiHsQgvkVQn`MjpmJpMv\IrmQlTiTtIp]D~B}@}B]TtiGvdYcjWfYgVcZqhUhUlXcZcYdYcZeXdYd[bUXExeShqlShfYTalQuHSnSxFwDwDtA{B_R?OCGODA?@_??HS?@?@??A@?A@WEGO?KoLOHOI?ACOnY_H?CbM_\_UCpAWdOeGbWU?S_IdGTES_[fIDN_Dyl?`fZ@#54!33?G!7?_???A??@??S`I?a!4?Cg?I!8?_#118!26?O?O??OK?O??o?OPOC???O?G??G??O???_#100!75?GCEaa?G#102!10?_O#121?O!6?oo$#81!358?oCESM???GCKG!5?O]B_?@?__AiP@jI?CRHCAIDPG!4?A#132!13?G#115O??O??O?G?KOC_CA__OGiCSi?CGGg__OGGG??@#251!72?D???C#112!15?CG@???OCG$#49!359?G#132???A-#237xOCbXcRGePGC`?S?OI`OCgAPGC@gA_I@Ga?TAOAPC_HSA`OI@SA@?Og@SHQlGt_TAh?OaTgF_I?SGPiPmPa?dI?I_I_I?I?G?WDQdYcYcQcIcG_I_S?OaCgTGS_G??IS?AOG?_??_??_??O#105???gOcGO_CGOgC?oC#193!37?c???@_P?`O@GAOChQCQ@GaDGRcHC`IT_OI_KOl?IoMP?S`Q?GcZcGCO?DOH??IT@Qe?Q?e???_?@GcOIOCAHSAGO?G?OGA@O?_!8?@iO?c!7?cv@#59__A_??C#102B#118O_OO_X!4?GAAAC@@?_OG??A?A?O?G??_!6?@!4?O?G#73???G?A@??_`POOWKKeAbtG]KgRbGBP_hSSciEMAG@!7?@@@#114!6?WEdkeO]OGApIcWa`_`OGLKET@A_#101??A@AO@yDqlcGSk?OIC#120!10?CA#101OG#95@?@#100?_o??GE@ecEF@@!5?K???@@HCQYGGC???@#98?CA#118OA??CCBA???@BB???@!4?OBdC#107@#101_Dac!9?O?_#98?@AC#113!8?GOG_G#101{m{SmYkv$#246AhOCaHCRGepISj@idOMgRTgcRgQDWDOu@Si?k`KaXUahSMdsyj[UfdS}jucQRINiwU^nLGRO\tQbdm?C?GOO?OdODODOdODQ`A_G??@?@G@O@A@O?@??G???_@???O_?_??A#137!18?CHO_C?QgCHQgAhQChQlQlqLqkRkRkRkRkRkRkRkRkRkRkRGQc~?MOM`KAKPcHQ?dG?S`GQ_CO#105??O#184?GA?@??g?@?APC?AC?ACJ?QcW_CG???IT?Ac@c?e?qC`Og?@Q?PGACO@cP?O?OGu@SHqGeHWCydApI!4?gdVyc#105B#96?BG#150_#0A#72A@#114@o!7?A_@?NF!9?_!5?CB?A??G#121!10?C?@DDFE`?C?aGOBS?ed_OPW@GAt_QDkSfkm^EJ?POwPlR}n~v~n~}]AAbaB`#102!7?c_cSKK?G?GMFCBQ?@Gg[\]}NG__GG#53???A??G#48A?@??S?AOCHC?H_?@#134!9?o?oGO?G_!5?A@?VDICA?hC@E@BADAWSj#119?G?@G??K!7?A#128_#119!9?o#103?Ai\AkOA#113CY`O??_#99?@A?O#77!15?O?_O_OG$#218CAG?C#240Q__PGEpISiTIdOFgATIcRkQdYdGuHTiPMpKaHSAhOI@#202C?@?OG@#192???H?c?O?@?_?O?C_A?CG!5?C?D#196?d?`?C?`O?A@O_I_?@?_G@O?ADW`[?OISiT_BgLqMhO_USbSyUdxUdxUd{jRkRCBGRAAgBaD_RHAhQ|EgZSdQlQLqLRkRkRkRkRkRkRkRkRkRkRkvHZ?~oN_]QlqeXehUGrliUTgVgJuzMta\isLoFOmoL_iShY_[`O??@A@Q_I_?_?_G?W?H?X??GADgQ@IcdOxCaXCbmDjA?sGe@SHqDqDGtIcSjmY@Y_DWc{O#202?G#14C#48C#119_S??o!8?w???WC?q?ACA@?TG_S_!4?GA?@!6?A@ABCAOOHSAGSWfISGA@?BA??O#132!9?O??O?_GC?_Oc?O#126?G?O#81?@!4?@#103!11?G???S?CO?GAC@Q_OA_???_cOGC#98!6?Q?@OIC@GtCjRCXKcX_WHFC?ypSH~Nv@EHA#103??Og]kY!8?_!4?_?_oOE??WA@!6?AA@#73C??C??g?GA#77!6?O#251O#100?HRmTzd]n~oNgSGsHyT~y|~^~~unv^vB@@B@@@$#244?CbW??GC#252!42?_G?A#184!10?C!4?a?G!4?O?PiPa?_I?I?I_I?I?G?G?ODQcYCAcAcG_??A_C_???GS?O???DI?@G#192!98?C?Q@?AOC???h??H_!5?@I_?CAt???O??H?H?HQCDQC!5?_!5?C@_C@!4?C@??A???G!4?@?Q?G??OA#37???G#77O#115CIJxGwiLKh\C}F?GrcH_HqkyTItIuTjH!6?C?GCO?@g?C?_#81??A???CB`!4?AgGGC_a@gSGA@`Q?G#119!6?BA@@#118!11?_O!5?X[COG!5?B!8?O#101_#77?_!7?OPIT_sDg#99!8?_O_AWC__A_QCR_EoizCMJE???G#101??HoGMU`RC\aOgO_YcO?_?o?gSGc_B?c@#121cGOHh_SCKaaK[?AAONDh~N#102!4?K#108??O?@g#134!5?N?VItIc@i?DA?_??@#72!6?AG?CA$#193!51?_G?A!19?`?A?C???G?O?OCO@OC?dOcA@??G??@??G@O?A?@A`C!5?A?@oA?@G_C@DGQCHQCHQ@CgRkRkRchSBSHQHCAoCD?OD_AG#237!61?@!6?@???A??C?A???Q_CG!4?T??_!11?O??@??@?_??_??A!9?C?G?Q!4?C!9?G?U#128O#133G#81G#69?CA#103@?C!4?A#69??oOC@OD?CO@GCA_@G?O{gKP@sQ}FJD^aU{gw[gw__o?Po!6?C?A#125!4?C!8?O!4?_G#119!15?kSSWsIa`?`OAPA@??@??@#107!9?@#72!9?BA?QLOZdbOncPiBG`?GQ_R?AGC_?OC!8?o?O@O_???`?KB?IT?GEOHC@U?HAH?gO@#107c!6?@#114@!6?@!7?oI@}@$#239!74?G!7?DI!10?_?C#192C!6?O!5?C??G??@OA!4?C!7?_#239!100?A!11?@#246O?cH???@Q`O??_ICG?QcO?CgQG??_Gc?A??AG!8?Ga???O?_@???C!9?AG@#140!4?@#121O#107??CAC@AbE#121!5?_??_G?G#59!11?F@_o?G?ooi_[??O#114!8?_#115!46?_GCG?C?bGAPGH?A_o?`Qa@OO?GC?A??A_@#251!53?_O_?_?_O???_??O#126!8?WO@_AOG?_??_#115?@?@!5?_KOI$#239!109?O?C??I@?@?A??A?@C??@G???@GA?GA?GA?C!111?CI!4?@!6?@???AC!4?G!4?AG?O?c@???GA!8?O@?O@C!9?@#112!8?O!11?O#54!14?O?C?@!7?@A@?A??G?I??GCOdG!5?@#69!34?G???S?A!7?@!5?@???G#98!71?A#127!14?a?A#125O?__?GW??_Sc?_o$#153!312?@#121!41?_C#59!84?A???C!4?_?O_!4?@??C#141!73?C#116eO#132???WOO?O_WGWEO?S$#81!355?AA@#102!183?@#112C!8?A-#237~?~?~?~@|A|@YdY`CAOCH?QGd?OGcAOHc_OH_OH_?GS@_I?S?HCQ`OI?tATIPkAtAG@GuHQhU_UhCYcHOeG@QcXeGeGUGUGQGQCY?ISgOACQ?EoDoC?SGO?AGQ#137!24?O?g?QGqCxAS@I@gh?pOI_AO??GCo?i?@c@OHAPGB?bGf??@?bGBKaCXfWfWfWfWfWfWfWfGQHQcHaT?_S?g???_??_??_#239?@??@!6?_?@?SG?Q???C!4?A_!4?G?GC?@O?GAOC???_G!5?G!4?O??@??@C??iSd??O?@#1A#119_?C!4?C?GE@?@cQ@O?O_PcA_GCOICT?I?c?E!7?@!4?C?@?AGC??CA?@O@C?CDGDYPM_?Ly@?A?_`_!11?pWOw[GKCCcSKU@K@@`w__c?G_??CC???_#107!8?C#101!7?ACPi?ZuHqOgO_G#48C?G?S@C!4?A?OC#100!5?@???@CAA#103?WOq___?U[Qkit}TsismvmC]?@#132_G!4?`@[a?Cr?_???C#115_#114?o?O#103?sg\WtMxyxppNQsycYCi?_???CGO??_?_OcX?tGqLylJEX$#246?~?~?~?}A|A}@YdYxljQUldQYldRXleQXKeoN_uH|biUTtiISqhC]dt^I|gteR\G|v]RHsdUhLhUZ_BcBPdYcH?O?O@_@_@?@?@?`?@A@G`G`G???p?a?A!4?c#105!33?g?s?U?AKAdOHcJsBOJCPUGQIcaS_AsGS?O?Si[?S_O#193!18?PC_G@CO?dI?l?JsJSb[BTITb[aOIOgSBK`I`A@Ad??c!4?c?K?CI?A??O?@?C!4?C#237??H!4?Q!6?C!9?_@!7?A#24_#69@@!9?A?AHCQC!4?@GC_GCogITtIQlWE_@oCIAa`WOIBCADsRHMX?LcmhOgGGWOW???WKo#81?GC_O???_#69!11?_??_O?G?G_O?Q?IA?@???_?G_!7?_#77!15?CAIPmc?o?_#99@DAC_RcOAGaGPMA?pKA?A?@#77???O_?O_W?E??ACOI#134??@!5?@#251?@???@#121?W?CoWD__E???ea?@?_oo?GM@@#108!5?fGoC?CI?_@G#100CACIDJBnNFXvJ^F@ABmZc@#77??C_??COe$#244!12?c??C!4?_#252!5?AC!7?C?C?CA#244???G??@#192!10?A?G?_A???_?AG??Q!4?GOcG???A?@_!5?C??cG?C?_C?OA?CO@I!8?O@??@G#96!33?_??O?G??O???C??G??c??G??G#105!42?@?A#184!11?AO_?gOIC@K@M_?`AGdQK_?C?K?CI?M?IOHPiDIAO@LgPLQk@_YcZ?aShCjCiOcA@^eP!5?A@_#203?_#35W#40C#118A?EFFFBNFG?Q_Q_G?QJLI?OPO?G?@#59!6?_?CI?@_??G?C?_WOO!4?_?O#73!6?@!6?@!4?WDjFEJDrBqM@fIBCB?E@#115???_?O???@?POgAAGH@G_AGg?ACC_AQO???_??_aO#72!9?@?HCLBSiT_Y_?_?_GpMol_KaHA{BwPi?C@CA?@!8?@A?@??@?A!4?@#125??_?A!4?@W[bOX@??WX@DAB#107??_GeI@a#101?A@ADACMOkB@P__Oo[Ooo_??_o[{[???]IvHQDA?H$#202!16?A?Ch?Q?d?QG_AOHcAPGAOH?O?S@gA?T_B?Qh?I?_#252!10?_#202C#184!8?_C!4?A?@OcGEGEGU?QGQ?A?Q?GO!7?_C?CGOG?C?G!5?_#150!34?C???C!4?_!7?O!4?C#192!57?D??@?_??O??SG?QG@ODiOAPAp?P_T_C?C??O?gAO?A???OC@???G!4?O??H?_?G#208!7?s?Q#217O#83C#59Y#39_#115@@!6?@?D??@?`??QcYdIEAAD?_A?dGQ@W@_GQCD?Q`gT?BCaHcQOEG?XO?_O?O??_??_?O#132!7?G???_?_O?@#81!4?@#112!8?G#118a__aCC[!4?@!4?I?A!4?_#53!21?A#98?GA?GR@KRNhUPE_@OLA@oL?CA??A???@#108?_??C!5?g_???G?G???OG?W#119?C!5?A#73G?A?K???o!4?GC#112??O?W@U#113!13?G?P?C???GA?c?GA@?@?A#108_!6?O_$#240!17?O!4?G#244!10?A#240@??A?A!8?gC#193!27?@?A??Oc!6?O@_?_@c@O@Gt?@E_W@G`G???G@?dGhDcGZkRuZcZcZeWfYcZeWfXeXeHilFVhdDHAl@U@U@AH?dOH_JsJ?HCPCHQ@cBOhAPGU?UGvJSAS_S_OO#237!45?A!4?C?G_??@?G?O!9?G#193!23?aO@?A?_?CA??AGS?@#153???G#240?G#96@#81?[#121wOg_gwo_o{g[?GcIhC!6?O_???_?O@!6?G!14?@?@?A?EK@FAAFADE@EBADubWCWOOWK[LPgWs{z{M?mFBfRrjRB@?K!5?CC?!5C#100!31?C#101!15?O???o@wCmS|j]yg\C~@BDLZNT?@kOSA?AGPI@??A@A#128_???A???_???O?G???A@?@#251!20?@#102!24?O_$#239!78?O?G!5?A?@!6?c??_!13?II@?@?c#246!129?Q!4?A??c??A??@G_?G?C???B_A?O_C!5?_??A!4?c@?AO??@C?OC?O!6?wAE?C#112???AGOGO??O!8?C_!6?_??O?G#102!7?C#81!18?A!4?AA#54!6?G#125!11?CA!4?E#81!17?G#114??_O?CROIQP?A@_WgICCCFoaPA`?@?e`???@O#102!42?_gGO??_#100???A@!4?C#102???O#98??@#118M@?`gWC#140!5?GCA??C#126G#118OOoMMd@$#196!84?G???O@_??H???G?c??A?gD?cQ?EO@?q?e?ROa?RcQcHCZcZcXfWdZcXfWeXeXuDQOgCQGqCOAg?G?S_A??AC???Oa?a?_?G??C?C_?`G`?G_?`GBGBLjeWfWfWfWfWfWfWfWehUdYqLiYTiQTsJsJ[b[itI[_LIsFC`W_Q?OSG?O???`IPiPAp?P_P_T_E_Oi?hFs_BgQcRKRcHcZS@CiOhCJQgW_?gViTiYDG@l#126!5?_#73?O#114!19?@@@?A!7?`YOF_Pw[CEB_W_gG??__?o_!5?o___?__O?_#103!40?AO?A?P?O??_AO@?ITG@?_?O@?A?@O?@CCO#107!52?_!6?__???@#115?OCA#142!7?C#49@?G#119?_!4?A$#102!437?@??@`PPXHGG??a[]^YLG]|}}mhw_#112!64?OG#116AE!9?G?A?A$#107!437?O#59?Q!8?DGC!8?@#126!70?O!4?O#52!8?CE$#129!531?C#127??@!4?@-#237~?~?~?~?~?~?vGrM_@cX?C@cAg@SAg@CQ?gGcAH_S@I_S@GdOAHcOGDAoHAPi?HA?`OHU`Y@m?Z?lA|?PACHQDQ?tGtGTgSGSGpE?DAG`?g?_?_?GC?AgS_O#105!5?O#137!15?_?OcHSaShUhE@??CAh?S?a??A?OB_TC?Q_CQ@G?_G@_G?bG?G_??_??@??@A@EHUhUhUhUhUhUhCHQdOIcHQ?hA?i@?GQ_?@??A#192@?_CQ?c???O@S???C@Sa?Q?d?h?Pe?AgOC?O?C@!5?C??_@??_??OC???A??_#208!12?b#240Z#2O#81G!4?C???C#112??_GOG?S_OA@A?G!4?c#114??G?C?@oC??_P?GE`@aTGSCEB_CACAB??A@?@cBXHDpHOo_?!4O?kOGsWguOWoOO__oOG_?_OG__a??_??_OOWWWMGLEcCEwi?DGQgebQXP?DCCCGA#72!7?IDQ`JeWsJ?haKRLgeSrWMhTZah?C#103??_kWsWsjSJg@?@FBBB@??@@A@?G#125?OMgOsqWG__`@??AA#107???_wwWsMS@!5?`#111!6?_#101!5?B?@FG@?GOoGx?@@!5?BGA#107??_#102HA$#246?~?~?~?~?~?~?vKp]mHezYMHtUihTUyhlVTpX{UJisTJisRGlsUHnqYLFukeTxulNIbqhMcu@l?vAW?iEwB_GoHeGA?A?A@a@???_O_CQCBSI@ICB?_???AC@A#105!20?G!9?OgUhQGSAhITCxcDgSGag@kBGhSaRMOQEPKOCrC@ITITiSiSgSgO_#193!12?H_C?h?Q?cIOcGDOjCGQLoLQkQGQ?h?QHQcI_G@U_I_G?Hc?G?AG???G@??@??_?O??Q??@???OA?C@??_G!4?A???GQA#16!8?C#128_??_#73g?O#135??A#118!5?ca?C!4?O@?W?@??G#59!4?O!4?@??OG?C@?_?G?OD@COC?A???@IP_A!8?_#81???@#73B??@#69!6?DG?C@??AG?A?@?G?HCOAC@A?@!6?O?@#102?GOEKOGG?eeqyx`ppxZ~YQO#53!4?G#98??@A?SZ??p?Q?H?C@OA_#77??CO?iCG@A#108A!6?C#112?O!4?O@L?o??QDO@#132_T??CA?C@O?O??@#103!5?CAI_JKzmn{v]h^~Vn|J}j^j}W~}or{zsLAtAV]S}Y|^~sr|zzRqx$#244!12?G#202???@?A?C@?AG@SAg@CA?g?CA@_S@I_S@IcQ?H_Q?D??G?OG!4?_OGC#192?O@G?Q???@!4?GA!5?_?S_?G??c?@CAG@?G!5?O!4?@!7?@?_!9?C#150!17?_O?@!4?GO?G!13?C??C?A@#184!55?Q?@???QGBC???@U`W?HS?d?I?S_GWdCAhQc`AOiDYdCPitMWePCHaGaXeHgSYDIvlP!5?d?K#35??B#49O}#121B?A?ITjPlxNvnR\jQHoi[cCkBdKO!4?o?C#102??C?A_o_?E??_OgOWKWgHgw{[{{}]CGC_O!8?__!9?_??_#103!19?A!5?O??@!4?OaG@?AO?G?GD??G?E?c?dl_@#48!8?@???O#100!7?_!6?@#102!4?OcHcJSbOBOB???C#119_?G???__#128???_O?kG?_S#115???C!5?O?E??C#114@#108?_O?OOB??U_?gOAS@S_S@c??GC???_???g?_@_?_?G???CGC$#252!17?O???_O!8?O??A#193A#240!12?A#252!5?_O!5?C?O?C#239!6?O!6?@??OC!7?_!5?A??G!11?oRGD?@#96!37?C?_?C?_??A?OA?O??Q??Q?G?_?@_G?_#246!55?C???@!7?aG??A@??H?O?SAK??O?C?G@IOgCO_GQ_!5?GAOC@???O?`CO?GQc!5?W]o#83??G#54@#132@C[SWcgOg#115!8?HAGS_?a@_?A?YDASAj_BwgSOIDC`OoCAE?b?_?QoB@?@?@?_??GC?yGu??SG??GGS?CsGCQGAAIACY?IcPKQGDQGO?q?OcGOi@a?a@QoGBhWED?_O`D?O@!6?G#100!17?_#99_CLAK?D?A#115!19?G?CG?kG_OC!6?C__#126?G#116@!5?_#126???O??G#102!7?_?O?_#100!23?A?BADAC?_A?@#77!4?C?C?C?C$#192!18?O???_#193O#192!31?_??@#184??A#193??O?C!7?c?O??Cg?_?_G?G??A???A?a@CgP_OoCRSBTYSB??@o?AGHewVhUhUnWfWfWfWfWb[bsZOJGQaXHA@O_CHA?SAh?T?aCPaCgAGPc@S`CaPGPaGPCOCrCPMtGTaSiCiSGSgO_#237!37?@#239?C??C@??A!7?S!11?AgO!5?@?@???C??c@!5?OC??C???`???G?ATa#97!5?_#69C#125?g??_#119!13?cC??AOA?W?@_O@g?SGCA@_C?I!4?O#101!12?_#107!4?O#119!7?F?B?K@EAGO!6?@CDGADA?IeODVG`SKTDuAJDG?_D??__AoO?@??C?_#101???C!5?A!8?ISjSidYSGdI??Q??__QOhGE`SIc\QmzTzVA@?B#107???COa{A?KG!4?ACL?@O#73!6?GC?W???@A??@#113!34?C??G!4?G?CA$#184!75?G?cAO?@?ODACO?TG@GS?S?OIO!5?_?_?_???GAGS_O?O!5?G#237!128?@O!6?A??_?Od!4?c???A??C???OI!10?@??G??C!4?_G!6?c#119?A#127?O#143@?@?AC?QAO#69!7?@?@H?OCAoIDasBH?AG@QHGC?B??G?G@@?@!8?@!7?C?A?GFGA?G?C_#59!45?OA!5?_??G??O??C#111!45?_#118!4?oO_WMCA?IOYK?FA??A@@@??KC???oO??gHDA@?@$#196!81?C!4?_@A???A@_@G???AGDAG??G?C@gC_S?AGDaGDgUgE@OfWfWfWfWb[b[JCfcRcHCaSgEHQ??h??OA??H??G@?D?AG?G???C??C??_AG?GaO?a?G@?P@A`A@EHUhUhUhUhUhUqUhYEtHuHtEXvOmSrdLqMqlPk`Ky?}H_cW`[b[_G?Ca?a?Y?t?@A@A?O@A?ISHC?i??hI??PAGcXaWeHAOePA`GO??Ad\ti\A`B[#126!5?A@A@!4?C#107!28?A#103!4?OG!6?_?A!6?A???_AO?a?C?_??_???_??_??_???_??_#77!40?C!5?AA!6?DiS`O?C_O???C#121!37?_oo{!5?gC?A@A??BBQIiG\DKcJF?A$#77!365?A#118G??A!23?G?O!6?G??AC?K???@?W!4?_?_?AB???G?o?CK?eD?D??GA_??@!4?@#114!66?A!6?A#112!13?a??_GcOO!6?AC@??G$#121!395?DBE@@??BBA@@@?@!4?@C@?@???C???G?@??@#119!107?C_??Q!4?@$#132!400?A-#237~?~?~?~?~_nOLa\qCGaA@?h?_WC@GaWDOAGgC?PCAg@cQG@c?I@S?`G@SAH?C?`?@Qg@ISJODgFgR_EgTgDgTgFg?cA\a[`GO@O_@[?HCPeOcO?Cg@OC_I_A_@#105???G#137!13?gACHU_DI_??_c?A?Ga`SCaF?iAP?gCP?KE@CCaS@?GC@GC@?O?C?OAO?@?P?PCO?@O@?@UHUhUhUhCxAS`IS`IdGPiChAHAS?hAC#184???c?Q?C???O_PG@A`Q_@cApC?cAC@U?AGDJEDJsC`CEH??IC\AGOdQHOcA\AHQ_HCLA!4?_G#105O???@#49_!4?A#112?_??A_GF!8?@??C??@??_AO#102O!6?O?C?_sQMVHVvbZJN?NMKCJNv|KL^^MEAACFAEBBBAAB??!4@BFV{A??@_BGWqg#118!5?CO?_AMcQ\sYP?o_O_?@_A!4?O__???OO#107???_O_#77??@A?aBGeOkO???_?oO?gCOg??OoG?`AK`S#107??O??sWlUP#121?EAEKMFzUvwO}K?NG???_!4?ABLBDD#103?e?_OK]JmTG`M~MnDbHKpD??cY@TGrPIVjeDzFnNk||NV|RaPDnRNDrVdZ$#246?~?~?~?~?^?nOLaLzt\keRQnD`yuTLayltRPxmiXTUyHduYHtsijVQrihsUZhKUrmdV}t`sm_ToTGVwR?UOR?QOCI?W_OASRCQcGOA_O?G?G@?_?@K!9?_#105!21?O??ITI@GsDqCGAXOGoD?kEPAkAP_WQH?I_VaPIaPiCj?z?hChEwEgEgAhEgEgUg?_#192!36?_?H?A?C?_CG@I?H?I_AG@AG@?CA???O??GA?O?Gd!4?_A?_?A!4?_?C_Q?_???O???_#183A#217?O#37K#121K???_oSzSlUVGD???@?A@AG??@???AOs#114??oSoS?q@Ca??I?@#77?_??G?__S__bXc!4?_?_?OgS@GCGCC?C??_CaKqK!5?O???O#119!14?@H??@??DA?@A!4?@!4?O#101!16?`OKRHdQKdYcXqKItEhiU?}`MpfM|r]`#115!4?G??OgAR!9?AG??D#125_Of_PNTa??dWO#118_GwYHA#102?_O_?O??AO?_?OO??A??Q@!5?C!4?O?O?O???O_??G#115_O?_oICgA$#240!10?O??O#202???A?@?_???C@GAOD?AG!4?CaG@CAG@CAG@S?_??SAH?C?`???G#192???I?@GA??_???_???_C?P?A??G@?_???@c?@CA??A???A??a!4?P?C!5?C#96!23?OA?G?@O?a!4?P??C@??A???AO@??C??C??O?C#246!64?A!5?CO???H?SgC_Y_PgO_G?A@?G@CA??Q_OT?G?S_HO_OCHQ?HAC!5?F?L#218??G#38O#81b!5?G#126C@O#119?_?o???A@??C?A?CA?_[!8?G?G#101!5?C!8?OIOPOAO???_O_?ogSgQ_W?W?k?KsGyKqC_?__?O?O#69!19?H??@!8?@#102?CA?D?G?@?GD??POYn\F{YcWC__#72?A@AYdYELBdIPQD@^?M@EW#102O!4?@gaK`IdA@#118kkxpxpOO!4?@??A#127?a!7?_?_#112A[??dOL#111??_?C#108??BC@?@O?GCB?Gyd??sGaCIdGCPiCgO_Q?A_GAGDC#111I$#244!12?a#252!6?OGC?OI???_!5?CA?P#240!5?O#218???O#252!4?GC!4?_?Q?GCO#239!7?Q#184?GA???CG@gCG@G?_?dAC_G?G!5?G?@_P?OC?GO?@OCO#150!35?@!7?O!4?G!4?_?_?_???G#237!75?@O_O??O?O???@A!4?A?@?S?O!13?@!4?A!8?G??C!6?A#56@#119O#125GrLLA#73@?A#115!9?O`AgQS@yco]??G_JM`FGfLCoOVN?@?G???CC!9?GA@#59A??@#114?@@G??@!7?@!9?c@_RGDEH@YAtTGjfJH[OAcAGciOLIcLeUOKiHCaGACQkDA_HKi@!8?O#98!4?@??@!9?_#100@#103!8?I}VLrU@#111A#112!5?C?A??Ch?Ca??G#128?@G???GP_@W#126C??AA#112!17?C#111?oCA??Y@?A?G!4?G#101!5?@A#114!4?_??_O??o??Oc$#193!20?O?C??A#244!8?_!5?_!5?_?A#192!4?G#193C!4?_?Q?G!12?CG@???A!5?CO!5?CBKICA?Q_OAG@IHDP?OG_Q?O?[QgVGvIxB{b[b[b{bslROo_?XiONtI@IsGqDGAh?H_D?gAPAgAT?GAH?G_U_PIs@iOjCz?nChEoEgEgAhEoEgU_Eg?_!5?I?_AG_AG?Q?CO@CO_T?hQcHs@IPcHQ@SAcGPiPK?A?C?AC?@C?_O?GcP??_G???_?_?Q??OG?C??O???O??H!6?H_Q__!5?O#240C#63A#128?vKA#118!4?_???oI~~~{m[{O_HO!5?@!4?A?A#72!8?G#122!4?G!4?@#108???_#72!12?_O_o_OOwOGS?O???_#107OGAK!6?_?O_#59!27?H?A!6?A#134!17?_#119!35?G??`_???@C@B#73_???XM!4?A#107!4?_???_^F@@O?gSW!4?i?q?GoDG?cI_T?_O_O!12?COI??K??G?G$#192!21?G??O!10?C#193A#196!43?A???A??A?G!4?A??_@OG@C?GC?c?_Q_?_C?HdJkBgVGv?tA{B[b[b[B[JQClJUhE?dO?_S?@???OC??C?IOC?_?O?g?PC_OD?G??_?O?C!4?OAO?H?P?PCO?HO@?HO@UHUhUhUpE\hUThUtGviDyQlUgjUCXqJ}tIZclYjsZdM?cQw?K?y?G?IOPG?_?@G_O?O_?HAWPG_tQ_`AhALAKaLAl?cQCHQ?_OUlTIV?a?he#244_#132!4?_OLA#143?G?H#69!11?D?I?HE@`M@N?@??@!5?G?@#100!32?_#115?@!8?O???@?IKCCA??ECSGIfOG_U@_O??A?Ci?TAOPgI`O?_W_DQK@QgKCA@C??_#143!50?G#126??G???O#116!8?GUG#115!4?O???O?GA?_@A_?_?O$#239!86?_?P@??@???_??A?_?A_!4?AG?EA?J??C!137?C?@??`C?_A??O???C?C?A_??CA_??GD!4?_!9?_?C_O?@?I@G???CH#127!5?O#114!19?_#107_??G!5?C!7?A@!6?A#98!31?_#59!12?G!8?@#132!101?_OOCOE_Oa??C??_$#153!312?o?Q#103!30?O!6?_??G_??_?G_O?_o_Og?O_O?_!5?o??Q!4?@!4?@??G??@?B???GQKG?@_BcQG_o@C??hA_O??S?_???_!6?G?G?CO?sQ?D?H_Q_?@q_C??AWBcXEH?COG#140!57?C@O$#208!313?L?O#59!38?G??O?AH!7?C!4?C#52!160?G-#237~?~?~?~A{agQPGvGQc??h@C?_GS@A_O??HS?aS@HS_CiOD?gCA?HCQ?gDcAW@QG_HcAIpCiTaSJOLQcYDgU_TISIo?hOeO_L?^_V?I?J?T_UgQ?@AcH_I??Q?GA#137!13?AcGCHQ@a?_GA@A?_IA?DOI_cOOR?IA`O?GCaG@T?Y?O?SAG?GCG?c?H?aOAOHOA?Ca??ID??cPC@e@MPmPcHOdItAShAS`SHAOd?Q#184!5?gAOC_G?_?SH_O??A@A`EGCH?@??O?C?D?Wo!5?`a?oIWcI_TQgJScXcRidCY`KO???G?YAk@#203O#63O#48_#115WoG?SAHC?GC!6?`WeIXTpXGmCGUAG?a@?TPGk?aoGG#122??@#101A???[`U@oKagQtaTeHyBCHs?Bg?AHSBmPJsLq@]R?Wg_c_?OO#107!4?@I?A_?A?C!5?GG!5?_!13?O?_???C??_?GCG?K#101@?DG@A`A@CI?B@A@KB?b?BC?@NA@?AC#111???O#118!5?J^fN~{???B#126?S@#127GSh!7?G??@#112IP??@#108!5?@!9?C@CA?CA!4?@!4?@!6?CA???@#114cAPGAOCKQDcaO$#246?~?~?~?|B\BkaRGvlZ|SUyjLTri}SFjxUqj\KiuqJ\xDmyVPj[UqhlUQyHle}dRZqX|SMYPiLhsfqlHdOR`LIo`TCZSeHH@Oa??G_S@S_A?H??c?O!4?P#105!18?O??_?_GOKR?_GSHU@SgQ?dPIDgC_T?KAtAX?U_I_D`I`G`?Q`Q`QHOeOL?l?e?lOHOL_?OiPI?iOGO_#192!34?A!4?A?C_?G!4?O??O?C?h?g???CGCAOC??C??@C??C!4?A?C??_!7?Qd?OA#217?_#83G#59@#119aG#118okapoXuAzV^Fb~}A`X_AGA_?PZt!4?C??AC!5?O#77!4?C???_]@kGqKQcITIPqD?@#99!4?CG_#53??C???G#103!4?CCAAI@HLE`bIO_??CgDq?h?AGCO`A?dAGPABO@AOHAG?G?SIG@GOK@c?e?KRAQ_t?WA?AkOKGy_`KGcGA`s?CSgYSU?WuxCJBSjC??O_O#114??Wo#119?B~??K#125??GujOeW_@BAE@GF_#118oA#102?gSAHOaHO??@?IRCgPAc#112???o?W?SgKOG?gOGSG?gO?O#115?O?O?W?A@H_?CQ?HB$#240!10?O??C#252!4?AG?COAG?@?g?CA`??A#218!5?A!5?A#202O`GCQ?hC?A?@?G_?CA?`#192?_C?OA?G??Q?_C?O??I_!4?OAC???@!13?C?O?C?AG?a?G#96!26?_G??@?G??O?A?G??O?G?a?@O?G!8?C!7?O??G!4?a!6?C#239!48?A?C!6?O??O???g?G???CGC?AC?I!4?C!6?CAGD??`GOdI!8?@#97C#72[#69C#125@@#114OGCA_Gs?g!4?@[A?T_?CAO!4?C??@???ieR{?C?O#100???@#59!7?A#72!6?_???{iQJtSRd[ahWPms?OG[__#102G?COQQQ_I[sl^}pr#118??G?O?hA@KA??O_CG?CGCCgog_AUb?_Ca?CA?O_?G#59!4?O?O#77??ADQlQdCHCBCADKQ?A?aC@BG?D#108???O#121!16?~Zo~j#132u@!9?CD?Q#103?_T?AlubDOac???_CzDiOGpCw@WaS@C_GOhQgOJDHVhPHPnQmYdmPkaO@_G@#107C$#244!10?C@G_#202!5?`???_?C???O!6?@#252!13?@!4?@?O!4?C#193C!5?@#184!10?I?GA_D??G_?H?_??H?S?A?A?H?S?Q???@?A?_#150!38?_!9?_?CA@!7?C?A!8?A#237!70?@Q?DG?@!4?S?D?O_GO???`O?_?PCG???H?C!4?_!8?O!8?@#77A#81@#112C#121EB@!4?@???_#107!4?C???_?C!6?@#59!8?@#107?GC??@??{#98!18?Oc?Ig?Q@SA_!9?_#114C??G#59??H!9?A#102!35?AA@??GCHFIbe|wo???O?QOooWo_??{WGO??_?_GEx?[AOgRKAC#112!9?c#128!6?EX_T?_sg??g#107??CiU_??GGCKOZE~T!5?OIpEIdDIgRAFeEDEb_qu?EI_k?K$#218!12?C#193!6?A???OA!4?G?C#244G??_?@G!5?@?g???_#192!7?O#193!29?@CA!5?O???G`O?S?A?@CGQ_H?UOch@k@S`VgVkP~~~nv~zHPrQoKSLRCrKsHS@sGQ?DOI@aC_T?GAg?S?T_I_D_GdG`SRkQ`SHOeOl?lOe?lOl?KqLoITI?iOIOgO_??I?CO??S@?S@GAOcHQcGRcZ?dQGdQGcPGcHuGdGP?Q??H??C_?H?a!4?D?C?@?O??@I?_A???_??_?O_@??I?C?@I?LjCO!5?A#132??A#107???GC#103A@#119???_W[#103!6?CAG?b???g?qG!8?PB_cIU}?AAGB?gQD@PCG?G?GC#77!16?BaDa@GR_PD?C_#115?C?@A??C?TGDSAhCOgAOdQGDQaSGeOhE?DQP`G_Da?DBOWHGWF@_o#108!19?O#114?G!5?_?O#116!31?DGI[?O_OO#115??G?@???CO_?JcG??g?AChA#118!6?_??O_?O!8?_???_!4?cOCJqH_YOk$#192!28?@#240!4?C??O??C_?AO???C#196!40?A!5?WaC_I_S?K_A_H_CgRcGQcH@IOcRShUgVgRm???OG?CcICHE@a?_GCPA_A??`CGa?C?G@GA_T?@?_?G?C?Q?Q?SAGc@?GAc?H?A?A?@OA?AO@?QD_?_PC@c@E@MPmPujItIhiUhiUheXeGZdkZc~YDtIhVRmTZa?VGvg\gsKoQpaISaCH?Q?Q_A@IoAhEGOC@C@?O@I?T?HA?G?O?P??A?taS`I@_OY#240C#116_#102!26?C!4?wCv!7?AK?BBtg?w@|v!7?@@#134!28?@#114!13?G?O?hCQOdQ`KOdAW`ChO@iO@EODk?SJOPKqG`e?P?oQC@_#72!21?@#53?@#115?_!8?_@C@?A_GaS_#140!15?AAs?G?O#142_#111!6?GO???A!8?O!4?G@???@A???@???C#102!6?CA?@?@$#239!93?CA!5?@?_??G???@?G!6?C#246!143?_A?CiCj?j?Q?ADA`Ap?G?GP??_Q`Y?_AOaH?O??OI?U_!6?_G@_A#121!29?_!6?oc#59!139?G#107?_!4?_?g?AkpLRL_#73!20?@#121@?A??D#118!12?o$#105!312?C??C#244G#119!30?A!4?GMHg?P#126!176?A??K$#153!313?C#112!34?@#69@??O?Q$#191!313?@-#237~?~?~?~?{QdYdYdY`SHSGc?J_AK@aPOGbSHQcHQdGTaSHQdGCPCA?gAOD??QGd?WdItAtIPiSbYDgUk@sATGRK@iOiUHe?e?R_Qc?JSHu?jOdAHAgAC!5?@C?@#137!10?g?O?gC?C_CQG?WCrOIGcQ@PGi_??A@P@cCAOHCc?O??`?GC@??_K_ICH???ICgA??O_?O???c?Q_IPcOcHQlOdIOdY`IcHQcHaPC_I?d?G#105Pa#184?O??ShAc?DA?CHO?GO@_A?G?GCh?DA?G@GAK_GOgPaPA@?As?^?l?QgTqLOIOd?S?C???IGC#204_C#114OH!4?A@?K??F#69!4?O#114!8?@G???Q!4?oOwsA?doE`X?A#101G???oChS?AGskJqKrMPhqUBCB?OGSGcq`i@xCyCyU`UHUGE?A#115?O?G?CK?AJ?AF`qgOEWOOPpGOAGGCoCAOc@OI_GCPGF?cQ@ohDO?IKQsIaWOI?gO?_??[GcA?kEA?CAAD@?OC??I?OGASUCIE@??@#119_}~#121~jhUDo???_!9?CGO#115A???QoXAHFO?`GO!4?P?G#119!6?_Gs?O#115!18?@C?@CG@#119?o$#246?~?~?~?|BlQdYdYd]juavX{SNdq]Kebp[julZulYvi\julYvxmX[UTliyVLcQYnbYOIlGteThKcyR?@qAkGrcQoCLP?sPlXTkZCHQc?a?HOCGOcO#105!22?@AC?@QhQH??dI`H?C`PAGkaCPCJsGcICQhODaOHbCjOKQ`QgUHQ@??_?Ql?_?@OcI@IC@cHQ?H?C???A#192!30?A!5?G?O?_??A_?A?G??_A??A?OA?AO?O@?@C?C??Gc?A!4?g?AG???_?O!6?_#153?@@#240OB#35A#69O#119E?PG??_@?__o{{]Kmb?E_?_?_!6?_??CI??GCAG#103G??\Pc_xPK@?iSD_A#98!7?C?@_W?C@_?_Q?K??CA?@#102???@?__owkLFrqqaq`?oO?W!7?C#119!13?A?OG?A#102!15?@?@C@??ACAR}BAA?G!5?@@???@?@A???CB#114!7?OHC#126!5?AhY?o?OO!9?A#118BC{!6?O_WfWA_!9?Y?HWcX_IWdO_W_IOc?_?IDgSqHgS_PcypUi~N$#239!7?A#244??G#193!8?@!5?O!5?C#202!16?A?A@_A?D???Hc?OC#193!13?@!4?_??_!7?O?G?CH?G!4?O???G?_OS`iTgiSsAhmOnOnOn~}vjETJlQhQHQhdQc??C`OAGCQCP?I_?cA?Q?ODAOHOC_OGQdQGUHSHOPtQsHQlOROlYdITJcZuHZCL?@CAHA!4?G@c??CP?c@GAOcHQcHQGbG?Sh?ShExAtAhEHSGC?GOD_QDG?@Sg???C?c@??c??A???AO!11?A!9?G@O#105?_#17?_#40_#77A#121h?_owO!6?B@_??[?O#103!5?B???C@#69?_???B??G#107!7?@AE#72_!9?OLRKogAH_[aKrkRgVHKQTUAhDyDG[GC?A#114!4?_??G??KO?DG?E@CGoAKbGEo@gOaOMPgDQGd?C@OgAoM@gCDQ?M_T_L?sC?__Q?i?G??_?Gs?O@gE_?COG#121??_OG#111???C#73!15?S??G?_G??_#116?AThAYQ#141O#112CG!6?_??_GFO!7?OaC`C_AQCB?bGAD?T_HODYC_O?@$#192!19?G??A!5?@?G#252!19?_?H?O??gQ?@#184!16?GQ?G?AC??G?a?gAG??_??_???GO?_?`A@???_A?_??_#150!27?A??G??@!6?SAOG?G??_???A?ICA!5?_??A#237!70?@O?@!6?C_?@?DO@G?GaG?GOgPAP!6?G???O??O!7?A@?A#208??O#244?G#49G#101C#112OO???_!7?A?_O#102!13?A@???_!8?__kQ[?MBA??gW#108?@#99!12?oGA?B!5?G#103!8?_?OGCPqGK@DH@Ok?iT_WKPEGcA?e?E_?eCa??@g@S?d@C`Cd?_O@oGCW?I?B_I?WAM@LP@|?@K?cR@jAO@@A?@??aM?@@o[J?D??A???A#132!9?_FC[e?oO!7?@o#107B@j]{kGCKC??_GDIsgWsmKPG?YU@G?C@CADYeGSaIw?x?IAg?O??G?A$#252!21?A@?O??_?GC#193!20?_#192!6?_!6?d?OA?G?AO@?C_?C?P??G@AO?C@??A?A!6?@C?A!6?D?G??A?@?O#96!25?C_???C???GA!4?@??_?A?G?_?O!5?C!4?C#239!73?C?_Q?G???I?CA??A?AO??@?@C!4?Ac?A!4?g?AG???_?O_KokOG_???O#63C#132_#115?A?@!4?G!6?A??U??dHaCSHChHoGE?GC?HpA?D_KA???@#77???wU@B_VGRc?_?@EOCG?@#48???C#100???@!8?@#107!11?C?O?A@??_!8?G?G!7?AO???G!7?OA?G!4?C_O??@?@??_C??C?o!4?S!9?O@ICA@b??OJHHD@#125!13?J@@MILy?gCG?G#119??_#103?S?A?B?_Q!4?QdAD???BCRC@?C@!7?@A@C@ADAD?TAHASBS?O$#202!23?_?G@?O??A#239!47?G@!5?C@#196!11?Qd?a?H?CGOcQKAH?TI?TAIhEOnOnOnO?@GSOg_QC?C_CQG?P?QGAC_O`??_CP?H?Oc?H?G_CA?G@?d?G?`??a?_M?HAc?QDgE?@Oc?oI??c?q_ZsiXcXulQnQsJYdYcZQkRsLIqLPuGvSe\jE|jAOCXAwCxQaehReCGPC_U`OA?OgDo!4?Q?A??GcGsH?H?_?Q?D!4?_D?I?@aHQfS@CIF#96?@#118??kMEDM^qv^WN??@@@?hh^YU\Y_uzU_?O?_??CACpWAPQCA#77!35?_?O???_A_QHD@B#118!10?C!5?A`@@`???@MT@PH@gCAG_A?QqGAOG@GCAA?a`P!6?_?O!8?O!4?gSwW{wiuK_O?oC?_og?_Oog}luy^@#127!8?A?@C!8?G#102!4?`?@CA!8?HQdI$#239!101?O???C?A???@??O??T?G??O#246!137?G?C`Q@O??Og?g?s@c@CQcA??Gc??X?|?v?V?D_D_NON?nIP!4?Cq?G#107!4?@#59!28?C?@#73?@#59!121?C#101!7?@#77@#59???@#112!11?gC!5?_?_?O!8?S#128!8?@AD{AQtcC_#111!5?@#108???@#114!4?C!7?_?_?_?_?AO???g!9?O_??CcBgAiHCI`S$#107!348?GE#121G]A@#140!177?@???@_#111!20?A#108@$#112!350?O@#129!184?@-#237~ONwVg^_~Wf{IlqMohE|IsloOgSylOy?O`QDoDqChQK`IT_TiPiDgFWbGD?I@?CaSHu?uHQLOeXaLoEXaG_HQC@U_ITIPkAtISjQhQgRA@AS_DWAC_S?A_G@C?OC#137!10?i?TGQ_???G??A@_?cSOAGGCGA??PgAPH?cAG@@_GCA`?_Og???gCGQcGQCO??Q?GO??_A?@a?@QcHQcIOdItGaHQcJOiChAS`SASgDO?c@G!6?C#184@!5?A?@???_CQ@OI?@??_A_Qc@KBCRK@JO@?_?IDGDY?OdOcBcJuHO??@skOOA#208?@#203U#35@#40A#73@O?G#118!6?@!9?G_O?o?OGAABJI`?_??G_C???A#77_WG?C?@A@?oMOdKoFXaTG!5?_#53!10?G#77?C?A@AXOJdAkQCASG#114aO?_O??OE?@@A@?_OHgPGEPaH_SBgQI?cOC_Qc??{BoGCAr_KaWAsKdHGcAOdA`GC@?C@??A?A#126??_#103!6?A#73??_#114??D!4?A#126!6?_??gQDoHQ_GS!8?EO#118GYskyT?gDAP?o??G?Ok_qXws{x}l|ULIKV{mWdW_Wi@zcrC?XUmlUhnUDnF#121C$#246?FoF_V?V?bGA@QCPJEwAPJAJdPaCAjDzjEdyNiLzUDr]ta^ITeSYRweSvy\SmjX\jqHlHucqjHeSQIgeSV\ucz{hHPi_eAXG`@?C?C@CgSgB?A?@??@#105!24?DQlQ@QcGSJAH@gDsBOdOlEcAOcASHOdQKQ@qGSIDA@SiTAP_??@?`AcH?cA@ISHSGSGSG!33?A!5?O#239!9?G@!5?AT_GC_?GA?@???Q???O??_?I???O!5?@?G_???gGA@A???OG#217@#37A#59O#125u__O#115!14?A@??A???BCH???`[{BQGdCQJ?A@!6?_#72!7?A@!4?qJuPlRKIxUSJexNRu`hPXckcA?C#102?O?@@h_@CIEC`_O_o{KSCEI#107!9?A!8?_!7?G@!10?OG?@G???DA@#112!9?_!4?G?_DA?OA?O@A??A?@!7?D#125C??oG???C?DJS@A?OK#115??CD??@?iDOOGeG?GecL?S??C#119!4?OAhQDBGAOcY_Y_Oo?OG_??_?O_?O?gOwz$#192?G??G?_??CO?c??_??@?c?O???G@O!4?O???O???G!5?_?G@_C?@G!9?C?Q??H?CO?H_?P?G_??G?A?AC?@G?_ASGOG?gO#239!5?G?_?O!9?@#150!19?_!5?O?A???@?`?_OG?C@!15?CA@#192!62?@?A!4?@!4?G?AG@???C_?S_AGOC@?A??g??O??c?I???O!5?@?GO???_!6?G#240???g#38O#77@#128G#112B!8?A??A?H?g?Q?D?A@!5?S#114??A?WdQQH`SJS?A??O?K?_C#98!11?C?Ga?g@?A`GO??_G?A?A?O?GC#103_?YG@?gS@uPdHBEP@KGAAIHGTAb?AGTGC@?H?C??OCAAOE_AcP?s?o?CCA?@A?@??AO??A!5?A#107!17?@#73!19?@???@O??@_#116__@sXAG@#112??B!6?A#102!7?@??A#112??_AGBC!4?_O_?@?@?BCBC?C??IS_#103?@?@$#193?_#184!5?G!6?G#193?CO!5?C?A???C??C?G#184!6?_???G#202!12?A@??a#184!14?C??@???@???O_?S?PC??AC`A?A?@A!6?A!4?A!5?@#96!22?@_??O?A??C?A??@???G?_A???_?C?@??O!5?C#246!72?_!5?_???A?H?D?GOgPg??Qc?cQHOcPa@a@eHAgA?@??aDBQC??C_?B#52??_#102G#121?KA@JbNtN^K}n[~u{S{gpQc{M[Caogg#102???A??@!4?__GCDA?OQGGwKA@#99!12?O??C#115!29?_OGEAB@@_?oo_LCQDa?pIWCAHO@k?I?G_GCP?e@?E@o?GDaC`GA?O?A@H???CA@?B???@!8?@!4?@?C???C#132!13?AG?CAG?_?A!6?o_#107???@B?A@O?GA@ADB?@A@BKC@???@A!8?A!4?@I?J?@?AHO??O$#239!11?@O?@#252!9?IC@!4?C?G!24?_?OC#239!15?@#193!4?A#239!5?C#193!8?_??C@C?SgTgDoAsGRAiXSDqgZcIpMpMpM~~~i?TGalQlQDQlQcICh?gDOAOA?HA_A?gAcHOdQKODqGSIdI@OiTIPaT_JS`YdZclQdItJShcISheG??DO?DO???H_CO?DOA?S@Ga?HAOdIOIcHsIsGs`[b[cYdWf?T???_CQ@?I?@???@??O_O!4?cA?O@Oc???cGCG!6?CG!5?_#56!5?G#103_#119??@!8?@?@??BB?CAG@??b?PC@?S#107??@??_#101!6?oO?CMB@A@A`KoNY`IOc\i@s@KACQpCGbcXEOcHSUgeHQP_No?dQkQ?I?G!5?_#102!26?CA#119?@#77?A#121!24?_!6?CwoOowWwo{NaosM[Og___os__{?o{_{^yyTdIAcd^QJ!8?Xno_#103I?C???A@cG@Io?Q???@#121!10?_O_$#193!59?_?O#196!38?O??g!4?QGDG`CgTcHqKRcIoMpMpMp???TTiaT?G??Gc?HO??S?A?g?_GOC?OGPC?OA?G?_AG?@_?O?gC??_?GALOaK?G?Q?HOc?_A?R_@AOdZugJtiItIvSUhJsiDxUhiUH|aTiItJsRsJtIvHIa[bYdYdWuA{f[RgK_?T_YCT?G?G!5?_???GAC@?Oa??@a?AGO!4?AScWA@IDtKu#142?C#114C#126??[aSS?IO_O?O_#69!4?@?C?G@??g??S?_S#103??CGC?QG_SHCHap_g_SS?Q@?_?OCgA#107!39?OG!6?O_#119!51?OOo__ckgC?GGCEEB???CG__??OOO??GO?_GBRB#128!12?WOiIC@?A#114!5?O?gS?gc?OCoCOG_OG?A?B?A!9?@??C@C?C??COjC??AGE?hQ$#192!113?G#237!145?OAG@?G!4?OA_OcACAC@k@I?H?C???GCG?O?OCOcASHO???_GO@AG_#132!7?C_Go?_?_#122!37?@#118!56?GK!8?OGcOCa?_CoSagU@dpX@HPGGXGA?GEJx?WPWCtGbAscQslYwWCiK[ZYRQ@NDFB@@CAOWH??@JFMGJNHVKB^F?K#127!14?C!4?_$#183!305?@#38!228?_#129CF$#74!535?O$#142!535?G$#145!535?_-#237^snQ|bLJuLrKXvILvIp^pnWvwfwNyfKrGqHQHQk@iShSHQhU_UHcHEPiS`QgQHC?DaCJ_LQdIpKQ`ShQHC?dQH_ISbSGO_@ASaAH?H?pAp?xA|?TG_I_???G?c?O#137!9?_I?TIPCOG@G?_??@C_CQI@DCCACP?WAAHA?W?D_H?C?cOA?C_X???P!4?O???A?HO??O_A?_A@iChAS`IOdIT_DiOIPcIOdIOdI?iD?I?D!7?D#184!8?@A??C?AC?_?GE@EPAP_PiOk@c?COi?C?GOgWcGCG?OgO?TgC?CgS`GsG#96?O#203G#50o#59A#121o?g_A???GpItaLq~Q~j\~ni^t{On~T~_O_o#103!4?XC@D_AH?Da?SaIoCQ{PZOD?Q_O?_!6?G#53?@!5?C!6?C#103?GA???RGG@CF_Ad@hCGQ@_s?eDWCG?MGCAHCAGCAO@?C?GC?E@C?COAK?CPA@?@#119!5?_oO]IG@@?N#143!5?C???C#73??A??A???A?C!6?A#119!6?A#116???o??OgIOfdC@Bg[MEg#121A@No_#112_#114IHaK?dOIoT@i?O#112?GCA_GaHOk@CHQDI?O!8?C@#107@!5?A$#193_!4?GO_?O?a???_#184!4?A?@#193!6?O#184!8?A!16?@#202@?G?@C??_?O_#184@!7?A_?_!4?_O???C???O?@_C?A??@?O#239!11?C?A?@#105!18?_ACaCPCJcIOJh?cOiOHoI?e@cWcPcB_Y?U_Z?J?LoJ?E_ZcICOdI?iChOc?AhAC@ODG#192!50?CO?H??O?G?A?O?_?c?I!5?G?i???G!4?A?A_?_C?D_?AO!4?CA?@#105?I#240@#52@#114x#132H_?UPGGgdGd??O#143@?G??a!9?i#112?C#114??@@GAtCAg??GoDQO?iD!6?_#72!5?DAN?Oh?ABa_SyDQIhQGFpKHyO??_GC#59??@#102!4?DDYuUqv`{Q?OWW?G?O#119_o_?O??O#107!9?@#119!4?G#121!17?__sQ}{oO~r~l~bLqnJUpKPcWjREGBHAi|LBcG}B?J?D|Gp??OP?@?C#140O??C?Oa#130_#52G#127O#132_KO#118L\^To??_QAdCGiOun|vz\VBTAA!7?@@ADADIQlQhSaXsHUItHVGQ$#192?AO!4?C??G??G?A?@?_G?_G?O?_D???_G?@?G?_??S??H??Q???C??O???O!6?A?G?C?`G??O??H??C?@?G?AOG!5?AO@?G???@?O!6?O@#184?_#150!30?O!8?_??_??A!5?C!15?C#239!72?c?O?_G??@?A@?OC?c!7?G?G!8?A??_??C!5?TaS??C?A@#244?E#55C#115C#73A!4?@!6?G#112???_#118!4?OD?I@lO???P?T?iutGA_?_?oC_gG_#101!5?@?A?CGQGFIT?}hUhTsDZGDOhTUhfWCrcDjyDWpAl?ePuGO?O#107?G???GAD!6?O#112!44?c!7?Q#132??o?OO_GOcY`OKo`GA?T???W!5?Ca!5?@?A??I#38?G???C??O#126?@Q#119?AA?_#103CGaK?D?A!5?A#119??_GS?S@A?O??G?eIdYtiTlQlOiSaHug`Gcgt`x$#246?@?L?SaOGaCPe?dOGoM?COE?FGFO?GrKVDukudP]TjAjucUhLhuZqxmCi]dFkqznI\hSUqhYSErlKJUCuzjYKeVthGbulJuKH@KoEoEGCGE!5?A#96!36?_?Q?@???A?@?G??@??G!7?_!5?O#237!77?A?@??O?G?_C@AP?PiOGOc?COa?G?G?GOcGCG??gO?T_Ta?G?g??G?G?o#116A#125?C^@GcuuRA#115!13?O_!7?AhAAS@GA_XSOOCAY?@^@Oo!4?_#98!9?@!7?_?iC!5?A?O#114!4?@!6?GO!6?@!4?@I@?EO?I?DAGCAGC`OL_E?iC@cPK?CQ?kBSGA?CQcWDGaE??A?@#126!4?_?K???WAL?_HE`I@CC??SC?D?AqKAC?C@CJO?D?O@KA@#142!5?GW???O#73??O#115!6?ASORGg?HAOCH#121!6?_G_kP}JelQdWcW_GO_#114???A?GCA?@#121S?Q?AKE$#184?G??A???@#196!5?O??C#252!45?O#193O!17?O!8?@ACGO?GoCpEWEgCHES?eI_FOSJyTdQIXFiTiTiTn~~Y?ta`cYdaSrKRcJ_IS?dOiOH_HOcPcOcOgQ_Z?U_Z?Z?LoJoE?Z_IcZdYdiTjSlOelQlJSlYTKy???T?G@c?O?AOC?PC?PC?PC?ODOaGTaWaTgF{@u?~?~?~?~PaH??_K?AD?_DGAG!5?C@A?A@??CPa?c?A??O?T?@A!12?_?c#128?G#126???U@G?@?OEOITaK?D?S#119!6?A!5?GAGC#102!6?AIC!7?GDNzk???Aq_#100!30?C#99G#108!8?G#115???G?C?GId?a@AD_OAGSaGCAWc?QG@C?IG_AI@@DO_J?K?A?A_IC??A#125!26?_G?ooG???O?P?G]oOG?AMlMakKQ`@??@!5?@@K__#107!5?@@???O?_C@#126!13?_O?_O$#196???_#239!91?_#196!6?_??A_?hAX_TGcJODgQkPegTiTiTiO??DtIGSI@GPG?aGO?S@??G?C?AOC?I??H?AC@?C_H?C_COa?C?H_C?P?_I?OD?OA?JO?CO_I?_ApCTzUgjUsJYdi\iPnciZcjYcjYdyDWv_\a\iVwB}Hy?~?~?~?mW?~cZQdx_YTo?o?_G?C!4?O?O?@???PA@C@?@A?A???A??@iPA@Y_BS?@#127!10?C#69!18?A!5?C?G#77!8?A@#119???C#77!7?BKCh?LdW_gO?E?UgGOCA???_??O_G?A??DqCApQkOe?bgY_#118!12?_`aD@?P`?pp`AHaKpyProQGopy_i@O_r_|wlWFor\x\NL@?@?AN#112!19?@!8?@?@#129!12?_!4?O!6?_$#246!264?AC???G?G?I?C@e@IPa@CPePePe@?P_PA\A@iGI?G??@A?P??u#101!47?@#127!145?o!5?_?o_?_??O?A#136!9?o_?A$#107!360?G#128!149?_!9?_!6?CS_GAAA{?@@?E$#145!535?@-#237jYsJStgRelOvG~?Ud]h^cZb{BKzNsJYdXcZ?ZcHqHqChQLQcYd?Ag@UGUgDq@GQ@OGaS?IPcHeGrKPiTAg?eOjCOCgODG@UhQcZ_HYdQ?ADQdGrCa?O?h???aG?O#137!9?S`?TIOcI@?G?c@??`O!5?GAGcG@O@OH?@OH?C?H?HAO@OAGO?BO?cO??O?H?cG?_?@?C@OAc?IT_TAShAS`IOdIOdIOdIOdIOaCG@S#184!19?hO?`??_AH_DAhUgEK?C@?qCq?k?V?D?g?G?d?@?B?R?t?B?D??AOBkAO#240?W#0O#125@_?w???@W??A#112!7?iCAG#143???G??QG?CGo#112??G#115CG???@?@??GC_CCaO?o?_#101!5?_T?CZkqDgQ|@SIGtItLqM@fgU`eYkTIEGZegPAo__#107???C@G!4?GC#119O??_???O!7?E!7?_!8?BB??WwCA?A`C?G#126?C??OiS`ACPHa@!4?A?C@A?@#116???_??g}?o?|w?s_wOG?NKK?N@]@!8?G#121Gw_D~Zm[O#103?QCOg#119!4?AF?OD#126!5?_U|MtkU~gcg!4?_O_O$#193S?A_GACGOAG???Tg!8?g!4?_#252!21?G!8?G??C#193C#240???A#192???C?aG?a!4?c?AC??GO??@C???Q_HOdO??@#239!9?C#105!22?@??Oc@Q?GuHCIdQhSaS`O@QcIcAcQkAcQhQcQc?kAk@cBcGcJ?@cHAc?Q?APICgQ_G#192!53?A?C?@C#237@C?A?S`CHAC@?O?q?c?e?T?G???h?D?@?B?p?d?P?C??A???g?_A#81oC#126?ADOkC?Gc?E@_It#118???_?`S!4?_!8?BrCE@y}Ea`^rhH_GD#59???A#77!7?IdYcQLqDlA!8?@?A?@???@B?CHAcXUAt?O?_#118!8?@A@?AOC_[SMCG]C_RMhRvdEFabP|Wy[zXNV{kbUfCrpRpOGG#143!5?D??C#125?OG?OWggc]gKhUkQMpD{AWgB?TLg?D~@YCIBv_@A???_#136?{g@??_C#126??_?W??cO#118AcwcrESh}i~\W^NG#143!8?OA@G#132?O#119@A\qlOMBEHUjUPMNnnNfBBB$#246?C@O_GAcGOFGr?i@W`A_P?[@Sq?o@OcGaZCucZQLcLzUCqlHdQ~TV}ht`VYGevkybTHjttmZqXTCr?T?|VYPl?znaDnyuQ_C?G?Uc??GdW_G!5?GA#96!34?O!5?G??C!5?G???G!7?O!6?@#239!74?i??A#192!11?@?O!5?A?_?g?@?`?G?i?S?c???S?g???_??G#90???_#49K#121ANDAm@O??Rgpi]tI~~TBPAAx~v~^hu|zvN~~s??ww??_#103!5?C@@WAuA_?a?PkPI_Y`???GQ#98???I?c!6?_!4?O???_O#103D???K?FATP`QP?`U_S_?oHK`A??_`?o?AP_!4?O_???G???A#121!10?GKKKIrvr~jz~iTBITj?s@CADA@?@!10?E!4?B!5?@#140_!7?A!5?@!4?O#125RD#132Ey#119??@#115@AD???@Q?@??_#121_?_ZtivWNhA`GQ_?FYTaLQmPkWcgS_K_O?O_Ws{{$#184?_GC??O?@?_!7?O?G??A?@??G!5?_???C?A???_!4?G!9?C#202??@?GaS?G#184!8?G?i!5?O!8?HQg@C???A???A!6?_?OC#150!33?CGCA?@#246!104?O??O??O!5?o?yCjCH?Z?W?I?V?}?U?q?S?g?I?Y?i?AOl?[Bs@?E#96G#140A#132G???@AieRGTGS@#119!5?Gc?gA#132!4?C@A#119!6?Go?EC?W[[_#107???O!5?GDG#72!9?@!5?}`tQItAaKp[WQh]HC?iP_O??@_#102GGHGK]kg{EG!9?@@@#107!5?G!7?OGO#103!17?_#112?C??C?OC#73???g!4?AG!7?A#112!9?@#126!4?C!4?@A#129?o??OoCOG?O???AN@?@_#73C#127A@#112!4?_G!12?_QcITGfO!5?@!7?@!6?G_!6?G$#196?@#192??@!7?C???A?C?A_!4?C?A?@OC??H??_?O???H??Q!7?AG?_@O#239!16?C#193!4?@G!4?@A???_??D???A??CYcWdGQCXGTdiQUdYTCrNcZcZcZc~UAG]I`eHokRu@YcHUG`O@SiS`[@QcIcQcQkQcQhQcQdQcBk@sBkQcJOJeXelQuHQtITiUgZaMgPZ_?GA_H?OAG`CO@CO@CO@CO@cHQ`SIPmONoMPkRcXeHsJsJsJSg@OI_W?aPG_AG?O?g?ACH?C?P?G?A?S?S?A?O???G?I???A???G?O?A??C#73?Oo???O??c#115!10?O??@#114!15?@??@?@?A?CQQIo?l?CO#100!20?@#53??GO!4?C???_O#99???_#114!6?C?A???A???aIsAC`IHC_G?yD@XC?O?KGIHGTKAAd@`CaOg?OK`?B#132!15?Og?e?CADQP?DA??@@???A@F!4?AO!4?C#149!5?_#142?x_C?kAO?W?ABM#114!9?@AHGhAC@S?_#118!26?@A@?@AP_O?O$#239!4?A?@!14?C!7?C?A#202!19?_#239!36?O!4?G#196!8?G`!4?QdGaTAG@?hYdGrK_ZcZcZcZ?hhU`_SGQDAG?k@Q?_A?Ag?@?A?aG@O@G@?@?@?C?H?G?H?OAGO?GO?cOGAO?H?cH?c?P?D?S`TIcTiVg\aUlhUSjIsjIsjIsjIsJShUi`mPnoNpmRkZeXuJsJsJsADSId[BkOM_\??R_@Q?g???H!5?O?A?A?O?C?g!5?g?O?D?D??@Cw@#244@#69?@#119??w#127???@#69!12?GS?C#103!14?A#107@#102!11?A??HHDYT~mRmT#115!39?A??@A?O`^HS@GaOC?IAA?@A__AK`O???O_??C?AC??C_???OG#127!23?_O???OO?GOc?I_@C?O!5?A??I??DCG??@#130A?_!6?O$#239!282?@?_?_?@???G?i?S?C???C?xiO?_???F#121!122?OO!11?_#141!45?G???O#38!29?O?A@??C#165_??O$#128!495?_?_?_?GoCY?W_?S@i???A!7?OA!4?@!9?F$#152!532?FG_?[__$#144!533?E???O$#145!533?o???G-#237lReXfI|Vg~SzkVylUj[ujLvi[a[ax]`]`GqLQcHU_UhCQdIoISbWChU`Y@YcBGAD_H?_GPiSHe?G@?XATIPMOeXAPAPk@kRcPgRkPhQlAl?U_EGUGTaGC@GAc?A#137!10?i?ChQd?@?@O@S@??_cAI?A?a?QGOGD?_?A?H??I?R?QE?D_C??OG?CGO!4?@?CG?cGAc??c?CHQdGcP?Ga?Ch?Q?CO@c?I?S@gA?HOA#192!19?A!5?A!5?c??C_?@C_I?S@G?I_?_G?A???O?G?A?C???Q_@Ci?AG#105?@#204C#14C#59A#128_O!4?O#112!7?D?SJKBO?G?O!4?OID?AO?dO??GA#115??_?CQ?g?S@HTAA@#101_?W??}GoGvYh~^q\u?b|NYH@gxTIC?GEhEW`CPKADYAtOKpOh_WoGoGog?__#107???_??C@??A???@#119A?O!4?C???EA?_G?KaAAAaD??_O#73O???AG#127!7?@?_@CCOBG???C#140!6?oCOGC??AA?@@?@A!4?@!9?C#73g?G??QE?I#118?@NSqhJVJ^g[B?W#126??I_?CpItAK`W?sJadGV?~?~@yDqC#119?R?gOC$#193Q?G?O#184???@?_??_?O#193??@??_!4?@C#184!9?O!5?G#193!7?@#202!10?@?G???@!8?O#193!10?cG!5?GAC??AC!6?P???PaGDqicPWJwTiTiTiTi~j@SrQDWeYcIcYaSjCH?cOl?l?l?dG_ITISlQcHu?m?l?GAWBwB{bUhRcjTiTiUgRu@ZoDYtIXeXq??_QChQ@Si?TGdQHcPI`SHaSHaSGdIpMpMpNoNoNoLa\a\a\`?i?T?G_?cG!5?@G!8?_??S?A@O_G?C?C`O_??Q`??G?O!4?A#217H#16@#69`#49Rc??O#119!11?AS_WACB??O#73?@???A#119!5?CC??GI!6?@#59!6?_#102WS\B^s?@?B#100??C!5?HO???!4C???aA#48!4?A#77!6?@?IOMIOH?GOGoGOG#118!14?Cacskm}}ZwJum}h|vPs}r!5@G?@?GK@@#128!11?@?_?@_GRICTiBOj`SlA@?E_??@@@#142W!5?xwgo@v??O??`GA#121?V?o`GhRDJ]o_!8?o@?N~t^jzMtIcPAD???TIVg~?~?}DyLz~kzUnz~~$#246?GOeGoAgA?BCP?D?hOA@COG@b[aHE@]`]VDolJqh\HUrlWTFthKezQhMcudX{v[IFuZXsmDjqX~vYJe|gteplHe{IsmRYRGQkBcAkALO??Q`GP_@#239!5?O#105!21?GcYcI??iSJCHOcOLOL?d?dAoITGOc?u@s?k?h?wAWBwAC@Q_A?i@iCgQ_@Q?@O?IP?H_#208?_#239!48?@?g?C!7?c!8?G???G?I_??G@!4?O??@!5?@O??C???GG#240o#35w#114[#50G#126@?C??@A@WaBLQgt#118?_R?DA???n}???_!6?I???ct?[~GCRAg?Q_#77!5?__?G@uGcGdQ?_D!5?O!5?A#103!20?CA!5?@??OI@W`HSgSoAgQcIW@OH???@!9?G#121???[s[kWqyALeB[u|??nSiCBBC_O#116???A???cPi@ShOSiOGymoZrrKCAAA??D@!4?A!7?_?@#126gsGQC?C?C#114??GC??_???A#119K}fo???S#132!4?OAC_??SG?_#112!12?C@$#196?c#192@??D??S?G?AG?A?C_G?A?S???O?_???_GA??C?A_???A_G?AO??C?O@G?A???_!6?O?C!7?A?G?AO?@!4?c!6?O!4?h?C???A?_??O#96!32?_?A???_???G??C???A!4?G?@!4?@_#237!78?S???O@AG@A?O?A?S_O@S`A_S@C@?@G_C?E@Q`A?G?I?K?C?E_@#244!6?A#83A#140?C#132AUoMleTIdHS_#114!6?C#115?@!4?@#126?@!10?`#107!6?A???C??C!5?A#108?_#72!10?GaHS?A_DAQ@?gtZTDXUheWiApLyd[Idb?`?O_?_!4?_#112!36?G_OC??_O??AG#73!15?G#129!18?GK?o?_[@IW!5?G!7?O#125oU?BFK_?_o_#115??AHAO??_#125!14?G_WA~J_?O$#239!20?O#252!4?@!36?_O??cA!8?c#184!12?@!4?c@?OG@?O_AC!6?GCG?A?C#150!32?O?@???O???A!15?_#184!85?OH?I@qGYdQ?S_O@?`?_C@C@I@C_K@U`I`A?G@W@K?C@U_@CxDQ#125!5?G???O?G_#132!19?A#114!17?pgCCRgCAgDGC@#98!16?aK??_oGQA??_GO_?O@CPKA_??_#59!5?C#114A??A@?AAA@!9?@D@@@CG??@@?cAo@P?O?GE@@#132!7?CCA!5?gc?bCXOc@YKGAH?C!7?C#38!9?C?_?kC_]s_]??FM_G#74}CAkE?A#127G#132!5?@OG?O_#103?@??CGO#73!15?@$#193!64?O??CA!8?c#239!26?O?G#246!157?t?sHA@W`I@M_I?S@I_Q_S?U@Q_W_K?K`U_S`Q`Y_G?Y?zCqd#121!6?@A?A??C?SgQlQIh??_gws~n??}{nTw~|n~Y`z]vP?~B#103??@gO?BgOAwTaI?C?B??FO#99!14?_!6?_!6?_?O#102!9?CFDDE!4CS]e]uJVJJ[OGWO#125!28?G!7?O??@_?WWCaV[q_JscPi?OgACI@AD?@@#52???OG#130O??_??_#152A!6?w?OGQ?@#112!14?S_?c?V`$#196!105?Q`GEgT_A?T_H?RkBsDiTiTiTiT?SSjGCgAP?@O@cH??OQ?H?AOA?Q?Q?P?_?`?HQ??@O?QCPC?C?C@G_CGPC?S?P?DG?k?Eg@?cAOACLYVHiUd[jPUidYheYItSja[Bs\afWtMpMpMoNoNoNq\a\a\a[iTVijcSAO?C@??G?A?I?S?I?Q?O???O!7?O?C?A_??G!8?s#127!5?_?_#115!104?A??A@@???@!4?_?_E_?caWA?R!4?D?G?@!4?A!8?@#126O?@__?ATBOGOAk?a!5?O#136!29?C@!5?Bk???C$#141!318?G#73G??G_OA#119!105?@#56!94?EO#52?S#144?@#145?@BpK@$#143!319?@#81@-#237TiSjSjuhLuKR}D}jU~DyUwT}H}HQuhZcItAShUHQcJoDYdQcZOiPeWEgRcRcGdIt?s?GBCHQkAhO_SHQlAlOdYcHQkAkPITi@i@iTiDQHsIWCG@_T_?HODGSAGC#137!11?@GQ?_?CI?A???CG@_CGQdI?GC?cE?@GGCA@?C?H?c?OAG@c@??Qc!4?@?cG?_?O?`?C?OCh??_?HAO@??a???@?AC_G?T?I?S?h??@#237!20?g??S_O?_???G??_?GCQ_IP?PaGCP_L_O_!4?@A??O?@ASgDI?A!4?G#204G#14@#73C!9?A@A[?G#119??B!6?A???_TD?oWg_oo?g#114??O?kBGCqHgAQdOA#101??ACBg?[bSHA]lvY~vkT}Y??aUslAPI???cOID_A!7?@!4?@ADAKIKtIPA?A??A#118???@?@?@??@?DqhgV~ZwCdBarrOSS_KL?cc_???C#125_?AAFcoW?_YxMIhYDySHG`a_PID@i?oOo_G??_#52?c#142!5?BB?~AwGE_K#132_!8?@@Bp?aDa#112H_O???Ja???O#126?_SIdY`CxCjCA?A?Ti?tIPIdYdGBCSg#112?C?O$#193i?`?GC!4?_!10?A!4?cH?C#252!35?A??_!7?A#184!8?@?_!4?_?A@?@?@gOA???S?G???_!4?A#105!20?I@O`?hChQ`AOI@_@??Pa@QH?kaCbOk?iPa?Q@G@c?Q?QcH?HODQcGQ?AOI@AC?I?HA??CHA#246!49?O`G@CGA?Gd?v?QLQ`KTCCiKSTqGCOIDITiTiSgDiCiSg@A?_@cHuGu@#217E#16C#125G?o?I?GjHOsCc_O#112!6?C??Ag?O?T???GDA?I?AC#103!4?O_Q?C?@cGQLhOAGpGQI_?gQ_`#72??@??RG@cQ??HAOlePe@YIDsITHAHE@I@A?B@@DI@i@@P@GO#114??C?GCC`???_CPGHa?J?DQ@G?cBA!5?_#132!5?A?W??C??U@H?_?J?iSDCoOSC_??OsO?C__?G???_#38???A@!4?BsHDGk]???C??O#125Om|^???BAC???B@#118??AFJy||SHK_GB#132???O??G`??C!6?SG?C#119!9?@A?J$#246?@A?@???q?Pk@o@?g?OChDA@a@QcHAcZT?|jAgudXSNi_YlHceTmHdpVkIgZVYoInH|t[YudP\UjLjudQWQnI_ZUdQxRMt_S]SiS?DwlsA`CpASI?IC?C_#96!34?A!7?A!4?C#150!9?A?@#239!80?CA!5?T?A??GC!13?A!10?O?@!6?O?O???@#240?p#64G#55_A#132?B@O??CBHYW@a`A#118!8?DB?_?Iyo?_!4?OOW~n~BOC_@?CP#102??_SN|s?_@@A#98!11?A?@kCS_HAO?cPQcPI@oA_gs_oD_`W_SEq?KOCo?_#103A?ccxK_J_[@AUIw?aQWaOI??O!5?A!5?_#73!7?A@!8?O?@#128!5?@?@W?B?B?@B?@?ACSIIDKs_oO??O#56!6?@?xC#74BOAB#128G#116@A#121_^~}_{wmcKwKiTsO_!5?aGokz]jdYdAGA??@!5?@VIpmtYdYv{zjU|zsn~$#196?S?S_??O#184?G???G!4?G???_?O!4?O???G!5?G!9?@!4?G???C#193!7?A??_!5?C!13?@!8?S!8?`?P_CIChUa?qH_dQkVsNcZkjV}}keCnTYhOlSjShQtISgPcGpmPqLOgQObOjOmPiSqLWdkOvGQkZcHQdYdYuHQtITMDi]OjuHaCZuLJ?OiCxATKQdWa[`GQdGQ`SI`Sa\_\a[b[b[b[b[b[b[b[b]_DAG@I?A?G_!4?@A_?@???C!8?ADGPaCG?gC?Cg!5?_!7?_#50O#128@N{_nQS__#126??@AGCOcW_V_W@#115!6?_!4?O???_?_!4?K_RGcQGdGA#77???@ISCs@[Bc\?QGc?G?_#100??@j!5?G#48??G@!6?C!5?O???_#100?C??W?_O#102?_???PROW?}[G?AAO??O#121!4?C!5?OGWCCKGJXbq`WAW{R~HGUsXG??e@I???_!5?_??OGC?_O#116@jCDIOB\?CoY_#130!6?_#136?CBo@O#127??O#119??_#126?@[@?OG?COOG#119?G!4?_OPVF?C@#125!4?SQCrOy\vl~i$#192??G?AO@C??A??A?S@?a???G?C!7?_A??S@??A_?OD??Q?G??OA???P??_?D?O!4?@?GA_??O??G?d??OC??G?C???G?_???A!4?G!8?O??G??H#150!41?@G#184!95?CAO_??_?GUGRG_?I_APIPA@aGCPaDgOa?G@?D??GOADaSGDI?UHu#83???A#54A#38_#127??C???AG#121!4?DQlZc^gZf}|O{n^I??NFAD^DNLBF#107!5?@G?Q!6?_#99!22?OH!6?Gc??_??GSPAXMo]Ke[iWGoo?_#77ACA?DIXA!4?A#119!7?C?C?o!7?wGcD?GBB?C??[A@D#126A_?Q@g?cO?C?S@!8?_??GCO#140!6?@??B??KGK?Is??O_!8?_#73!9?A??A#107!6?C?A??C#73!13?G!8?_$#239!6?GA?@!9?@#202!47?A#196!36?A@??ACIP?PA?HODASQgR_JoRcBSg@@QPhO?cACQ?OACG?c@QCGQC?CG_?P?CO??@OC?HC_AOAG?cH??Qc?I_G@?cH?d?ogP?dO?cXQ_?OsulDyE|GrlYe\`YVdYalSj`]A\a]a\b[b[b[b[b[b[b[b[`^QhO_CJtGAT?`???O@!4?_!4?@!7?C?O_?A?a??O?@_!6?Gu#97?O#121@#52W#116??O#49?d?OC?_#115!109?_C?@??@_T?GC_DGc?GCA_??C@???G???_#127!16?B!4?_A@CA_ADGE?A??ISIcO#129!7?AA@@DGJsIS!9?C#81!10?O#115!8?C?A#127!18?_GO$#239!107?A?_!5?_???_??@?G??G?O#192!134?T?AO??c??CO?G_??_G??aG?O!6?AO?P?@??G?Q?SH_?@#140!5?C#107!121?_???_???c#112!15?O!6?AO??@???G?_!5?G#73!15?CG???O#149!10?@A!4?A_?O#152!5?GC?B#103!19?@$#144!532?_@$#145!533?G-#237DYTitI|Iv[b}Piv|a^tjuHzc~A|UkzcVgU`YdGtIPiSbShEgRKPeWbKpEWbKPMOeHQk@A_BcHu@YcHu@sHeSIOiTaShEgRKaTaWa\a\AXeHqCwAXEGACi@m?IOD?CG_CP?A#137!4?HACO_D???_?ACg?CGQ?G??_@?C@?SgAO??ACO?_?_Q_HQCAC?QC?HO_HOC_?CGP?i?@!4?@OCG@aG!5?@??G??AG@C?H?A?C#237!22?_A??CY?S?aC_?o?S@G@Cg@??O?I?`OG?C_CGOg?PaGa@QgCG_G!6?G__#35G#125G!4?G@ATANTJMUO?G#112?O?_@??_#114?CAM@?_O??_?O_APSOII@dKG@e_I?O?G?_#101??dGA?@SgEJdJUn\j^hQ`LYcO?G#48?I??C???OA?G#93?G?_KOC_?K?KGO#101?@??AAIYcC#115@hA@?_PqSOHCQ`?Z??_!4?_?G??OO#126G!4?_??CGC??OooG?P?__?G??CAC?A?F??@?A??A#127??@!4?C#81?_#38_?PAWvJ[_?GC@#132OCCA!8?AC#126?ACGC@AG!8?_OkbCSIUG@??A!4?@?FGQD?mD[HQ???FOS_$#193y?AS?P?c??O?CO!7?C???G?@??@#184!28?_?O???@!8?A!8?_#193!14?D!9?@A?CP`WhO?OaSD_YR_VGaKxc^nLsoxINYtytItgRU`Z_lQTiTIuhYkhI?Ti[dHiDYDZCl?U_ZgZchQsAlAU_jUXj`Cm?Ts{Nn{[EQpcXCrkP}pysjspvGPcQHsAhSqCzCqLqLqLq\qlqLqLqLqLqL?O?B?@???O!6?a???C?@!4?C?A?@?@A?A?C!6?@?OAO?O#240!5?U#37A#128CrJe~r{ti\??C#73?@IDAC#118??G]E?M^J[pSvVn~oW{nVtMjN?osWADoP#102??ID@?HNuJG??oO#72!6?@??O_UgQ_`OkQd?OtJ?z@m@k#41???C#95KC!6?GOO???C#103@!5?hoUhCgOaCAGA?G!5?G!5?_O#125!6?C?AOC!4?_?GG?CKCJI?_@@?Q_?A?g_O`EQ@@DCy@gGoKH?Q?O!9?_O?MAB#119GCKL]?eQ??G!5?_!5?@IG@GD#132??O`?_?A?__oO???GC_@gO!4?s#112?@O_!4?@$#196?D_?I??O!20?A#239?G#202!35?@??@#184!29?OAO???H??g?OAGA#239!6?_??_#105!17?I?IDGO?@Q_@?cAPICGQ_QA?@?DaGo?i@YCH?C??_O_H?hA_AC?A?HA#184!61?O_??ODY??C_DcAoJS@?@?_@!4?I?@O??E?CHSGAPa?A@QgCG?@?@IdG#244??H#70C#140A??G??AG#49?_OA_#126???yc`II#119?_WB@_o_??GG??ND??GG#103??_T???oAK?Tt?iSPeOHs?Al?m?QgOGO#98!6?@?QCH?kOKcI_GCC?kORfvarAR?bT?RC`?aIgOgcO#77??YO#59??O#107_?@?G@?C???C#121!4?_Oo?OGAemJje{gF??gvBVZ?ZEEBa@__OCGCSK?LG[HFOCG?GK?a_!7?_#52!4?_?C#142?_BQF?A#121_?oWSA@A@BPlR\R~LZPbMtUw_O_?v{vYnRGQ`S`C#127oKO?GAtGS_#73?A!4?G#119!4?C!4?A$#239?_???_#246A??`K@iCGAG_GCGQCH?T?_P?AgRhMcYRIseThKiQXTcqiHdSQIhdSRi`lXucQ}lUsZQHkdZQGmJqXHtfTgLjQXTcr\gLaL_GateOO@Q@c?_O`O?O#96!29?_!8?_!7?A#246!92?OdA_??@?OHOHCJ_iSyqDW{wNttTYedzQXq@E@SgCPSg?@QpE?aTitWtcW#97?O#38_#52Co#50??C#127!4?_?O_#121???@YdtV?`{O#115??@?a!5?A!4?_??_DGA@oAGI?o?geO#77???Qt?N?jCPcQcgOaC#100??CK??A@@#72!23?O?@??A@C?Ksc#118!13?@CIH?ZFU\LH@BR?XOcCPBA??G!5?@#143!7?O#128@?@???@O!6?O???W?GCGUpKPUQ?K??G#129@?G???O?GA#73?G??@!6?C!6?GO#143?_#73!11?C???G#128!8?_#121!4?Di~Pq`Al}j^wnJ\}$#184??G!4?@G!7?C?A!8?G#193!40?O?G#239!35?CG#196?CH_?C?ACi@S@iQDgVGrKrCZ_OqALAdO_?D?OADG?K?U?H?C?P?C@?S`Sg?@QCP?c?_Q?Z_L?D?QC?HS?X_LO?cOUiPTiIBoOBahhEYCrKRm@MCJSBMGteYhuA|SjHzCzLqLqLqLaLQLqLqLqLqLADIdG_CITHAG?H!9?C!8?G!8?CG?G??A?_Cg!4?R??_#55P#56G#116CP#132!7?G?@Gd?O#103!12?G#69!6?@#107!8?A!7?D?A#108!7?O???@#99!15?A?Ar@?Sr?yPA@kOGP?X_nWI~_bAeLtSgOG_#119!15?A@O_!4?AAEMKC??@!5?OG@@#116???_!10?@#73C??A??A?_!7?_OO!6?_#56!6?O!4?DGC@#127O#128?@#115?_??O#114_#112!7?O?AO?G@FOG?d?A#125!5?GI@?pMRNLf|IVaZWs!5?A!7?_$#192???@?C???A???@??P??O@_?Q?_A??CO?C?O@?c?@G?AO@C_AG@COAG`COAG?C?A??G!6?c?O??c@O?C?A?G?AO?C_AG??AO???D?G??aC!6?C?@C?H??G#150!31?_#239!102?G?O???_!4?A!8?A?A!11?_??A!5?C!4?P!5?A?F#144?@#141!11?_?O_#121!22?A#100!77?A#102A?!4@AM??WUMK??@!7?_#132??_#112?o!9?OG@???O??G!4?@_???O#118OO#119!11?O#116?O?G??e?E@A??@@Av?Cb!4?_O!5?@#118wq_?{G?g__?___!5?Nf]O$#252!69?G#192!189?G??_?i??AO?C???CGQ?A?_I?_?G?C_?GO_?`?G?@S_C??@CGAC?A#114!122?@!7?CA@??@geow?CQccW@!6?@!6?@#132_SE?GG??QC`@K?QACCGAAI?G?p`SOGjEgd_E?@@O???_??_#130!7?S?G#136?@#126_?_?_#81!14?C$#48!433?O#69!17?_#73!12?c!8?_?A?_#140!36?A??HKQLGEg!8?K@$#127!475?O??_?C_???O?G??A?__p_#144!31?_??A-#193~?iDGO_G?CH?H?g???@#184??A???A#252!5?G#184!6?O!10?_!24?C!16?A!8?_@!4?C?S?A?@?G??_A??A??C#137!12?@?AOdGA?H?D_AGOC??CO?GCa?@?C@Qc@Q?G??GO?_??O_??AO@i??`?O?`AOD_IO!6?T?A?O?_?D#246!30?GA#237!8?iCGS?Pg@G?_?G?CA?TGC?AO?GQ`GOcGQC?@g?gT?G_AH?C`OlYdID!5?@#96G#38KOC??_#125??A`?OG??{E_?_#119?@@???@FBADW[KKG?GG!5?k{w?G}o#103@A!4?`ISDrcCClGCRCHaDi?G?o_#98?@A@G??ACJ?_CW_LY@[IzfWsjSiwdZ@YUhFq?CA@C@?CO?_??_#115??G??@?aPg_H_???A?G?IC!9?c_?_AO_!5?_??_#128G?GA?CCAE#115??A#116!8?OO???GAG@?D!4?@#98O#115GG???_?oGCBg_?_#112@?O?g?C`?_@?@cO?ICP#125!4?EOOGA}Z@nDrHTidB@\w_??___?O$#237?T@ybM\bmRsjSjUlwVg}VH}oN|rMzcVqHQkAkPK`Y@YcRcXEhQLQcYdGtIPKPeXaLqcRcHeGRk@iT_TaSb[_LqcRcHu@sHQLOe?cHq?tAShSjODRCJcG_Qk?iSgCQ_CO?G?_#105!11?Oc?Q?G?_A?G?@?c@O?SGQ_G??G?D?Ta@AGA@I?AC@G!4?AGAC?G#184!61?TiSgTgPg@g@???AS?a@G!6?A!5?OC?@g?iD??_Q?H?_?cI@I@#208???@#240__#56B?G#128KBBF^|Yoco???_#126EEGo??wk#69???C#115@AC!4?G!5?Dg???HA??GDBA@SC_GWC?_?O#101?@!5?@IDyDEIsgAPNOgo?I?_?G_#93!6?A??@?A?_!4?G?fOLwywo__#103@???GDWBG@__Sg?T_???A`??G?A#132??_?C??@?G?@G!6?K??GC??c?O@G???A_?c???B?EH@?@OC!7?C!6?B@#107??C?A#119???B?CwG_#126A?A???GGO!8?DiX?E`S_#127?cQ?GCaIOICA#121??F[B[ALANvnyt}N$#239?iS?S_?O?GA?A!9?@#193!75?HQ?C!8?G?G_PcRC@Y@@ApHCRidTqMTiTiTkyWLGqlQUhYD{ALyDXadZsITiUgZ_LY?latiTaleXMtILZktKeDQ|ULImSWL_Y@dn~?~~T?ih{BkZV_yy~~nzv~?PkRcZcRkRkRkRkRkRkRl}bsLqLqLqLq?PA@aC?OAOA???@g#202!7?G#193!12?A???A???_!6?O!5?A?P#37_#52nr_[O?_#49?CI@#121???A@?hAI}}FB^{oww__?ooo#107!19?SI??A???GO?_#77A?@?@ACTqCGXo#100??O#99???@??COB?B??cA`CWdJSiTDYC}dhUoLWA_C@A?WG??_#108G#59!4?@A??G?C#118GAI]P_?wscoX\]E!7?CA!4?OA!4@`_!4?_!5?O???__#115!7?_#103_!4?_O?O!4?_?_GGoCGIS_w?O#119!15?B#73_!6?DA??C_#128???GO_?O_D???_#143???G$#196!5?@ACP_?S_S@Q!4?_!8?G?C#239!74?A??A_#196cO?A?G?Oc?gSA?RgDWaKPiTiTiQDdaQD?H??_A@O??_AG???_G@_D?U_@u?WA?GS?PCo?dO_Q?bWOl??o`PAdaYDsIO?~??iiTSBkRCgYDD??OCG?~mRkZcZkRkRkRkRkRkRkQ@SHqLqLqLqL!6?AC???S@g#239!26?O?S?G?CA!5?_???gM#97C#144O#116??R?Gw#132???@?E~~@?X?OD!4?_#118!4?GAB@BFtvt~|YqDRBFot@MoWsg_?O?_#59A???G#108!9?_#72?@A?DITkeonSIspNWfOAcY`#100!18?_!7?O#114@!4?@?ACAE@ERACC?AO???OC???G!8?_#103A#125!8?KCOKSGSGEAJL@@?_???Q?B`CIIEA@A!5?C??A??C#126A??A#132!33?hgA@\@?c?QGC??OwKAFO?o?XQG_$#246!16?FgA@?s?FO?COCPG?udP\Rib]cudXkJaxUCqlHdYRIseriHeSQLHkYQXtcRYSiNi\hKbZQLHkYQHkJucqjXUHUGnI|h?j?KOG_O?RC@?@#239??@??G??A?@#150!14?_??O?@_?Qc?I??@#246!98?@A?ACAsBWBS@g@}?qr|hnvbKSfIRdhjyUUTB?idJ?cRqGC??O_O]~~~?O#142!5?_#140C#127!4?CI@???W#73?O!5?O#114!6?@?A??A?A?AdGQ???E??@E_GTI`IT?_GO?_?O#48!20?@!5?CO@??S#41!17?H?A?C#77@??G?ICC???_#119??@!5?@?G!6?_a??K?C!6?OO??_?A!6?_!9?ACB!8?_!4?O!6?GGKG#126!54?_??GbCBC?t?GODI@o$#192!18?S?G??G_?G`?A_@?GA_?C??@G?A?OC??H??Q??c?@G?CO?H_?Q?@c?AG?_@?O??AO?C_?Q?@c?O??H?C?_???O??AO??`??AC???G??S??G_#96!21?C???C?@??O??A#239!99?_?G!5?C?_AO#196!33?Q@!7?S?A#112!19?@!6?AG?CO?_#102!26?@??JRBAFwkyu[wO#95!43?O???K??_#121!15?OO`cGCA@A@??`PPRGMaf@YKDliXN|{aqOABOBB@?gO?_G?[HGYDlGKW??@??O!5?G???C?ABD?A@@!7?@BARN|V|z]~Vun}WN~tzm~yOcO@GA#73!12?O$#192!265?C?gAS??@GC?AS??S`GOdGQC?@g??S?O?SH?C?QH???C_#143!26?C#72!101?AACC??_#112!16?CGD!7?A_??C???O???A#116!10?O?C#112O???o_??O?O?C??O_#141?O#49G#101__!6?_?_???O$!438?@AA]SQO__o?_#107!10?@O#126?A@!7?Q`??A!4?@!6?A??B??A@??OO?G?O??G?_O#118!7?O?O???G!7?CC?A`@??CBK]WCc$#102!439?@??@@BYECSW[W#73!18?_G!9?CC???OK?OG???_??@???C@??DA!4?A???@!5?G???C??@$#125!472?`OG?O@#127!19?__!9?O_?_CCGCI#128DDEI!7?C$!474?O#116O#140!42?G@?B???B#59OO$#127!475?G#72!42?__#77O??_?_?_?O$#142!520?CC#52A@#114WO???_?O?C?A?`Z?S?_$#102!521?_o!8?_oGWOC$#38!523?A@?@#81A$#129!524?A-#193~?~?Sg?iO@Q??`G?ACG?Q!6?G#196!14?@#193??_#202!15?_??C?A_?GcO??_#184!4?G@#196?S#184!12?C?A!5?@???G?G?a?O???C?C!5?C?O#137!11?@?I?COA_@I??eGDa@?_??O?A?c?OC@A?G@AC@?Q?dG???HQ@C@I?T?G??H#246!45?OC_HQH_?O_?O???C??GcWeXA`cdxQ[gVWgiiwSVzy{xy|xYSdLZRtTk@smsRcl?iTgX^~~r}#244?F#14A#128_S!4?FFFB@?nXSIU@c#132R?VGDQKa[O_?_O_#118?@GC?B@??B@???@BE@@FEYL\]og?}z_O??_#101!7?A@?A@]`ZsIsHU@qK?e?G_!5?O?_?_#93!8?_QGVDnJ\inmCKGGOg_#100G??OOO#114?@?C???@?@_BGOG??GAC?OG?AA?EB!6?C#93__?_?_O?__GoW_GcGOGQGC_C?_#72@??@E?OcG?CGG?K#121!8?AAABHYYzWopqbff{y^umzFhUyHa?@?TG#128??@_GQcZ?OdOCO#126@CR?WA[`IoD_$#237?T?iATjSjSlxnYt^OjcYDzeXvkYbtLr[QhCxAXaTI`QcYCYcItAXa\_LQcZc@?gQGSGAs@GdO?@_MPIpEwB?TaSjOLQcY`MpIT_TaSJOlA[?XAk@uGuHuHcOi?QgCAOc?P_CG_C_#105!7?@??C??S?@!4?QGCa?dGP?HA_G?d?CO?g#192!78?_?OG@C!4?_GQ??C`AO_DOC?@g?C@AC@AC`IO_CGA?OC@?G_A!5?_#64!7?C#49U_#38?QO_?_??C#125@?A@CHUHgw_oo__O_#112??A!4?Q??G?C#73?@#143_#132??g#114???@???@CA?@CQg?CICS??gGU#77!4?@?ADI@[_?SG_#98?_K?a@Go?WPcnO@lAt\_\btePiSDD??_!8?BAC?KCOW?G_#121!4?OQQOAA?C?CA?@!6?@G!5?@C?A@@GE?G?@A?D@??@???@#118?@#101?@!4?@?A@A@ZCWoCw?sKOKGs?O#112!7?A???a?A???G@??HO#143??AG#125??GaQ`_CiviDrKRcZdQlOM{o?Gf|a$#239?i?Tg!4?A?A??A_C!8?@C!4?@#252!29?G!11?GC#193!31?@Ac???GA???AGbDO`CaXdIPiEI`VPYHnl[m_tqn{ZstiLOugDqHCqHfWtIXEhZ_|QuWdwUmGlOAuvlE`kqy_TAjbuXEwVy~~^v~nv~^v^v}]nv~z\mvz]~?nOnOnOnOnOnOnOntZehZUce\id]TiLU?Q???GaOA@#239!11?C#184!13?A?_?GA_G?@?GO???AC???C#70???@#125H#116Ad?@A??_W_cOCGP?GO#73C???G#115!11?C#119BBB?A@??A@!5?EMGG?O__#103@CA???j?Z?A`G|?Oq_i`GC#72?ACJ`BUh]@q\GvASDi??C?O#95!13?`?YOo_???AAC??O?___#107BA?CCU#118?A?DCO[?w??C?AA??AGB?@?G!4?@CGKGE!4?C#100?GG???C???AA?C?A@A???@?O!7?C#118@?@?@?@@C?CsT{CoccC???C[G#73!14?G??A#116!8?c#121!6?BGc??@]tNy^~$#196!4?@AS@Cg?COC??@O@_#193!54?G#239!31?_??@AG!9?C?@!7?O#96!13?@?G?@A!5?_??O#237!95?_??G_Q@???cGQGAC`AGaDO@A@g?C@AC?AC`IO_CGa?Y?@?GOAT?ACA???G@KGO#52?@Y`eKWOW?W#127!7?A#121?A?BADQCANZd^b^jgsws{g]m[c]B~U{woOoo_#107!10?G?D@???G#100!17?@?O!7?g#85!19?CASOOw?_O_#77?@#102?@@?CCOQGG???_?_??@?_!4?P!5?CO?CIA#81?A#98_#95__??!4O???G???[CGckAgCG#134???A!5?C_#114?@!8?@AG?GG?_#126???@??@!6?AC_??CoC`CO@OCIA#127O?GSIC`G??IGAh_#73???A$#192!16?_!5?@_GA_??_??G?_?G?@?@??O?A?G_AO?H?C??Q?@!5?G!9?C??@?OA!4?a?G??Q?G`?O???OA?G?c!4?@C?c@SH_??O@G!7?O#150!19?O?@?OGCQHC#239!95?G?_Q@!5?O#193!30?@??OAC??g@gP#150!8?G#132?G#142?GGO_#140G??AY?_a___#126??DGC?G@H@_CW?K?S!5?O_O?W_S?g#112??G_???_#102!10?C!4?AFNL[S[oo_#99!13?DBACZ?BmA\IA^a[IXmTjYgUg!4?@?@@??CGCOOG?__#115A@_?Qhd??C?G?aG?OOP?GGD?Q??F??@CGOC?A#73@?AA#112@ADD??BA?@@??@#131??__GO_??_#103!4?A@A`A??AAaA?KAgo?G#73!5?@!9?@$#184!16?G!4?C!6?A!4?A!5?_C!4?GC!6?_!5?G#196!50?O???Ga?O@??iCQH?A?e?H`UGiDuOQaPTIG???A??_G?QGC?@??GA?cAoC?U?G@aGB?PdQItHGQoKQHCTigSSHeoFgD??_G?OG?_G_G@`OG?CaPGC`?~OnOnOnOnOnOnOnOIcHQC_HOATI@iDQ@l@CGC?CH???@!30?A???@?AC!8?@#56!5?C#55?@???c#115!45?@?A?I@T@?T?b_WSU`?__#48!21?G_??O#88!26?o?_#103!5?A?@@a?``C?_?@?@?O_PLC?\?T?SGOo_G?C?qG?O?O???IG!4?CC???A???@#77!12?@A?Q?oAo_OsGo_O#132!11?@?@!7?@?GO?@eSL_SG`T??O!8?A@AGcP$#246!18?QDg?WE?O@SGQKadSZEte[Io]kJdP`RTGleSAZqlHcQ}VVlrbt\JuRInvQZpmsEgDg~i\HSfqlHdUOIdg^iLhseQXAtAs?O@@!4?QG!4?O_G@GC#184!126?A?_Q`Q@?C?CGQ?G?D??A@OCA#239!25?O???_!4?qo_#59!68?A!4?O#72!53?@#87O#101@BBABECK?GGG!6?_!4?@??__?__?_?_!7?_!4?O!4?G#119!4?@?A?@#99O?_?OOSgGGoO#119!8?@!9?@BB@?@WC???CIK??OO$!461?!4G?S??A??G!4?A???@?@!4?@@A#126??GG!4?AAA??A#98?OO??C?A@A@VSMK}kw_G?CG#115?@?@?@???CACo?G?_!5?C?G$#132!463?A!4?C??A#107???A!7?_WOw??O?O!9?C!4?A#102!22?A!5?A$#112!466?A#77!4?_?C_??_?c#108C#112G??__#125!7?@CD#88_??O$#111!483?O#85!10?_???__OOoG_?_???O$#116!494?@#111?C-#193~?~?Ti?GP?DA!4?S?SAS`GO???_A??@!10?A#184!8?@#202!12?`?I_S?G!4?_#184!17?A#193??CO_?g???G!7?C?DO`W??G?UPGRkACBPKHQCjYDuhUvvnZf^Y}lzt]}ltIlS[kqY_DmTZcFLY?i@TBgEOHj~Bjj~~zn^zx|Z{|]~m~^BhYb~}NZ^L]VZ^`iZjRjRjShUhulYTMtYLuLYtEbCAt@AQ@AAH_F?L??CG??C!10?O??O#202???A?A?A@?A??_#184!10?GA#196??@?A#153?G#239!4?B{#150A#140@??_!8?A@?A?@A#127?@?A@?A?GC_??_#73A#143???OG???G!6?G?C???S?_#118@??@G??E@Kq?hC?G#102???AI\u~|ko#53!5?@#98!5?@A@?HA?GQ_WDKPROMiTOfEc?W`?OA#85???B?EA@??BCBGC?g!4?_OgWWWwo?woSwWwWks[u[s[snXk{U|XgSbATiAcB@?A?@@?@#98?Gg[oGw}{jq~{DNUjQ@CG?C??O#115?@@GMO@??G#121Ad^{s\|tO]jTlV}JsD?B#125odrZHd[A^_I@PCiChEYdQlTdONrOs?@OK$#237?T?i?TiTmTytm\zViTHsB[AflQ|JSxNwEOlOLaHcJS`WaKhS`ShEgQKPeCIcHEGQK`?J_SAGQC@?bCjSgOLaTgTAsBsHeOdW`ADISBkRc@iTaTi@y@iCADYcRk?iC?@gO_IOcGOC?G#208!6?C#137???@!6?AP?_A@C@IO@_?GO_?T?i?S@gAS??S!8?A??A#237!35?_??_??_??G?G???K_S_S?O_Q_Q?O`Oa?s@YcAgTGcGDGCGCWCOCgCOcGCA?@???Q_IOACHa?_V?A@!5?hO@#193@#38E!4?@B#129??_O#132?CC!6?I@?ADCA?HUx?Z_Xa_?__[__PacY`S_#73?O_G#112???AS?G?O?K?_#103A???J?SI_TKoAH?AOG_#100!10?A???_csO?A??_g_#93@!6?@?AANcCxJRClPk}nzkw[qX{So___WK?___??[CIGC#103!4?@?@@@#100@#93@?C??_A_@`SlgTkR{[{{Ra{huPdS`Dd?@?CC#100???_#102??_!9?CC#108?_#118AYnDP\G???AA#73?I_!8?gOC?G#127_QG`[_J??A?@?O@?GCAGGdOK#126B?aa?P$#239?i?Ti!4?G??@??_?_!4?O#192??G??G??C??OC?@_?C@O?G_C?O?C_?G?C?A??C??G!7?A!5?@C_?G?@?S??AO@C??O?WdGSACPc???AO???@g?A??CH_A??@_?O?G?_??@#105!14?ACG@??G?AH?O?_???AC@?A#239!69?o!4?O!10?G?G???@#240!52?AS#56G#128CJ^[c!5?ApwIK|[{iCws{_o{_O#126@C[CTeXS??]@]OMKXC[iC\_YcY_#119??ABEKFB?GO_#107?C??_!6?_#101???BCHUkB|QdjStKoKa\QH?cGO_W#48O#95!6?A!4?@C_JWAogwOgO?OCO?_@_!4?O#103?@#108??C??C#84?_#41A#95C!6?AA#84??AA???A!4?A#95!5?@??_@@kSAAGa#134!7?A???AA?@#77!6?B?@aCW__#119?G?Oqa_O?AB#132!4?@!6?@?RCGICCcQA`#128?StQkaOZEWdAhO_O?_?_#121AHSlA$#196!6?Ta?a?GOaCG@A?G??C#252!50?`?G!21?GO_#184!6?@???@!5?C!4?OGC!6?C?O??O#150!17?@!4?A#96@#246!81?C`SGa@?I@GaL?K?C`ACJCWAkcPxEibZrirzbzbrlzPZlIrx|}[~~jKTdLxqST|Jg{|{~v~~~Uk#218?G#70_#116@??_GSgEHaT?ATpAa@#121!11?A@?G?CJjT@A@F_PA`A@RaJDRdJ~\g{oo_wo_#72!18?@A?BS?_ISbIrKp[aCOI@_D?a?C!4?A??G#88!11?A?@!4?A?C!8?_O!4?G!5?CCC?G_GaG_IOaPB@?ESIGOA?OG??A#131??G???G?!5A?@?@#103!12?BA@BAGU?d#112!5?A_@G_?Id???A#143G?C#116!15?k?XC_?_?O#132??AAI??KHSGA_$#184!17?G!6?A!5?O#193!43?_?G???@A#196!29?A?O?G?A@QC@_?_C?@gO_A?dg?DqHUhGGO_W_d?O?A_?Q?cO?_AHCTiOG_QgOdiTSigUPlaS?gSS??CO_CCAc@A`?P?_{Ud[?@oc_q`gc_]TcSkSkSjUhUHQdIpIDqHQdI@GQhAK_H?G`CAG@?`U_ACW?G#244!52?_#74O#52Ao?@OgVxUKg??_#112!22?CA#115!21?@A??APKO?hCOJ_TI_PC#77!5?AShOgAKO?G#99!8?@?DGF?BAKmpTglWpY~cWO?`CCC#80!8?@#99??A@?CO?GC???B?@A#94???_?_?_O#107?@#94!9?G#99!11?A!5?S?CQ@?GOD!5?@#114!15?A@P?c?GC#126!10?SiO_@oIyCgBO$#246!18?a@gA`GOdAS`E_AxnAjq[UZoiKfTRQjMjQWVdriXxtZqxvdQ]tSJjttlY]VSyOJUdq[iBi|HkIqXlIfA?A@@wAGR}SgLiS{?EO`W__???@?OGACB??@A#184!108?O!4?OC_S?O?O_Q???O_?A@?@GC??O!8?G#55!38?wC?A!5?@#125?G!6?ToEH?YH@VaG?a!8?_#69!22?C#114@?A@LQQ_SB_TI_@#95!24?A#72!36?A??A!4?AA?A?@?@!6?A#101!40?O???OO_CGqP`ZgSgCw_O$#239!124?A?O??C!4?A?_#192!120?G@??@_?Q?A?P?C?C?C?C?C???C_?OC??@A??S`IOaCHa??S?A#142!16?A#101!135?@B?D?AA@!5?@??@?@?@#72!42?G??g?GODKiUcOgSG$#102!458?A#131G??O#118!4?C#112C#77!6?@?@?@$#98!460?KAA???@?@ACA?@!5A$#77!460?@?@?@$#100!461?GC??C-#193~?~?Ti?i!6?OI@A?@??O?_!4?C#202!27?IC?QCH_COAOCH_??O#184!18?@#193???i?VcGPC#184!5?O#193!4?@?@??A?AD?eGD?GRCHe?JCD`LUpHKYShBXElQ|pN~zu|JEJOy@T_iCT_iCTaIPdGY`twyN_yy~~mvz|MnflmNjlM~?~?~NnOnWfXlZcZcZcZcZcZcZsZM`sB[`ehcJG_O@C??GQG?GaC_!6?A?_#202!5?O#252!9?O#202!11?Q?`???_!5?_!4?@#240???Q?Oy?P#14@#52@?FKgkVAJ?R_g???_WO?oW_O_#127!5?@?G?@G??AGOCIC??OOgW#143!4?A?CPAh??I#118??K_ANwC_iO?o?O#102@AB}JulJukO#72??A?GFOJgQHCO?I?sA?cQH?e?AG?_#95!4?@?ETgYDaD?f?C?O?O#88?DRYM~o@??c?wGGG?{oL_Cqoz{zox|zWZxarrGHB???CG#95oAGe@_@CA@#98cySYv[zu}V|Z\vI{AAC_#103!5?AH@IKbDG?W?O#119@E???Wg#126?PA@UKp?BGS??o?g#128??GPUPSKApKYDJccZgESPa[A#132?j{S$#237?T?i?TiTzvm\zVitiSxUlYfG]vkR]`yVhQKPeGV_TiSATiPiSbShEhQL?OIC_OAHHCC_OCH_G_T?HaKPeGrKHShQhQcZ?YcH!4?A?OjWfKQcHU_TiSyCz?|_YdObWcAgAoHs?wAOa?CQ_@AOc?O#105!7?HAC#137O_D?i?T?i?T?i?T_IOd?I?D??D#239!44?_!9?C??_O?O??KA?AG!6?C???G#184!32?G!6?C@#252?A#193A!8?A#244eO#38M~w??OgsCGc??TO??__??_#132!9?A@?OB@GD?G@@JEFfABB}xCp?o#112!4?CO?hQ?C#119l#114?BOTCiC@g_S?_#101!4?_@ADUHCZeWfOVlsyj}dtIOwOGcoOO__#48?@#93!5?`?AEDqTg~O~r}l}jtygC`!4?G?G?Aq_!4?OO?C???C!5?CGCGSokylvytF\vXqLUjLSZ@iDG@??@#72_??_?SA@taZShghO_#114?G??G?QI?QKG_#121FVDAQ~mt]GrKn{t#125@PKMG@U~`K`I`?GA`???A??RGbKXaTVS?i$#239?i?Ti!8?_C#246?CHE_OdGq@?@K`ICGUcriHt_^i?j|gTEThKjQXUcq~dpZKisUQjXLjqU\sIi~UTriXTCqqjUCUlHcudZu?G??cibCAOplJqh^i?@CPCSA???GC?OOCPC?A?@?K?G#237!90?OAG_AGOAO_OJ??`Id?_@s@?PGRGV?jODGBSH_ACaP?Q?T?T_@a@WAc@gQCH???A?`GC@AC@AC@?{?sG_G!7?G#20_#116??ADA?@?v?OS?D_GC?oG?S_O`#141!5?@?A!6?A#140_#121!5?@!4?PChEXaLUzltUlrIOo#103?g?P?iCPI_KW@SHQSGO_G__#53!4?C#100??A@???I?DA@_O??G!7?ACA#85!4?GG!5?@A@CI?C`O?NyzrWuEd?V]BMaNJLJCBCJEACfcATGCaEODQG@AG#131_??G?_??a#101!10?Ac?G@@kGXCjSRSmS_s?_#115?AD_`g?O#112???A@C???_#132!5?AamQ@vAh#116!4?cIBdCQDgc@Q_CpG_#121!5?A#73@$#196!6?T?CGPaCG@?O!6?@#239???_#252!31?_@???_?_A???A@C??_!20?T_?PC#196!18?H?G??AGD??A?@cAg?O`IcRchEWehQlAMo?C??ohSiDSiITPiITPiGTcIQdSIADoYDD??PGCApOWQPoSQp?~?~?oOnOfWeQcZcZcZcZcZcZcJC`[B[`UHSJOFCIcI?QD???C??AC?g??G!52?O??_#64?A#63O#56??o!4?_#125!10?@!4?@??O@!4?@c?Ea?D`A?OgGGGCC#135!11?A#115!4?P??C?I?@PIEDIoC#77!6?@I`UXcP_G_#98!4?C@O?@g@GC?AH`WTOYT@jDQ?hgP#131???A#75!15?C#84C?@?@?C#117!22?@#99!11?CQGOoG?C@_?aCH?G#100??A?_#77?O!4?ACA@HU?s#107??O_#118DEDbeXwgwc#73@!4?`!5?G?_??S#140!7?_OG?_?OOG#126!10?@$#184!17?_??A!4?G!7?@??O?G??@#193!19?@!10?A#192@???G?C?aG@C??h??Q?G???T_?P???OdGA??C???Si?i?h?S_O?O?A_?_???O?O#184!103?_O@??dG_@c@O@G@?B?R?@?@?@#239!48?_N?\#96?C#55???@A#128@!5?N@?INV@FMFAINM[~n}~}{q{IswSGaCWo_O_???_#107!20?B??C!5?@??_#99!24?CA@AL?EDAnCi}Swg[O??_??O?G?G#94!13?CA@??@?@?@#102!63?A@RSg?O#143!12?G???AO#127!4?@!5?UaG??O!4?Q?G@C???AC@gg$#192!19?G???C??Q??O@_?G?C?A???S??A?g?AO?C_?H#242!42?AGG#184!22?A@?_???G?OG???A#246!104?CI???Q?OG_SaS_s?gOawuOau^|xLm}lniyi^]Kmf|X]Vdxu}~l|[]Rq[xy{xyYuBXHuVv~lN_D?G_#140!4?O!7?A??O?AG??D@??A#49!6?C!6?O??C??O?_O#117!103?O??_??O?_$#202!99?A??G#239!23?@#192!116?O!5?A!4?G??C?C??CG???A??@?O?D??_@O??A_?GA?@???A?c@AC@AC@?G?c??G#142!16?GO?G??i_#126!22?@!6?@!5?@CaISHaKo$#116!356?o#73!8?C???AG-#193~?~?Ti?i!4?OI@A??C!5?I@O??@#184!19?P???A#252???G@C!7?G!5?_?A#192!5?C_?H?_C?Q??H??AS_C?CO@???h?C???cHaGQcG@GC?ODAS_T_??HcP!11?G#239C???_#137!12?@???@??A?C@i?S#237!49?gC@G?_?GQD?APAKOC_COCPaXaOcPA?CGC`?QGAgA?G?V_@cHQ?TGc@iODGAS`O?C@??G?A_?_A???~TuHU?g!5?c#217AO#38F~?E@F^?ACCNCH?GC@g@?wQi?_?_!5?_???o#125?D??@I`MpKqHcCO_O#121@kAXcXnZLYmtBo_#114AOL_JOIgOiCP??_???AOG#101@AD?BTIVK~i^yVxjS|Q??HueXO#95!4?B?RiSxDiA@A@@C@A?DA?_???__GOG!7?__?_O??O?_O_??O?O??GOMSAD??D?O???@?@#101???A???G??P?gRgAtIeHUhUiCBG?@???C#118?@``FfE]TB@A?CE__?Oow_#132?@AD?qG#127FgG?G#140???s?AGQ?_?Si#127!5?G$#237?T?i?TiTm\zViti[jtIhV}hVSojExMydYcRcHU`YDgU`Y@YcRK_LQHShA_AO@?iP?cP?AOFg?CH?gCCqChSjOjChU_UHQLQc?C?CQD?DOhQlOLQcHuHuHYdYDJchYdiTiTcWeXePA?CGcO_@GQ_O?O!4?_#239!72?A?O??C?@!7?_A?G?I!6?C#202!4?_?O!5?P?A!19?C@?_G?A_?GAO?C#193??g#184??@#240?@?U?NG?D#2A#58G?_#52@!4?H?B?O?FA??B??FD@{R]A{WsG_OG??G#132!9?A@CR@?EN{?w_#112!4?QD?I#118cBFsLq^Sg_S!4?__#59?G_#77!5?@?BKATGR?S_?_#100?C?AGlvC?G?_go#93???CGC@A?@@SHKWBY`^Q\vZv{]U]umsckORxTxY[u[N]~M^]N]~~k]kM~Vn`BHAHfI\eHb@CBKCG?G@#100!4?O?a@!5?@#77EGEgSJWAP??A?AC#107?O#119!5?G{u[MIHK?__G?Oo#73???H?O#128?TaLUtHsA?@C@cIT@?SfWHqcGo$#239?i?Ti!6?_C?C@O!6?_?C#202!32?O??kP?i@GAOD_?C??_C?a#193!17?i@Qh?AgOA#184!4?O#193!10?O_GA??@G?APA???CXcXaRGVgU`DJiLiTmTYTjZeVnnmlkmmlmMyxtry?SBjj~~?y~~z]j~u~?}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}jDPacTQLu?GySg?_@?H?B_GC?C@??GO@#252!10?C#196!44?E???O#35@#14_#56?Hw}W_qoW_O_???_}O}w??O#128???H@BBFUB@FF?FYEf]d]pMpKq?O_O#143??A?CIAOc?_#119@?WKW#115Ha??_AT@IDOgGWO??Oo#108!8?_#72???@?DGEOj?dQ??H?aCO#131!12?A_ACG_C#85???GCGB_H???A?BBG?GA?A?B?@?@?@?@??A??@#98!6?_O!6?Wo?OXrnTm\~D~fMKUgEp!7?@#103oCOiQdgOGhICK?W?_#121??G`@_oB]VL@FFKqlQc#125DfwATa??A!6?@??A?@?DaLRvN$#196!6?T?PaCG@?O_C?O#193!39?G?C#240???CO#193!8?_?A#252!19?@O_??_O#184!17?A?@?_??A?G?c???A???CG_?O@#192!84?G!8?@???A_??G!6?OA???C!4?AG!4?C?@_?C@O?C?_@G?C?AO@??C@??G??_??A???A?C#239!5?O_BRg#104C#70O#142?A??_?DCbW_JuwsR?C?F?gC#129!5?_!4?o#127!15?G_CG_#103!20?D?AD?hCSDKoQb@kagOAS_G?__#98!11?Gq?PCGAHkFob_PgCySG??_#88!11?@?!5@?CCCA?C@@#98!7?_#88???@@B#100!17?o#113_#72???_?a?O?G_P?CPCItOo`O@???@#59??A#115?_OO_?Q_?O@_!6?O#126@!5?BKOgQG#116!4?O`IsJH~{rkYTigTiWaS$#246!17?A_Ug?AG@I?xEO@IdPKYqhMcyRhMcudXkaZqlsbU|VciyRCmPIetliWVzZU\PzXLzQJSeSZQhLhucqlX?G??gGEidUCQjalZQ?S@c@Qc_OQC?O!4?I@???GcXaP?AGC_C!84?A!5?_?gC_@?HOB_@cGCHEJGtlyrZ]nlttV|mrxg]]ZqknirZ]Sfyr|hMmzyy]vvt\^V\l|z~??Hqg~U~hhOc#193G?G#144??S!4?G#116!7?@!8?BK`SACGoGGC?oCO?`O#73!9?A@!4?@#107!20?_OA!4?C?CG#99!27?BDERwKWC?A???sgSOaoCW_g_!10?GOG_?_!6?_?_!7?_?O?_??_OGaW_aHUKeGC?aCO?O??a#134!7?G#53??G#102!6?_cCkWTL@ACG#112!9?_P???G?E?G$#192!17?G???@S?_!4?_CO?A_@C?O@?C?O@G?A??C???G!4?@#202!37?A?Q@???G#196!20?G!6?OAG_?A???D?A?GQ_TaTIPiDiScXgOOPQQPPQOpDCIGCTjgSS??~D??C`S?H?~@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@SOiCPiHq?dOD?ATAKOAo!6?G???A#244!58?O#203??_#130!16?G#132!15?@#140CAwGBg_WG_O#141!7?G#126A@?APCAPc??_?O#102!15?ABABBLGCBTUkwgO_#131!53?O?_!8?_???_!8?_???OGcOC?O??_O?AGA#108!31?A#114_?OA?W?h?A#69???O#143!5?A$#184!18?@!7?C!6?G#242!64?H#184!136?GA???GO??C?COAPaO_?_#49!116?G#117!97?A???A?C@?G-#193~?~?Ti?_DO?D??a!4?O!6?C#239?A#196??P#252!17?CO!6?_!4?C!11?C??CO?A_#192_???_C?AG@?C?OAS`CHQCOcGQ`G`IOaCGPaCHOcG@aCg?_AcI?QCa??aO???C_O?G??_??A#239!51?_#237G???_?_?_?_?_?_?_O?GOCP?IDgOaS`A@qHOGo?QcBG?KOA_QG@c?AH_OA@GcA@OC`GC??T?gA?gQk@APcGC???G?A_G???O??@OcWC@IOc@W??K?S?_#56[BArrWe?@EW[pNNV~N?B^|Mw~ksovSW_#116?DgAOF{Ho#132!4?@UHCPI?@Bh{{ocwOgY#112??@?Q?Oc?O???_#114AAGP`CCAQg`S?oG_O#101@!4?oCQ@KiXe`HUhA]kiB@gWOCj_@_??_O?_#93??@?BACC??@AFRGBCICJ?C??@C@A@D@E?A?AO?AD??CB?@?@#77!5?_#103_#99@??A??SI@S?EKAA@C?C?AA#103!5?ORecAWCQ?@A@_?A#121!7?OGo_!8?GFTaKh_#127AD#116@QICjTn^I^LzUxlup}`[_gs$#239?~?Ti?@A?_???@???G#202!32?AG?C??A?PM_POAGdOAHcOAl?O!4?C??C#184!8?_#202!11?@#193@??C!11?A??O??@ACGO?C?_GCJ?G?\@I@C_DYDOiD?W`UiFsJKZSYLYuhe\It\b]eXeXeYdYdYeWeXeWeXe!4~?~?~TyVdQtmTYLuLYTMTYLuLIdR?G?i?O?HC?AGS??aC@C!5?A#202?_?G@c?AHcOI@GcA@OC`GCaGT?gA?g#192?gA?@?OC!5?G?A_G???O???OC??@G!6?C#239@#105@#38@!7?GO_??A!8?A@C?QBE?AcUlWOSh#128?@?N!4~{hCP?sgO_#126C?BCG?e?CCgO#119@??A?ED[WKW_#115D?C?A@G@SKATK_OG_#108A#72!7?B@EX]ahUh?OCgA@_GO?CI?OG?_??_???_???_#95@??GCfKrDxCy@AgAa?`AA?@?DGC?DH?A@@G#72G?_O??O?G?OG_?G?tiTSaUWRsDCJCIFcP??CAG#102?_???cp@?_#69?A!7?A?OI?CA#107!4?CZ_D#126??I??U[o#128AKdSIC_!7?AOHE@M@]PI$#237???i?Ti\qL~Yj}T~gVuJd}R|jSza|P~GeGdItAsHeSIOjSbWA_?RGgEOCI_PG?`S?GdOAHcOAH_SH_@OCG?sAhChEWbYdGTaSjUhUlQeWehQpMpMPiTiTjShWeCDySgPdIdYcZCq_TaOAS_Y`Y_?gD?gDAG@OG?O_?_?_??O?_#239!54?cB?_?o???@??C?C?C??@#252!13?O#202!32?aG?A_G?C?OA?@O!8?O??W?@#204?K#74AB#58WcGC!9?O_?O?_!8?G#129!5?A#140!4?A#141!5?A#125?QIc@Q_S?A#143?B?A?D#118!6?@?B@IBFBF\wti]wyogBOG_#102@BAEESy]bK??G#98!5?S??C@A@CGO@cJOR_DKaTJsQDiSiO[@hHUGo?_Oo?o?o?y[EGWCKGWOO`wTGBWoI\i?OeM\m^mN^EIFUK~TnI@_I@h??@_A?A??@?A#114!7?Ac?AggAT_URhgU@g@#112???O!6?I???@???O#125?BLWqG`#140pOIO?D_QCHCA?G?O_$#196!6?S?GA?_#246S???B_G_Y?C?Cj?K?E?aXvYPIkJqXHtfSiGf|ZhcvRxnxTM_RKIhtQIlsQJlOuJjuZijxTZJ|UZQxdSCYriLh?GQ_?hGAPCGEOC`KPaCGOaCBPiW@ADIO@O@@?PHCG?L_g@??C?DQ?O?O_S_C_#192!68?_#246IC@?QCW?GOg?a?bKilX{vupj\\duYZLsQNd{uRX{mjYUrXviiVT|VVDP}{mJrz~\vvt\TVr~nln}mnJbz}sfZmfNcRqIO#70C#37_#144cX#136CG!5?__??_#144G??~[_?o#52@?@G@?@BHAADHEwAs#127!7?__I?DIGO#121@??RDHQ`zVm}l}lWw___o#103???A??@?@??A`IASL_W_C`[A`GcO#100!7?O_@OOsEE?_??O#88!18?@#100!10?_O_?oO___???_!4?_??g_O!5?_#134??C#77!15?OO?o?O??G??O?`CXOH#115A?CUGgWHCS@gUOs@??A#114!6?@C@#132!9?_#52!7?_O#38?_#55?_#127!6?A@E@$#184!14?G!4?C??_A!5?_!7?@???_!4?C#193???C#244!9?C???A#193!13?C??A#184!44?O!5?G???O!4?AO?I@?_??C!4?G!72?O?g?_?a??A@OGO!8?C#196!63?O@?G_a#83G#142!5?f@RcGFAKo???_!5?A???G?g??O_?_#49!16?C#73?A??G#107!26?CC!9?G#99!23?B?CG?YbTICJLYTiTK`yQUguKoG??G?A?D?@@S@I?S?Mg]?ApkaCO_SQC#131@?A??@??@@??B#103!14?_#100!4?cpB?C#108!6?@#59G?@#119S!7?GFG[MCdBH?}Oc_???CW_\b#129!12?_$#192!16?S?@??@G?O??P?G?C???c?O?C?A?G?@O#240!14?a#196!69?_!6?Da!6?A??I@OgDA?@OJcRcJdQdHEXAtIa[`XeXeXdYdYdXfXeXfXeX!4?~?~?iDGQlIPIdQHQdIpIdQHQdY?kRC@CADA?HS`?G?@?A!5?@#193!65?_A#240_#96???O#165!6?WcIP#52?@#77!81?@?@@??@YdQ_S_#95!17?C#101!52?o??_O?_oOG_O?_O???_G?`_GGgOHpgWGC{zhvMG?HO#107!6?C#118?g?U@_??a``?GS~@nZO_OAq_$#239!143?C??O!4?A#192!87?C???O?A??G???A!4?_#103!308?Mw-#193~?~?TgO?AG???A?O???_??A??@??_A!6?O???G!4?_?O!5?OC?@#240???@#244???G!7?@#240G#252!5?_#193_#192?OC?AG?C??A??@g@QcGO?S_ChAGQcHQc@O?O`AcG`IOaCgAGQcG_G?i?IOAS@??GCHO?C?O?O?PG?A_@?CAG?C!7?G!22?_!7?_#246??O_O?OCO!4?C_GOGC_CI?`_QoloeP}tRKwtsUNjX]ypX^ji]BlcQNTuyJltuYJLtuYXkmvtlnJby{mNjz|\TVt|lnjyymjiy{ZVes}jNldv[Tf`W#239_O#56A_RFdiT_?@BADKd^V_Q`OOO`AGS]PA@Q#116???OhQDyJ?GO@?gC#127@AP?Q_GSGG#126A_PI?DcOgS_Q_!4?_#119@B@???ozo#103?A?GBGEOKBGoAIc?G@_C?O#100???@??@@??C@@OWAA?_?@?OO??O??GCQWKc_O@KSOG?S{YZWTRh?@?HDO?@?ABH?A@@???A??A#53!12?O?G#99!4?A#102???GG???O?OceACDD@DJHWCOg??_#112!4?G?_???_!5?@?G???A#125??O^ic#38!4?A@?O?A?OC?GS_$#237?S?i?TjUkR~tk\zekVyLTylO~g]tI\o^?j?@AcQ@?aTAGACB_SGB?_?gA?CAGDOA`OCQGCQG?QC_JOAGDOdWEhQl?lQ?I@y@yDYcgSiShUhUgZclRc`W`AdItItJSjShUlQsGsJSiTIsJS@HSJSHU@U?oCPiPIcA_LAkQcGTiOAGs?CG?GOG?GOG?GO??_?_?_?O_?g?_?O_COcGAC@Ga?H_AG`OA?a@oHO`K?K_COLOk@ICpEGBG?OC_CGE_?S@_?QH?_G@cOAG@CoAG@cAP?GAOcWDAP_S??A_G?A?O?C@?OC@AcGPI@S_OOG`IOKc#240L_#38C???O??T?K?_#144?A???BDCCDA??A#38??AGsGBsJgQ?g#128?c^vn}~Vx}Ti|CW_#73@!4?A!4?_#112?@???CO@G?AG?_#114?@!4?H_EoCPGAc_?_#59C#101?@QCAHQLQlSmz[mynyhsmaDWsSGgs`?ApK?q_O??_OOGgO!5_??!4_??}WUoiCy[wWOoSgwAXShOElOjOZhPzAKDCZPalUhSIDgDHAPprba`b`@#114?G@?oCQ?sA?A@??B??A@A#119?@?BwNYdAGKO_@ADYcXg#132F_#128TQXq#55??O!5?@#149?G!5?_$#239?j?Ti??@!7?@???A#184!5?O#252!9?O???G_???_?O!4?_OCA@?O?_#184!26?_#202!6?_!7?A#193!11?GA?C?O!7?@???@A@AO?C_@G_ASa?Oa?h?gAJ`AC_SGPGQ_P?HQ_?EXdBX`UdUDEtEdEtEdI|UH]hUZJJZCTYlJEXIHadWie@WeQL`EIHsLSAC_?A?@?B???A#202??_!5?OC_@?A_?S@_[AHcOA@COAG@COAG@cAP?GAO!9?A_G?A?O?C@?OC@#193!9?A!6?@#203A#14A_#58H_G#142GD_I\Ok\ioG_?Cg?h_?A`?i`ktId{Js@#129C#140!4?_#125!5?A?gCAhCSa@DO!4?_#143!9?G#118!5?N^}NCN~s]pGA??_#102?DNH`Z}cwWo_#98!6?A???@?A?D?c@GATG?EhGQc?Z?Q`?AB?DKQBGDSHA@?DAGS@A?A?AD??@?CI@???@?C@???A!5?@?B??G!4?@#107!9?GK?GG???AG???A_OgSgkKxSc_?G!9?@AGO_o#73!4?g#116??@A?KrkEB@@DEd_??BJFE`$#196!5?ACgPc?IO_C#192?A?D?G??g?C?G??G?@!4?A!4?A???A!5?_??A#193!43?@A?@#242!12?C#252?O#196!10?@!6?@!14?@!6?@?CA?G?CQ?GC`?A?CA@Y@iPIPIPIPITAHu@UHccSCRiDQcXaDQTGB?PKB?D_UG`SB??H?JC`?Q?G?A@#252!8?_??A?@#240!7?O??_G#252!6?_#192_!11?OC?@?O?C??A_G?A?O?C@?OC@?_G@??O!4?_G#184O#218?O#2G#144HOK#136?AO???A???@Q?gO?Q?IgSGt#52!9?E?lQDO#132!12?BB?Eal^gtGQHA#115!21?@?CPgePWO?O#77???@ADAK_kOgOC_O#99!10?A@AACH?C@@@CAhCA@GFA?@GFQJA@CCAGCA??@??@??ACCA@?EC#134?A#103?_!4?C?CACOao_!7?O_?o?gC?K[O?SCQ?di_Ag?O?DICADO??g??O#121!4?COdYkSO_!5?@EB#140???GcLrK@?OgUgOAO?T?C?HU$#246!12?@??GPg?OaDOF?A`AT_F_}S~mLHluVLg|V\hKNjt[NJpSkjXSqilSAjXcrhluK`ZTcntUYnIbxSDQzQl|t]CUCg@QDh?JQ?S`D?Q?GQKbIKGPAS?cHOAS_?G@U@_?@?_@?_iSa_?a?w?lCIk?C_PGS_O?@?@???c!4?_?_?_?_?_?_?_#184!22?C??_?G!7?a?O???C!9?G?@#202!71?I!4?A#24??@#20O#74A?o#165??I?__O?O#58!4?G?GA?DGS?@#49!28?G?O#121??C?vGQLVi^l^znuv^{s}O_#107!9?_?@??A?CO#72!6?@A@AB??@?COCQGOGa@G`S??Y_CA_IC?d?GD_?O?_!5?_!5?_??cGCOg?aC?g?_S?GaGE@GQLC@?Q??@??GCKDO`ABCADAA@#115!4?C?G??W?OG?Qgc??`@?Q?OE@WC_?O#126!6?O__!8?C#129!9?OgCgO_GA^agOoOG$#252!12?A#202!23?_O???O!5?_O?A???G?OCaHCOAhSCaHCQ?@qC_IO?G@#184!54?C?O?C??G??@??C?A!6?A!5?@?_?_APG?OG_#239!42?O!8?A??OQ?H?A#196!81?A???A#83?C#37?C#129!6?A#141!47?o#95!77?G!9?A#77!15?_!6?_!5?oC_OGo?_Ogc?k?kOIO_a?A?Sg_WOGsSaE??@A?A?@#118O?O!10?B??A@YDvM~{B???@BAKOe\IdW_O#52!9?gCA??G?@_???G$#239!173?AO#192!43?O!8?O?G?C???G!4?A?AG@_!4?C#95!237?@#103!79?B$#114!568?C-#193~_~_TI?AT?@?_G@C?O!9?O!4?G!4?G#218?O#192??GA@#193!6?@#218!9?@#240??I@!7?H#192!8?C?@??C?@???G??AC?DG@I?ACHAC?@AS@CHQGAGQchAGQcHO??GOCI?@?@AcGO?@OCGPAcg??AGAdG?GA?@A?g?@_??I!8?GA?CG??I!5?@?C!4?G@?ACGDA?OCP?GCA!4?A?I??C?A!4?@#252?G#240!7?O??G!6?G?CGA?O#252!5?G#193G#192!22?G!20?O?I?A!4?A#239?Ca#37AP#136@?Oko!6?@!4?@JA?@DI#52!4?_!4?ho_SHQG#140!4?O!6?_#132!4?@HNGEhco`gDqDOOo_??wC?o?O?_#115!4?DGA?C@GHcbHCq_G?O#101?@?A?A@NANCNANEAN|jNH|mA^jMJTNZKkykveqnZLf\FIMTjlRFQLAdA@Q@??LI?HAKJ?dQG?GOQ?A?@!9?@?BIDAT?JPCK!4?@#118O_oO???A?A_!9?Oioo_[ug!8?@ADJ{h#81C#116??@???@O`_o_?OQ@#130???O?O$#237?D?I_TYtit}lZdMitelqzkvjSjcjcjSb_qw`Q?dCA?qkaX_uG?CGQc_I?T?i_CPC_i??@IQH?QHC?HQ?icidahciDQ`S@OlacjdiTITicjcLQDQdiUHUlQKRkRSLRkRShOHShYdjAPaDYSgPadWTiTISGa_UlYDXALaadISH?R?ISI`?gQODYshewsgPSIP__Q?LodO?grgaTitiDAKPCZSicQG_aSISjSHE?JO?JCPAG?T?I??C@AO?I?C??S?A?G?@S??CA??D?CAg?PC?AGDOAG?QGCA?G?G!4?@!8?caOGAOcQcICI@?Q?FI?o#58Ka@#142E??@msJaucmun|icwhsi?Ti^~CqnqC#116ACZ`UlADyC_hqO_w_?OO#141???G#121???GQHCOBGDifIF^{pFHvNjMnWwgO!7?O#102!4?O??@JDM}iKAogO?O_OO??o_??oo??_??_#99!6?@#103!9?O!5?G?G_O?K?K?{o?OQCOo?o??O@@??@?A?@o`?aOJEQAKS_gsgQsgPpdB?ys@]A?l?G_OG?O?o_y_hO???@#114?@#119?@UDIH!4?@ACGCBU#140???C?G~sjOCITiD$#239?Y?TI!8?A!5?C#184???C#252??O??O?G!4?G_??_W?@!6?@???A!6?O!5?S!24?G#193??O!13?G???_???__!4?_!4?Ac_A!4?g?CG?`ACGA_a?g?@aGT_??__o_SGO`AcaChc`_GTE`di_B??A@Rc_`gCJcgaGAdiAC?L!4?w_aga_`?H?@CH?@#202!6?O?G?O??OS?IOOS@IOCI?S?IS@AG@SPCI?TAO?T?OAG?PC?AG@OAG?QGCA?GQ??S?OHOCHAPCY@CAOGA?CA!4?O?O#240???@G#35C#74AKk#56GRK???_??I@@?ACO@EIOtiT_??H#165?G#129?O#128???_?tyDz^ELnTEXfGfruCOC_?O#73???A!5?_!5?_???_#118OA??HRqt{yq{_o!4?CO#77!6?@?@A?D?I?D?GC?AS?A?OK_S?oao_o!4?OC?_oW_g?ogSQcocALY@M_qBCADLqGAsNYdFG?``?@@AA@!5?@@?B?DQHAL?Ei?O__#115?GC?CAADRG``P_O?I?@?_OJ?A@?A#121?@YtegA?@AC?Oo??y_#128?Y@E#52?ICI@???__A$#196!5?_dG?I?QC#246OoPIHO@CPGOjSJCZCjSFDE]dRIh\fDOKeZHvziclZLtiitTIieXTOnisdkuxcqjuclvTZPY[UZPyk]jufQLXOYOas_TXOQohqkW@Gq_?DPc@GAOc@GaCJQ`E_OOCkGo@ADiSGB???PAPTG@???ECOHSGO@QSGSP?PSiPCGO???O@ACA??CISGSOAGITS?SOgO?O?W@AG??@?hsZShs`Ciqx|cnvsimtfjitdnjislbttjysja|pu`mi`~ixlvaynxtVmiz|tuiltvldrx|vdvvj~numzu|mzd}zXLft|jHlPtpd}nl|woC#38@#20_#144O?_#129!5?CG#38@O#130O#144!5?C#38!8?ZCODzCJCI#125!10?I?CODG?HpeoOV_?QGCO_G#112??@!8?S@?C?O#114???A@DGACAGCQHG?q!5?_#72!6?@???@!5?CA@!4?CG?CBOCOGH?OCA?A?D?A!4?@!5?@??@!4?@@#114!6?A!5?G???`!4?C??G#108!8?AGO#107G??A!4?O!4?KNnJSDYSNNcSKKM_#126!4?OFL\AK?G#107A#149!12?CG!6?S?G?G$#192!18?AG?A#202!10?OG@??COA!4?O?C??COA??O?T?I?T?Ga?CO@IO@?E?COHQ?G!50?C!5?O?O#184!9?C!7?O?A?@!4?C!4?A!7?A?D#239!6?G?O???@#184???O!11?C???CAO!8?O@#252!24?@#193@#184!62?G#0!7?@#83G#145??Q#165@?B}PJOTG??GO?O??O#127!27?@AGA?K?I?A?_!6?O#119!15?@FFekG!8?O#107?A???C?O#108!9?O#100!4?H!7?@!8?B?@??H!7?@#114!6?O!8?o_#59!12?GA!5?G#111!20?C#114??_??cOicSMCA#112!8?_?@?AO@G?_#73??Oo_?_!6?@\#38!8?OCGSILsgqtiti{$#240!51?O#184!81?@#196?C?A!14?C!5?O!9?G!4?CA??G!4?SH!4?@CAP??A?@???@?A??@A??@!7?CA!103?O#126!61?@C?BGCA?OGCG?BM?QG#103!13?@?BCRGc_@NCoi`?TO|KS_w_?_goo?O!6?O??O#102!17?o!5?G??_?_o?K?G??_?c!4?G_usMC{{ss{EEMLNswg{o_O???_!4?AKRDAG@HH!9?C@?CA#125!15?A{?wo!5?A~_}p#129!4?A@A@??GBLADADB$#202!216?O#98!237?@!7?A#108!20?O#134!4?A#115!17?G??G??O#69!28?@#119?O#132!25?O??_$#107!510?OO?_#103!57?@\ \ No newline at end of file diff --git a/lib/Image/Sixel.pm b/lib/Image/Sixel.pm new file mode 100644 index 00000000..5cae15af --- /dev/null +++ b/lib/Image/Sixel.pm @@ -0,0 +1,28 @@ +package Image::Sixel; +use 5.012001; +our $VERSION = '0.0_1'; + +require XSLoader; +XSLoader::load('Image::Sixel', $VERSION); + +1; + +__END__ + +=head1 NAME + +Image::Sixel - perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 Class Methods + +=head2 Object Methods + +=head1 AUTHOR + +=head1 SEE ALSO + +=cut diff --git a/lib/Image/Sixel.xs b/lib/Image/Sixel.xs new file mode 100644 index 00000000..1e56940e --- /dev/null +++ b/lib/Image/Sixel.xs @@ -0,0 +1,183 @@ +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include "ppport.h" +#include + +MODULE = Image::Sixel PACKAGE = Image::Sixel + +void +_sixel(...) +PPCODE: +{ + PerlIO_printf(PerlIO_stdout(), "Hello, world!\n"); + XSRETURN(0); +} + +MODULE = Image::Sixel PACKAGE = Image::Sixel::Encoder PREFIX = encoder_ + +SV * +encoder_new(void) + INIT: + sixel_encoder_t *encoder; + SV *sv; + CODE: + encoder = sixel_encoder_create(); + if (!encoder) { + XSRETURN_UNDEF; + } else { + const char *klass = SvPV_nolen(ST(0)); + sv = newSViv(PTR2IV(encoder)); + if (!sv) { + XSRETURN_UNDEF; + } + sv = newRV_noinc(sv); + sv_bless(sv, gv_stashpv(klass, 1)); + SvREADONLY_on(sv); + RETVAL = sv; + } + OUTPUT: + RETVAL + + +void +encoder_setopt(...) + INIT: + IV iv; + sixel_encoder_t *encoder; + char const *arg; + char const *optarg = NULL; + int retval; + PPCODE: + if (items != 2 && items != 3) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + encoder = INT2PTR(sixel_encoder_t *, iv); + arg = SvPV_nolen(ST(1)); + if (strlen(arg) != 1) { + croak("Bad argument: %s", arg); + } + if (items == 3) { + optarg = SvPV_nolen(ST(2)); + } + retval = sixel_encoder_setopt(encoder, *arg, optarg); + if (retval != 0) { + croak("setopt() failed"); + } + + +void +encoder_encode(...) + INIT: + IV iv; + sixel_encoder_t *encoder; + char const *infile; + int retval; + PPCODE: + if (items != 2) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + encoder = INT2PTR(sixel_encoder_t *, iv); + infile = SvPV_nolen(ST(1)); + retval = sixel_encoder_encode(encoder, infile); + if (retval != 0) { + croak("encode() failed"); + } + + +void +encoder_DESTROY(...) + INIT: + IV iv; + sixel_encoder_t *encoder; + PPCODE: + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + encoder = INT2PTR(sixel_encoder_t *, iv); + sixel_encoder_unref(encoder); + + + +MODULE = Image::Sixel PACKAGE = Image::Sixel::Decoder PREFIX = decoder_ + +SV * +decoder_new(void) + INIT: + sixel_decoder_t *decoder; + SV *sv; + CODE: + decoder = sixel_decoder_create(); + if (!decoder) { + XSRETURN_UNDEF; + } else { + const char *klass = SvPV_nolen(ST(0)); + sv = newSViv(PTR2IV(decoder)); + if (!sv) { + XSRETURN_UNDEF; + } + sv = newRV_noinc(sv); + sv_bless(sv, gv_stashpv(klass, 1)); + SvREADONLY_on(sv); + RETVAL = sv; + } + OUTPUT: + RETVAL + + +void +decoder_setopt(...) + INIT: + IV iv; + sixel_decoder_t *decoder; + char const *arg; + char const *optarg = NULL; + int retval; + PPCODE: + if (items != 2 && items != 3) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + decoder = INT2PTR(sixel_decoder_t *, iv); + arg = SvPV_nolen(ST(1)); + if (strlen(arg) != 1) { + croak("Bad argument: %s", arg); + } + if (items == 3) { + optarg = SvPV_nolen(ST(2)); + } + retval = sixel_decoder_setopt(decoder, *arg, optarg); + if (retval != 0) { + croak("setopt() failed"); + } + + +void +decoder_decode(...) + INIT: + IV iv; + sixel_decoder_t *decoder; + int retval; + PPCODE: + if (items != 1) { + croak("Bad argument count: %d", items); + } + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + decoder = INT2PTR(sixel_decoder_t *, iv); + retval = sixel_decoder_decode(decoder); + if (retval != 0) { + croak("decode() failed"); + } + + +void +decoder_DESTROY(...) + INIT: + IV iv; + sixel_decoder_t *decoder; + PPCODE: + iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); + decoder = INT2PTR(sixel_decoder_t *, iv); + sixel_decoder_unref(decoder); diff --git a/lib/Image/Sixel/Decoder.pm b/lib/Image/Sixel/Decoder.pm new file mode 100644 index 00000000..6c78a052 --- /dev/null +++ b/lib/Image/Sixel/Decoder.pm @@ -0,0 +1,4 @@ +package Image::Sixel::Decoder; +use Image::Sixel; + +1; diff --git a/lib/Image/Sixel/Encoder.pm b/lib/Image/Sixel/Encoder.pm new file mode 100644 index 00000000..a21ba473 --- /dev/null +++ b/lib/Image/Sixel/Encoder.pm @@ -0,0 +1,4 @@ +package Image::Sixel::Encoder; +use Image::Sixel; + +1; diff --git a/lib/Image/ppport.h b/lib/Image/ppport.h new file mode 100644 index 00000000..9eff35fe --- /dev/null +++ b/lib/Image/ppport.h @@ -0,0 +1,7258 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.20 + + Automatically created by Devel::PPPort running under perl 5.018001. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.20 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --version show version + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.11.5. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --version + +Display the version of F. + +=head2 --patch=I + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. Note that this does not +automagially add a dot between the original filename and the +suffix. If you want the dot, you have to include it in the option +argument. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C or a C program to be installed. + +=head2 --diff=I + +Manually set the diff program and options to use. The default +is to use C, when installed, and output unified +context diffs. + +=head2 --compat-version=I + +Tell F to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. Warnings will still be displayed. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F. +This reduces the size of F dramatically and may be useful +if you want to include F in smaller modules without +increasing their distribution size too much. + +The stripped F will have a C<--unstrip> option that allows +you to undo the stripping, but only if an appropriate C +module is installed. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints or warnings for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I + +Show portability information for API elements matching I. +If I is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C prefix is deprecated. Also, +some API functions used to have a C prefix. Using this form is +also deprecated. You can safely use the supported API, as F +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F. + +These functions or variables will be marked C in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C or global +variants. + +For a C function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + load_module() NEED_load_module NEED_load_module_GLOBAL + my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL + my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL + my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL + my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL + newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL + newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL + pv_display() NEED_pv_display NEED_pv_display_GLOBAL + pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL + pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL + sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + vload_module() NEED_vload_module NEED_vload_module_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + warner() NEED_warner NEED_warner_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C +macro. Just C<#define> the macro before including C: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C. + +=back + +The good thing is that most of the above can be checked by running +F on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +If you want to create patched copies of your files instead, use: + + perl ppport.h --copy=.new + +To display portability information for the C function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F is causing failure during +the compilation of this module, please check if newer versions +of either this module or C are available on CPAN +before sending a bug report. + +If F was generated using the latest version of +C and is causing failure of this module, please +file a bug report using the CPAN Request Tracker at L. + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2010, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L. + +=cut + +use strict; + +# Disable broken TRIE-optimization +BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } + +my $VERSION = 3.20; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, + version => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +# Never use C comments in this file! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip version + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +if ($opt{version}) { + print "This is $0 $VERSION.\n"; + exit 0; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +AvFILLp|5.004050||p +AvFILL||| +BhkDISABLE||5.014000| +BhkENABLE||5.014000| +BhkENTRY_set||5.014000| +BhkENTRY||| +BhkFLAGS||| +CALL_BLOCK_HOOKS||| +CLASS|||n +CPERLscope|5.005000||p +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002||p +Copy||| +CvPADLIST||| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV_set|5.010001||p +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_METHOD|5.006001||p +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvSVn|5.009003||p +GvSV||| +Gv_AMupdate||5.011000| +HEf_SVKEY||5.004000| +HeHASH||5.004000| +HeKEY||5.004000| +HeKLEN||5.004000| +HePV||5.004000| +HeSVKEY_force||5.004000| +HeSVKEY_set||5.004000| +HeSVKEY||5.004000| +HeUTF8||5.010001| +HeVAL||5.004000| +HvENAME||5.013007| +HvNAMELEN_get|5.009003||p +HvNAME_get|5.009003||p +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LINKLIST||5.013006| +LVRET||| +MARK||| +MULTICALL||5.014000| +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002||p +Move||| +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +OP_CLASS||5.013007| +OP_DESC||5.007003| +OP_NAME||5.007003| +ORIGMARK||| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_DUP||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERLIO_FUNCS_CAST|5.009003||p +PERLIO_FUNCS_DECL|5.009003||p +PERL_ABS|5.008001||p +PERL_BCDVERSION|5.014000||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_HASH|5.004000||p +PERL_INT_MAX|5.004000||p +PERL_INT_MIN|5.004000||p +PERL_LONG_MAX|5.004000||p +PERL_LONG_MIN|5.004000||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.014000||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.014000||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.007002||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.007002||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_PV_ESCAPE_ALL|5.009004||p +PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p +PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p +PERL_PV_ESCAPE_NOCLEAR|5.009004||p +PERL_PV_ESCAPE_QUOTE|5.009004||p +PERL_PV_ESCAPE_RE|5.009005||p +PERL_PV_ESCAPE_UNI_DETECT|5.009004||p +PERL_PV_ESCAPE_UNI|5.009004||p +PERL_PV_PRETTY_DUMP|5.009004||p +PERL_PV_PRETTY_ELLIPSES|5.010000||p +PERL_PV_PRETTY_LTGT|5.009004||p +PERL_PV_PRETTY_NOCLEAR|5.010000||p +PERL_PV_PRETTY_QUOTE|5.009004||p +PERL_PV_PRETTY_REGPROP|5.009004||p +PERL_QUAD_MAX|5.004000||p +PERL_QUAD_MIN|5.004000||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.004000||p +PERL_SHORT_MIN|5.004000||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_SYS_INIT3||5.006000| +PERL_SYS_INIT||| +PERL_SYS_TERM||5.014000| +PERL_UCHAR_MAX|5.004000||p +PERL_UCHAR_MIN|5.004000||p +PERL_UINT_MAX|5.004000||p +PERL_UINT_MIN|5.004000||p +PERL_ULONG_MAX|5.004000||p +PERL_ULONG_MIN|5.004000||p +PERL_UNUSED_ARG|5.009003||p +PERL_UNUSED_CONTEXT|5.009004||p +PERL_UNUSED_DECL|5.007002||p +PERL_UNUSED_VAR|5.007002||p +PERL_UQUAD_MAX|5.004000||p +PERL_UQUAD_MIN|5.004000||p +PERL_USE_GCC_BRACE_GROUPS|5.009004||p +PERL_USHORT_MAX|5.004000||p +PERL_USHORT_MIN|5.004000||p +PERL_VERSION|5.006000||p +PL_DBsignal|5.005000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||pn +PL_Sv|5.005000||p +PL_bufend|5.014000||p +PL_bufptr|5.014000||p +PL_compiling|5.004050||p +PL_copline|5.014000||p +PL_curcop|5.004050||p +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_error_count|5.014000||p +PL_expect|5.014000||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_in_my_stash|5.014000||p +PL_in_my|5.014000||p +PL_keyword_plugin||5.011002| +PL_last_in_gv|||n +PL_laststatval|5.005000||p +PL_lex_state|5.014000||p +PL_lex_stuff|5.014000||p +PL_linestr|5.014000||p +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofsgv|||n +PL_opfreehook||5.011000|n +PL_parser|5.009005|5.009005|p +PL_peepp||5.007003|n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rpeepp||5.013005|n +PL_rsfp_filters|5.014000||p +PL_rsfp|5.014000||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_statcache|5.005000||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +PL_tokenbuf|5.014000||p +POP_MULTICALL||5.014000| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2nat|5.009003||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.014000| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_context_layers||5.009004| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Perl_signbit||5.009005|n +PoisonFree|5.009004||p +PoisonNew|5.009004||p +PoisonWith|5.009004||p +Poison|5.008000||p +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +STR_WITH_LEN|5.009003||p +ST||| +SV_CONST_RETURN|5.009003||p +SV_COW_DROP_PV|5.008001||p +SV_COW_SHARED_HASH_KEYS|5.009005||p +SV_GMAGIC|5.007002||p +SV_HAS_TRAILING_NUL|5.009004||p +SV_IMMEDIATE_UNREF|5.007001||p +SV_MUTABLE_RETURN|5.009003||p +SV_NOSTEAL|5.009002||p +SV_SMAGIC|5.009003||p +SV_UTF8_NO_ENCODING|5.008001||p +SVfARG|5.009005||p +SVf_UTF8|5.006000||p +SVf|5.006000||p +SVt_IV||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVHV||| +SVt_PVMG||| +SVt_PV||| +Safefree||| +Slab_Alloc||| +Slab_Free||| +Slab_to_rw||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGAMAGIC||5.006001| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_nomg||5.013002| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK_offset||5.011000| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_const|5.009003||p +SvPV_flags_const_nolen|5.009003||p +SvPV_flags_const|5.009003||p +SvPV_flags_mutable|5.009003||p +SvPV_flags|5.007002||p +SvPV_force_flags_mutable|5.009003||p +SvPV_force_flags_nolen|5.009003||p +SvPV_force_flags|5.007002||p +SvPV_force_mutable|5.009003||p +SvPV_force_nolen|5.009003||p +SvPV_force_nomg_nolen|5.009003||p +SvPV_force_nomg|5.007002||p +SvPV_force|||p +SvPV_mutable|5.009003||p +SvPV_nolen_const|5.009003||p +SvPV_nolen|5.006000||p +SvPV_nomg_const_nolen|5.009003||p +SvPV_nomg_const|5.009003||p +SvPV_nomg_nolen||5.013007| +SvPV_nomg|5.007002||p +SvPV_renew|5.009003||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec||| +SvREFCNT_inc_NN|5.009004||p +SvREFCNT_inc_simple_NN|5.009004||p +SvREFCNT_inc_simple_void_NN|5.009004||p +SvREFCNT_inc_simple_void|5.009004||p +SvREFCNT_inc_simple|5.009004||p +SvREFCNT_inc_void_NN|5.009004||p +SvREFCNT_inc_void|5.009004||p +SvREFCNT_inc|||p +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvRXOK||5.009005| +SvRX||5.009005| +SvSETMAGIC||| +SvSHARED_HASH|5.009003||p +SvSHARE||5.007003| +SvSTASH_set|5.009003||p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTRUE_nomg||5.013006| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK|5.007001|5.006000|p +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +SvVSTRING_mg|5.009004||p +THIS|||n +UNDERBAR|5.009002||p +UTF8_MAXBYTES|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +WARN_ALL|5.006000||p +WARN_AMBIGUOUS|5.006000||p +WARN_ASSERTIONS|5.014000||p +WARN_BAREWORD|5.006000||p +WARN_CLOSED|5.006000||p +WARN_CLOSURE|5.006000||p +WARN_DEBUGGING|5.006000||p +WARN_DEPRECATED|5.006000||p +WARN_DIGIT|5.006000||p +WARN_EXEC|5.006000||p +WARN_EXITING|5.006000||p +WARN_GLOB|5.006000||p +WARN_INPLACE|5.006000||p +WARN_INTERNAL|5.006000||p +WARN_IO|5.006000||p +WARN_LAYER|5.008000||p +WARN_MALLOC|5.006000||p +WARN_MISC|5.006000||p +WARN_NEWLINE|5.006000||p +WARN_NUMERIC|5.006000||p +WARN_ONCE|5.006000||p +WARN_OVERFLOW|5.006000||p +WARN_PACK|5.006000||p +WARN_PARENTHESIS|5.006000||p +WARN_PIPE|5.006000||p +WARN_PORTABLE|5.006000||p +WARN_PRECEDENCE|5.006000||p +WARN_PRINTF|5.006000||p +WARN_PROTOTYPE|5.006000||p +WARN_QW|5.006000||p +WARN_RECURSION|5.006000||p +WARN_REDEFINE|5.006000||p +WARN_REGEXP|5.006000||p +WARN_RESERVED|5.006000||p +WARN_SEMICOLON|5.006000||p +WARN_SEVERE|5.006000||p +WARN_SIGNAL|5.006000||p +WARN_SUBSTR|5.006000||p +WARN_SYNTAX|5.006000||p +WARN_TAINT|5.006000||p +WARN_THREADS|5.008000||p +WARN_UNINITIALIZED|5.006000||p +WARN_UNOPENED|5.006000||p +WARN_UNPACK|5.006000||p +WARN_UNTIE|5.006000||p +WARN_UTF8|5.006000||p +WARN_VOID|5.006000||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002||p +XCPT_TRY_END|5.009002||p +XCPT_TRY_START|5.009002||p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSPROTO|5.010000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_APIVERSION_BOOTCHECK||5.013004| +XS_VERSION_BOOTCHECK||| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +XopDISABLE||5.014000| +XopENABLE||5.014000| +XopENTRY_set||5.014000| +XopENTRY||5.014000| +XopFLAGS||5.013007| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_append_range_to_invlist||| +_new_invlist||| +_pMY_CXT|5.007003||p +_swash_inversion_hash||| +_swash_to_invlist||| +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHXR_|5.014000||p +aTHXR|5.014000||p +aTHX_|5.006000||p +aTHX|5.006000||p +add_alternate||| +add_cp_to_invlist||| +add_data|||n +add_range_to_invlist||| +add_utf16_textfilter||| +addmad||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_deref_call||5.013007| +amagic_i_ncmp||| +amagic_ncmp||| +anonymise_cv_maybe||| +any_dup||| +ao||| +append_madprops||| +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +assert_uft8_cache_coherent||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_create_and_push||5.009005| +av_create_and_unshift_one||5.009005| +av_delete||5.006000| +av_exists||5.006000| +av_extend||| +av_fetch||| +av_fill||| +av_iter_p||5.011000| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_undef||| +av_unshift||| +ax|||n +bad_type||| +bind_match||| +block_end||| +block_gimme||5.004000| +block_start||| +blockhook_register||5.013003| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_mro||| +bytes_cmp_utf8||5.013007| +bytes_from_utf8||5.007001| +bytes_to_uni|||n +bytes_to_utf8||5.006001| +call_argv|5.006000||p +call_atexit||5.006000| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +caller_cx||5.013005| +calloc||5.007002|n +cando||| +cast_i32||5.006000| +cast_iv||5.006000| +cast_ulong||5.006000| +cast_uv||5.006000| +check_type_and_open||| +check_uni||| +check_utf8_print||| +checkcomma||| +checkposixcc||| +ckWARN|5.006000||p +ck_entersub_args_list||5.013006| +ck_entersub_args_proto_or_list||5.013006| +ck_entersub_args_proto||5.013006| +ck_warner_d||5.011001|v +ck_warner||5.011001|v +ckwarn_common||| +ckwarn_d||5.009003| +ckwarn||5.009003| +cl_and|||n +cl_anything|||n +cl_init|||n +cl_is_anything|||n +cl_or|||n +clear_placeholders||| +clone_params_del|||n +clone_params_new|||n +closest_cop||| +convert||| +cop_free||| +cop_hints_2hv||5.013007| +cop_hints_fetch_pvn||5.013007| +cop_hints_fetch_pvs||5.013007| +cop_hints_fetch_pv||5.013007| +cop_hints_fetch_sv||5.013007| +cophh_2hv||5.013007| +cophh_copy||5.013007| +cophh_delete_pvn||5.013007| +cophh_delete_pvs||5.013007| +cophh_delete_pv||5.013007| +cophh_delete_sv||5.013007| +cophh_fetch_pvn||5.013007| +cophh_fetch_pvs||5.013007| +cophh_fetch_pv||5.013007| +cophh_fetch_sv||5.013007| +cophh_free||5.013007| +cophh_new_empty||5.014000| +cophh_store_pvn||5.013007| +cophh_store_pvs||5.013007| +cophh_store_pv||5.013007| +cophh_store_sv||5.013007| +cr_textfilter||| +create_eval_scope||| +croak_no_modify||5.013003| +croak_nocontext|||vn +croak_sv||5.013001| +croak_xs_usage||5.010001| +croak|||v +csighandler||5.009003|n +curmad||| +curse||| +custom_op_desc||5.007003| +custom_op_name||5.007003| +custom_op_register||5.013007| +custom_op_xop||5.013007| +cv_ckproto_len||| +cv_clone||| +cv_const_sv||5.004000| +cv_dump||| +cv_get_call_checker||5.013006| +cv_set_call_checker||5.013006| +cv_undef||| +cvgv_set||| +cvstash_set||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXR|5.014000||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dVAR|5.009003||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +debug_start_match||| +deb||5.007003|v +del_sv||| +delete_eval_scope||| +delimcpy||5.004000|n +deprecate_commaless_var_list||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_sv||5.013001| +die_unwind||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_close||| +do_delete_local||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_oddball||| +do_op_dump||5.006000| +do_op_xmldump||| +do_open9||5.006000| +do_openn||5.007001| +do_open||5.004000| +do_pmop_dump||5.006000| +do_pmop_xmldump||| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +dump_all_perl||| +dump_all||5.006000| +dump_eval||5.006000| +dump_exec_pos||| +dump_fds||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs_perl||| +dump_packsubs||5.006000| +dump_sub_perl||| +dump_sub||5.006000| +dump_sv_child||| +dump_trie_interim_list||| +dump_trie_interim_table||| +dump_trie||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_cop_io||| +eval_pv|5.006000||p +eval_sv|5.006000||p +exec_failed||| +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +feature_is_enabled||| +fetch_cop_label||5.011000| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +find_and_forget_pmops||| +find_array_subscript||| +find_beginning||| +find_byclass||| +find_hash_subscript||| +find_in_my_stash||| +find_runcv||5.008001| +find_rundefsvoffset||5.009002| +find_rundefsv||5.013002| +find_script||| +find_uninit_var||| +first_symbol|||n +foldEQ_latin1||5.013008|n +foldEQ_locale||5.013002|n +foldEQ_utf8_flags||5.013010| +foldEQ_utf8||5.013002| +foldEQ||5.013002|n +fold_constants||| +forbid_setid||| +force_ident||| +force_list||| +force_next||| +force_strict_version||| +force_version||| +force_word||| +forget_pmop||| +form_nocontext|||vn +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_aux_mg||| +get_av|5.006000||p +get_context||5.006000|n +get_cvn_flags|5.009005||p +get_cvs|5.011000||p +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_re_arg||| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +glob_2number||| +glob_assign_glob||| +glob_assign_ref||| +gp_dup||| +gp_free||| +gp_ref||| +grok_bin|5.007003||p +grok_bslash_c||| +grok_bslash_o||| +grok_hex|5.007003||p +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_add_by_type||5.011000| +gv_autoload4||5.004000| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.004000| +gv_efullname4||5.006001| +gv_efullname||| +gv_ename||| +gv_fetchfile_flags||5.009005| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod_flags||5.011000| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags|5.009002||p +gv_fetchpvs|5.009004||p +gv_fetchpv||| +gv_fetchsv|5.009002||p +gv_fullname3||5.004000| +gv_fullname4||5.006001| +gv_fullname||| +gv_get_super_pkg||| +gv_handler||5.007001| +gv_init_sv||| +gv_init||| +gv_magicalize_isa||| +gv_magicalize_overload||| +gv_name_set||5.009004| +gv_stashpvn|5.004000||p +gv_stashpvs|5.009003||p +gv_stashpv||| +gv_stashsv||| +gv_try_downgrade||| +he_dup||| +hek_dup||| +hfreeentries||| +hsplit||| +hv_assert||| +hv_auxinit|||n +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_common_key_len||5.010000| +hv_common||5.010000| +hv_copy_hints_hv||5.009004| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.004000| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_ename_add||| +hv_ename_delete||| +hv_exists_ent||5.004000| +hv_exists||| +hv_fetch_ent||5.004000| +hv_fetchs|5.009003||p +hv_fetch||| +hv_fill||5.013002| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.004000| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.004000| +hv_magic_check|||n +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||5.009003| +hv_placeholders_set||5.009003| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.004000| +hv_store_flags||5.008000| +hv_stores|5.009004||p +hv_store||| +hv_undef_flags||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incline||| +incpush_if_exists||| +incpush_use_sep||| +incpush||| +ingroup||| +init_argv_symbols||| +init_dbargs||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +instr|||n +intro_my||| +intuit_method||| +intuit_more||| +invert||| +invlist_array||| +invlist_destroy||| +invlist_extend||| +invlist_intersection||| +invlist_len||| +invlist_max||| +invlist_set_array||| +invlist_set_len||| +invlist_set_max||| +invlist_trim||| +invlist_union||| +invoke_exception_hook||| +io_close||| +isALNUMC|5.006000||p +isALPHA||| +isASCII|5.006000||p +isBLANK|5.006001||p +isCNTRL|5.006000||p +isDIGIT||| +isGRAPH|5.006000||p +isGV_with_GP|5.009004||p +isLOWER||| +isOCTAL||5.013005| +isPRINT|5.004000||p +isPSXSPC|5.006001||p +isPUNCT|5.006000||p +isSPACE||| +isUPPER||| +isWORDCHAR||5.013006| +isXDIGIT|5.006000||p +is_an_int||| +is_ascii_string||5.011000|n +is_gv_magical_sv||| +is_handle_constructor|||n +is_inplace_av||| +is_list_assignment||| +is_lvalue_sub||5.007001| +is_uni_alnum_lc||5.006000| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_X_LVT||| +is_utf8_X_LV_LVT_V||| +is_utf8_X_LV||| +is_utf8_X_L||| +is_utf8_X_T||| +is_utf8_X_V||| +is_utf8_X_begin||| +is_utf8_X_extend||| +is_utf8_X_non_hangul||| +is_utf8_X_prepend||| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_char_slow|||n +is_utf8_char||5.006000|n +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_perl_space||5.011001| +is_utf8_perl_word||5.011001| +is_utf8_posix_digit||5.011001| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003|n +is_utf8_string_loc||5.008001|n +is_utf8_string||5.006001|n +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +is_utf8_xidcont||5.013010| +is_utf8_xidfirst||5.013010| +isa_lookup||| +items|||n +ix|||n +jmaybe||| +join_exact||| +keyword_plugin_standard||| +keyword||| +leave_scope||| +lex_bufutf8||5.011002| +lex_discard_to||5.011002| +lex_grow_linestr||5.011002| +lex_next_chunk||5.011002| +lex_peek_unichar||5.011002| +lex_read_space||5.011002| +lex_read_to||5.011002| +lex_read_unichar||5.011002| +lex_start||5.009005| +lex_stuff_pvn||5.011002| +lex_stuff_pvs||5.013005| +lex_stuff_pv||5.013006| +lex_stuff_sv||5.011002| +lex_unstuff||5.011002| +listkids||| +list||| +load_module_nocontext|||vn +load_module|5.006000||pv +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHs|5.010001||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHs|5.010001||p +mXPUSHu|5.009002||p +mad_free||| +madlex||| +madparse||| +magic_clear_all_env||| +magic_clearenv||| +magic_clearhints||| +magic_clearhint||| +magic_clearisa||| +magic_clearpack||| +magic_clearsig||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_getarylen||| +magic_getdefelem||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_len||| +magic_methcall1||| +magic_methcall|||v +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setamagic||| +magic_setarylen||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdefelem||| +magic_setenv||| +magic_sethint||| +magic_setisa||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +make_matcher||| +make_trie_failtable||| +make_trie||| +malloc_good_size|||n +malloced_size|||n +malloc||5.007002|n +markstack_grow||| +matcher_matches_sv||| +measure_struct||| +memEQs|5.009005||p +memEQ|5.004000||p +memNEs|5.009005||p +memNE|5.004000||p +mem_collxfrm||| +mem_log_common|||n +mess_alloc||| +mess_nocontext|||vn +mess_sv||5.013001| +mess||5.006000|v +method_common||| +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_findext||5.013008| +mg_find||| +mg_free_type||5.013006| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical||| +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002| +missingterm||| +mode_from_discipline||| +modkids||| +mod||| +more_bodies||| +more_sv||| +moreswitches||| +mro_clean_isarev||| +mro_gather_and_rename||| +mro_get_from_name||5.010001| +mro_get_linear_isa_dfs||| +mro_get_linear_isa||5.009005| +mro_get_private_data||5.010001| +mro_isa_changed_in||| +mro_meta_dup||| +mro_meta_init||| +mro_method_changed_in||5.009005| +mro_package_moved||| +mro_register||5.010001| +mro_set_mro||5.010001| +mro_set_private_data||5.010001| +mul128||| +mulexp10|||n +munge_qwlist_to_paren_list||| +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_betoh16|||n +my_betoh32|||n +my_betoh64|||n +my_betohi|||n +my_betohl|||n +my_betohs|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_index||| +my_cxt_init||| +my_dirfd||5.009005| +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_htobe16|||n +my_htobe32|||n +my_htobe64|||n +my_htobei|||n +my_htobel|||n +my_htobes|||n +my_htole16|||n +my_htole32|||n +my_htole64|||n +my_htolei|||n +my_htolel|||n +my_htoles|||n +my_htonl||| +my_kid||| +my_letoh16|||n +my_letoh32|||n +my_letoh64|||n +my_letohi|||n +my_letohl|||n +my_letohs|||n +my_lstat_flags||| +my_lstat||5.014000| +my_memcmp||5.004000|n +my_memset|||n +my_ntohl||| +my_pclose||5.004000| +my_popen_list||5.007001| +my_popen||5.004000| +my_setenv||| +my_snprintf|5.009004||pvn +my_socketpair||5.007003|n +my_sprintf|5.009003||pvn +my_stat_flags||| +my_stat||5.014000| +my_strftime||5.007002| +my_strlcat|5.009004||pn +my_strlcpy|5.009004||pn +my_swabn|||n +my_swap||| +my_unexec||| +my_vsnprintf||5.009004|n +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB|5.004050||p +newCVREF||| +newDEFSVOP||| +newFORM||| +newFOROP||5.013007| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGP||| +newGVOP||| +newGVREF||| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMADPROP||| +newMADsv||| +newMYSUB||| +newNULLLIST||| +newOP||| +newPADOP||| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.004000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSUB||| +newSVOP||| +newSVREF||| +newSV_type|5.009005||p +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpv_share||5.013006| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_flags|5.010001||p +newSVpvn_share|5.007001||p +newSVpvn_utf8|5.010001||p +newSVpvn|5.004050||p +newSVpvs_flags|5.010001||p +newSVpvs_share|5.009003||p +newSVpvs|5.009003||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newTOKEN||| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.013007| +newXS_flags||5.009004| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +new_warnings_bitfield||| +next_symbol||| +nextargv||| +nextchar||| +ninstr|||n +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +not_a_number||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +oopsAV||| +oopsHV||| +op_append_elem||5.013006| +op_append_list||5.013006| +op_clear||| +op_const_sv||| +op_contextualize||5.013006| +op_dump||5.006000| +op_free||| +op_getmad_weak||| +op_getmad||| +op_linklist||5.013006| +op_lvalue||5.013007| +op_null||5.007002| +op_prepend_elem||5.013006| +op_refcnt_dec||| +op_refcnt_inc||| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +op_scope||5.013007| +op_xmldump||| +open_script||| +opt_scalarhv||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +packWARN|5.007003||p +pack_cat||5.007003| +pack_rec||| +package_version||| +package||| +packlist||5.008001| +pad_add_anon||| +pad_add_name_sv||| +pad_add_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||| +pad_findlex||| +pad_findmy||5.011002| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||| +pad_peg|||n +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||| +pad_swipe||| +pad_tidy||| +padlist_dup||| +parse_arithexpr||5.013008| +parse_barestmt||5.013007| +parse_block||5.013007| +parse_body||| +parse_fullexpr||5.013008| +parse_fullstmt||5.013005| +parse_label||5.013007| +parse_listexpr||5.013008| +parse_stmtseq||5.013006| +parse_termexpr||5.013008| +parse_unicode_opts||| +parser_dup||| +parser_free||| +path_is_absolute|||n +peep||| +pending_Slabs_to_ro||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pm_description||| +pmop_dump||5.006000| +pmop_xmldump||| +pmruntime||| +pmtrans||| +pop_scope||| +populate_isa|||v +pregcomp||5.009005| +pregexec||| +pregfree2||5.011000| +pregfree||| +prepend_madprops||| +prescan_version||5.011004| +printbuf||| +printf_nocontext|||vn +process_special_blocks||| +ptr_table_clear||5.009005| +ptr_table_fetch||5.009005| +ptr_table_find|||n +ptr_table_free||5.009005| +ptr_table_new||5.009005| +ptr_table_split||5.009005| +ptr_table_store||5.009005| +push_scope||| +put_byte||| +pv_display|5.006000||p +pv_escape|5.009004||p +pv_pretty|5.009004||p +pv_uni_display||5.007003| +qerror||| +qsortsvu||| +re_compile||5.009005| +re_croak2||| +re_dup_guts||| +re_intuit_start||5.009005| +re_intuit_string||5.006000| +readpipe_override||| +realloc||5.007002|n +reentrant_free||| +reentrant_init||| +reentrant_retry|||vn +reentrant_size||| +ref_array_or_hash||| +refcounted_he_chain_2hv||| +refcounted_he_fetch_pvn||| +refcounted_he_fetch_pvs||| +refcounted_he_fetch_pv||| +refcounted_he_fetch_sv||| +refcounted_he_free||| +refcounted_he_inc||| +refcounted_he_new_pvn||| +refcounted_he_new_pvs||| +refcounted_he_new_pv||| +refcounted_he_new_sv||| +refcounted_he_value||| +refkids||| +refto||| +ref||5.014000| +reg_check_named_buff_matched||| +reg_named_buff_all||5.009005| +reg_named_buff_exists||5.009005| +reg_named_buff_fetch||5.009005| +reg_named_buff_firstkey||5.009005| +reg_named_buff_iter||| +reg_named_buff_nextkey||5.009005| +reg_named_buff_scalar||5.009005| +reg_named_buff||| +reg_namedseq||| +reg_node||| +reg_numbered_buff_fetch||| +reg_numbered_buff_length||| +reg_numbered_buff_store||| +reg_qr_package||| +reg_recode||| +reg_scan_name||| +reg_skipcomment||| +reg_temp_copy||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.009004| +regclass||| +regcppop||| +regcppush||| +regcurly||| +regdump_extflags||| +regdump||5.005000| +regdupe_internal||| +regexec_flags||5.005000| +regfree_internal||5.009005| +reghop3|||n +reghop4|||n +reghopmaybe3|||n +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regpiece||| +regpposixcc||| +regprop||| +regrepeat||| +regtail_study||| +regtail||| +regtry||| +reguni||| +regwhite|||n +reg||| +repeatcpy|||n +report_evil_fh||| +report_uninit||| +report_wrongway_fh||| +require_pv||5.006000| +require_tie_mod||| +restore_magic||| +rninstr|||n +rpeep||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rv2cv_op_cv||5.013006| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_adelete||5.011000| +save_aelem_flags||5.011000| +save_aelem||5.004050| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hdelete||5.011000| +save_hek_flags|||n +save_helem_flags||5.011000| +save_helem||5.004050| +save_hints||5.010001| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||5.005000| +save_padsv_and_mortalize||5.010001| +save_pptr||| +save_pushi32ptr||5.010001| +save_pushptri32ptr||| +save_pushptrptr||5.010001| +save_pushptr||5.010001| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_svref||| +save_vptr||5.006000| +savepvn||| +savepvs||5.009003| +savepv||| +savesharedpvn||5.009005| +savesharedpvs||5.013006| +savesharedpv||5.007003| +savesharedsvpv||5.013006| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type|||n +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.009005| +scan_word||| +screaminstr||5.005000| +search_const||| +seed||5.008001| +sequence_num||| +sequence_tail||| +sequence||| +set_context||5.006000|n +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +set_regclass_bit_fold||| +set_regclass_bit||| +setdefout||| +share_hek_flags||| +share_hek||5.004000| +si_dup||| +sighandler|||n +simplify_sort||| +skipspace0||| +skipspace1||| +skipspace2||| +skipspace||| +softref2xv||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +space_join_names_mortal||| +ss_dup||| +stack_grow||| +start_force||| +start_glob||| +start_subparse||5.004000| +stashpv_hvname_match||5.014000| +stdize_locale||| +store_cop_label||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool_flags||5.013006| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_common||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2num||| +sv_2nv_flags||5.013001| +sv_2pv_flags|5.007002||p +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen|5.006000||p +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff||| +sv_bless||| +sv_cat_decode||5.008001| +sv_catpv_flags||5.013006| +sv_catpv_mg|5.004050||p +sv_catpv_nomg||5.013006| +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpvs_flags||5.013006| +sv_catpvs_mg||5.013006| +sv_catpvs_nomg||5.013006| +sv_catpvs|5.009003||p +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_catxmlpvn||| +sv_catxmlpv||| +sv_catxmlsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_flags||5.013006| +sv_cmp_locale_flags||5.013006| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm_flags||5.013006| +sv_collxfrm||| +sv_compile_2op_is_broken||| +sv_compile_2op||5.008001| +sv_copypv||5.007003| +sv_dec_nomg||5.013002| +sv_dec||| +sv_del_backref||| +sv_derived_from||5.004000| +sv_destroyable||5.010000| +sv_does||5.009004| +sv_dump||| +sv_dup_common||| +sv_dup_inc_multiple||| +sv_dup_inc||| +sv_dup||| +sv_eq_flags||5.013006| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_gets||5.004000| +sv_grow||| +sv_i_ncmp||| +sv_inc_nomg||5.013002| +sv_inc||| +sv_insert_flags||5.010001| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8||5.006000| +sv_len||| +sv_magic_portable|5.014000|5.004000|p +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||| +sv_nv||5.005000| +sv_peek||5.005000| +sv_pos_b2u_midway||| +sv_pos_b2u||5.006000| +sv_pos_u2b_cached||| +sv_pos_u2b_flags||5.011005| +sv_pos_u2b_forwards|||n +sv_pos_u2b_midway|||n +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags|5.007002||p +sv_pvn_force||| +sv_pvn_nomg|5.007003|5.005000|p +sv_pvn||5.005000| +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_release_COW||| +sv_replace||| +sv_report_used||| +sv_reset||| +sv_rvweaken||5.006000| +sv_setiv_mg|5.004050||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.004050||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.004050||p +sv_setpvn||| +sv_setpvs_mg||5.013006| +sv_setpvs|5.009004||p +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pvs||5.013006| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.004050||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.004050||p +sv_setuv|5.004000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagicext||5.013008| +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_flags||5.009004| +sv_usepvn_mg|5.004050||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags_grow||5.011000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade_nomg||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.005000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +sv_xmlpeek||| +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_get||| +swash_init||5.006000| +sys_init3||5.010000|n +sys_init||5.010000|n +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +sys_term||5.010000|n +taint_env||| +taint_proper||| +tied_method|||v +tmps_grow||5.006000| +toLOWER||| +toUPPER||| +to_byte_substr||| +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.007003| +to_utf8_lower||5.007003| +to_utf8_substr||| +to_utf8_title||5.007003| +to_utf8_upper||5.007003| +token_free||| +token_getmad||| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments||| +too_many_arguments||| +try_amagic_bin||| +try_amagic_un||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unreferenced_to_tmp_stack||| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.004000| +unwind_handler_stack||| +update_debugger_info||| +upg_version||5.009005| +usage||| +utf16_textfilter||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000| +utf8_length||5.007001| +utf8_mg_len_cache_update||| +utf8_mg_pos_cache_update||| +utf8_to_bytes||5.006001| +utf8_to_uvchr||5.007001| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module|5.006000||p +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warn_sv||5.013001| +warner_nocontext|||vn +warner|5.006000|5.004000|pv +warn|||v +watch||| +whichsig||| +with_queued_errors||| +write_no_mem||| +write_to_stderr||| +xmldump_all_perl||| +xmldump_all||| +xmldump_attr||| +xmldump_eval||| +xmldump_form||| +xmldump_indent|||v +xmldump_packsubs_perl||| +xmldump_packsubs||| +xmldump_sub_perl||| +xmldump_sub||| +xmldump_vindent||| +xs_apiversion_bootcheck||| +xs_version_bootcheck||| +yyerror||| +yylex||| +yyparse||| +yyunlex||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %warnings, %depends); +my $replace = 0; +my($hint, $define, $function); + +sub find_api +{ + my $code = shift; + $code =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; + grep { exists $API{$_} } $code =~ /(\w+)/mg; +} + +while () { + if ($hint) { + my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; + if (m{^\s*\*\s(.*?)\s*$}) { + for (@{$hint->[1]}) { + $h->{$_} ||= ''; # suppress warning with older perls + $h->{$_} .= "$1\n"; + } + } + else { undef $hint } + } + + $hint = [$1, [split /,?\s+/, $2]] + if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; + + if ($define) { + if ($define->[1] =~ /\\$/) { + $define->[1] .= $_; + } + else { + if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { + my @n = find_api($define->[1]); + push @{$depends{$define->[0]}}, @n if @n + } + undef $define; + } + } + + $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; + + if ($function) { + if (/^}/) { + if (exists $API{$function->[0]}) { + my @n = find_api($function->[1]); + push @{$depends{$function->[0]}}, @n if @n + } + undef $function; + } + else { + $function->[1] .= $_; + } + } + + $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + my @deps = map { s/\s+//g; $_ } split /,/, $3; + my $d; + for $d (map { s/\s+//g; $_ } split /,/, $1) { + push @{$depends{$d}}, @deps; + } + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +for (values %depends) { + my %s; + $_ = [sort grep !$s{$_}++, @$_]; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "\n$hints{$f}" if exists $hints{$f}; + print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; + $info++; + } + print "No portability information available.\n" unless $info; + $count++; + } + $count or print "Found no API matching '$opt{'api-info'}'."; + print "\n"; + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + push @flags, 'warning' if exists $warnings{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); +my $srcext = join '|', map { quotemeta $_ } @srcext; + +if (@ARGV) { + my %seen; + for (@ARGV) { + if (-e) { + if (-f) { + push @files, $_ unless $seen{$_}++; + } + else { warn "'$_' is not a file.\n" } + } + else { + my @new = grep { -f } glob $_ + or warn "'$_' does not exist.\n"; + push @files, grep { !$seen{$_}++ } @new; + } + } +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +die "No input files given!\n" unless @files; + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; }; + close IN; + + my %file = (orig => $c, changes => 0); + + # Temporarily remove C/XS comments and strings from the code + my @ccom; + + $c =~ s{ + ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* + | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) + | ( ^$HS*\#[^\r\n]* + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' + | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) + }{ defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + $file{uses_provided}{$func}++; + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + $file{needs}{$_} = 'static' if exists $need{$_}; + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { warning("Possibly wrong #define $1 in $filename") } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + my $warnings = 0; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + unless ($API{$func}{nothxarg}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses_provided}}) { + if ($file{uses}{$func}) { + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + else { + diag("Uses $func"); + } + } + $warnings += hint($func); + } + + unless ($opt{quiet}) { + for $func (sort keys %{$file{uses_todo}}) { + print "*** WARNING: Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo}), ", even with '$ppport'\n"; + $warnings++; + } + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + my $s = $warnings != 1 ? 's' : ''; + my $warn = $warnings ? " ($warnings warning$s)" : ''; + info("Analysis completed$warn"); + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub try_use { eval "use @_;"; return $@ eq '' } + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and try_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <
$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while () { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub rec_depend +{ + my($func, $seen) = @_; + return () unless exists $depends{$func}; + $seen = {%{$seen||{}}}; + return () if $seen->{$func}++; + my %s; + grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +my %given_warnings; +sub hint +{ + $opt{quiet} and return; + my $func = shift; + my $rv = 0; + if (exists $warnings{$func} && !$given_warnings{$func}++) { + my $warn = $warnings{$func}; + $warn =~ s!^!*** !mg; + print "*** WARNING: $func\n", $warn; + $rv++; + } + if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; + } + $rv; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print < }; + my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; + $copy =~ s/^(?=\S+)/ /gms; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + if (eval \$Devel::PPPort::VERSION < $VERSION) { + die "$0 was originally generated with Devel::PPPort $VERSION.\\n" + . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" + . "Please install a newer version, or --unstrip will not work.\\n"; + } + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <$0" or die "cannot strip $0: $!\n"; + print OUT "$pl$c\n"; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) +#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ +#ifndef dTHR +# define dTHR dNOOP +#endif +#ifndef dTHX +# define dTHX dNOOP +#endif + +#ifndef dTHXa +# define dTHXa(x) dNOOP +#endif +#ifndef pTHX +# define pTHX void +#endif + +#ifndef pTHX_ +# define pTHX_ +#endif + +#ifndef aTHX +# define aTHX +#endif + +#ifndef aTHX_ +# define aTHX_ +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# ifdef USE_THREADS +# define aTHXR thr +# define aTHXR_ thr, +# else +# define aTHXR +# define aTHXR_ +# endif +# define dTHXR dTHR +#else +# define aTHXR aTHX +# define aTHXR_ aTHX_ +# define dTHXR dTHX +#endif +#ifndef dTHXoa +# define dTHXoa(x) dTHXa(x) +#endif + +#ifdef I_LIMITS +# include +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +# ifdef SHORT_MAX +# define PERL_SHORT_MAX ((short)SHORT_MAX) +# else +# ifdef MAXSHORT /* Often used in */ +# define PERL_SHORT_MAX ((short)MAXSHORT) +# else +# ifdef SHRT_MAX +# define PERL_SHORT_MAX ((short)SHRT_MAX) +# else +# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MIN +# ifdef SHORT_MIN +# define PERL_SHORT_MIN ((short)SHORT_MIN) +# else +# ifdef MINSHORT +# define PERL_SHORT_MIN ((short)MINSHORT) +# else +# ifdef SHRT_MIN +# define PERL_SHORT_MIN ((short)SHRT_MIN) +# else +# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +#ifndef PERL_UINT_MAX +# ifdef UINT_MAX +# define PERL_UINT_MAX ((unsigned int)UINT_MAX) +# else +# ifdef MAXUINT +# define PERL_UINT_MAX ((unsigned int)MAXUINT) +# else +# define PERL_UINT_MAX (~(unsigned int)0) +# endif +# endif +#endif + +#ifndef PERL_UINT_MIN +# define PERL_UINT_MIN ((unsigned int)0) +#endif + +#ifndef PERL_INT_MAX +# ifdef INT_MAX +# define PERL_INT_MAX ((int)INT_MAX) +# else +# ifdef MAXINT /* Often used in */ +# define PERL_INT_MAX ((int)MAXINT) +# else +# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_INT_MIN +# ifdef INT_MIN +# define PERL_INT_MIN ((int)INT_MIN) +# else +# ifdef MININT +# define PERL_INT_MIN ((int)MININT) +# else +# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MAX +# ifdef ULONG_MAX +# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) +# else +# ifdef MAXULONG +# define PERL_ULONG_MAX ((unsigned long)MAXULONG) +# else +# define PERL_ULONG_MAX (~(unsigned long)0) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MIN +# define PERL_ULONG_MIN ((unsigned long)0L) +#endif + +#ifndef PERL_LONG_MAX +# ifdef LONG_MAX +# define PERL_LONG_MAX ((long)LONG_MAX) +# else +# ifdef MAXLONG +# define PERL_LONG_MAX ((long)MAXLONG) +# else +# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_LONG_MIN +# ifdef LONG_MIN +# define PERL_LONG_MIN ((long)LONG_MIN) +# else +# ifdef MINLONG +# define PERL_LONG_MIN ((long)MINLONG) +# else +# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) +# ifndef PERL_UQUAD_MAX +# ifdef ULONGLONG_MAX +# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) +# else +# ifdef MAXULONGLONG +# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) +# else +# define PERL_UQUAD_MAX (~(unsigned long long)0) +# endif +# endif +# endif + +# ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN ((unsigned long long)0L) +# endif + +# ifndef PERL_QUAD_MAX +# ifdef LONGLONG_MAX +# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) +# else +# ifdef MAXLONGLONG +# define PERL_QUAD_MAX ((long long)MAXLONGLONG) +# else +# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) +# endif +# endif +# endif + +# ifndef PERL_QUAD_MIN +# ifdef LONGLONG_MIN +# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) +# else +# ifdef MINLONGLONG +# define PERL_QUAD_MIN ((long long)MINLONGLONG) +# else +# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +/* This is based on code from 5.003 perl.h */ +#ifdef HAS_QUAD +# ifdef cray +#ifndef IVTYPE +# define IVTYPE int +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_INT_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_INT_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UINT_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UINT_MAX +#endif + +# ifdef INTSIZE +#ifndef IVSIZE +# define IVSIZE INTSIZE +#endif + +# endif +# else +# if defined(convex) || defined(uts) +#ifndef IVTYPE +# define IVTYPE long long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_QUAD_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_QUAD_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UQUAD_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UQUAD_MAX +#endif + +# ifdef LONGLONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGLONGSIZE +#endif + +# endif +# else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +# ifdef LONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGSIZE +#endif + +# endif +# endif +# endif +#ifndef IVSIZE +# define IVSIZE 8 +#endif + +#ifndef PERL_QUAD_MIN +# define PERL_QUAD_MIN IV_MIN +#endif + +#ifndef PERL_QUAD_MAX +# define PERL_QUAD_MAX IV_MAX +#endif + +#ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN UV_MIN +#endif + +#ifndef PERL_UQUAD_MAX +# define PERL_UQUAD_MAX UV_MAX +#endif + +#else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif +#ifndef UVTYPE +# define UVTYPE unsigned IVTYPE +#endif + +#ifndef UVSIZE +# define UVSIZE IVSIZE +#endif +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif + +#if !defined(SvUOK) && defined(SvIOK_UV) +# define SvUOK(sv) SvIOK_UV(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef memEQs +# define memEQs(s1, l, s2) \ + (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) +#endif + +#ifndef memNEs +# define memNEs(s1, l, s2) !memEQs(s1, l, s2) +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif + +#ifndef PERL_UNUSED_DECL +# ifdef HASATTRIBUTE +# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) +# define PERL_UNUSED_DECL +# else +# define PERL_UNUSED_DECL __attribute__((unused)) +# endif +# else +# define PERL_UNUSED_DECL +# endif +#endif + +#ifndef PERL_UNUSED_ARG +# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ +# include +# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) +# else +# define PERL_UNUSED_ARG(x) ((void)x) +# endif +#endif + +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(x) ((void)x) +#endif + +#ifndef PERL_UNUSED_CONTEXT +# ifdef USE_ITHREADS +# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) +# else +# define PERL_UNUSED_CONTEXT +# endif +#endif +#ifndef NOOP +# define NOOP /*EMPTY*/(void)0 +#endif + +#ifndef dNOOP +# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif +#endif + +#ifndef PTR2ul +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif +#ifndef PTR2nat +# define PTR2nat(p) (PTRV)(p) +#endif + +#ifndef NUM2PTR +# define NUM2PTR(any,d) (any)PTR2nat(d) +#endif + +#ifndef PTR2IV +# define PTR2IV(p) INT2PTR(IV,p) +#endif + +#ifndef PTR2UV +# define PTR2UV(p) INT2PTR(UV,p) +#endif + +#ifndef PTR2NV +# define PTR2NV(p) NUM2PTR(NV,p) +#endif + +#undef START_EXTERN_C +#undef END_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C extern +#endif + +#if defined(PERL_GCC_PEDANTIC) +# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN +# define PERL_GCC_BRACE_GROUPS_FORBIDDEN +# endif +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) +# ifndef PERL_USE_GCC_BRACE_GROUPS +# define PERL_USE_GCC_BRACE_GROUPS +# endif +#endif + +#undef STMT_START +#undef STMT_END +#ifdef PERL_USE_GCC_BRACE_GROUPS +# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ +# define STMT_END ) +#else +# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) +# define STMT_START if (1) +# define STMT_END else (void)0 +# else +# define STMT_START do +# define STMT_END while (0) +# endif +#endif +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +/* DEFSV appears first in 5.004_56 */ +#ifndef DEFSV +# define DEFSV GvSV(PL_defgv) +#endif + +#ifndef SAVE_DEFSV +# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) +#endif + +#ifndef DEFSV_set +# define DEFSV_set(sv) (DEFSV = (sv)) +#endif + +/* Older perls (<=5.003) lack AvFILLp */ +#ifndef AvFILLp +# define AvFILLp AvFILL +#endif +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +/* Hint: gv_stashpvn + * This function's backport doesn't support the length parameter, but + * rather ignores it. Portability can only be ensured if the length + * parameter is used for speed reasons, but the length can always be + * correctly computed from the string argument. + */ +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,create) gv_stashpv(str,create) +#endif + +/* Replace: 1 */ +#ifndef get_cv +# define get_cv perl_get_cv +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef get_av +# define get_av perl_get_av +#endif + +#ifndef get_hv +# define get_hv perl_get_hv +#endif + +/* Replace: 0 */ +#ifndef dUNDERBAR +# define dUNDERBAR dNOOP +#endif + +#ifndef UNDERBAR +# define UNDERBAR DEFSV +#endif +#ifndef dAX +# define dAX I32 ax = MARK - PL_stack_base + 1 +#endif + +#ifndef dITEMS +# define dITEMS I32 items = SP - MARK +#endif +#ifndef dXSTARG +# define dXSTARG SV * targ = sv_newmortal() +#endif +#ifndef dAXMARK +# define dAXMARK I32 ax = POPMARK; \ + register SV ** const mark = PL_stack_base + ax++ +#endif +#ifndef XSprePUSH +# define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#if (PERL_BCDVERSION < 0x5005000) +# undef XSRETURN +# define XSRETURN(off) \ + STMT_START { \ + PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ + return; \ + } STMT_END +#endif +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +#ifndef SVfARG +# define SVfARG(p) ((void*)(p)) +#endif +#ifndef PERL_ABS +# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) +#endif +#ifndef dVAR +# define dVAR dNOOP +#endif +#ifndef SVf +# define SVf "_" +#endif +#ifndef UTF8_MAXBYTES +# define UTF8_MAXBYTES UTF8_MAXLEN +#endif +#ifndef CPERLscope +# define CPERLscope(x) x +#endif +#ifndef PERL_HASH +# define PERL_HASH(hash,str,len) \ + STMT_START { \ + const char *s_PeRlHaSh = str; \ + I32 i_PeRlHaSh = len; \ + U32 hash_PeRlHaSh = 0; \ + while (i_PeRlHaSh--) \ + hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ + (hash) = hash_PeRlHaSh; \ + } STMT_END +#endif + +#ifndef PERLIO_FUNCS_DECL +# ifdef PERLIO_FUNCS_CONST +# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) +# else +# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (funcs) +# endif +#endif + +/* provide these typedefs for older perls */ +#if (PERL_BCDVERSION < 0x5009003) + +# ifdef ARGSproto +typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); +# else +typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); +# endif + +typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); + +#endif +#ifndef isPSXSPC +# define isPSXSPC(c) (isSPACE(c) || (c) == '\v') +#endif + +#ifndef isBLANK +# define isBLANK(c) ((c) == ' ' || (c) == '\t') +#endif + +#ifdef EBCDIC +#ifndef isALNUMC +# define isALNUMC(c) isalnum(c) +#endif + +#ifndef isASCII +# define isASCII(c) isascii(c) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) iscntrl(c) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) isgraph(c) +#endif + +#ifndef isPRINT +# define isPRINT(c) isprint(c) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) ispunct(c) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) isxdigit(c) +#endif + +#else +# if (PERL_BCDVERSION < 0x5010000) +/* Hint: isPRINT + * The implementation in older perl versions includes all of the + * isSPACE() characters, which is wrong. The version provided by + * Devel::PPPort always overrides a present buggy version. + */ +# undef isPRINT +# endif +#ifndef isALNUMC +# define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) +#endif + +#ifndef isASCII +# define isASCII(c) ((U8) (c) <= 127) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) ((U8) (c) < ' ' || (c) == 127) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) +#endif + +#ifndef isPRINT +# define isPRINT(c) (((c) >= 32 && (c) < 127)) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#endif + +#endif + +#ifndef PERL_SIGNALS_UNSAFE_FLAG + +#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 + +#if (PERL_BCDVERSION < 0x5008000) +# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG +#else +# define D_PPP_PERL_SIGNALS_INIT 0 +#endif + +#if defined(NEED_PL_signals) +static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#elif defined(NEED_PL_signals_GLOBAL) +U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#else +extern U32 DPPP_(my_PL_signals); +#endif +#define PL_signals DPPP_(my_PL_signals) + +#endif + +/* Hint: PL_ppaddr + * Calling an op via PL_ppaddr requires passing a context argument + * for threaded builds. Since the context argument is different for + * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will + * automatically be defined as the correct argument. + */ + +#if (PERL_BCDVERSION <= 0x5005005) +/* Replace: 1 */ +# define PL_ppaddr ppaddr +# define PL_no_modify no_modify +/* Replace: 0 */ +#endif + +#if (PERL_BCDVERSION <= 0x5004005) +/* Replace: 1 */ +# define PL_DBsignal DBsignal +# define PL_DBsingle DBsingle +# define PL_DBsub DBsub +# define PL_DBtrace DBtrace +# define PL_Sv Sv +# define PL_bufend bufend +# define PL_bufptr bufptr +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_debstash debstash +# define PL_defgv defgv +# define PL_diehook diehook +# define PL_dirty dirty +# define PL_dowarn dowarn +# define PL_errgv errgv +# define PL_error_count error_count +# define PL_expect expect +# define PL_hexdigit hexdigit +# define PL_hints hints +# define PL_in_my in_my +# define PL_laststatval laststatval +# define PL_lex_state lex_state +# define PL_lex_stuff lex_stuff +# define PL_linestr linestr +# define PL_na na +# define PL_perl_destruct_level perl_destruct_level +# define PL_perldb perldb +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stack_base stack_base +# define PL_stack_sp stack_sp +# define PL_statcache statcache +# define PL_stdingv stdingv +# define PL_sv_arenaroot sv_arenaroot +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +# define PL_tainted tainted +# define PL_tainting tainting +# define PL_tokenbuf tokenbuf +/* Replace: 0 */ +#endif + +/* Warning: PL_parser + * For perl versions earlier than 5.9.5, this is an always + * non-NULL dummy. Also, it cannot be dereferenced. Don't + * use it if you can avoid is and unless you absolutely know + * what you're doing. + * If you always check that PL_parser is non-NULL, you can + * define DPPP_PL_parser_NO_DUMMY to avoid the creation of + * a dummy parser structure. + */ + +#if (PERL_BCDVERSION >= 0x5009005) +# ifdef DPPP_PL_parser_NO_DUMMY +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (croak("panic: PL_parser == NULL in %s:%d", \ + __FILE__, __LINE__), (yy_parser *) NULL))->var) +# else +# ifdef DPPP_PL_parser_NO_DUMMY_WARNING +# define D_PPP_parser_dummy_warning(var) +# else +# define D_PPP_parser_dummy_warning(var) \ + warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), +# endif +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) +#if defined(NEED_PL_parser) +static yy_parser DPPP_(dummy_PL_parser); +#elif defined(NEED_PL_parser_GLOBAL) +yy_parser DPPP_(dummy_PL_parser); +#else +extern yy_parser DPPP_(dummy_PL_parser); +#endif + +# endif + +/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ +/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf + * Do not use this variable unless you know exactly what you're + * doint. It is internal to the perl parser and may change or even + * be removed in the future. As of perl 5.9.5, you have to check + * for (PL_parser != NULL) for this variable to have any effect. + * An always non-NULL PL_parser dummy is provided for earlier + * perl versions. + * If PL_parser is NULL when you try to access this variable, a + * dummy is being accessed instead and a warning is issued unless + * you define DPPP_PL_parser_NO_DUMMY_WARNING. + * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access + * this variable will croak with a panic message. + */ + +# define PL_expect D_PPP_my_PL_parser_var(expect) +# define PL_copline D_PPP_my_PL_parser_var(copline) +# define PL_rsfp D_PPP_my_PL_parser_var(rsfp) +# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) +# define PL_linestr D_PPP_my_PL_parser_var(linestr) +# define PL_bufptr D_PPP_my_PL_parser_var(bufptr) +# define PL_bufend D_PPP_my_PL_parser_var(bufend) +# define PL_lex_state D_PPP_my_PL_parser_var(lex_state) +# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) +# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) +# define PL_in_my D_PPP_my_PL_parser_var(in_my) +# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) +# define PL_error_count D_PPP_my_PL_parser_var(error_count) + + +#else + +/* ensure that PL_parser != NULL and cannot be dereferenced */ +# define PL_parser ((void *) 1) + +#endif +#ifndef mPUSHs +# define mPUSHs(s) PUSHs(sv_2mortal(s)) +#endif + +#ifndef PUSHmortal +# define PUSHmortal PUSHs(sv_newmortal()) +#endif + +#ifndef mPUSHp +# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) +#endif + +#ifndef mPUSHn +# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) +#endif + +#ifndef mPUSHi +# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) +#endif + +#ifndef mPUSHu +# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) +#endif +#ifndef mXPUSHs +# define mXPUSHs(s) XPUSHs(sv_2mortal(s)) +#endif + +#ifndef XPUSHmortal +# define XPUSHmortal XPUSHs(sv_newmortal()) +#endif + +#ifndef mXPUSHp +# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END +#endif + +#ifndef mXPUSHn +# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END +#endif + +#ifndef mXPUSHi +# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END +#endif + +#ifndef mXPUSHu +# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END +#endif + +/* Replace: 1 */ +#ifndef call_sv +# define call_sv perl_call_sv +#endif + +#ifndef call_pv +# define call_pv perl_call_pv +#endif + +#ifndef call_argv +# define call_argv perl_call_argv +#endif + +#ifndef call_method +# define call_method perl_call_method +#endif +#ifndef eval_sv +# define eval_sv perl_eval_sv +#endif + +/* Replace: 0 */ +#ifndef PERL_LOADMOD_DENY +# define PERL_LOADMOD_DENY 0x1 +#endif + +#ifndef PERL_LOADMOD_NOIMPORT +# define PERL_LOADMOD_NOIMPORT 0x2 +#endif + +#ifndef PERL_LOADMOD_IMPORT_OPS +# define PERL_LOADMOD_IMPORT_OPS 0x4 +#endif + +#ifndef G_METHOD +# define G_METHOD 64 +# ifdef call_sv +# undef call_sv +# endif +# if (PERL_BCDVERSION < 0x5006000) +# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) +# else +# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) +# endif +#endif + +/* Replace perl_eval_pv with eval_pv */ + +#ifndef eval_pv +#if defined(NEED_eval_pv) +static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +static +#else +extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +#endif + +#ifdef eval_pv +# undef eval_pv +#endif +#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) +#define Perl_eval_pv DPPP_(my_eval_pv) + +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + +SV* +DPPP_(my_eval_pv)(char *p, I32 croak_on_error) +{ + dSP; + SV* sv = newSVpv(p, 0); + + PUSHMARK(sp); + eval_sv(sv, G_SCALAR); + SvREFCNT_dec(sv); + + SPAGAIN; + sv = POPs; + PUTBACK; + + if (croak_on_error && SvTRUE(GvSV(errgv))) + croak(SvPVx(GvSV(errgv), na)); + + return sv; +} + +#endif +#endif + +#ifndef vload_module +#if defined(NEED_vload_module) +static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +static +#else +extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +#endif + +#ifdef vload_module +# undef vload_module +#endif +#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) +#define Perl_vload_module DPPP_(my_vload_module) + +#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) + +void +DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) +{ + dTHR; + dVAR; + OP *veop, *imop; + + OP * const modname = newSVOP(OP_CONST, 0, name); + /* 5.005 has a somewhat hacky force_normal that doesn't croak on + SvREADONLY() if PL_compling is true. Current perls take care in + ck_require() to correctly turn off SvREADONLY before calling + force_normal_flags(). This seems a better fix than fudging PL_compling + */ + SvREADONLY_off(((SVOP*)modname)->op_sv); + modname->op_private |= OPpCONST_BARE; + if (ver) { + veop = newSVOP(OP_CONST, 0, ver); + } + else + veop = NULL; + if (flags & PERL_LOADMOD_NOIMPORT) { + imop = sawparens(newNULLLIST()); + } + else if (flags & PERL_LOADMOD_IMPORT_OPS) { + imop = va_arg(*args, OP*); + } + else { + SV *sv; + imop = NULL; + sv = va_arg(*args, SV*); + while (sv) { + imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); + sv = va_arg(*args, SV*); + } + } + { + const line_t ocopline = PL_copline; + COP * const ocurcop = PL_curcop; + const int oexpect = PL_expect; + +#if (PERL_BCDVERSION >= 0x5004000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), + veop, modname, imop); +#else + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + modname, imop); +#endif + PL_expect = oexpect; + PL_copline = ocopline; + PL_curcop = ocurcop; + } +} + +#endif +#endif + +#ifndef load_module +#if defined(NEED_load_module) +static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +static +#else +extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +#endif + +#ifdef load_module +# undef load_module +#endif +#define load_module DPPP_(my_load_module) +#define Perl_load_module DPPP_(my_load_module) + +#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) + +void +DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) +{ + va_list args; + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); +} + +#endif +#endif +#ifndef newRV_inc +# define newRV_inc(sv) newRV(sv) /* Replace */ +#endif + +#ifndef newRV_noinc +#if defined(NEED_newRV_noinc) +static SV * DPPP_(my_newRV_noinc)(SV *sv); +static +#else +extern SV * DPPP_(my_newRV_noinc)(SV *sv); +#endif + +#ifdef newRV_noinc +# undef newRV_noinc +#endif +#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) +#define Perl_newRV_noinc DPPP_(my_newRV_noinc) + +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) +SV * +DPPP_(my_newRV_noinc)(SV *sv) +{ + SV *rv = (SV *)newRV(sv); + SvREFCNT_dec(sv); + return rv; +} +#endif +#endif + +/* Hint: newCONSTSUB + * Returns a CV* as of perl-5.7.1. This return value is not supported + * by Devel::PPPort. + */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) +#if defined(NEED_newCONSTSUB) +static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +static +#else +extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +#endif + +#ifdef newCONSTSUB +# undef newCONSTSUB +#endif +#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) +#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + +/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ +/* (There's no PL_parser in perl < 5.005, so this is completely safe) */ +#define D_PPP_PL_copline PL_copline + +void +DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) +{ + U32 oldhints = PL_hints; + HV *old_cop_stash = PL_curcop->cop_stash; + HV *old_curstash = PL_curstash; + line_t oldline = PL_curcop->cop_line; + PL_curcop->cop_line = D_PPP_PL_copline; + + PL_hints &= ~HINT_BLOCK_SCOPE; + if (stash) + PL_curstash = PL_curcop->cop_stash = stash; + + newSUB( + +#if (PERL_BCDVERSION < 0x5003022) + start_subparse(), +#elif (PERL_BCDVERSION == 0x5003022) + start_subparse(0), +#else /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +#endif + + newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), + newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ + newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) + ); + + PL_hints = oldhints; + PL_curcop->cop_stash = old_cop_stash; + PL_curstash = old_curstash; + PL_curcop->cop_line = oldline; +} +#endif +#endif + +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ + defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) + +#ifndef START_MY_CXT + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +#if (PERL_BCDVERSION < 0x5004068) +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) +#else /* >= perl5.004_68 */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) +#endif /* < perl5.004_68 */ + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +/* Clones the per-interpreter data. */ +#define MY_CXT_CLONE \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) +#endif + +#else /* single interpreter */ + +#ifndef START_MY_CXT + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +#define MY_CXT_CLONE NOOP +#endif + +#endif + +#ifndef IVdf +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# define UVuf "lu" +# define UVof "lo" +# define UVxf "lx" +# define UVXf "lX" +# else +# if IVSIZE == INTSIZE +# define IVdf "d" +# define UVuf "u" +# define UVof "o" +# define UVxf "x" +# define UVXf "X" +# endif +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) + /* Not very likely, but let's try anyway. */ +# define NVef PERL_PRIeldbl +# define NVff PERL_PRIfldbl +# define NVgf PERL_PRIgldbl +# else +# define NVef "e" +# define NVff "f" +# define NVgf "g" +# endif +#endif + +#ifndef SvREFCNT_inc +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (SvREFCNT(_sv))++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc(sv) \ + ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_simple +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_simple(sv) \ + ({ \ + if (sv) \ + (SvREFCNT(sv))++; \ + (SV *)(sv); \ + }) +# else +# define SvREFCNT_inc_simple(sv) \ + ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_NN +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_NN(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + SvREFCNT(_sv)++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc_NN(sv) \ + (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) +# endif +#endif + +#ifndef SvREFCNT_inc_void +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_void(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (void)(SvREFCNT(_sv)++); \ + }) +# else +# define SvREFCNT_inc_void(sv) \ + (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) +# endif +#endif +#ifndef SvREFCNT_inc_simple_void +# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#endif + +#ifndef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) +#endif + +#ifndef SvREFCNT_inc_void_NN +# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef newSV_type + +#if defined(NEED_newSV_type) +static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +static +#else +extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +#endif + +#ifdef newSV_type +# undef newSV_type +#endif +#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) +#define Perl_newSV_type DPPP_(my_newSV_type) + +#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) + +SV* +DPPP_(my_newSV_type)(pTHX_ svtype const t) +{ + SV* const sv = newSV(0); + sv_upgrade(sv, t); + return sv; +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# define D_PPP_CONSTPV_ARG(x) ((char *) (x)) +#else +# define D_PPP_CONSTPV_ARG(x) (x) +#endif +#ifndef newSVpvn +# define newSVpvn(data,len) ((data) \ + ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ + : newSV(0)) +#endif +#ifndef newSVpvn_utf8 +# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) +#endif +#ifndef SVf_UTF8 +# define SVf_UTF8 0 +#endif + +#ifndef newSVpvn_flags + +#if defined(NEED_newSVpvn_flags) +static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +static +#else +extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +#endif + +#ifdef newSVpvn_flags +# undef newSVpvn_flags +#endif +#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) +#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) + +#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) + +SV * +DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) +{ + SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); + SvFLAGS(sv) |= (flags & SVf_UTF8); + return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; +} + +#endif + +#endif + +/* Backwards compatibility stuff... :-( */ +#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) +# define NEED_sv_2pv_flags +#endif +#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) +# define NEED_sv_2pv_flags_GLOBAL +#endif + +/* Hint: sv_2pv_nolen + * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). + */ +#ifndef sv_2pv_nolen +# define sv_2pv_nolen(sv) SvPV_nolen(sv) +#endif + +#ifdef SvPVbyte + +/* Hint: SvPVbyte + * Does not work in perl-5.6.1, ppport.h implements a version + * borrowed from perl-5.7.3. + */ + +#if (PERL_BCDVERSION < 0x5007000) + +#if defined(NEED_sv_2pvbyte) +static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +static +#else +extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +#endif + +#ifdef sv_2pvbyte +# undef sv_2pvbyte +#endif +#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) +#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) + +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + +char * +DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) +{ + sv_utf8_downgrade(sv,0); + return SvPV(sv,*lp); +} + +#endif + +/* Hint: sv_2pvbyte + * Use the SvPVbyte() macro instead of sv_2pvbyte(). + */ + +#undef SvPVbyte + +#define SvPVbyte(sv, lp) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + +#endif + +#else + +# define SvPVbyte SvPV +# define sv_2pvbyte sv_2pv + +#endif +#ifndef sv_2pvbyte_nolen +# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) +#endif + +/* Hint: sv_pvn + * Always use the SvPV() macro instead of sv_pvn(). + */ + +/* Hint: sv_pvn_force + * Always use the SvPV_force() macro instead of sv_pvn_force(). + */ + +/* If these are undefined, they're not handled by the core anyway */ +#ifndef SV_IMMEDIATE_UNREF +# define SV_IMMEDIATE_UNREF 0 +#endif + +#ifndef SV_GMAGIC +# define SV_GMAGIC 0 +#endif + +#ifndef SV_COW_DROP_PV +# define SV_COW_DROP_PV 0 +#endif + +#ifndef SV_UTF8_NO_ENCODING +# define SV_UTF8_NO_ENCODING 0 +#endif + +#ifndef SV_NOSTEAL +# define SV_NOSTEAL 0 +#endif + +#ifndef SV_CONST_RETURN +# define SV_CONST_RETURN 0 +#endif + +#ifndef SV_MUTABLE_RETURN +# define SV_MUTABLE_RETURN 0 +#endif + +#ifndef SV_SMAGIC +# define SV_SMAGIC 0 +#endif + +#ifndef SV_HAS_TRAILING_NUL +# define SV_HAS_TRAILING_NUL 0 +#endif + +#ifndef SV_COW_SHARED_HASH_KEYS +# define SV_COW_SHARED_HASH_KEYS 0 +#endif + +#if (PERL_BCDVERSION < 0x5007002) + +#if defined(NEED_sv_2pv_flags) +static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_2pv_flags +# undef sv_2pv_flags +#endif +#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) +#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) + +#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) + +char * +DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_2pv(sv, lp ? lp : &n_a); +} + +#endif + +#if defined(NEED_sv_pvn_force_flags) +static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_pvn_force_flags +# undef sv_pvn_force_flags +#endif +#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) +#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) + +#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) + +char * +DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_pvn_force(sv, lp ? lp : &n_a); +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) +# define DPPP_SVPV_NOLEN_LP_ARG &PL_na +#else +# define DPPP_SVPV_NOLEN_LP_ARG 0 +#endif +#ifndef SvPV_const +# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_mutable +# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) +#endif +#ifndef SvPV_flags +# define SvPV_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_flags_const +# define SvPV_flags_const(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ + (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_const_nolen +# define SvPV_flags_const_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : \ + (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_mutable +# define SvPV_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ + sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_force +# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nolen +# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) +#endif + +#ifndef SvPV_force_mutable +# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nomg +# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) +#endif + +#ifndef SvPV_force_nomg_nolen +# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) +#endif +#ifndef SvPV_force_flags +# define SvPV_force_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_force_flags_nolen +# define SvPV_force_flags_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) +#endif +#ifndef SvPV_force_flags_mutable +# define SvPV_force_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ + : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_nolen +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) +#endif +#ifndef SvPV_nolen_const +# define SvPV_nolen_const(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) +#endif +#ifndef SvPV_nomg +# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const +# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const_nolen +# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) +#endif +#ifndef SvPV_renew +# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ + SvPV_set((sv), (char *) saferealloc( \ + (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ + } STMT_END +#endif +#ifndef SvMAGIC_set +# define SvMAGIC_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5009003) +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) (0 + SvPVX(sv)) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END +#endif + +#else +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + ((sv)->sv_u.svu_rv = (val)); } STMT_END +#endif + +#endif +#ifndef SvSTASH_set +# define SvSTASH_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5004000) +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END +#endif + +#else +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END +#endif + +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) +#if defined(NEED_vnewSVpvf) +static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +static +#else +extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +#endif + +#ifdef vnewSVpvf +# undef vnewSVpvf +#endif +#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) +#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) + +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + +SV * +DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) +{ + register SV *sv = newSV(0); + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); + return sv; +} + +#endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) +# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) +# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) +#if defined(NEED_sv_catpvf_mg) +static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) + +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) +#if defined(NEED_sv_catpvf_mg_nocontext) +static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) +#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) + +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ +#ifndef sv_catpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# else +# define sv_catpvf_mg Perl_sv_catpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) +# define sv_vcatpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) +#if defined(NEED_sv_setpvf_mg) +static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) + +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) +#if defined(NEED_sv_setpvf_mg_nocontext) +static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) +#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) + +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ +#ifndef sv_setpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# else +# define sv_setpvf_mg Perl_sv_setpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) +# define sv_vsetpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +/* Hint: newSVpvn_share + * The SVs created by this function only mimic the behaviour of + * shared PVs without really being shared. Only use if you know + * what you're doing. + */ + +#ifndef newSVpvn_share + +#if defined(NEED_newSVpvn_share) +static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +static +#else +extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +#endif + +#ifdef newSVpvn_share +# undef newSVpvn_share +#endif +#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) +#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) + +#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) + +SV * +DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) +{ + SV *sv; + if (len < 0) + len = -len; + if (!hash) + PERL_HASH(hash, (char*) src, len); + sv = newSVpvn((char *) src, len); + sv_upgrade(sv, SVt_PVIV); + SvIVX(sv) = hash; + SvREADONLY_on(sv); + SvPOK_on(sv); + return sv; +} + +#endif + +#endif +#ifndef SvSHARED_HASH +# define SvSHARED_HASH(sv) (0 + SvUVX(sv)) +#endif +#ifndef HvNAME_get +# define HvNAME_get(hv) HvNAME(hv) +#endif +#ifndef HvNAMELEN_get +# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) +#endif +#ifndef GvSVn +# define GvSVn(gv) GvSV(gv) +#endif + +#ifndef isGV_with_GP +# define isGV_with_GP(gv) isGV(gv) +#endif + +#ifndef gv_fetchpvn_flags +# define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt) +#endif + +#ifndef gv_fetchsv +# define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) +#endif +#ifndef get_cvn_flags +# define get_cvn_flags(name, namelen, flags) get_cv(name, flags) +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#define Perl_warner DPPP_(my_warner) + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +/* concatenating with "" ensures that only literal strings are accepted as argument + * note that STR_WITH_LEN() can't be used as argument to macros or functions that + * under some configurations might be macros + */ +#ifndef STR_WITH_LEN +# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) +#endif +#ifndef newSVpvs +# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) +#endif + +#ifndef newSVpvs_flags +# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) +#endif + +#ifndef newSVpvs_share +# define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) +#endif + +#ifndef sv_catpvs +# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef sv_setpvs +# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef hv_fetchs +# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) +#endif + +#ifndef hv_stores +# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) +#endif +#ifndef gv_fetchpvs +# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) +#endif + +#ifndef gv_stashpvs +# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) +#endif +#ifndef get_cvs +# define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) +#endif +#ifndef SvGETMAGIC +# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END +#endif +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +/* That's the best we can do... */ +#ifndef sv_catpvn_nomg +# define sv_catpvn_nomg sv_catpvn +#endif + +#ifndef sv_catsv_nomg +# define sv_catsv_nomg sv_catsv +#endif + +#ifndef sv_setsv_nomg +# define sv_setsv_nomg sv_setsv +#endif + +#ifndef sv_pvn_nomg +# define sv_pvn_nomg sv_pvn +#endif + +#ifndef SvIV_nomg +# define SvIV_nomg SvIV +#endif + +#ifndef SvUV_nomg +# define SvUV_nomg SvUV +#endif + +#ifndef sv_catpv_mg +# define sv_catpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catpvn_mg +# define sv_catpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catsv_mg +# define sv_catsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_catsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setiv_mg +# define sv_setiv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setiv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setnv_mg +# define sv_setnv_mg(sv, num) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setnv(TeMpSv,num); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpv_mg +# define sv_setpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpvn_mg +# define sv_setpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setsv_mg +# define sv_setsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_setsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setuv_mg +# define sv_setuv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setuv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_usepvn_mg +# define sv_usepvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_usepvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif +#ifndef SvVSTRING_mg +# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) +#endif + +/* Hint: sv_magic_portable + * This is a compatibility function that is only available with + * Devel::PPPort. It is NOT in the perl core. + * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when + * it is being passed a name pointer with namlen == 0. In that + * case, perl 5.8.0 and later store the pointer, not a copy of it. + * The compatibility can be provided back to perl 5.004. With + * earlier versions, the code will not compile. + */ + +#if (PERL_BCDVERSION < 0x5004000) + + /* code that uses sv_magic_portable will not compile */ + +#elif (PERL_BCDVERSION < 0x5008000) + +# define sv_magic_portable(sv, obj, how, name, namlen) \ + STMT_START { \ + SV *SvMp_sv = (sv); \ + char *SvMp_name = (char *) (name); \ + I32 SvMp_namlen = (namlen); \ + if (SvMp_name && SvMp_namlen == 0) \ + { \ + MAGIC *mg; \ + sv_magic(SvMp_sv, obj, how, 0, 0); \ + mg = SvMAGIC(SvMp_sv); \ + mg->mg_len = -42; /* XXX: this is the tricky part */ \ + mg->mg_ptr = SvMp_name; \ + } \ + else \ + { \ + sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ + } \ + } STMT_END + +#else + +# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) + +#endif + +#ifdef USE_ITHREADS +#ifndef CopFILE +# define CopFILE(c) ((c)->cop_file) +#endif + +#ifndef CopFILEGV +# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) ((c)->cop_stashpv) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ + || (CopSTASHPV(c) && HvNAME(hv) \ + && strEQ(CopSTASHPV(c), HvNAME(hv))))) +#endif + +#else +#ifndef CopFILEGV +# define CopFILEGV(c) ((c)->cop_filegv) +#endif + +#ifndef CopFILEGV_set +# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) +#endif + +#ifndef CopFILE +# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) ((c)->cop_stash) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) +#endif + +#endif /* USE_ITHREADS */ +#ifndef IN_PERL_COMPILETIME +# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) +#endif + +#ifndef IN_LOCALE_RUNTIME +# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE_COMPILETIME +# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE +# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) +#endif +#ifndef IS_NUMBER_IN_UV +# define IS_NUMBER_IN_UV 0x01 +#endif + +#ifndef IS_NUMBER_GREATER_THAN_UV_MAX +# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef IS_NUMBER_NOT_INT +# define IS_NUMBER_NOT_INT 0x04 +#endif + +#ifndef IS_NUMBER_NEG +# define IS_NUMBER_NEG 0x08 +#endif + +#ifndef IS_NUMBER_INFINITY +# define IS_NUMBER_INFINITY 0x10 +#endif + +#ifndef IS_NUMBER_NAN +# define IS_NUMBER_NAN 0x20 +#endif +#ifndef GROK_NUMERIC_RADIX +# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +#endif +#ifndef PERL_SCAN_GREATER_THAN_UV_MAX +# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef PERL_SCAN_SILENT_ILLDIGIT +# define PERL_SCAN_SILENT_ILLDIGIT 0x04 +#endif + +#ifndef PERL_SCAN_ALLOW_UNDERSCORES +# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 +#endif + +#ifndef PERL_SCAN_DISALLOW_PREFIX +# define PERL_SCAN_DISALLOW_PREFIX 0x02 +#endif + +#ifndef grok_numeric_radix +#if defined(NEED_grok_numeric_radix) +static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +static +#else +extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +#endif + +#ifdef grok_numeric_radix +# undef grok_numeric_radix +#endif +#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) +#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) + +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) +bool +DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) +{ +#ifdef USE_LOCALE_NUMERIC +#ifdef PL_numeric_radix_sv + if (PL_numeric_radix_sv && IN_LOCALE) { + STRLEN len; + char* radix = SvPV(PL_numeric_radix_sv, len); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#else + /* older perls don't have PL_numeric_radix_sv so the radix + * must manually be requested from locale.h + */ +#include + dTHR; /* needed for older threaded perls */ + struct lconv *lc = localeconv(); + char *radix = lc->decimal_point; + if (radix && IN_LOCALE) { + STRLEN len = strlen(radix); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#endif +#endif /* USE_LOCALE_NUMERIC */ + /* always try "." if numeric radix didn't match because + * we may have data from different locales mixed */ + if (*sp < send && **sp == '.') { + ++*sp; + return TRUE; + } + return FALSE; +} +#endif +#endif + +#ifndef grok_number +#if defined(NEED_grok_number) +static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +static +#else +extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +#endif + +#ifdef grok_number +# undef grok_number +#endif +#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) +#define Perl_grok_number DPPP_(my_grok_number) + +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) +int +DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) +{ + const char *s = pv; + const char *send = pv + len; + const UV max_div_10 = UV_MAX / 10; + const char max_mod_10 = UV_MAX % 10; + int numtype = 0; + int sawinf = 0; + int sawnan = 0; + + while (s < send && isSPACE(*s)) + s++; + if (s == send) { + return 0; + } else if (*s == '-') { + s++; + numtype = IS_NUMBER_NEG; + } + else if (*s == '+') + s++; + + if (s == send) + return 0; + + /* next must be digit or the radix separator or beginning of infinity */ + if (isDIGIT(*s)) { + /* UVs are at least 32 bits, so the first 9 decimal digits cannot + overflow. */ + UV value = *s - '0'; + /* This construction seems to be more optimiser friendly. + (without it gcc does the isDIGIT test and the *s - '0' separately) + With it gcc on arm is managing 6 instructions (6 cycles) per digit. + In theory the optimiser could deduce how far to unroll the loop + before checking for overflow. */ + if (++s < send) { + int digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + /* Now got 9 digits, so need to check + each time for overflow. */ + digit = *s - '0'; + while (digit >= 0 && digit <= 9 + && (value < max_div_10 + || (value == max_div_10 + && digit <= max_mod_10))) { + value = value * 10 + digit; + if (++s < send) + digit = *s - '0'; + else + break; + } + if (digit >= 0 && digit <= 9 + && (s < send)) { + /* value overflowed. + skip the remaining digits, don't + worry about setting *valuep. */ + do { + s++; + } while (s < send && isDIGIT(*s)); + numtype |= + IS_NUMBER_GREATER_THAN_UV_MAX; + goto skip_value; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + numtype |= IS_NUMBER_IN_UV; + if (valuep) + *valuep = value; + + skip_value: + if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT; + while (s < send && isDIGIT(*s)) /* optional digits after the radix */ + s++; + } + } + else if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ + /* no digits before the radix means we need digits after it */ + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + if (valuep) { + /* integer approximation is valid - it's 0. */ + *valuep = 0; + } + } + else + return 0; + } else if (*s == 'I' || *s == 'i') { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; + s++; if (s < send && (*s == 'I' || *s == 'i')) { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; + s++; if (s == send || (*s != 'T' && *s != 't')) return 0; + s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; + s++; + } + sawinf = 1; + } else if (*s == 'N' || *s == 'n') { + /* XXX TODO: There are signaling NaNs and quiet NaNs. */ + s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; + sawnan = 1; + } else + return 0; + + if (sawinf) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; + } else if (sawnan) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; + } else if (s < send) { + /* we can have an optional exponent part */ + if (*s == 'e' || *s == 'E') { + /* The only flag we keep is sign. Blow away any "it's UV" */ + numtype &= IS_NUMBER_NEG; + numtype |= IS_NUMBER_NOT_INT; + s++; + if (s < send && (*s == '-' || *s == '+')) + s++; + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + } + else + return 0; + } + } + while (s < send && isSPACE(*s)) + s++; + if (s >= send) + return numtype; + if (len == 10 && memEQ(pv, "0 but true", 10)) { + if (valuep) + *valuep = 0; + return IS_NUMBER_IN_UV; + } + return 0; +} +#endif +#endif + +/* + * The grok_* routines have been modified to use warn() instead of + * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, + * which is why the stack variable has been renamed to 'xdigit'. + */ + +#ifndef grok_bin +#if defined(NEED_grok_bin) +static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_bin +# undef grok_bin +#endif +#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) +#define Perl_grok_bin DPPP_(my_grok_bin) + +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) +UV +DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_2 = UV_MAX / 2; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading b or 0b. + for compatibility silently suffer "b" and "0b" as valid binary + numbers. */ + if (len >= 1) { + if (s[0] == 'b') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'b') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + char bit = *s; + if (bit == '0' || bit == '1') { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_bin. */ + redo: + if (!overflowed) { + if (value <= max_div_2) { + value = (value << 1) | (bit - '0'); + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in binary number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 2.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount. */ + value_nv += (NV)(bit - '0'); + continue; + } + if (bit == '_' && len && allow_underscores && (bit = s[1]) + && (bit == '0' || bit == '1')) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal binary digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Binary number > 0b11111111111111111111111111111111 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_hex +#if defined(NEED_grok_hex) +static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_hex +# undef grok_hex +#endif +#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) +#define Perl_grok_hex DPPP_(my_grok_hex) + +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) +UV +DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_16 = UV_MAX / 16; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + const char *xdigit; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading x or 0x. + for compatibility silently suffer "x" and "0x" as valid hex numbers. + */ + if (len >= 1) { + if (s[0] == 'x') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'x') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + xdigit = strchr((char *) PL_hexdigit, *s); + if (xdigit) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_hex. */ + redo: + if (!overflowed) { + if (value <= max_div_16) { + value = (value << 4) | ((xdigit - PL_hexdigit) & 15); + continue; + } + warn("Integer overflow in hexadecimal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 16.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 16-tuples. */ + value_nv += (NV)((xdigit - PL_hexdigit) & 15); + continue; + } + if (*s == '_' && len && allow_underscores && s[1] + && (xdigit = strchr((char *) PL_hexdigit, s[1]))) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal hexadecimal digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Hexadecimal number > 0xffffffff non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_oct +#if defined(NEED_grok_oct) +static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_oct +# undef grok_oct +#endif +#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) +#define Perl_grok_oct DPPP_(my_grok_oct) + +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) +UV +DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_8 = UV_MAX / 8; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + for (; len-- && *s; s++) { + /* gcc 2.95 optimiser not smart enough to figure that this subtraction + out front allows slicker code. */ + int digit = *s - '0'; + if (digit >= 0 && digit <= 7) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + */ + redo: + if (!overflowed) { + if (value <= max_div_8) { + value = (value << 3) | digit; + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in octal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 8.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 8-tuples. */ + value_nv += (NV)digit; + continue; + } + if (digit == ('_' - '0') && len && allow_underscores + && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) + { + --len; + ++s; + goto redo; + } + /* Allow \octal to work the DWIM way (that is, stop scanning + * as soon as non-octal characters are seen, complain only iff + * someone seems to want to use the digits eight and nine). */ + if (digit == 8 || digit == 9) { + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal octal digit '%c' ignored", *s); + } + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Octal number > 037777777777 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#if !defined(my_snprintf) +#if defined(NEED_my_snprintf) +static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +static +#else +extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +#endif + +#define my_snprintf DPPP_(my_my_snprintf) +#define Perl_my_snprintf DPPP_(my_my_snprintf) + +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + +int +DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) +{ + dTHX; + int retval; + va_list ap; + va_start(ap, format); +#ifdef HAS_VSNPRINTF + retval = vsnprintf(buffer, len, format, ap); +#else + retval = vsprintf(buffer, format, ap); +#endif + va_end(ap); + if (retval < 0 || (len > 0 && (Size_t)retval >= len)) + Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); + return retval; +} + +#endif +#endif + +#if !defined(my_sprintf) +#if defined(NEED_my_sprintf) +static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +static +#else +extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +#endif + +#define my_sprintf DPPP_(my_my_sprintf) +#define Perl_my_sprintf DPPP_(my_my_sprintf) + +#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) + +int +DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) +{ + va_list args; + va_start(args, pat); + vsprintf(buffer, pat, args); + va_end(args); + return strlen(buffer); +} + +#endif +#endif + +#ifdef NO_XSLOCKS +# ifdef dJMPENV +# define dXCPT dJMPENV; int rEtV = 0 +# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) +# define XCPT_TRY_END JMPENV_POP; +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW JMPENV_JUMP(rEtV) +# else +# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 +# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) +# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW Siglongjmp(top_env, rEtV) +# endif +#endif + +#if !defined(my_strlcat) +#if defined(NEED_my_strlcat) +static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcat DPPP_(my_my_strlcat) +#define Perl_my_strlcat DPPP_(my_my_strlcat) + +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + +Size_t +DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif +#endif + +#if !defined(my_strlcpy) +#if defined(NEED_my_strlcpy) +static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcpy DPPP_(my_my_strlcpy) +#define Perl_my_strlcpy DPPP_(my_my_strlcpy) + +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + +Size_t +DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} + +#endif +#endif +#ifndef PERL_PV_ESCAPE_QUOTE +# define PERL_PV_ESCAPE_QUOTE 0x0001 +#endif + +#ifndef PERL_PV_PRETTY_QUOTE +# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_ELLIPSES +# define PERL_PV_PRETTY_ELLIPSES 0x0002 +#endif + +#ifndef PERL_PV_PRETTY_LTGT +# define PERL_PV_PRETTY_LTGT 0x0004 +#endif + +#ifndef PERL_PV_ESCAPE_FIRSTCHAR +# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 +#endif + +#ifndef PERL_PV_ESCAPE_UNI +# define PERL_PV_ESCAPE_UNI 0x0100 +#endif + +#ifndef PERL_PV_ESCAPE_UNI_DETECT +# define PERL_PV_ESCAPE_UNI_DETECT 0x0200 +#endif + +#ifndef PERL_PV_ESCAPE_ALL +# define PERL_PV_ESCAPE_ALL 0x1000 +#endif + +#ifndef PERL_PV_ESCAPE_NOBACKSLASH +# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 +#endif + +#ifndef PERL_PV_ESCAPE_NOCLEAR +# define PERL_PV_ESCAPE_NOCLEAR 0x4000 +#endif + +#ifndef PERL_PV_ESCAPE_RE +# define PERL_PV_ESCAPE_RE 0x8000 +#endif + +#ifndef PERL_PV_PRETTY_NOCLEAR +# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR +#endif +#ifndef PERL_PV_PRETTY_DUMP +# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_REGPROP +# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE +#endif + +/* Hint: pv_escape + * Note that unicode functionality is only backported to + * those perl versions that support it. For older perl + * versions, the implementation will fall back to bytes. + */ + +#ifndef pv_escape +#if defined(NEED_pv_escape) +static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +static +#else +extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +#endif + +#ifdef pv_escape +# undef pv_escape +#endif +#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) +#define Perl_pv_escape DPPP_(my_pv_escape) + +#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) + +char * +DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, + const STRLEN count, const STRLEN max, + STRLEN * const escaped, const U32 flags) +{ + const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; + const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; + char octbuf[32] = "%123456789ABCDF"; + STRLEN wrote = 0; + STRLEN chsize = 0; + STRLEN readsize = 1; +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; +#endif + const char *pv = str; + const char * const end = pv + count; + octbuf[0] = esc; + + if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) + sv_setpvs(dsv, ""); + +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) + isuni = 1; +#endif + + for (; pv < end && (!max || wrote < max) ; pv += readsize) { + const UV u = +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + isuni ? utf8_to_uvchr((U8*)pv, &readsize) : +#endif + (U8)*pv; + const U8 c = (U8)u & 0xFF; + + if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + chsize = my_snprintf(octbuf, sizeof octbuf, + "%"UVxf, u); + else + chsize = my_snprintf(octbuf, sizeof octbuf, + "%cx{%"UVxf"}", esc, u); + } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { + chsize = 1; + } else { + if (c == dq || c == esc || !isPRINT(c)) { + chsize = 2; + switch (c) { + case '\\' : /* fallthrough */ + case '%' : if (c == esc) + octbuf[1] = esc; + else + chsize = 1; + break; + case '\v' : octbuf[1] = 'v'; break; + case '\t' : octbuf[1] = 't'; break; + case '\r' : octbuf[1] = 'r'; break; + case '\n' : octbuf[1] = 'n'; break; + case '\f' : octbuf[1] = 'f'; break; + case '"' : if (dq == '"') + octbuf[1] = '"'; + else + chsize = 1; + break; + default: chsize = my_snprintf(octbuf, sizeof octbuf, + pv < end && isDIGIT((U8)*(pv+readsize)) + ? "%c%03o" : "%c%o", esc, c); + } + } else { + chsize = 1; + } + } + if (max && wrote + chsize > max) { + break; + } else if (chsize > 1) { + sv_catpvn(dsv, octbuf, chsize); + wrote += chsize; + } else { + char tmp[2]; + my_snprintf(tmp, sizeof tmp, "%c", c); + sv_catpvn(dsv, tmp, 1); + wrote++; + } + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + break; + } + if (escaped != NULL) + *escaped= pv - str; + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_pretty +#if defined(NEED_pv_pretty) +static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +static +#else +extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +#endif + +#ifdef pv_pretty +# undef pv_pretty +#endif +#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) +#define Perl_pv_pretty DPPP_(my_pv_pretty) + +#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) + +char * +DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, + const STRLEN max, char const * const start_color, char const * const end_color, + const U32 flags) +{ + const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; + STRLEN escaped; + + if (!(flags & PERL_PV_PRETTY_NOCLEAR)) + sv_setpvs(dsv, ""); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, "<"); + + if (start_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); + + pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); + + if (end_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, ">"); + + if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) + sv_catpvs(dsv, "..."); + + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_display +#if defined(NEED_pv_display) +static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +static +#else +extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +#endif + +#ifdef pv_display +# undef pv_display +#endif +#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) +#define Perl_pv_display DPPP_(my_pv_display) + +#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) + +char * +DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) +{ + pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); + if (len > cur && pv[cur] == '\0') + sv_catpvs(dsv, "\\0"); + return SvPVX(dsv); +} + +#endif +#endif + +#endif /* _P_P_PORTABILITY_H_ */ + +/* End of File ppport.h */ diff --git a/t/sixel.t b/t/sixel.t new file mode 100644 index 00000000..6c946b12 --- /dev/null +++ b/t/sixel.t @@ -0,0 +1,62 @@ +# Before 'make install' is performed this script should be runnable with +# 'make test'. After 'make install' it should work as 'perl Hello.t' + +######################### + +# change 'tests => 1' to 'tests => last_test_to_print'; + +use strict; +use warnings; +use Test::More; + +#use Test::More; +BEGIN { use_ok('Image::Sixel') }; +BEGIN { + unlink "egret.six", "egret.png"; +}; + +######################### + +# Insert your test code below, the Test::More module is use()ed here so read +# its man page ( perldoc Test::More ) for help writing this test script. + +subtest 'encoder' => sub { + use Image::Sixel; + my $encoder = Image::Sixel::Encoder->new(); + isa_ok $encoder, 'Image::Sixel::Encoder'; + can_ok $encoder, 'setopt', 'encode'; + $encoder->setopt("o", "egret.six"); + $encoder->setopt("w", "200"); + $encoder->encode("images/egret.jpg"); + ok -f "egret.six", 'output file exists'; +}; + +subtest 'decoder' => sub { + use Image::Sixel; + my $decoder = Image::Sixel::Decoder->new; + isa_ok $decoder, 'Image::Sixel::Decoder'; + can_ok $decoder, 'setopt', 'decode'; + $decoder->setopt("i", "images/egret.six"); + $decoder->setopt("o", "egret.png"); + $decoder->decode(); + ok -f "egret.png", 'output file exists'; +}; + +done_testing; +#subtest 'foo => bar' => sub { +# my $encoder = Image::Sixel::Encoder->new; +# $encoder->setopt("w", 200); +# $encoder->encode("images/egret.jpg"); +# isa_ok $encoder, 'Image::Sixel::Encoder'; +#}; + +# +# +#my $decoder = Image::Sixel::Decoder->new(); +#isa_ok($decoder, 'Image::Sixel::Decoder'); +# +#$decoder->setopt("i", "egret.six"); +#$decoder->setopt("o", "egret1.png"); +#$decoder->decode(); + +#1; From 657dd421142b4dcc67f178b44f5bf8c90ced1c01 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 29 May 2015 01:46:47 +0900 Subject: [PATCH 274/451] Add missing build files --- tools/Makefile.am | 8 + tools/Makefile.in | 544 +++++++++++++++++++++++++++++++++++++++ tools/libsixel-config.in | 86 +++++++ 3 files changed, 638 insertions(+) create mode 100644 tools/Makefile.am create mode 100644 tools/Makefile.in create mode 100755 tools/libsixel-config.in diff --git a/tools/Makefile.am b/tools/Makefile.am new file mode 100644 index 00000000..4c50eca5 --- /dev/null +++ b/tools/Makefile.am @@ -0,0 +1,8 @@ + +CLEANFILES = + +clean-local: + +bin_SCRIPTS = libsixel-config + +EXTRA_DIST = libsixel-config.in diff --git a/tools/Makefile.in b/tools/Makefile.in new file mode 100644 index 00000000..d36c1d07 --- /dev/null +++ b/tools/Makefile.in @@ -0,0 +1,544 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = tools +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = libsixel-config +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(bindir)" +SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libsixel-config.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CPPFLAGS = @AM_CPPFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LS_LTVERSION = @LS_LTVERSION@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_DESCRIPTION = @PACKAGE_DESCRIPTION@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +attr_func_deprecated = @attr_func_deprecated@ +attr_var_deprecated = @attr_var_deprecated@ +bashcompletiondir = @bashcompletiondir@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +zshcompletiondir = @zshcompletiondir@ +CLEANFILES = +bin_SCRIPTS = libsixel-config +EXTRA_DIST = libsixel-config.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tools/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +libsixel-config: $(top_builddir)/config.status $(srcdir)/libsixel-config.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(SCRIPTS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binSCRIPTS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binSCRIPTS + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-binSCRIPTS + +.PRECIOUS: Makefile + + +clean-local: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tools/libsixel-config.in b/tools/libsixel-config.in new file mode 100755 index 00000000..0267b653 --- /dev/null +++ b/tools/libsixel-config.in @@ -0,0 +1,86 @@ +#!/bin/sh +# +# Author: Hayaki Saito, 2015 +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +include_dir=@includedir@ +bindir=@bindir@ +datadir=@datadir@ +mandir=@mandir@ + +LANG=C; export LANG +LANGUAGE=C; export LANGUAGE +LC_ALL=C; export LC_ALL +LC_CTYPE=C; export LC_CTYPE + +test $# = 0 && exec /bin/sh $0 --error + +while test $# -gt 0; do + case "$1" in + # basic configuration + --prefix) + echo "$prefix" + ;; + --exec-prefix) + echo "${exec_prefix}" + ;; + # compile/link + --cflags) + echo "-I${include_dir}" + ;; + --libs) + echo "-L${libdir} -lsixel" + ;; + # identification + --version) + echo @PACKAGE_VERSION@ + ;; + --abi-version) + echo @LS_LTVERSION@ | tr : . + ;; + # locations + --bindir) + echo "${bindir}" + ;; + --datadir) + echo "${datadir}" + ;; + --libdir) + echo "${libdir}" + ;; + --mandir) + echo "${mandir}" + ;; + # general info + --help) + cat <&2 + exit 1 + ;; + esac + shift +done From 3e83a55cad1ece4877ae7dcd1edd86924408e299 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 29 May 2015 02:03:50 +0900 Subject: [PATCH 275/451] Correct wrong help string of ./configure --- configure | 2 +- configure.ac | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 44caad3c..5956c400 100755 --- a/configure +++ b/configure @@ -1483,7 +1483,7 @@ Optional Features: --disable-libtool-lock avoid locking (might break parallel builds) --disable-img2sixel whether to build img2sixel (default: yes) --disable-sixel2png whether to build sixel2png (default: yes) - --enable-sixel2png Python bindings (default: yes) + --enable-python Python interface (default: yes) --enable-debug Use debug macro and specific CFLAGS --enable-gcov Use gcov --enable-tests Build tests diff --git a/configure.ac b/configure.ac index 6a375919..bd33b44a 100644 --- a/configure.ac +++ b/configure.ac @@ -105,8 +105,8 @@ AC_MSG_NOTICE([zsh-completion directory is ${zshcompletiondir}]) AC_SUBST(zshcompletiondir) AC_ARG_ENABLE([python], - [AS_HELP_STRING([--enable-sixel2png], - [Python bindings (default: yes)])], + [AS_HELP_STRING([--enable-python], + [Python interface (default: yes)])], [], [enable_python=yes]) From c2ecae64ef70d91a52fd5db609172c16f10dbb7f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 30 May 2015 20:18:10 +0900 Subject: [PATCH 276/451] Update ChangeLog --- ChangeLog | 453 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 453 insertions(+) diff --git a/ChangeLog b/ChangeLog index 869700b4..41fd2738 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,426 @@ +2015-05-29 Hayaki Saito + + * configure, configure.ac: Correct wrong help string of ./configure + + * tools/Makefile.am, tools/Makefile.in, tools/libsixel-config.in: Add missing + build files + + * Makefile.am, Makefile.in, configure, configure.ac: Add a helper tool + libsixel-config + +2015-05-28 Hayaki Saito + + * src/encoder.c: Don't close STDOUT with -o option + +2015-05-27 Hayaki Saito + + * configure, configure.ac, python/README.rst, src/Makefile.am, + src/Makefile.in: Show python package path after ./configure is succeeded + + * Makefile.am, Makefile.in: Add test-output.png to CLEANFILES + + * src/Makefile.am, src/Makefile.in: Add src/tests to CLEANFILES + + * python/README.rst: Fix syntax errors of README.rst + + * python/Makefile.am, python/Makefile.in: Add python/Makefile.am + python/Makefile.in + + * python/sample1.py: Remove a trivial sample file + + * py-compile: Add py-compile, distributed under special exception to the GNU + General Public License + + * python/setup.py: Add setup.py for python bindings + + * python/README.rst: Add README.rst for python bindings + + * python/libsixel/__init__.py, python/libsixel/decoder.py, + python/libsixel/encoder.py: Add license blocks to python modules + + * Makefile.am, Makefile.in, aclocal.m4, configure, configure.ac, + converters/Makefile.in, include/Makefile.in, src/Makefile.in: Build and + install python bindings by 'make install' + + * python/libsixel.py, python/libsixel/__init__.py, + python/libsixel/decoder.py, python/libsixel/encoder.py: Update python modules + +2015-05-26 Hayaki Saito + + * src/encoder.c, src/encoder.h: Aggregate a sixel_dither_t instance to + encoder object + + * examples/opengl/Makefile.in, examples/opengl/aclocal.m4, + examples/opengl/compile, examples/opengl/config.guess, + examples/opengl/config.h.in, examples/opengl/config.sub, + examples/opengl/configure, examples/opengl/configure.ac, + examples/opengl/depcomp, examples/opengl/install-sh, examples/opengl/main.c, + examples/opengl/missing: Update OpenGL example: add on-demand scrolling + feature + + * Makefile.in, converters/Makefile.am, converters/Makefile.in, src/dither.c, + src/encoder.c, src/frame.c, src/pixelformat.c, src/quant.c, src/tests.c, + src/writer.c: Add more tests for quant.c and encoder.c + +2015-05-25 Hayaki Saito + + * src/frame.c: Add more tests for frame.c + +2015-05-24 Hayaki Saito + + * Makefile.in, converters/Makefile.am, converters/Makefile.in: Add 'testfile' + to CLEANFILES + +2015-05-21 Hayaki Saito + + * Makefile.in, converters/Makefile.in, src/frame.c: Add more tests for + frame.c + + * src/frame.c: Drop unused function sixel_frame_set_palette() + + * src/quant.c, src/quant.h, src/tests.c, src/writer.c: Add initial tests for + quant.c + +2015-05-20 Hayaki Saito + + * src/encoder.c: Strip extra debug code + + * converters/Makefile.am, converters/Makefile.in, src/encoder.c: Fix broken + -B option test + + * src/Makefile.am, src/Makefile.in, src/writer.c: Add more test cases for + writer.c + + * src/Makefile.am, src/Makefile.in, src/tests.c, src/writer.c, src/writer.h: + Add initial tests for writer.c + + * converters/Makefile.am, converters/Makefile.in: sixel2png: Add test of + specifing invalid output file name + + * converters/Makefile.in, src/frame.c: Add more tests for frame.c + +2015-05-19 Hayaki Saito + + * src/dither.h, src/frame.c, src/frame.h, src/tests.c: Add initial test of + frame.c + + * src/pixelformat.c: Add more tests for pixelformat.c + +2015-05-18 Hayaki Saito + + * src/pixelformat.h: Add missing header file pixelformat.h + + * src/pixelformat.c: Add more tests for pixelformat.c + + * Makefile.in, src/Makefile.am, src/Makefile.in, src/dither.h, src/encoder.c, + src/encoder.h, src/pixelformat.c, src/tests.c: Add tests for pixelformat + + * Makefile.am, Makefile.in: Run unittests on travis + +2015-05-17 Hayaki Saito + + * Makefile.in, configure, configure.ac, src/fromgif.c, src/fromgif.h: Cleanup + + * converters/Makefile.in: Minor fix + + * converters/Makefile.am: Drop a surplus test for -k option + + * src/loader.c: Suppress an unused-parameter gcc warning + + * converters/Makefile.am: Add tests for invalid permission file + + * package.json.in.in: Strip --with-curl from package.json + + * include/sixel.h.in, src/decoder.c, src/dither.c, src/encoder.c, + src/frame.c, src/fromsixel.c, src/loader.c, src/output.c, src/pixelformat.c, + src/quant.c, src/scale.c, src/tosixel.c, src/writer.c: Add __declspec for + mingw + + * converters/Makefile.am: Add test cases for -B and -o option + + * src/Makefile.am, src/Makefile.in, src/decoder.c, src/decoder.h, + src/easy_decode.c, src/easy_decode.h, src/easy_encode.c, src/easy_encode.h, + src/encoder.c, src/encoder.h: Rename files: easy_encode.c -> encoder.c, + easy_decode -> decoder.c + + * python/libsixel.py: Update python-ctypes binding + + * php/sixel/package.xml, php/sixel/package2.xml, php/sixel/php_sixel.h, + php/sixel/sixel.c, php/sixel/sixel.xml, + php/sixel/tests/SixelEncoder__encode.phpt, + php/sixel/tests/SixelEncoder__setopt.phpt, + .../tests/SixelEncoder__sixel_easy_encode.phpt, + .../SixelEncoder__sixel_easy_encode_setopt.phpt: Update php extension + + * src/loader.c: Fix segmentation error when cancel_flag is not set + + * src/easy_encode.c: Drop sixel_callback_context_t + + * include/sixel.h.in, src/easy_decode.c, src/easy_encode.c: Add const + qualifier to some arguments of sixel_{en,de}coder_setopt() + + * converters/img2sixel.c, include/sixel.h.in, src/easy_encode.c, + src/easy_encode.h: Add new API sixel_encoder_set_cancel_flag() + + * converters/Makefile.am, converters/Makefile.in, converters/img2sixel.c, + src/loader.c: Wait input data with select() only if input file is a tty + device + + * include/sixel.h.in, src/easy_encode.c: Use sixel_write_callback() instead + of printf() to fix broken -n option + +2015-05-16 Hayaki Saito + + * converters/img2sixel.c, converters/sixel2png.c, include/sixel.h.in, + src/easy_decode.c, src/easy_decode.h, src/easy_encode.c, src/easy_encode.h: + Rename easy encoder/decoder structures and releated APIs + + * src/easy_encode.c: Suppress warnings in MinGW environment + + * converters/shell-completion/zsh/_img2sixel: Update zsh completion file + + * converters/shell-completion/bash/img2sixel: Update bash completion file + + * converters/img2sixel.1: Update manpage of img2sixel + + * src/loader.c: Minor fixes + + * src/loader.c: Suppress gcc unused-parameter warnings + +2015-05-15 Hayaki Saito + + * include/sixel.h.in, src/easy_encode.c, src/loader.c: Passes cancel flag to + image loader + + * src/easy_encode.c, src/loader.c: Minor fix + + * src/easy_encode.c: Don't close stdout/stderr on exit + +2015-05-14 Hayaki Saito + + * converters/img2sixel.c, src/easy_encode.c, src/easy_encode.h, src/loader.c: + Implement -o(--outfile) option + +2015-05-12 Hayaki Saito + + * converters/Makefile.am, converters/Makefile.in: Add pngsuite background + tests + + * src/fromgif.c: Fix leaks around GIF loader + +2015-05-11 Hayaki Saito + + * php/README, php/sixel/.cvsignore, php/sixel/CREDITS, + php/sixel/EXPERIMENTAL, php/sixel/README, php/sixel/config.m4, + php/sixel/config.w32, php/sixel/manual/file-entities.ent, + php/sixel/manual/functions.xml, php/sixel/manual/manual.xml.in, + php/sixel/manual/sixel/configure.xml, php/sixel/manual/sixel/constants.xml, + php/sixel/manual/sixel/ini.xml, php/sixel/manual/sixel/reference.xml, + php/sixel/package.xml, php/sixel/package2.xml, php/sixel/php_sixel.h, + php/sixel/sixel.c, php/sixel/sixel.dsp, php/sixel/sixel.xml, + php/sixel/tests/SixelEncoder____construct.phpt, + php/sixel/tests/SixelEncoder____destruct.phpt, + .../tests/SixelEncoder__sixel_easy_encode.phpt, + .../SixelEncoder__sixel_easy_encode_setopt.phpt: Add php extension + +2015-05-10 Hayaki Saito + + * Makefile.in, configure, configure.ac, converters/Makefile.in, + include/Makefile.in, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, + m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, package.json, + src/Makefile.in: Update package version and libtool version + + * Makefile.in, configure, configure.ac, converters/Makefile.in, + include/Makefile.in, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, + m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, src/Makefile.in: Update + package version and libtool version + + * src/easy_encode.c: Fix segmentation errors around evaluating cancel_flag + +2015-05-06 Hayaki Saito + + * src/fromgif.c: Add missing memset() initialization of the structure + stbi__gif (for Issue #42, reported by @msmhrt) + +2015-05-05 Hayaki Saito + + * src/Makefile.am, src/Makefile.in, src/loader.c: Use built-in gif loader + + * src/easy_encode.c, src/loader.c: Minor fixes + + * src/fromgif.c, src/fromgif.h: Add new file fromgif.{c,h} + +2015-05-04 Hayaki Saito + + * src/easy_encode.c: Emit CAN(\x18) when received signals + + * src/easy_encode.c: Minor fix around auto-scrolling + + * src/easy_encode.c: Fix a memory leak + +2015-05-02 Hayaki Saito + + * python/libsixel.py: Rename python class names + + * src/easy_encode.c: Suppress a gcc warning [-Werror=unused-variable] + + * src/easy_decode.c, src/easy_decode.h: Add missing files, + src/easy_decode.{c,h} + + * src/loader.c: Respect fuse_palette flag when decoding GIF images + +2015-04-30 Hayaki Saito + + * python/libsixel.py, python/sample1.py: Add ctypes(ffi) python binding + examples + + * src/easy_encode.c: Minor fixes + + * src/loader.c: Fix leak around playing GIF animation + + * src/frame.c: Resize PAL8 formatted pixel buffer correctly + + * src/easy_encode.c: Strip unused code around resize/crop + + * src/easy_encode.c: Minor fix + + * src/easy_encode.c: Allow NULL as 2nd argument in sixel_easy_encode() + + * converters/sixel2png.c, include/sixel.h.in: Abolish cancel_flag argument of + sixel_easy_decode() + + * src/easy_encode.c: Allow NULL as cancel_flag argument in + sixel_easy_encode() + + * converters/sixel2png.c, include/sixel.h.in, src/Makefile.am, + src/Makefile.in, src/easy_encode.c, src/easy_encode.h: Add easy decode API + set + + * converters/Makefile.am, converters/Makefile.in, converters/img2sixel.c, + include/sixel.h.in, src/Makefile.am, src/Makefile.in, src/easy_encode.c, + src/easy_encode.h, src/frame.c, src/frame.h: Add easy converter API set + +2015-04-29 Hayaki Saito + + * converters/img2sixel.c: Clean up + + * src/loader.c: Load paletted PNG with keycolor (for Issue #28) + + * include/sixel.h.in, src/loader.c: Cleanup + + * converters/img2sixel.c, include/sixel.h.in, src/frame.c, src/frame.h: Minor + fixes + + * converters/img2sixel.c, include/sixel.h.in, src/Makefile.am, + src/Makefile.in, src/loader.c: Introduce frame API + + * src/frame.c, src/frame.h: Add frame.c/frame.h + + * include/sixel.h.in: Add reference counter to struct sixel_frame_t + +2015-04-28 Hayaki Saito + + * libsixel.pc.in: Strip -lsixel-imageio from libsixel.pc + +2015-04-26 Hayaki Saito + + * src/loader.c: Respect -B option regarding with GIF images with transparent + index (for Issue #25) + + * src/loader.c: Prevent segmentation fault when receiving SIGINT during + playing gif animation + + * converters/img2sixel.c: Handle SIGINT correctly + +2015-04-25 Hayaki Saito + + * converters/img2sixel.c: Minor fix + + * src/tosixel.c: Don't output palette definition of the keycolor + + * src/loader.c: Set default transparent color index in with_load_gdkpixbuf() + and load_with_gd() + + * converters/img2sixel.c, src/loader.c: Pass the keycolor of gif to the + encoder by using sixel_dither_set_transpaernt() + + * include/sixel.h.in, src/dither.c: Add new API: + sixel_dither_set_transparent() + + * include/sixel.h.in, src/loader.c: Retrieve transparent color index from gif + +2015-04-22 Hayaki Saito + + * src/loader.c: Convert PIXELFORMAT_ARGB8888 into PIXELFORMAT_RGB888 in + sixel_strip_alpha() + +2015-04-19 Hayaki Saito + + * src/loader.c, src/stb_image.h: Load gif as PAL8 pixelformat + +2015-04-13 Hayaki Saito + + * converters/img2sixel.c: Fix a gcc warning (unused parameter) + + * Makefile.in, converters/img2sixel.c: Set timeout on waiting CPR response + + * config.h.in, configure, configure.ac, converters/img2sixel.c: Check the + availability of isatty(), termios.h, sys/ioctl.h + + * converters/img2sixel.c: Scroll the terminal on demand when playing gif + animation + +2015-04-12 Hayaki Saito + + * converters/img2sixel.c, include/sixel.h.in, src/loader.c, src/stb_image.h: + Detect if the image has multi-frames by builtin gif loader + + * converters/img2sixel.c, src/loader.c: Fix a double free error in gdk-pixbuf + loader + + * src/loader.c: Minor fix + + * src/loader.c: Suppress a GCC warning when specified --with-gdk-pixbuf2 + configure option + + * converters/img2sixel.c, src/pixelformat.c: Fix broken + sixel_helper_normalize_pixelforma(), return dst_pixelformat correctly + +2015-04-11 Hayaki Saito + + * converters/img2sixel.c: Fix a memory leak found in cropping routine + + * converters/img2sixel.c: Fix a segmentation error occurs when resizing + + * src/loader.c: Suppress GCC warnings + + * src/loader.c: Support callback loader API with libgd loader + + * src/loader.c: Support callback loader API with gdk-pixbuf loader + +2015-04-09 Hayaki Saito + + * converters/img2sixel.c: Implement macro invocation with callback + + * converters/img2sixel.c, include/sixel.h.in, src/loader.c: Fix loop control + without macro + + * converters/img2sixel.c, include/sixel.h.in, src/loader.c: Fix broken + animation without macro + + * converters/Makefile.am, converters/Makefile.in: Update tests + 2015-04-05 Hayaki Saito + * converters/stb_image.h: Fix an existing bug in stb_image v1.41 of building + color palette, reported by @msmhrt (for Issue #41) + + * converters/img2sixel.c: Don't use fuse_palette flag when using fixed + palette + + * converters/img2sixel.c, include/sixel.h.in, src/loader.c: Load image frame + with callback function (on progress) + * Makefile.in, configure, configure.ac, converters/Makefile.am, converters/Makefile.in, include/Makefile.in, src/Makefile.in: Add tests for pngsuite basic images @@ -423,6 +844,10 @@ * src/quant.c: Correct wrong histgram processing (for Issue #26) +2015-02-05 Hayaki Saito + + * Makefile.in, converters/Makefile.am, converters/Makefile.in: Minor fixes + 2015-02-04 Hayaki Saito * converters/loader.c, converters/stb_image.h, @@ -436,6 +861,9 @@ * examples/opengl/main.c: Minor fix + * converters/Makefile.am, converters/Makefile.in: Add converters/unittest.log + to clean targets + * Makefile.in, configure, configure.ac: Detect availabilies for GD functions correctly if gd.h is not in default include path @@ -558,8 +986,18 @@ * converters/img2sixel.c, converters/scale.c, converters/scale.h: Cleanup scale.c +2014-12-28 Hayaki Saito + + * converters/tests.c: Add missing tests.c + + * .travis.yml, Makefile.am, Makefile.in, converters/Makefile.am, + converters/Makefile.in, src/dither.c, src/dither.h: Add basic tests of + dither.c + 2014-12-26 Hayaki Saito + * config.h.in, configure, configure.ac: Add --enable-tests configure option + * converters/img2sixel.c: Minor style improvement * converters/img2sixel.c: Strip an unreached return statement @@ -651,8 +1089,23 @@ * src/tosixel.c: Move a long case statement to a new function + * converters/loader.c: Suppress a clang warning: -Wunused-parameter + * NEWS: Update NEWS +2014-12-04 Hayaki Saito + + * converters/img2sixel.c: Fix a stupid typo + + * README.md, converters/Makefile.am, converters/Makefile.in, + converters/img2sixel.1, converters/img2sixel.c, converters/loader.c, + converters/loader.h, converters/shell-completion/bash/img2sixel, + converters/shell-completion/zsh/_img2sixel: Introduce -k, --insecure option + for libcurl integration + + * converters/Makefile.am, converters/Makefile.in: Add test for SSL access + with libcurl + 2014-12-03 OBATA Akio * configure, configure.ac: Kill bashizm '=' operator for test(1) is not From 4d907fde24e053c6663d016a8969c5d075c4f3bb Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 2 Jun 2015 01:28:13 +0900 Subject: [PATCH 277/451] Update NEWS --- NEWS | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/NEWS b/NEWS index d297cc9e..34ab4421 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,16 @@ + ------------------------------ + What's new in libsixel-1.5 ? + ------------------------------ +* img2sixel: Add -B(--bgcolor) option. + +* core: introduce new API for dither object, sixel_dither_set_transparent(). + +* core: Improve processing quality of loading paletted PNG images. + +* core: Improve processing quality and performance of loading GIF images. + +* core: Add more high level APIs + ------------------------------ What's new in libsixel-1.4 ? ------------------------------ From f34a405672ef165101ec2bda13c6740a8cc77c6b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 5 Jun 2015 02:05:06 +0900 Subject: [PATCH 278/451] Fix segmentation fault caused by previous commit --- src/loader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/loader.c b/src/loader.c index f19e7e4a..3f94eb80 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1130,7 +1130,7 @@ load_with_gdkpixbuf( } else { for (i = 0; i < frame->height; ++i) { memcpy(frame->pixels + frame->width * depth * i, - p + stride * frame->height * i, + p + stride * i, frame->width * depth); } } @@ -1175,7 +1175,7 @@ load_with_gdkpixbuf( } else { for (i = 0; i < frame->height; ++i) { memcpy(frame->pixels + frame->width * depth * i, - p + stride * frame->height * i, + p + stride * i, frame->width * depth); } } From a4f62c80ec940f7ae172940145055b3ee8dcfc47 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:35:23 +0900 Subject: [PATCH 279/451] Update README --- README.md | 156 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 133 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 768e0c0d..12c6c16d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ So if you want to view a SIXEL image file, all you have to do is "cat" it to you ## SIXEL Animation -img2sixel(1) can decode GIF animation. +`img2sixel(1)` can decode GIF animation. ![Animation](https://raw.githubusercontent.com/saitoha/libsixel/data/data/sixel.gif) @@ -36,7 +36,7 @@ Now Youtube video streaming is available over SIXEL protocol by [FFmpeg-SIXEL](h [SDL1.2-SIXEL](https://github.com/saitoha/SDL1.2-SIXEL) project makes enable you to operate various GUI applications on the terminal. -You can play "The Battle for Wesnoth" over SIXEL protocol. +You can play "`The Battle for Wesnoth`" over SIXEL protocol. [![SDL1.2-SIXEL WESNOTH](https://raw.githubusercontent.com/saitoha/libsixel/data/data/wesnoth.png)](http://youtu.be/aMUkN7TSct4) @@ -58,7 +58,7 @@ You can run QEMU on SIXEL terminals. ### W3M integration -img2sixel(1) can be integrated with [Arakiken's w3m fork(remoteimg branch)](https://bitbucket.org/arakiken/w3m/branch/remoteimg). +`img2sixel(1)` can be integrated with [Arakiken's w3m fork(remoteimg branch)](https://bitbucket.org/arakiken/w3m/branch/remoteimg). ![w3m-sixel](https://raw.githubusercontent.com/saitoha/libsixel/data/data/w3m-sixel.png) @@ -145,37 +145,37 @@ Now libsixel and ImageMagick's sixel coder follow it. ### High quality quantization -img2sixel(1) supports color image quantization. It works well even if few number of colors are allowed. +`img2sixel(1)` supports color image quantization. It works well even if few number of colors are allowed. -- ppmtosixel (netpbm) +- `ppmtosixel` (`netpbm`) $ jpegtopnm images/snake.jpg | pnmquant 16 | ppmtosixel ![ppmtosixel](https://raw.githubusercontent.com/saitoha/libsixel/data/data/q_ppmtosixel.png) -- ppmtosixel with Floyd–Steinberg dithering (netpbm) +- `ppmtosixel` with Floyd–Steinberg dithering (`netpbm`) $ jpegtopnm images/snake.jpg | pnmquant 16 -floyd | ppmtosixel ![ppmtosixel](https://raw.githubusercontent.com/saitoha/libsixel/data/data/q_ppmtosixel2.png) -- kmiya's sixel +- kmiya's `sixel` $ sixel -p16 images/snake.jpg ![kmiya's sixel](https://raw.githubusercontent.com/saitoha/libsixel/data/data/q_sixel.png) -- PySixel (sixelconv command) +- PySixel (`sixelconv` command) $ sixelconv -n16 images/snake.jpg ![PySixel](https://raw.githubusercontent.com/saitoha/libsixel/data/data/q_sixelconv.png) -- libsixel (img2sixel command) +- libsixel (`img2sixel` command) $ img2sixel -p16 images/snake.jpg @@ -212,11 +212,11 @@ Now SIXEL feature is supported by the following terminals. Works on each of X, win32/cygwin, framebuffer version. -- XTerm (compiled with --enable-sixel option) +- XTerm (compiled with `--enable-sixel` option) [http://invisible-island.net/xterm/](http://invisible-island.net/xterm/) - You should launch xterm with "-ti 340" option. The SIXEL palette is limited to a maximum of 16 colors. + You should launch xterm with "`-ti 340`" option. The SIXEL palette is limited to a maximum of 16 colors. - yaft @@ -269,6 +269,10 @@ You can configure with the following options --with-pkgconfigdir specify pkgconfig dir (default is libdir/pkgconfig) --with-bashcompletiondir specify bashcompletion.d --with-zshcompletiondir specify zshcompletion.d +--enable-python Python interface (default: yes) +--enable-debug Use debug macro and specific CFLAGS +--enable-gcov Use gcov +--enable-tests Build tests ``` For more information, see "./configure --help". @@ -502,7 +506,68 @@ Convert a sixel file into a png image file $ sixel2png < egret.sixel > egret.png ``` -## Usage of conversion API 1.3 +## The high-level conversion API + +The high-livel API provides File-to-File conversion features. + + +### Encoder + +The sixel encoder object and related functions provides almost same features as `img2sixel`. + +```C +/* create encoder object */ +SIXELAPI sixel_encoder_t * +sixel_encoder_create(void); + +SIXELAPI void +sixel_encoder_ref(sixel_encoder_t *encoder); + +SIXELAPI void +sixel_encoder_unref(sixel_encoder_t *encoder); + +SIXELAPI int +sixel_encoder_setopt( + sixel_encoder_t /* in */ *encoder, + int /* in */ arg, + char const /* in */ *optarg); + +SIXELAPI int +sixel_encoder_encode( + sixel_encoder_t /* in */ *encoder, + char const /* in */ *filename); +``` + +### Decoder + +The sixel decoder object and related functions provides almost same features as `sixel2png`. + +```C +/* create decoder object */ +SIXELAPI sixel_decoder_t * +sixel_decoder_create(void); + +SIXELAPI void +sixel_decoder_ref(sixel_decoder_t *decoder); + +SIXELAPI void +sixel_decoder_unref(sixel_decoder_t *decoder); + +SIXELAPI int +sixel_decoder_setopt( + sixel_decoder_t /* in */ *decoder, + int /* in */ arg, + char const /* in */ *optarg); + +SIXELAPI int +sixel_decoder_decode( + sixel_decoder_t /* in */ *decoder); +``` + + +## The low-level conversion API + +The low-livel API provides Bytes-to-Bytes conversion features. The Whole API is described [here](https://github.com/saitoha/libsixel/blob/master/include/sixel.h.in). @@ -515,7 +580,7 @@ If you use OSX, a tiny example is available ### Bitmap to SIXEL -*sixel_encode* function converts bitmap array into SIXEL format. +`sixel_encode` function converts bitmap array into SIXEL format. ```C /* converter API */ @@ -532,8 +597,8 @@ sixel_encode( ``` To use this function, you have to initialize two objects, -- *sixel_dither_t* (dithering context object) -- *sixel_output_t* (output context object) +- `sixel_dither_t` (dithering context object) +- `sixel_output_t` (output context object) #### Dithering context @@ -595,7 +660,7 @@ sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ ### SIXEL to indexed bitmap -*sixel_decode* function converts SIXEL into indexed bitmap bytes with its palette. +`sixel_decode` function converts SIXEL into indexed bitmap bytes with its palette. ``` /* malloc(3) compatible function */ @@ -613,6 +678,42 @@ sixel_decode(unsigned char /* in */ *sixels, /* sixel bytes */ sixel_allocator_function /* out */ allocator); /* malloc function */ ``` +## Perl interface + +This package includes a perl module `Image::Sixel`. + +### Build and install Perl interface + +``` +$ cd perl +$ perl Build.PL +$ ./Build test +$ ./Build install +``` + +## Python interface + +This package includes a Python module `libsixel`. + +### Build and install Python interface + +``` +$ cd python +$ python setup.py install +``` + +## PHP interface + +This package includes a PHP module `sixel`. + +### Build and install PHP interface + +``` +$ cd php/sixel +$ phpize +$ ./configure +$ make install +``` ## Support @@ -663,6 +764,15 @@ The MIT License (MIT) - @vrtsds - @waywardmonkeys - @yoshikaw + +## Contributing + +1. Fork it ( https://github.com/saitoha/libsixel/fork/ ) +2. Create your feature branch (git checkout -b my-new-feature) +3. Commit your changes (git commit -am 'Add some feature') +4. Push to the branch (git push origin my-new-feature) +5. Create a new Pull Request + ## Acknowledgment @@ -719,7 +829,7 @@ kmiya also said this is compatible with MIT/BSD/GPL. ### stbi-1.41 -This software includes *stbi-1.41* (stb_image.h), +This software includes `stbi-1.41` (stb_image.h), public domain JPEG/PNG reader. https://github.com/nothings/stb @@ -727,7 +837,7 @@ https://github.com/nothings/stb ### stbiw-0.92 -This software includes *stbiw-0.94* (stb_image_write.h), +This software includes `stbiw-0.94` (stb_image_write.h), public domain PNG/BMP/TGA writer. https://github.com/nothings/stb @@ -736,11 +846,11 @@ https://github.com/nothings/stb ### pnmquant.c (netpbm library) The implementation of median cut algorithm for color quantization in quant.c -is imported from *pnmcolormap* included in *netpbm library*. +is imported from `pnmcolormap` included in `netpbm library`. http://netpbm.sourceforge.net/ -*pnmcolormap* was derived from *ppmquant*, originally written by Jef Poskanzer. +`pnmcolormap` was derived from `ppmquant`, originally written by Jef Poskanzer. > Copyright (C) 1989, 1991 by Jef Poskanzer. > Copyright (C) 2001 by Bryan Henderson. @@ -786,8 +896,8 @@ http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html ### graphics.c (from Xterm pl#310) -The helper function *hls2rgb* in *src/fromsixel.c* is imported from -*graphics.c* in [Xterm pl#310](http://invisible-island.net/xterm/), +The helper function `hls2rgb` in `src/fromsixel.c` is imported from +`graphics.c` in [Xterm pl#310](http://invisible-island.net/xterm/), originally written by Ross Combs. > Copyright 2013,2014 by Ross Combs @@ -863,7 +973,7 @@ Images under the directory images/pngsuite/ are imported from ### ImageMagick We are greatly inspired by the quality of ImageMagick and added some resampling filters to -img2sixel in reference to the line-up of filters of MagickCore's resize.c. +`img2sixel` in reference to the line-up of filters of MagickCore's resize.c. http://www.imagemagick.org/api/MagickCore/resize_8c_source.html From 7ce1d3e2978b2279452249d0ed7fa507c0f05ac6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:53:41 +0900 Subject: [PATCH 280/451] Update README of perl module --- perl/README | 56 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/perl/README b/perl/README index 94820e89..8d9f2fa3 100644 --- a/perl/README +++ b/perl/README @@ -1,13 +1,53 @@ +# NAME -How to Build -============ +Image::Sixel - The Perl interface for libsixel -$ perl Build.PL -$ ./Build +# SYNOPSIS +```perl +use Image::Sixel; -Install -======= +$encoder = Image::Sixel::Encoder->new(); +$encoder->setopt("w", 400); +$encoder->setopt("p", 16); +$encoder->encode("images/egret.jpg"); +``` + +```perl +use Image::Sixel; + +$decoder = Image::Sixel::Decoder->new(); +$decoder->encode("images/egret.jpg", "egret.png"); +``` + +# DESCRIPTION + +This perl module privides wrapper interfaces for a part of libsixel functions. + + +# LICENSE + +Copyright (c) 2014,2015 Hayaki Saito + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +# AUTHOR + +Hayaki Saito -$ ./Build test -$ ./Build install From 04a9bbcb9cc47ea2146fface8f309114c4aac266 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:53:41 +0900 Subject: [PATCH 281/451] Update README of perl module --- README | 56 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/README b/README index 94820e89..8d9f2fa3 100644 --- a/README +++ b/README @@ -1,13 +1,53 @@ +# NAME -How to Build -============ +Image::Sixel - The Perl interface for libsixel -$ perl Build.PL -$ ./Build +# SYNOPSIS +```perl +use Image::Sixel; -Install -======= +$encoder = Image::Sixel::Encoder->new(); +$encoder->setopt("w", 400); +$encoder->setopt("p", 16); +$encoder->encode("images/egret.jpg"); +``` + +```perl +use Image::Sixel; + +$decoder = Image::Sixel::Decoder->new(); +$decoder->encode("images/egret.jpg", "egret.png"); +``` + +# DESCRIPTION + +This perl module privides wrapper interfaces for a part of libsixel functions. + + +# LICENSE + +Copyright (c) 2014,2015 Hayaki Saito + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +# AUTHOR + +Hayaki Saito -$ ./Build test -$ ./Build install From 8cc399a3dd96ddd1f39339abb09cd90f1abde2b4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:54:43 +0900 Subject: [PATCH 282/451] Rename the README of perl module --- perl/MANIFEST | 2 +- perl/{README => README.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename perl/{README => README.md} (100%) diff --git a/perl/MANIFEST b/perl/MANIFEST index 0e34dd5d..484d5a8f 100644 --- a/perl/MANIFEST +++ b/perl/MANIFEST @@ -8,4 +8,4 @@ Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.yml -README +README.md diff --git a/perl/README b/perl/README.md similarity index 100% rename from perl/README rename to perl/README.md From b3a2c9faf7aaba54e2c2959a7c440d96ef9ed90a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:54:43 +0900 Subject: [PATCH 283/451] Rename the README of perl module --- MANIFEST | 2 +- README => README.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename README => README.md (100%) diff --git a/MANIFEST b/MANIFEST index 0e34dd5d..484d5a8f 100644 --- a/MANIFEST +++ b/MANIFEST @@ -8,4 +8,4 @@ Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.yml -README +README.md diff --git a/README b/README.md similarity index 100% rename from README rename to README.md From 190342d564e49fcae6a00726aa1a95e111cc983f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:58:40 +0900 Subject: [PATCH 284/451] Minor fixes --- perl/README.md | 4 +++- perl/t/sixel.t | 17 ----------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/perl/README.md b/perl/README.md index 8d9f2fa3..ebb36017 100644 --- a/perl/README.md +++ b/perl/README.md @@ -17,7 +17,9 @@ $encoder->encode("images/egret.jpg"); use Image::Sixel; $decoder = Image::Sixel::Decoder->new(); -$decoder->encode("images/egret.jpg", "egret.png"); +$decoder->setopt("i", "images/egret.six"); +$decoder->setopt("o", "egret.png"); +$decoder->decode(); ``` # DESCRIPTION diff --git a/perl/t/sixel.t b/perl/t/sixel.t index 6c946b12..02f29a15 100644 --- a/perl/t/sixel.t +++ b/perl/t/sixel.t @@ -43,20 +43,3 @@ subtest 'decoder' => sub { }; done_testing; -#subtest 'foo => bar' => sub { -# my $encoder = Image::Sixel::Encoder->new; -# $encoder->setopt("w", 200); -# $encoder->encode("images/egret.jpg"); -# isa_ok $encoder, 'Image::Sixel::Encoder'; -#}; - -# -# -#my $decoder = Image::Sixel::Decoder->new(); -#isa_ok($decoder, 'Image::Sixel::Decoder'); -# -#$decoder->setopt("i", "egret.six"); -#$decoder->setopt("o", "egret1.png"); -#$decoder->decode(); - -#1; From 131d4eeda7be9b7c4d6c5186cb3356aecf788515 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 7 Jun 2015 19:58:40 +0900 Subject: [PATCH 285/451] Minor fixes --- README.md | 4 +++- t/sixel.t | 17 ----------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 8d9f2fa3..ebb36017 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,9 @@ $encoder->encode("images/egret.jpg"); use Image::Sixel; $decoder = Image::Sixel::Decoder->new(); -$decoder->encode("images/egret.jpg", "egret.png"); +$decoder->setopt("i", "images/egret.six"); +$decoder->setopt("o", "egret.png"); +$decoder->decode(); ``` # DESCRIPTION diff --git a/t/sixel.t b/t/sixel.t index 6c946b12..02f29a15 100644 --- a/t/sixel.t +++ b/t/sixel.t @@ -43,20 +43,3 @@ subtest 'decoder' => sub { }; done_testing; -#subtest 'foo => bar' => sub { -# my $encoder = Image::Sixel::Encoder->new; -# $encoder->setopt("w", 200); -# $encoder->encode("images/egret.jpg"); -# isa_ok $encoder, 'Image::Sixel::Encoder'; -#}; - -# -# -#my $decoder = Image::Sixel::Decoder->new(); -#isa_ok($decoder, 'Image::Sixel::Decoder'); -# -#$decoder->setopt("i", "egret.six"); -#$decoder->setopt("o", "egret1.png"); -#$decoder->decode(); - -#1; From 27c28ae15b2b4159ae32539f8b36d3351889305c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 8 Jun 2015 00:02:26 +0900 Subject: [PATCH 286/451] Update README and POD of perl interface --- perl/README.md | 6 +++--- perl/lib/Image/Sixel.pm | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/perl/README.md b/perl/README.md index ebb36017..69d42edb 100644 --- a/perl/README.md +++ b/perl/README.md @@ -1,6 +1,6 @@ # NAME -Image::Sixel - The Perl interface for libsixel +Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) # SYNOPSIS @@ -24,7 +24,7 @@ $decoder->decode(); # DESCRIPTION -This perl module privides wrapper interfaces for a part of libsixel functions. +This perl module provides wrapper objects for part of [libsixel](http://saitoha.github.io/libsixel/) interface. # LICENSE @@ -51,5 +51,5 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # AUTHOR -Hayaki Saito +Hayaki Saito diff --git a/perl/lib/Image/Sixel.pm b/perl/lib/Image/Sixel.pm index 5cae15af..3335b359 100644 --- a/perl/lib/Image/Sixel.pm +++ b/perl/lib/Image/Sixel.pm @@ -11,18 +11,51 @@ __END__ =head1 NAME -Image::Sixel - perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) +Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) =head1 SYNOPSIS + use Image::Sixel; + + $encoder = Image::Sixel::Encoder->new(); + $encoder->setopt("w", 400); + $encoder->setopt("p", 16); + $encoder->encode("images/egret.jpg"); + + $decoder = Image::Sixel::Decoder->new(); + $decoder->setopt("i", "images/egret.six"); + $decoder->setopt("o", "egret.png"); + $decoder->decode(); + =head1 DESCRIPTION +This perl module provides wrapper objects for part of libsixel interface. +http://saitoha.github.io/libsixel/ + =head2 Class Methods +=Image::Sixel::Encoder->new + +Create Encoder object + +=Image::Sixel::Decoder->new + +Create Decoder object + =head2 Object Methods +=Image::Sixel::Encoder->setopt + +=Image::Sixel::Encoder->encode + +=Image::Sixel::Decoder->setopt + +=Image::Sixel::Decoder->decode + =head1 AUTHOR +Hayaki Saito + =head1 SEE ALSO =cut From d5594f218858722e97a8bb6364bd9381ace2266d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 8 Jun 2015 00:02:26 +0900 Subject: [PATCH 287/451] Update README and POD of perl interface --- README.md | 6 +++--- lib/Image/Sixel.pm | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ebb36017..69d42edb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # NAME -Image::Sixel - The Perl interface for libsixel +Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) # SYNOPSIS @@ -24,7 +24,7 @@ $decoder->decode(); # DESCRIPTION -This perl module privides wrapper interfaces for a part of libsixel functions. +This perl module provides wrapper objects for part of [libsixel](http://saitoha.github.io/libsixel/) interface. # LICENSE @@ -51,5 +51,5 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # AUTHOR -Hayaki Saito +Hayaki Saito diff --git a/lib/Image/Sixel.pm b/lib/Image/Sixel.pm index 5cae15af..3335b359 100644 --- a/lib/Image/Sixel.pm +++ b/lib/Image/Sixel.pm @@ -11,18 +11,51 @@ __END__ =head1 NAME -Image::Sixel - perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) +Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) =head1 SYNOPSIS + use Image::Sixel; + + $encoder = Image::Sixel::Encoder->new(); + $encoder->setopt("w", 400); + $encoder->setopt("p", 16); + $encoder->encode("images/egret.jpg"); + + $decoder = Image::Sixel::Decoder->new(); + $decoder->setopt("i", "images/egret.six"); + $decoder->setopt("o", "egret.png"); + $decoder->decode(); + =head1 DESCRIPTION +This perl module provides wrapper objects for part of libsixel interface. +http://saitoha.github.io/libsixel/ + =head2 Class Methods +=Image::Sixel::Encoder->new + +Create Encoder object + +=Image::Sixel::Decoder->new + +Create Decoder object + =head2 Object Methods +=Image::Sixel::Encoder->setopt + +=Image::Sixel::Encoder->encode + +=Image::Sixel::Decoder->setopt + +=Image::Sixel::Decoder->decode + =head1 AUTHOR +Hayaki Saito + =head1 SEE ALSO =cut From 629db2d853090bed209393a34e3ff6d1800e6aaf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 8 Jun 2015 00:03:33 +0900 Subject: [PATCH 288/451] Add cpanfile for perl interface --- perl/cpanfile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 perl/cpanfile diff --git a/perl/cpanfile b/perl/cpanfile new file mode 100644 index 00000000..8f685871 --- /dev/null +++ b/perl/cpanfile @@ -0,0 +1,6 @@ +requires 'perl', '5.012001'; + +on 'test' => sub { + requires 'Test::More', '0.98'; +}; + From f95dde1a50626c2c39b2fb608f558b846f8fb4f3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 8 Jun 2015 00:03:33 +0900 Subject: [PATCH 289/451] Add cpanfile for perl interface --- cpanfile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 cpanfile diff --git a/cpanfile b/cpanfile new file mode 100644 index 00000000..8f685871 --- /dev/null +++ b/cpanfile @@ -0,0 +1,6 @@ +requires 'perl', '5.012001'; + +on 'test' => sub { + requires 'Test::More', '0.98'; +}; + From 3f152fe6879044349995da6ceccacfb44b7b2468 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 8 Jun 2015 01:00:59 +0900 Subject: [PATCH 290/451] Use constant symbols which start with the prefix SIXEL_ --- include/sixel.h.in | 126 ++++++++++++++++++++++++++++++++--- src/decoder.c | 4 +- src/dither.c | 54 +++++++-------- src/encoder.c | 133 ++++++++++++++++++------------------- src/frame.c | 56 ++++++++-------- src/fromgif.c | 8 +-- src/frompnm.c | 2 +- src/loader.c | 56 ++++++++-------- src/output.c | 4 +- src/pixelformat.c | 160 ++++++++++++++++++++++----------------------- src/quant.c | 38 +++++------ src/scale.c | 20 +++--- src/tosixel.c | 34 +++++----- src/writer.c | 58 ++++++++-------- 14 files changed, 432 insertions(+), 321 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 65040bb0..0d2b9e49 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -33,16 +33,123 @@ #define LIBSIXEL_VRTSION @PACKAGE_VERSION@ #define LIBSIXEL_ABI_VRTSION @LS_LTVERSION@ -#define SIXEL_OUTPUT_PACKET_SIZE 16384 -#define SIXEL_PALETTE_MAX 256 +#define SIXEL_OUTPUT_PACKET_SIZE 16384 +#define SIXEL_PALETTE_MAX 256 +#define SIXEL_USE_DEPRECATED_SYMBOLS 1 -/* output character size */ -enum statusCode { - SIXEL_SUCCESS = 0x0000, /* succeeded */ - SIXEL_FAILED = 0x1000, /* failed */ - SIXEL_INTERRUPTED = SIXEL_SUCCESS | 0x001, /* interrupted by a signal */ -}; +/* return value */ +#define SIXEL_SUCCESS 0x0000 /* succeeded */ +#define SIXEL_FAILED 0x1000 /* failed */ +#define SIXEL_INTERRUPTED (SIXEL_SUCCESS | 0x001) /* interrupted by a signal */ + +/* method for finding the largest dimension for splitting, + * and sorting by that component */ +#define SIXEL_LARGE_AUTO 0 /* choose automatically the method for finding the largest + dimension */ +#define SIXEL_LARGE_NORM 1 /* simply comparing the range in RGB space */ +#define SIXEL_LARGE_LUM 2 /* transforming into luminosities before the comparison */ + +/* method for choosing a color from the box */ +#define SIXEL_REP_AUTO 0 /* choose automatically the method for selecting + representative color from each box */ +#define SIXEL_REP_CENTER_BOX 1 /* choose the center of the box */ +#define SIXEL_REP_AVERAGE_COLORS 2 /* choose the average all the color + in the box (specified in Heckbert's paper) */ +#define SIXEL_REP_AVERAGE_PIXELS 3 /* choose the average all the pixels in the box */ +/* method for diffusing */ +#define SIXEL_DIFFUSE_AUTO 0 /* choose diffusion type automatically */ +#define SIXEL_DIFFUSE_NONE 1 /* don't diffuse */ +#define SIXEL_DIFFUSE_ATKINSON 2 /* diffuse with Bill Atkinson's method */ +#define SIXEL_DIFFUSE_FS 3 /* diffuse with Floyd-Steinberg method */ +#define SIXEL_DIFFUSE_JAJUNI 4 /* diffuse with Jarvis, Judice & Ninke method */ +#define SIXEL_DIFFUSE_STUCKI 5 /* diffuse with Stucki's method */ +#define SIXEL_DIFFUSE_BURKES 6 /* diffuse with Burkes' method */ + +/* quality modes */ +#define SIXEL_QUALITY_AUTO 0 /* choose quality mode automatically */ +#define SIXEL_QUALITY_HIGH 1 /* high quality palette construction */ +#define SIXEL_QUALITY_LOW 2 /* low quality palette construction */ +#define SIXEL_QUALITY_FULL 3 /* full quality palette construction */ +#define SIXEL_QUALITY_HIGHCOLOR 4 /* high color */ + +/* built-in dither */ +#define SIXEL_BUILTIN_MONO_DARK 0 /* monochrome terminal with dark background */ +#define SIXEL_BUILTIN_MONO_LIGHT 1 /* monochrome terminal with dark background */ +#define SIXEL_BUILTIN_XTERM16 2 /* xterm 16color */ +#define SIXEL_BUILTIN_XTERM256 3 /* xterm 256color */ +#define SIXEL_BUILTIN_VT340_MONO 4 /* vt340 monochrome */ +#define SIXEL_BUILTIN_VT340_COLOR 5 /* vt340 color */ + +/* offset value of pixelFormat */ +#define SIXEL_FORMATTYPE_COLOR (0) +#define SIXEL_FORMATTYPE_GRAYSCALE (1 << 6) +#define SIXEL_FORMATTYPE_PALETTE (1 << 7) +/* pixelformat type of input image + NOTE: for compatibility, the value of PIXELFORAMT_COLOR_RGB888 must be 3 */ +#define SIXEL_PIXELFORMAT_RGB555 (SIXEL_FORMATTYPE_COLOR | 0x01) /* 15bpp */ +#define SIXEL_PIXELFORMAT_RGB565 (SIXEL_FORMATTYPE_COLOR | 0x02) /* 16bpp */ +#define SIXEL_PIXELFORMAT_RGB888 (SIXEL_FORMATTYPE_COLOR | 0x03) /* 24bpp */ +#define SIXEL_PIXELFORMAT_BGR555 (SIXEL_FORMATTYPE_COLOR | 0x04) /* 15bpp */ +#define SIXEL_PIXELFORMAT_BGR565 (SIXEL_FORMATTYPE_COLOR | 0x05) /* 16bpp */ +#define SIXEL_PIXELFORMAT_BGR888 (SIXEL_FORMATTYPE_COLOR | 0x06) /* 24bpp */ +#define SIXEL_PIXELFORMAT_ARGB8888 (SIXEL_FORMATTYPE_COLOR | 0x10) /* 32bpp */ +#define SIXEL_PIXELFORMAT_RGBA8888 (SIXEL_FORMATTYPE_COLOR | 0x11) /* 32bpp */ +#if 0 +#define SIXEL_PIXELFORMAT_G1 (SIXEL_FORMATTYPE_GRAYSCALE | 0x00) /* 1bpp grayscale */ +#define SIXEL_PIXELFORMAT_G2 (SIXEL_FORMATTYPE_GRAYSCALE | 0x01) /* 2bpp grayscale */ +#define SIXEL_PIXELFORMAT_G4 (SIXEL_FORMATTYPE_GRAYSCALE | 0x02) /* 4bpp grayscale */ +#endif +#define SIXEL_PIXELFORMAT_G8 (SIXEL_FORMATTYPE_GRAYSCALE | 0x03) /* 8bpp grayscale */ +#define SIXEL_PIXELFORMAT_AG88 (SIXEL_FORMATTYPE_GRAYSCALE | 0x13) /* 16bpp gray+alpha */ +#define SIXEL_PIXELFORMAT_GA88 (SIXEL_FORMATTYPE_GRAYSCALE | 0x23) /* 16bpp gray+alpha */ +#define SIXEL_PIXELFORMAT_PAL1 (SIXEL_FORMATTYPE_PALETTE | 0x00) /* 1bpp palette */ +#define SIXEL_PIXELFORMAT_PAL2 (SIXEL_FORMATTYPE_PALETTE | 0x01) /* 2bpp palette */ +#define SIXEL_PIXELFORMAT_PAL4 (SIXEL_FORMATTYPE_PALETTE | 0x02) /* 4bpp palette */ +#define SIXEL_PIXELFORMAT_PAL8 (SIXEL_FORMATTYPE_PALETTE | 0x03) /* 8bpp palette */ + +/* palette type */ +#define SIXEL_PALETTETYPE_AUTO 0 /* choose palette type automatically */ +#define SIXEL_PALETTETYPE_HLS 1 /* HLS colorspace */ +#define SIXEL_PALETTETYPE_RGB 2 /* RGB colorspace */ + +/* policies of SIXEL encoding */ +#define SIXEL_ENCODEPOLICY_AUTO 0 /* choose encoding policy automatically */ +#define SIXEL_ENCODEPOLICY_FAST 1 /* encode as fast as possible */ +#define SIXEL_ENCODEPOLICY_SIZE 2 /* encode to as small sixel sequence as possible */ + +/* method for re-sampling */ +#define SIXEL_RES_NEAREST 0 /* Use nearest neighbor method */ +#define SIXEL_RES_GAUSSIAN 1 /* Use guaussian filter */ +#define SIXEL_RES_HANNING 2 /* Use hanning filter */ +#define SIXEL_RES_HAMMING 3 /* Use hamming filter */ +#define SIXEL_RES_BILINEAR 4 /* Use bilinear filter */ +#define SIXEL_RES_WELSH 5 /* Use welsh filter */ +#define SIXEL_RES_BICUBIC 6 /* Use bicubic filter */ +#define SIXEL_RES_LANCZOS2 7 /* Use lanczos-2 filter */ +#define SIXEL_RES_LANCZOS3 8 /* Use lanczos-3 filter */ +#define SIXEL_RES_LANCZOS4 9 /* Use lanczos-4 filter */ + +/* image format */ +#define SIXEL_FORMAT_GIF 0x0 /* read only */ +#define SIXEL_FORMAT_PNG 0x1 /* read/write */ +#define SIXEL_FORMAT_BMP 0x2 /* read only */ +#define SIXEL_FORMAT_JPG 0x3 /* read only */ +#define SIXEL_FORMAT_TGA 0x4 /* read only */ +#define SIXEL_FORMAT_WBMP 0x5 /* read only with --with-gd configure option */ +#define SIXEL_FORMAT_TIFF 0x6 /* read only */ +#define SIXEL_FORMAT_SIXEL 0x7 /* read only */ +#define SIXEL_FORMAT_PNM 0x8 /* read only */ +#define SIXEL_FORMAT_GD2 0x9 /* read only with --with-gd configure option */ +#define SIXEL_FORMAT_PSD 0xa /* read only */ +#define SIXEL_FORMAT_HDR 0xb /* read only */ + +/* loop mode */ +#define SIXEL_LOOP_AUTO 0 /* honer the setting of GIF header */ +#define SIXEL_LOOP_FORCE 1 /* always enable loop */ +#define SIXEL_LOOP_DISABLE 2 /* always disable loop */ + +#if SIXEL_USE_DEPRECATED_SYMBOLS /* output character size */ enum characterSize { CSIZE_7BIT = 0, /* 7bit character */ @@ -157,6 +264,7 @@ enum methodForResampling { RES_LANCZOS3 = 8, /* Use lanczos-3 filter */ RES_LANCZOS4 = 9, /* Use lanczos-4 filter */ }; +#endif #ifndef LIBSIXEL_DITHER_H @@ -415,6 +523,7 @@ sixel_helper_scale_image( /* image loader/writer API */ +#if SIXEL_USE_DEPRECATED_SYMBOLS enum imageFormat { FORMAT_GIF = 0, /* read only */ FORMAT_PNG = 1, /* read/write */ @@ -436,6 +545,7 @@ enum loopControl { LOOP_FORCE = 1, /* always enable loop */ LOOP_DISABLE = 2, /* always disable loop */ }; +#endif #ifndef LIBSIXEL_FRAME_H diff --git a/src/decoder.c b/src/decoder.c index 452c386f..b75b9d4b 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -222,9 +222,9 @@ sixel_decoder_decode( } ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, - PIXELFORMAT_PAL8, + SIXEL_PIXELFORMAT_PAL8, decoder->output, - FORMAT_PNG); + SIXEL_FORMAT_PNG); end: free(pixels); diff --git a/src/dither.c b/src/dither.c index 5f2b5253..ebc5764a 100644 --- a/src/dither.c +++ b/src/dither.c @@ -172,7 +172,7 @@ sixel_dither_create(int ncolors) if (ncolors == -1) { ncolors = 256; - quality_mode = QUALITY_HIGHCOLOR; + quality_mode = SIXEL_QUALITY_HIGHCOLOR; } else { if (ncolors > SIXEL_PALETTE_MAX) { @@ -180,7 +180,7 @@ sixel_dither_create(int ncolors) } else if (ncolors < 2) { ncolors = 2; } - quality_mode = QUALITY_LOW; + quality_mode = SIXEL_QUALITY_LOW; } headsize = sizeof(sixel_dither_t); datasize = ncolors * 3; @@ -201,11 +201,11 @@ sixel_dither_create(int ncolors) dither->optimize_palette = 0; dither->complexion = 1; dither->bodyonly = 0; - dither->method_for_largest = LARGE_NORM; - dither->method_for_rep = REP_CENTER_BOX; - dither->method_for_diffuse = DIFFUSE_FS; + dither->method_for_largest = SIXEL_LARGE_NORM; + dither->method_for_rep = SIXEL_REP_CENTER_BOX; + dither->method_for_diffuse = SIXEL_DIFFUSE_FS; dither->quality_mode = quality_mode; - dither->pixelformat = PIXELFORMAT_RGB888; + dither->pixelformat = SIXEL_PIXELFORMAT_RGB888; return dither; } @@ -248,32 +248,32 @@ sixel_dither_get(int builtin_dither) sixel_dither_t *dither; switch (builtin_dither) { - case BUILTIN_MONO_DARK: + case SIXEL_BUILTIN_MONO_DARK: ncolors = 2; palette = (unsigned char *)pal_mono_dark; keycolor = 0; break; - case BUILTIN_MONO_LIGHT: + case SIXEL_BUILTIN_MONO_LIGHT: ncolors = 2; palette = (unsigned char *)pal_mono_light; keycolor = 0; break; - case BUILTIN_XTERM16: + case SIXEL_BUILTIN_XTERM16: ncolors = 16; palette = (unsigned char *)pal_xterm256; keycolor = (-1); break; - case BUILTIN_XTERM256: + case SIXEL_BUILTIN_XTERM256: ncolors = 256; palette = (unsigned char *)pal_xterm256; keycolor = (-1); break; - case BUILTIN_VT340_MONO: + case SIXEL_BUILTIN_VT340_MONO: ncolors = 16; palette = (unsigned char *)pal_vt340_mono; keycolor = (-1); break; - case BUILTIN_VT340_COLOR: + case SIXEL_BUILTIN_VT340_COLOR: ncolors = 16; palette = (unsigned char *)pal_vt340_color; keycolor = (-1); @@ -297,8 +297,8 @@ sixel_dither_get(int builtin_dither) static void sixel_dither_set_method_for_largest(sixel_dither_t *dither, int method_for_largest) { - if (method_for_largest == LARGE_AUTO) { - method_for_largest = LARGE_NORM; + if (method_for_largest == SIXEL_LARGE_AUTO) { + method_for_largest = SIXEL_LARGE_NORM; } dither->method_for_largest = method_for_largest; } @@ -307,8 +307,8 @@ sixel_dither_set_method_for_largest(sixel_dither_t *dither, int method_for_large static void sixel_dither_set_method_for_rep(sixel_dither_t *dither, int method_for_rep) { - if (method_for_rep == REP_AUTO) { - method_for_rep = REP_CENTER_BOX; + if (method_for_rep == SIXEL_REP_AUTO) { + method_for_rep = SIXEL_REP_CENTER_BOX; } dither->method_for_rep = method_for_rep; } @@ -317,11 +317,11 @@ sixel_dither_set_method_for_rep(sixel_dither_t *dither, int method_for_rep) static void sixel_dither_set_quality_mode(sixel_dither_t *dither, int quality_mode) { - if (quality_mode == QUALITY_AUTO) { + if (quality_mode == SIXEL_QUALITY_AUTO) { if (dither->ncolors <= 8) { - quality_mode = QUALITY_HIGH; + quality_mode = SIXEL_QUALITY_HIGH; } else { - quality_mode = QUALITY_LOW; + quality_mode = SIXEL_QUALITY_LOW; } } dither->quality_mode = quality_mode; @@ -339,7 +339,7 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, unsigned char *input_pixels; int nret = (-1); - if (pixelformat != PIXELFORMAT_RGB888) { + if (pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ normalized_pixels = malloc(width * height * 3); @@ -365,7 +365,7 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, buf = sixel_quant_make_palette(input_pixels, width * height * 3, - PIXELFORMAT_RGB888, + SIXEL_PIXELFORMAT_RGB888, dither->reqcolors, &dither->ncolors, &dither->origcolors, dither->method_for_largest, @@ -378,7 +378,7 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, dither->optimized = 1; if (dither->origcolors <= dither->ncolors) { - dither->method_for_diffuse = DIFFUSE_NONE; + dither->method_for_diffuse = SIXEL_DIFFUSE_NONE; } sixel_quant_free_palette(buf); @@ -393,11 +393,11 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, SIXELAPI void sixel_dither_set_diffusion_type(sixel_dither_t *dither, int method_for_diffuse) { - if (method_for_diffuse == DIFFUSE_AUTO) { + if (method_for_diffuse == SIXEL_DIFFUSE_AUTO) { if (dither->ncolors > 16) { - method_for_diffuse = DIFFUSE_FS; + method_for_diffuse = SIXEL_DIFFUSE_FS; } else { - method_for_diffuse = DIFFUSE_ATKINSON; + method_for_diffuse = SIXEL_DIFFUSE_ATKINSON; } } dither->method_for_diffuse = method_for_diffuse; @@ -509,7 +509,7 @@ sixel_dither_apply_palette(sixel_dither_t *dither, } /* if quality_mode is full, do not use palette caching */ - if (dither->quality_mode == QUALITY_FULL) { + if (dither->quality_mode == SIXEL_QUALITY_FULL) { dither->optimized = 0; } @@ -525,7 +525,7 @@ sixel_dither_apply_palette(sixel_dither_t *dither, } } - if (dither->pixelformat != PIXELFORMAT_RGB888) { + if (dither->pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ normalized_pixels = malloc(width * height * 3); if (normalized_pixels == NULL) { diff --git a/src/encoder.c b/src/encoder.c index 4f7550c8..da7c2f4c 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -225,9 +225,9 @@ prepare_monochrome_palette(int finvert) sixel_dither_t *dither; if (finvert) { - dither = sixel_dither_get(BUILTIN_MONO_LIGHT); + dither = sixel_dither_get(SIXEL_BUILTIN_MONO_LIGHT); } else { - dither = sixel_dither_get(BUILTIN_MONO_DARK); + dither = sixel_dither_get(SIXEL_BUILTIN_MONO_DARK); } if (dither == NULL) { return NULL; @@ -267,10 +267,10 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) callback_context = (sixel_callback_context_for_mapfile_t *)data; switch (sixel_frame_get_pixelformat(frame)) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - case PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL8: if (sixel_frame_get_palette(frame) == NULL) { goto end; } @@ -293,9 +293,9 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) sixel_frame_get_width(frame), sixel_frame_get_height(frame), sixel_frame_get_pixelformat(frame), - LARGE_NORM, - REP_CENTER_BOX, - QUALITY_HIGH); + SIXEL_LARGE_NORM, + SIXEL_REP_CENTER_BOX, + SIXEL_QUALITY_HIGH); if (ret != 0) { sixel_dither_unref(callback_context->dither); goto end; @@ -328,7 +328,7 @@ prepare_specified_palette( 1, /* fuse_palette */ 256, /* reqcolors */ bgcolor, - LOOP_DISABLE, + SIXEL_LOOP_DISABLE, load_image_callback_for_palette, finsecure, cancel_flag, @@ -374,7 +374,8 @@ prepare_palette(sixel_dither_t *former_dither, return former_dither; } dither = prepare_builtin_palette(encoder->builtin_palette); - } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & FORMATTYPE_PALETTE)) { + } else if (sixel_frame_get_palette(frame) && + (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_PALETTE)) { dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (!dither) { return NULL; @@ -384,7 +385,7 @@ prepare_palette(sixel_dither_t *former_dither, if (sixel_frame_get_transparent(frame) != (-1)) { sixel_dither_set_transparent(dither, sixel_frame_get_transparent(frame)); } - } else if (sixel_frame_get_pixelformat(frame) == PIXELFORMAT_G8) { + } else if (sixel_frame_get_pixelformat(frame) == SIXEL_PIXELFORMAT_G8) { dither = sixel_dither_create(-1); sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); } else { @@ -409,7 +410,7 @@ prepare_palette(sixel_dither_t *former_dither, } histogram_colors = sixel_dither_get_num_of_histogram_colors(dither); if (histogram_colors <= encoder->reqcolors) { - encoder->method_for_diffuse = DIFFUSE_NONE; + encoder->method_for_diffuse = SIXEL_DIFFUSE_NONE; } sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); } @@ -789,7 +790,7 @@ load_image_callback(sixel_frame_t *frame, void *data) /* evaluate -v option: print palette */ if (encoder->verbose) { - if (!(sixel_frame_get_pixelformat(frame) & FORMATTYPE_GRAYSCALE)) { + if (!(sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_GRAYSCALE)) { print_palette(dither); } } @@ -899,13 +900,13 @@ sixel_encoder_create(void) encoder->monochrome = 0; encoder->highcolor = 0; encoder->builtin_palette = 0; - encoder->method_for_diffuse = DIFFUSE_AUTO; - encoder->method_for_largest = LARGE_AUTO; - encoder->method_for_rep = REP_AUTO; - encoder->quality_mode = QUALITY_AUTO; - encoder->method_for_resampling = RES_BILINEAR; - encoder->loop_mode = LOOP_AUTO; - encoder->palette_type = PALETTETYPE_AUTO; + encoder->method_for_diffuse = SIXEL_DIFFUSE_AUTO; + encoder->method_for_largest = SIXEL_LARGE_AUTO; + encoder->method_for_rep = SIXEL_REP_AUTO; + encoder->quality_mode = SIXEL_QUALITY_AUTO; + encoder->method_for_resampling = SIXEL_RES_BILINEAR; + encoder->loop_mode = SIXEL_LOOP_AUTO; + encoder->palette_type = SIXEL_PALETTETYPE_AUTO; encoder->f8bit = 0; encoder->finvert = 0; encoder->fuse_macro = 0; @@ -924,7 +925,7 @@ sixel_encoder_create(void) encoder->macro_number = -1; encoder->verbose = 0; encoder->penetrate_multiplexer = 0; - encoder->encode_policy = ENCODEPOLICY_AUTO; + encoder->encode_policy = SIXEL_ENCODEPOLICY_AUTO; encoder->pipe_mode = 0; encoder->bgcolor = NULL; encoder->outfd = STDOUT_FILENO; @@ -1030,13 +1031,13 @@ sixel_encoder_setopt( break; case 'b': if (strcmp(optarg, "xterm16") == 0) { - encoder->builtin_palette = BUILTIN_XTERM16; + encoder->builtin_palette = SIXEL_BUILTIN_XTERM16; } else if (strcmp(optarg, "xterm256") == 0) { - encoder->builtin_palette = BUILTIN_XTERM256; + encoder->builtin_palette = SIXEL_BUILTIN_XTERM256; } else if (strcmp(optarg, "vt340mono") == 0) { - encoder->builtin_palette = BUILTIN_VT340_MONO; + encoder->builtin_palette = SIXEL_BUILTIN_VT340_MONO; } else if (strcmp(optarg, "vt340color") == 0) { - encoder->builtin_palette = BUILTIN_VT340_COLOR; + encoder->builtin_palette = SIXEL_BUILTIN_VT340_COLOR; } else { fprintf(stderr, "Cannot parse builtin palette option.\n"); @@ -1046,19 +1047,19 @@ sixel_encoder_setopt( case 'd': /* parse --diffusion option */ if (strcmp(optarg, "auto") == 0) { - encoder->method_for_diffuse = DIFFUSE_AUTO; + encoder->method_for_diffuse = SIXEL_DIFFUSE_AUTO; } else if (strcmp(optarg, "none") == 0) { - encoder->method_for_diffuse = DIFFUSE_NONE; + encoder->method_for_diffuse = SIXEL_DIFFUSE_NONE; } else if (strcmp(optarg, "fs") == 0) { - encoder->method_for_diffuse = DIFFUSE_FS; + encoder->method_for_diffuse = SIXEL_DIFFUSE_FS; } else if (strcmp(optarg, "atkinson") == 0) { - encoder->method_for_diffuse = DIFFUSE_ATKINSON; + encoder->method_for_diffuse = SIXEL_DIFFUSE_ATKINSON; } else if (strcmp(optarg, "jajuni") == 0) { - encoder->method_for_diffuse = DIFFUSE_JAJUNI; + encoder->method_for_diffuse = SIXEL_DIFFUSE_JAJUNI; } else if (strcmp(optarg, "stucki") == 0) { - encoder->method_for_diffuse = DIFFUSE_STUCKI; + encoder->method_for_diffuse = SIXEL_DIFFUSE_STUCKI; } else if (strcmp(optarg, "burkes") == 0) { - encoder->method_for_diffuse = DIFFUSE_BURKES; + encoder->method_for_diffuse = SIXEL_DIFFUSE_BURKES; } else { fprintf(stderr, "Diffusion method '%s' is not supported.\n", @@ -1070,11 +1071,11 @@ sixel_encoder_setopt( /* parse --find-largest option */ if (optarg) { if (strcmp(optarg, "auto") == 0) { - encoder->method_for_largest = LARGE_AUTO; + encoder->method_for_largest = SIXEL_LARGE_AUTO; } else if (strcmp(optarg, "norm") == 0) { - encoder->method_for_largest = LARGE_NORM; + encoder->method_for_largest = SIXEL_LARGE_NORM; } else if (strcmp(optarg, "lum") == 0) { - encoder->method_for_largest = LARGE_LUM; + encoder->method_for_largest = SIXEL_LARGE_LUM; } else { fprintf(stderr, "Finding method '%s' is not supported.\n", @@ -1086,14 +1087,14 @@ sixel_encoder_setopt( case 's': /* parse --select-color option */ if (strcmp(optarg, "auto") == 0) { - encoder->method_for_rep = REP_AUTO; + encoder->method_for_rep = SIXEL_REP_AUTO; } else if (strcmp(optarg, "center") == 0) { - encoder->method_for_rep = REP_CENTER_BOX; + encoder->method_for_rep = SIXEL_REP_CENTER_BOX; } else if (strcmp(optarg, "average") == 0) { - encoder->method_for_rep = REP_AVERAGE_COLORS; + encoder->method_for_rep = SIXEL_REP_AVERAGE_COLORS; } else if ((strcmp(optarg, "histogram") == 0) || (strcmp(optarg, "histgram") == 0)) { - encoder->method_for_rep = REP_AVERAGE_PIXELS; + encoder->method_for_rep = SIXEL_REP_AVERAGE_PIXELS; } else { fprintf(stderr, "Finding method '%s' is not supported.\n", @@ -1159,25 +1160,25 @@ sixel_encoder_setopt( case 'r': /* parse --resampling option */ if (strcmp(optarg, "nearest") == 0) { - encoder->method_for_resampling = RES_NEAREST; + encoder->method_for_resampling = SIXEL_RES_NEAREST; } else if (strcmp(optarg, "gaussian") == 0) { - encoder->method_for_resampling = RES_GAUSSIAN; + encoder->method_for_resampling = SIXEL_RES_GAUSSIAN; } else if (strcmp(optarg, "hanning") == 0) { - encoder->method_for_resampling = RES_HANNING; + encoder->method_for_resampling = SIXEL_RES_HANNING; } else if (strcmp(optarg, "hamming") == 0) { - encoder->method_for_resampling = RES_HAMMING; + encoder->method_for_resampling = SIXEL_RES_HAMMING; } else if (strcmp(optarg, "bilinear") == 0) { - encoder->method_for_resampling = RES_BILINEAR; + encoder->method_for_resampling = SIXEL_RES_BILINEAR; } else if (strcmp(optarg, "welsh") == 0) { - encoder->method_for_resampling = RES_WELSH; + encoder->method_for_resampling = SIXEL_RES_WELSH; } else if (strcmp(optarg, "bicubic") == 0) { - encoder->method_for_resampling = RES_BICUBIC; + encoder->method_for_resampling = SIXEL_RES_BICUBIC; } else if (strcmp(optarg, "lanczos2") == 0) { - encoder->method_for_resampling = RES_LANCZOS2; + encoder->method_for_resampling = SIXEL_RES_LANCZOS2; } else if (strcmp(optarg, "lanczos3") == 0) { - encoder->method_for_resampling = RES_LANCZOS3; + encoder->method_for_resampling = SIXEL_RES_LANCZOS3; } else if (strcmp(optarg, "lanczos4") == 0) { - encoder->method_for_resampling = RES_LANCZOS4; + encoder->method_for_resampling = SIXEL_RES_LANCZOS4; } else { fprintf(stderr, "Resampling method '%s' is not supported.\n", @@ -1188,13 +1189,13 @@ sixel_encoder_setopt( case 'q': /* parse --quality option */ if (strcmp(optarg, "auto") == 0) { - encoder->quality_mode = QUALITY_AUTO; + encoder->quality_mode = SIXEL_QUALITY_AUTO; } else if (strcmp(optarg, "high") == 0) { - encoder->quality_mode = QUALITY_HIGH; + encoder->quality_mode = SIXEL_QUALITY_HIGH; } else if (strcmp(optarg, "low") == 0) { - encoder->quality_mode = QUALITY_LOW; + encoder->quality_mode = SIXEL_QUALITY_LOW; } else if (strcmp(optarg, "full") == 0) { - encoder->quality_mode = QUALITY_FULL; + encoder->quality_mode = SIXEL_QUALITY_FULL; } else { fprintf(stderr, "Cannot parse quality option.\n"); @@ -1204,11 +1205,11 @@ sixel_encoder_setopt( case 'l': /* parse --loop-control option */ if (strcmp(optarg, "auto") == 0) { - encoder->loop_mode = LOOP_AUTO; + encoder->loop_mode = SIXEL_LOOP_AUTO; } else if (strcmp(optarg, "force") == 0) { - encoder->loop_mode = LOOP_FORCE; + encoder->loop_mode = SIXEL_LOOP_FORCE; } else if (strcmp(optarg, "disable") == 0) { - encoder->loop_mode = LOOP_DISABLE; + encoder->loop_mode = SIXEL_LOOP_DISABLE; } else { fprintf(stderr, "Cannot parse loop-control option.\n"); @@ -1218,11 +1219,11 @@ sixel_encoder_setopt( case 't': /* parse --palette-type option */ if (strcmp(optarg, "auto") == 0) { - encoder->palette_type = PALETTETYPE_AUTO; + encoder->palette_type = SIXEL_PALETTETYPE_AUTO; } else if (strcmp(optarg, "hls") == 0) { - encoder->palette_type = PALETTETYPE_HLS; + encoder->palette_type = SIXEL_PALETTETYPE_HLS; } else if (strcmp(optarg, "rgb") == 0) { - encoder->palette_type = PALETTETYPE_RGB; + encoder->palette_type = SIXEL_PALETTETYPE_RGB; } else { fprintf(stderr, "Cannot parse palette type option.\n"); @@ -1235,7 +1236,7 @@ sixel_encoder_setopt( free(encoder->bgcolor); } if (parse_x_colorspec(optarg, &encoder->bgcolor) == 0) { - encoder->palette_type = PALETTETYPE_AUTO; + encoder->palette_type = SIXEL_PALETTETYPE_AUTO; } else { fprintf(stderr, "Cannot parse bgcolor option.\n"); @@ -1271,11 +1272,11 @@ sixel_encoder_setopt( break; case 'E': if (strcmp(optarg, "auto") == 0) { - encoder->encode_policy = ENCODEPOLICY_AUTO; + encoder->encode_policy = SIXEL_ENCODEPOLICY_AUTO; } else if (strcmp(optarg, "fast") == 0) { - encoder->encode_policy = ENCODEPOLICY_FAST; + encoder->encode_policy = SIXEL_ENCODEPOLICY_FAST; } else if (strcmp(optarg, "size") == 0) { - encoder->encode_policy = ENCODEPOLICY_SIZE; + encoder->encode_policy = SIXEL_ENCODEPOLICY_SIZE; } else { fprintf(stderr, "Cannot parse encode policy option.\n"); @@ -1387,8 +1388,8 @@ sixel_encoder_encode( encoder->reqcolors = 2; } - if (encoder->palette_type == PALETTETYPE_AUTO) { - encoder->palette_type = PALETTETYPE_RGB; + if (encoder->palette_type == SIXEL_PALETTETYPE_AUTO) { + encoder->palette_type = SIXEL_PALETTETYPE_RGB; } if (encoder->mapfile) { diff --git a/src/frame.c b/src/frame.c index d9da84d1..83c4bd03 100644 --- a/src/frame.c +++ b/src/frame.c @@ -53,7 +53,7 @@ sixel_frame_create(void) frame->width = 0; frame->height = 0; frame->ncolors = (-1); - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; frame->delay = 0; frame->frame_no = 0; frame->loop_count = 0; @@ -218,8 +218,8 @@ sixel_frame_strip_alpha( src = dst = frame->pixels; switch (frame->pixelformat) { - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: + case SIXEL_PIXELFORMAT_RGBA8888: + case SIXEL_PIXELFORMAT_ARGB8888: for (y = 0; y < frame->height; y++) { for (x = 0; x < frame->width; x++) { if (bgcolor) { @@ -228,12 +228,12 @@ sixel_frame_strip_alpha( *dst++ = (*src++ * alpha + bgcolor[1] * (0xff - alpha)) >> 8; *dst++ = (*src++ * alpha + bgcolor[2] * (0xff - alpha)) >> 8; src++; - } else if (frame->pixelformat == PIXELFORMAT_ARGB8888){ + } else if (frame->pixelformat == SIXEL_PIXELFORMAT_ARGB8888){ src++; /* A */ *dst++ = *src++; /* R */ *dst++ = *src++; /* G */ *dst++ = *src++; /* B */ - } else if (frame->pixelformat == PIXELFORMAT_RGBA8888){ + } else if (frame->pixelformat == SIXEL_PIXELFORMAT_RGBA8888){ *dst++ = *src++; /* R */ *dst++ = *src++; /* G */ *dst++ = *src++; /* B */ @@ -241,7 +241,7 @@ sixel_frame_strip_alpha( } } } - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; default: break; @@ -262,9 +262,9 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) unsigned char *p; switch (frame->pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: size = frame->width * frame->height * 4; normalized_pixels = malloc(size); src = normalized_pixels + frame->width * frame->height * 3; @@ -286,9 +286,9 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) } free(frame->pixels); frame->pixels = normalized_pixels; - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; - case PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_PAL8: size = frame->width * frame->height * 3; normalized_pixels = malloc(size); src = frame->pixels; @@ -300,19 +300,19 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) } free(frame->pixels); frame->pixels = normalized_pixels; - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; - case PIXELFORMAT_RGB888: + case SIXEL_PIXELFORMAT_RGB888: break; - case PIXELFORMAT_G8: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: - case PIXELFORMAT_RGB555: - case PIXELFORMAT_RGB565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: + case SIXEL_PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_GA88: + case SIXEL_PIXELFORMAT_AG88: + case SIXEL_PIXELFORMAT_RGB555: + case SIXEL_PIXELFORMAT_RGB565: + case SIXEL_PIXELFORMAT_BGR555: + case SIXEL_PIXELFORMAT_BGR565: + case SIXEL_PIXELFORMAT_RGBA8888: + case SIXEL_PIXELFORMAT_ARGB8888: /* normalize pixelformat */ size = frame->width * frame->height * 3; normalized_pixels = malloc(size); @@ -400,9 +400,9 @@ clip(unsigned char *pixels, /* unused */ (void) cx; switch (pixelformat) { - case PIXELFORMAT_PAL8: - case PIXELFORMAT_G8: - case PIXELFORMAT_RGB888: + case SIXEL_PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_RGB888: dst = pixels; src = pixels + cy * sx * depth + cx * depth; for (y = 0; y < ch; y++) { @@ -432,9 +432,9 @@ sixel_frame_clip( unsigned char *normalized_pixels; switch (frame->pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: normalized_pixels = malloc(frame->width * frame->height); ret = sixel_helper_normalize_pixelformat(normalized_pixels, &frame->pixelformat, diff --git a/src/fromgif.c b/src/fromgif.c index 0e7c30ca..b0636e6e 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -221,7 +221,7 @@ init_gif_frame( return (-1); } if (frame->ncolors <= reqcolors && fuse_palette) { - frame->pixelformat = PIXELFORMAT_PAL8; + frame->pixelformat = SIXEL_PIXELFORMAT_PAL8; free(frame->pixels); frame->pixels = malloc(frame->width * frame->height); memcpy(frame->pixels, pg->out, frame->width * frame->height); @@ -253,7 +253,7 @@ init_gif_frame( } } } else { - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; frame->pixels = malloc(pg->w * pg->h * 3); for (i = 0; i < pg->w * pg->h; ++i) { frame->pixels[i * 3 + 0] = pg->color_table[pg->out[i] * 3 + 2]; @@ -608,10 +608,10 @@ load_gif( if (g.loop_count == (-1)) { break; } - if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { + if (loop_control == SIXEL_LOOP_DISABLE || frame->frame_no == 1) { break; } - if (loop_control == LOOP_AUTO && frame->loop_count == g.loop_count) { + if (loop_control == SIXEL_LOOP_AUTO && frame->loop_count == g.loop_count) { break; } } diff --git a/src/frompnm.c b/src/frompnm.c index 0d7f97cd..3ce9d222 100644 --- a/src/frompnm.c +++ b/src/frompnm.c @@ -211,7 +211,7 @@ load_pnm(unsigned char *p, int length, *psx = width; *psy = height; - *ppixelformat = PIXELFORMAT_RGB888; + *ppixelformat = SIXEL_PIXELFORMAT_RGB888; return result; } diff --git a/src/loader.c b/src/loader.c index 3f94eb80..3a4a79c0 100644 --- a/src/loader.c +++ b/src/loader.c @@ -368,7 +368,7 @@ load_jpeg(unsigned char *data, goto end; } - *ppixelformat = PIXELFORMAT_RGB888; + *ppixelformat = SIXEL_PIXELFORMAT_RGB888; *pwidth = cinfo.output_width; *pheight = cinfo.output_height; @@ -546,7 +546,7 @@ load_png(unsigned char *buffer, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); png_set_strip_alpha(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; } else { switch (bitdepth) { case 1: @@ -556,7 +556,7 @@ load_png(unsigned char *buffer, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background, transparent); - *pixelformat = PIXELFORMAT_PAL1; + *pixelformat = SIXEL_PIXELFORMAT_PAL1; break; case 2: *ppalette = malloc(*pncolors * 3); @@ -565,7 +565,7 @@ load_png(unsigned char *buffer, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background, transparent); - *pixelformat = PIXELFORMAT_PAL2; + *pixelformat = SIXEL_PIXELFORMAT_PAL2; break; case 4: *ppalette = malloc(*pncolors * 3); @@ -574,7 +574,7 @@ load_png(unsigned char *buffer, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background, transparent); - *pixelformat = PIXELFORMAT_PAL4; + *pixelformat = SIXEL_PIXELFORMAT_PAL4; break; case 8: *ppalette = malloc(*pncolors * 3); @@ -583,13 +583,13 @@ load_png(unsigned char *buffer, } read_palette(png_ptr, info_ptr, *ppalette, *pncolors, png_palette, &background, transparent); - *pixelformat = PIXELFORMAT_PAL8; + *pixelformat = SIXEL_PIXELFORMAT_PAL8; break; default: png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_palette_to_rgb(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; break; } } @@ -608,7 +608,7 @@ load_png(unsigned char *buffer, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; } else { switch (bitdepth) { case 1: @@ -620,14 +620,14 @@ load_png(unsigned char *buffer, (unsigned int)bitdepth); # endif png_set_expand_gray_1_2_4_to_8(png_ptr); - *pixelformat = PIXELFORMAT_G8; + *pixelformat = SIXEL_PIXELFORMAT_G8; # elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 # if HAVE_DEBUG fprintf(stderr, "expand %u bpp to 8bpp format...\n", (unsigned int)bitdepth); # endif png_set_gray_1_2_4_to_8(png_ptr); - *pixelformat = PIXELFORMAT_G8; + *pixelformat = SIXEL_PIXELFORMAT_G8; # else # if HAVE_DEBUG fprintf(stderr, "expand into RGB format...\n"); @@ -635,12 +635,12 @@ load_png(unsigned char *buffer, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; # endif break; case 8: if (ppalette) { - *pixelformat = PIXELFORMAT_G8; + *pixelformat = SIXEL_PIXELFORMAT_G8; } else { # if HAVE_DEBUG fprintf(stderr, "expand into RGB format...\n"); @@ -648,7 +648,7 @@ load_png(unsigned char *buffer, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; } break; default: @@ -658,7 +658,7 @@ load_png(unsigned char *buffer, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; break; } } @@ -672,7 +672,7 @@ load_png(unsigned char *buffer, png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); png_set_gray_to_rgb(png_ptr); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB_ALPHA: # if HAVE_DEBUG @@ -682,7 +682,7 @@ load_png(unsigned char *buffer, # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case PNG_COLOR_TYPE_RGB: # if HAVE_DEBUG @@ -691,7 +691,7 @@ load_png(unsigned char *buffer, # endif png_set_background(png_ptr, &background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - *pixelformat = PIXELFORMAT_RGB888; + *pixelformat = SIXEL_PIXELFORMAT_RGB888; break; default: /* unknown format */ @@ -707,9 +707,9 @@ load_png(unsigned char *buffer, goto cleanup; } switch (*pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: for (i = 0; i < *psy; ++i) { rows[i] = result + (depth * *psx * bitdepth + 7) / 8 * i; } @@ -766,7 +766,7 @@ load_sixel(unsigned char *buffer, return NULL; } if (ppalette == NULL || colors > reqcolors) { - *ppixelformat = PIXELFORMAT_RGB888; + *ppixelformat = SIXEL_PIXELFORMAT_RGB888; pixels = malloc(*psx * *psy * 3); if (pixels == NULL) { goto cleanup; @@ -777,7 +777,7 @@ load_sixel(unsigned char *buffer, pixels[i * 3 + 2] = palette[p[i] * 3 + 2]; } } else { - *ppixelformat = PIXELFORMAT_PAL8; + *ppixelformat = SIXEL_PIXELFORMAT_PAL8; pixels = p; *ppalette = palette; *pncolors = colors; @@ -1033,7 +1033,7 @@ load_with_builtin( case 1: case 3: case 4: - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; default: fprintf(stderr, "load_with_builtin() failed.\n" @@ -1117,10 +1117,10 @@ load_with_gdkpixbuf( goto end; } if (gdk_pixbuf_get_has_alpha(pixbuf)) { - frame->pixelformat = PIXELFORMAT_RGBA8888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGBA8888; depth = 4; } else { - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; depth = 3; } p = gdk_pixbuf_get_pixels(pixbuf); @@ -1162,10 +1162,10 @@ load_with_gdkpixbuf( goto end; } if (gdk_pixbuf_get_has_alpha(pixbuf)) { - frame->pixelformat = PIXELFORMAT_RGBA8888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGBA8888; depth = 4; } else { - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; depth = 3; } p = gdk_pixbuf_get_pixels(pixbuf); @@ -1372,7 +1372,7 @@ load_with_gd( frame->width = gdImageSX(im); frame->height = gdImageSY(im); - frame->pixelformat = PIXELFORMAT_RGB888; + frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; p = frame->pixels = malloc(frame->width * frame->height * 3); if (frame->pixels == NULL) { #if HAVE_ERRNO_H diff --git a/src/output.c b/src/output.c index fa683dfa..6cc10cfa 100644 --- a/src/output.c +++ b/src/output.c @@ -37,7 +37,7 @@ sixel_output_create(sixel_write_function fn_write, void *priv) output->has_8bit_control = 0; output->has_sdm_glitch = 0; output->skip_dcs_envelope = 0; - output->palette_type = PALETTETYPE_AUTO; + output->palette_type = SIXEL_PALETTETYPE_AUTO; output->fn_write = fn_write; output->save_pixel = 0; output->save_count = 0; @@ -47,7 +47,7 @@ sixel_output_create(sixel_write_function fn_write, void *priv) output->priv = priv; output->pos = 0; output->penetrate_multiplexer = 0; - output->encode_policy = ENCODEPOLICY_AUTO; + output->encode_policy = SIXEL_ENCODEPOLICY_AUTO; } return output; diff --git a/src/pixelformat.c b/src/pixelformat.c index eb945560..84cee865 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -57,51 +57,51 @@ get_rgb(unsigned char const *data, #endif switch (pixelformat) { - case PIXELFORMAT_RGB555: + case SIXEL_PIXELFORMAT_RGB555: *r = ((pixels >> 10) & 0x1f) << 3; *g = ((pixels >> 5) & 0x1f) << 3; *b = ((pixels >> 0) & 0x1f) << 3; break; - case PIXELFORMAT_RGB565: + case SIXEL_PIXELFORMAT_RGB565: *r = ((pixels >> 11) & 0x1f) << 3; *g = ((pixels >> 5) & 0x3f) << 2; *b = ((pixels >> 0) & 0x1f) << 3; break; - case PIXELFORMAT_RGB888: + case SIXEL_PIXELFORMAT_RGB888: *r = (pixels >> 16) & 0xff; *g = (pixels >> 8) & 0xff; *b = (pixels >> 0) & 0xff; break; - case PIXELFORMAT_BGR555: + case SIXEL_PIXELFORMAT_BGR555: *r = ((pixels >> 0) & 0x1f) << 3; *g = ((pixels >> 5) & 0x1f) << 3; *b = ((pixels >> 10) & 0x1f) << 3; break; - case PIXELFORMAT_BGR565: + case SIXEL_PIXELFORMAT_BGR565: *r = ((pixels >> 0) & 0x1f) << 3; *g = ((pixels >> 5) & 0x3f) << 2; *b = ((pixels >> 11) & 0x1f) << 3; break; - case PIXELFORMAT_BGR888: + case SIXEL_PIXELFORMAT_BGR888: *r = (pixels >> 0) & 0xff; *g = (pixels >> 8) & 0xff; *b = (pixels >> 16) & 0xff; break; - case PIXELFORMAT_RGBA8888: + case SIXEL_PIXELFORMAT_RGBA8888: *r = (pixels >> 24) & 0xff; *g = (pixels >> 16) & 0xff; *b = (pixels >> 8) & 0xff; break; - case PIXELFORMAT_ARGB8888: + case SIXEL_PIXELFORMAT_ARGB8888: *r = (pixels >> 16) & 0xff; *g = (pixels >> 8) & 0xff; *b = (pixels >> 0) & 0xff; break; - case PIXELFORMAT_GA88: + case SIXEL_PIXELFORMAT_GA88: *r = *g = *b = (pixels >> 8) & 0xff; break; - case PIXELFORMAT_G8: - case PIXELFORMAT_AG88: + case SIXEL_PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_AG88: *r = *g = *b = pixels & 0xff; break; default: @@ -117,27 +117,27 @@ sixel_helper_compute_depth(int pixelformat) int depth = (-1); /* unknown */ switch (pixelformat) { - case PIXELFORMAT_ARGB8888: - case PIXELFORMAT_RGBA8888: + case SIXEL_PIXELFORMAT_ARGB8888: + case SIXEL_PIXELFORMAT_RGBA8888: depth = 4; break; - case PIXELFORMAT_RGB888: - case PIXELFORMAT_BGR888: + case SIXEL_PIXELFORMAT_RGB888: + case SIXEL_PIXELFORMAT_BGR888: depth = 3; break; - case PIXELFORMAT_RGB555: - case PIXELFORMAT_RGB565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_AG88: - case PIXELFORMAT_GA88: + case SIXEL_PIXELFORMAT_RGB555: + case SIXEL_PIXELFORMAT_RGB565: + case SIXEL_PIXELFORMAT_BGR555: + case SIXEL_PIXELFORMAT_BGR565: + case SIXEL_PIXELFORMAT_AG88: + case SIXEL_PIXELFORMAT_GA88: depth = 2; break; - case PIXELFORMAT_G8: - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - case PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL8: depth = 1; break; default: @@ -186,16 +186,16 @@ expand_palette(unsigned char *dst, unsigned char const *src, int bpp; /* bit per plane */ switch (pixelformat) { - case PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL1: bpp = 1; break; - case PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL2: bpp = 2; break; - case PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL4: bpp = 4; break; - case PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_PAL8: for (i = 0; i < width * height; ++i, ++src) { *dst++ = *src; } @@ -237,35 +237,35 @@ sixel_helper_normalize_pixelformat( int /* in */ height) /* height of source image */ { switch (src_pixelformat) { - case PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_G8: (void) expand_rgb(dst, src, width, height, src_pixelformat, 1); - *dst_pixelformat = PIXELFORMAT_RGB888; + *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; - case PIXELFORMAT_RGB565: - case PIXELFORMAT_RGB555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: + case SIXEL_PIXELFORMAT_RGB565: + case SIXEL_PIXELFORMAT_RGB555: + case SIXEL_PIXELFORMAT_BGR565: + case SIXEL_PIXELFORMAT_BGR555: + case SIXEL_PIXELFORMAT_GA88: + case SIXEL_PIXELFORMAT_AG88: (void) expand_rgb(dst, src, width, height, src_pixelformat, 2); - *dst_pixelformat = PIXELFORMAT_RGB888; + *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; - case PIXELFORMAT_RGB888: - case PIXELFORMAT_BGR888: + case SIXEL_PIXELFORMAT_RGB888: + case SIXEL_PIXELFORMAT_BGR888: (void) expand_rgb(dst, src, width, height, src_pixelformat, 3); - *dst_pixelformat = PIXELFORMAT_RGB888; + *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: + case SIXEL_PIXELFORMAT_RGBA8888: + case SIXEL_PIXELFORMAT_ARGB8888: (void) expand_rgb(dst, src, width, height, src_pixelformat, 4); - *dst_pixelformat = PIXELFORMAT_RGB888; + *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: - *dst_pixelformat = PIXELFORMAT_PAL8; + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: + *dst_pixelformat = SIXEL_PIXELFORMAT_PAL8; return expand_palette(dst, src, width, height, src_pixelformat); - case PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_PAL8: memcpy(dst, src, width * height); *dst_pixelformat = src_pixelformat; break; @@ -282,8 +282,8 @@ static int test1(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_RGB888; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_RGB888; unsigned char src[] = { 0x46, 0xf3, 0xe5 }; int ret = 0; @@ -298,7 +298,7 @@ test1(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if ((dst[0] << 16 | dst[1] << 8 | dst[2]) != (src[0] << 16 | src[1] << 8 | src[2])) { @@ -316,8 +316,8 @@ static int test2(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_RGB555; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_RGB555; unsigned char src[] = { 0x47, 0x9c }; int ret = 0; @@ -332,7 +332,7 @@ test2(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if ((dst[0] >> 3 << 10 | dst[1] >> 3 << 5 | dst[2] >> 3) != (src[0] << 8 | src[1])) { @@ -350,8 +350,8 @@ static int test3(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_RGB565; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_RGB565; unsigned char src[] = { 0x47, 0x9c }; int ret = 0; @@ -366,7 +366,7 @@ test3(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if ((dst[0] >> 3 << 11 | dst[1] >> 2 << 5 | dst[2] >> 3) != (src[0] << 8 | src[1])) { @@ -384,8 +384,8 @@ static int test4(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_BGR888; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_BGR888; unsigned char src[] = { 0x46, 0xf3, 0xe5 }; int ret = 0; @@ -400,7 +400,7 @@ test4(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if ((dst[2] << 16 | dst[1] << 8 | dst[0]) != (src[0] << 16 | src[1] << 8 | src[2])) { @@ -418,8 +418,8 @@ static int test5(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_BGR555; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_BGR555; unsigned char src[] = { 0x23, 0xc8 }; int ret = 0; @@ -434,7 +434,7 @@ test5(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if ((dst[2] >> 3 << 10 | dst[1] >> 3 << 5 | dst[0] >> 3) != (src[0] << 8 | src[1])) { @@ -452,8 +452,8 @@ static int test6(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_BGR565; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_BGR565; unsigned char src[] = { 0x47, 0x88 }; int ret = 0; @@ -468,7 +468,7 @@ test6(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if ((dst[2] >> 3 << 11 | dst[1] >> 2 << 5 | dst[0] >> 3) != (src[0] << 8 | src[1])) { @@ -486,8 +486,8 @@ static int test7(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_AG88; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_AG88; unsigned char src[] = { 0x47, 0x88 }; int ret = 0; @@ -502,7 +502,7 @@ test7(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if (dst[0] != src[1]) { @@ -520,8 +520,8 @@ static int test8(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_GA88; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_GA88; unsigned char src[] = { 0x47, 0x88 }; int ret = 0; @@ -536,7 +536,7 @@ test8(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if (dst[0] != src[0]) { @@ -554,8 +554,8 @@ static int test9(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_RGBA8888; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_RGBA8888; unsigned char src[] = { 0x46, 0xf3, 0xe5, 0xf0 }; int ret = 0; @@ -570,7 +570,7 @@ test9(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if (dst[0] != src[0]) { @@ -594,8 +594,8 @@ static int test10(void) { unsigned char dst[3]; - int dst_pixelformat = PIXELFORMAT_RGB888; - int src_pixelformat = PIXELFORMAT_ARGB8888; + int dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; + int src_pixelformat = SIXEL_PIXELFORMAT_ARGB8888; unsigned char src[] = { 0x46, 0xf3, 0xe5, 0xf0 }; int ret = 0; @@ -610,7 +610,7 @@ test10(void) if (ret != 0) { goto error; } - if (dst_pixelformat != PIXELFORMAT_RGB888) { + if (dst_pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } if (dst[0] != src[1]) { diff --git a/src/quant.c b/src/quant.c index 1a365f84..5abf0fc7 100644 --- a/src/quant.c +++ b/src/quant.c @@ -423,17 +423,17 @@ colormapFromBv(unsigned int const newcolors, for (bi = 0; bi < boxes; ++bi) { switch (methodForRep) { - case REP_CENTER_BOX: + case SIXEL_REP_CENTER_BOX: centerBox(bv[bi].ind, bv[bi].colors, colorfreqtable, depth, colormap.table[bi]->tuple); break; - case REP_AVERAGE_COLORS: + case SIXEL_REP_AVERAGE_COLORS: averageColors(bv[bi].ind, bv[bi].colors, colorfreqtable, depth, colormap.table[bi]->tuple); break; - case REP_AVERAGE_PIXELS: + case SIXEL_REP_AVERAGE_PIXELS: averagePixels(bv[bi].ind, bv[bi].colors, colorfreqtable, depth, colormap.table[bi]->tuple); @@ -490,10 +490,10 @@ splitBox(boxVector const bv, transforming into luminosities before the comparison. */ switch (methodForLargest) { - case LARGE_NORM: + case SIXEL_LARGE_NORM: largestDimension = largestByNorm(minval, maxval, depth); break; - case LARGE_LUM: + case SIXEL_LARGE_LUM: largestDimension = largestByLuminosity(minval, maxval, depth); break; default: @@ -504,7 +504,7 @@ splitBox(boxVector const bv, /* TODO: I think this sort should go after creating a box, not before splitting. Because you need the sort to use - the REP_CENTER_BOX method of choosing a color to + the SIXEL_REP_CENTER_BOX method of choosing a color to represent the final boxes */ @@ -621,7 +621,7 @@ computeHistogram(unsigned char const *data, unsigned int length, unsigned long const depth, tupletable2 * const colorfreqtableP, - enum qualityMode const qualityMode) + int const qualityMode) { typedef unsigned short unit_t; unsigned int i, n; @@ -634,15 +634,15 @@ computeHistogram(unsigned char const *data, unsigned int max_sample; switch (qualityMode) { - case QUALITY_LOW: + case SIXEL_QUALITY_LOW: max_sample = 18383; step = length / depth / max_sample * depth; break; - case QUALITY_HIGH: + case SIXEL_QUALITY_HIGH: max_sample = 18383; step = length / depth / max_sample * depth; break; - case QUALITY_FULL: + case SIXEL_QUALITY_FULL: default: max_sample = 4003079; step = length / depth / max_sample * depth; @@ -713,9 +713,9 @@ computeColorMapFromInput(unsigned char const *data, unsigned int const length, unsigned int const depth, unsigned int const reqColors, - enum methodForLargest const methodForLargest, - enum methodForRep const methodForRep, - enum qualityMode const qualityMode, + int const methodForLargest, + int const methodForRep, + int const qualityMode, tupletable2 * const colormapP, int *origcolors) { @@ -1161,22 +1161,22 @@ sixel_quant_apply_palette(unsigned char *data, f_diffuse = diffuse_none; } else { switch (methodForDiffuse) { - case DIFFUSE_NONE: + case SIXEL_DIFFUSE_NONE: f_diffuse = diffuse_none; break; - case DIFFUSE_ATKINSON: + case SIXEL_DIFFUSE_ATKINSON: f_diffuse = diffuse_atkinson; break; - case DIFFUSE_FS: + case SIXEL_DIFFUSE_FS: f_diffuse = diffuse_fs; break; - case DIFFUSE_JAJUNI: + case SIXEL_DIFFUSE_JAJUNI: f_diffuse = diffuse_jajuni; break; - case DIFFUSE_STUCKI: + case SIXEL_DIFFUSE_STUCKI: f_diffuse = diffuse_stucki; break; - case DIFFUSE_BURKES: + case SIXEL_DIFFUSE_BURKES: f_diffuse = diffuse_burkes; break; default: diff --git a/src/scale.c b/src/scale.c index 7c114726..df60c8cc 100644 --- a/src/scale.c +++ b/src/scale.c @@ -340,42 +340,42 @@ sixel_helper_scale_image( /* choose re-sampling strategy */ switch (method_for_resampling) { - case RES_NEAREST: + case SIXEL_RES_NEAREST: scale_without_resampling(dst, src, srcw, srch, dstw, dsth, depth); break; - case RES_GAUSSIAN: + case SIXEL_RES_GAUSSIAN: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, gaussian, 1.0); break; - case RES_HANNING: + case SIXEL_RES_HANNING: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, hanning, 1.0); break; - case RES_HAMMING: + case SIXEL_RES_HAMMING: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, hamming, 1.0); break; - case RES_WELSH: + case SIXEL_RES_WELSH: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, welsh, 1.0); break; - case RES_BICUBIC: + case SIXEL_RES_BICUBIC: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, bicubic, 2.0); break; - case RES_LANCZOS2: + case SIXEL_RES_LANCZOS2: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, lanczos2, 3.0); break; - case RES_LANCZOS3: + case SIXEL_RES_LANCZOS3: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, lanczos3, 3.0); break; - case RES_LANCZOS4: + case SIXEL_RES_LANCZOS4: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, lanczos4, 4.0); break; - case RES_BILINEAR: + case SIXEL_RES_BILINEAR: default: scale_with_resampling(dst, src, srcw, srch, dstw, dsth, depth, bilinear, 1.0); diff --git a/src/tosixel.c b/src/tosixel.c index fec50bc1..d4218ac4 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -399,7 +399,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, #endif if (!bodyonly && (ncolors != 2 || keycolor == (-1))) { - if (context->palette_type == PALETTETYPE_HLS) { + if (context->palette_type == SIXEL_PALETTETYPE_HLS) { for (n = 0; n < ncolors; n++) { nret = output_hls_palette_definition(context, palette, n, keycolor); if (nret != 0) { @@ -418,7 +418,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, for (y = i = 0; y < height; y++) { int fillable; - if (context->encode_policy != ENCODEPOLICY_SIZE) { + if (context->encode_policy != SIXEL_ENCODEPOLICY_SIZE) { fillable = 0; } else if (palstate) { @@ -616,9 +616,9 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, int nret = (-1); switch (dither->pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: paletted_pixels = malloc(width * height * 3); if (paletted_pixels == NULL) { goto end; @@ -633,10 +633,10 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, } input_pixels = paletted_pixels; break; - case PIXELFORMAT_PAL8: - case PIXELFORMAT_G8: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: + case SIXEL_PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_GA88: + case SIXEL_PIXELFORMAT_AG88: input_pixels = pixels; break; default: @@ -1014,32 +1014,32 @@ sixel_apply_15bpp_dither( { /* apply floyd steinberg dithering */ switch (method_for_diffuse) { - case DIFFUSE_FS: + case SIXEL_DIFFUSE_FS: if (x < width - 1 && y < height - 1) { dither_func_fs(pixels, width); } break; - case DIFFUSE_ATKINSON: + case SIXEL_DIFFUSE_ATKINSON: if (x < width - 2 && y < height - 2) { dither_func_atkinson(pixels, width); } break; - case DIFFUSE_JAJUNI: + case SIXEL_DIFFUSE_JAJUNI: if (x < width - 2 && y < height - 2) { dither_func_jajuni(pixels, width); } break; - case DIFFUSE_STUCKI: + case SIXEL_DIFFUSE_STUCKI: if (x < width - 2 && y < height - 2) { dither_func_stucki(pixels, width); } break; - case DIFFUSE_BURKES: + case SIXEL_DIFFUSE_BURKES: if (x < width - 2 && y < height - 1) { dither_func_burkes(pixels, width); } break; - case DIFFUSE_NONE: + case SIXEL_DIFFUSE_NONE: default: dither_func_none(pixels, width); break; @@ -1067,7 +1067,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, + maxcolors /* for rgb2pal */ + width * 6; /* for marks */ - if (dither->pixelformat != PIXELFORMAT_RGB888) { + if (dither->pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelfromat */ normalized_pixels = malloc(width * height * 3); if (normalized_pixels == NULL) { @@ -1241,7 +1241,7 @@ sixel_encode(unsigned char /* in */ *pixels, /* pixel bytes */ (void) depth; - if (dither->quality_mode == QUALITY_HIGHCOLOR) { + if (dither->quality_mode == SIXEL_QUALITY_HIGHCOLOR) { nret = sixel_encode_highcolor(pixels, width, height, dither, context); } else { diff --git a/src/writer.c b/src/writer.c index a1870a6b..6ac0b4b7 100644 --- a/src/writer.c +++ b/src/writer.c @@ -84,9 +84,9 @@ write_png_to_file( unsigned char *dst; switch (pixelformat) { - case PIXELFORMAT_PAL1: - case PIXELFORMAT_PAL2: - case PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_PAL4: new_pixels = malloc(width * height * 4); src = new_pixels + width * height * 3; dst = pixels = new_pixels; @@ -104,7 +104,7 @@ write_png_to_file( *dst++ = *(palette + *src * 3 + 2); } break; - case PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_PAL8: src = data; dst = pixels = new_pixels = malloc(width * height * 3); for (i = 0; i < width * height; ++i, ++src) { @@ -113,19 +113,19 @@ write_png_to_file( *dst++ = *(palette + *src * 3 + 2); } break; - case PIXELFORMAT_RGB888: + case SIXEL_PIXELFORMAT_RGB888: pixels = data; break; - case PIXELFORMAT_G8: - case PIXELFORMAT_RGB565: - case PIXELFORMAT_RGB555: - case PIXELFORMAT_BGR565: - case PIXELFORMAT_BGR555: - case PIXELFORMAT_GA88: - case PIXELFORMAT_AG88: - case PIXELFORMAT_BGR888: - case PIXELFORMAT_RGBA8888: - case PIXELFORMAT_ARGB8888: + case SIXEL_PIXELFORMAT_G8: + case SIXEL_PIXELFORMAT_RGB565: + case SIXEL_PIXELFORMAT_RGB555: + case SIXEL_PIXELFORMAT_BGR565: + case SIXEL_PIXELFORMAT_BGR555: + case SIXEL_PIXELFORMAT_GA88: + case SIXEL_PIXELFORMAT_AG88: + case SIXEL_PIXELFORMAT_BGR888: + case SIXEL_PIXELFORMAT_RGBA8888: + case SIXEL_PIXELFORMAT_ARGB8888: pixels = new_pixels = malloc(width * height * 3); ret = sixel_helper_normalize_pixelformat(pixels, &pixelformat, @@ -235,21 +235,21 @@ sixel_helper_write_image_file( int nret = (-1); switch (imageformat) { - case FORMAT_PNG: + case SIXEL_FORMAT_PNG: nret = write_png_to_file(data, width, height, palette, pixelformat, filename); break; - case FORMAT_GIF: - case FORMAT_BMP: - case FORMAT_JPG: - case FORMAT_TGA: - case FORMAT_WBMP: - case FORMAT_TIFF: - case FORMAT_SIXEL: - case FORMAT_PNM: - case FORMAT_GD2: - case FORMAT_PSD: - case FORMAT_HDR: + case SIXEL_FORMAT_GIF: + case SIXEL_FORMAT_BMP: + case SIXEL_FORMAT_JPG: + case SIXEL_FORMAT_TGA: + case SIXEL_FORMAT_WBMP: + case SIXEL_FORMAT_TIFF: + case SIXEL_FORMAT_SIXEL: + case SIXEL_FORMAT_PNM: + case SIXEL_FORMAT_GD2: + case SIXEL_FORMAT_PSD: + case SIXEL_FORMAT_HDR: default: nret = (-1); break; @@ -268,7 +268,7 @@ test1(void) unsigned char pixels[] = {0xff, 0xff, 0xff}; ret = sixel_helper_write_image_file( - pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); + pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); if (ret != (-1)) { goto error; @@ -288,7 +288,7 @@ test2(void) unsigned char pixels[] = {0xff, 0xff, 0xff}; ret = sixel_helper_write_image_file( - pixels, 1, 1, NULL, PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); + pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); if (ret != 0) { goto error; From 6750aa907ac1589efeedffc62e0e008c0cb6d121 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 8 Jun 2015 06:06:43 +0900 Subject: [PATCH 291/451] Update LICENCE file --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 80f8026b..6e0ba162 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014 Hayaki Saito +Copyright (c) 2014,2015 Hayaki Saito Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From 2997ecf8d353bf06c72eea25b563342e72a41e63 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 01:13:50 +0900 Subject: [PATCH 292/451] Update stb_image to version 2.06 --- src/loader.c | 2 +- src/stb_image.h | 257 +++++++++++++++++++++++++++++++----------------- 2 files changed, 170 insertions(+), 89 deletions(-) diff --git a/src/loader.c b/src/loader.c index 3a4a79c0..e2baa9b3 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1021,7 +1021,7 @@ load_with_builtin( return SIXEL_FAILED; } stbi__start_mem(&s, pchunk->buffer, pchunk->size); - frame->pixels = stbi_load_main(&s, &frame->width, &frame->height, &depth, 3); + frame->pixels = stbi__load_main(&s, &frame->width, &frame->height, &depth, 3); if (!frame->pixels) { fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", stbi_failure_reason()); diff --git a/src/stb_image.h b/src/stb_image.h index 3c7c7388..d0fa9c21 100644 --- a/src/stb_image.h +++ b/src/stb_image.h @@ -1,4 +1,4 @@ -/* stb_image - v2.02 - public domain image loader - http://nothings.org/stb_image.h +/* stb_image - v2.06 - public domain image loader - http://nothings.org/stb_image.h no warranty implied; use at your own risk Do this: @@ -143,6 +143,12 @@ Latest revision history: + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) additional corruption checking + stbi_set_flip_vertically_on_load + fix NEON support; fix mingw support 2.02 (2015-01-19) fix incorrect assert, fix warning 2.01 (2015-01-17) fix various warnings 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG @@ -156,8 +162,6 @@ 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted) optimize PNG fix bug in interlaced PNG with user-specified channel count - 1.46 (2014-08-26) fix broken tRNS chunk in non-paletted PNG - 1.45 (2014-08-16) workaround MSVC-ARM internal compiler error by wrapping malloc See end of file for full revision history. @@ -180,7 +184,7 @@ James "moose2000" Brown (iPhone PNG) Roy Eltham Ben "Disch" Wenger (io callbacks) Luke Graham Omar Cornut (1/2/4-bit PNG) Thomas Ruf - John Bartholomew + Nicolas Guillemot (vertical flip) John Bartholomew Ken Hamada Optimizations & bugfixes Cort Stratton Fabian "ryg" Giesen Blazej Dariusz Roszkowski @@ -196,6 +200,9 @@ Sergio Gonzalez Cass Everitt Engin Manap + Martins Mozeiko + Joseph Thomson + Phil Jordan License: This software is in the public domain. Where that dedication is not @@ -487,6 +494,8 @@ STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultipl // or just pass them through "as-is" STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); // ZLIB client - used by PNG, available for other purposes @@ -624,7 +633,15 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI_FREE(p) free(p) #endif -#if defined(__GNUC__) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// NOTE: not clear do we actually need this for the 64-bit path? // gcc doesn't support sse2 intrinsics unless you compile with -msse2, // (but compiling with -msse2 allows the compiler to use SSE2 everywhere; // this is just broken and gcc are jerks for not fixing it properly @@ -632,7 +649,22 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI_NO_SIMD #endif -#if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)) +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET) #define STBI_SSE2 #include @@ -885,7 +917,14 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); #endif -static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) { #ifndef STBI_NO_JPEG if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); @@ -925,6 +964,53 @@ static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); } +static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result = stbi__load_main(s, x, y, comp, req_comp); + + if (stbi__vertically_flip_on_load && result != NULL) { + int w = *x, h = *y; + int depth = req_comp ? req_comp : *comp; + int row,col,z; + stbi_uc temp; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < depth; z++) { + temp = result[(row * w + col) * depth + z]; + result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; + result[((h - row - 1) * w + col) * depth + z] = temp; + } + } + } + } + + return result; +} + +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int w = *x, h = *y; + int depth = req_comp ? req_comp : *comp; + int row,col,z; + float temp; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < depth; z++) { + temp = result[(row * w + col) * depth + z]; + result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; + result[((h - row - 1) * w + col) * depth + z] = temp; + } + } + } + } +} + + #ifndef STBI_NO_STDIO static FILE *stbi__fopen(char const *filename, char const *mode) @@ -955,7 +1041,7 @@ STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req unsigned char *result; stbi__context s; stbi__start_file(&s,f); - result = stbi_load_main(&s,x,y,comp,req_comp); + result = stbi__load_flip(&s,x,y,comp,req_comp); if (result) { // need to 'unget' all the characters in the IO buffer fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); @@ -968,25 +1054,29 @@ STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, i { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi_load_main(&s,x,y,comp,req_comp); + return stbi__load_flip(&s,x,y,comp,req_comp); } STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_load_main(&s,x,y,comp,req_comp); + return stbi__load_flip(&s,x,y,comp,req_comp); } #ifndef STBI_NO_LINEAR -static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) { unsigned char *data; #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) - return stbi__hdr_load(s,x,y,comp,req_comp); + if (stbi__hdr_test(s)) { + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } #endif - data = stbi_load_main(s, x, y, comp, req_comp); + data = stbi__load_flip(s, x, y, comp, req_comp); if (data) return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); @@ -996,14 +1086,14 @@ STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, in { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi_loadf_main(&s,x,y,comp,req_comp); + return stbi__loadf_main(&s,x,y,comp,req_comp); } STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_loadf_main(&s,x,y,comp,req_comp); + return stbi__loadf_main(&s,x,y,comp,req_comp); } #ifndef STBI_NO_STDIO @@ -1021,7 +1111,7 @@ STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_ { stbi__context s; stbi__start_file(&s,f); - return stbi_loadf_main(&s,x,y,comp,req_comp); + return stbi__loadf_main(&s,x,y,comp,req_comp); } #endif // !STBI_NO_STDIO @@ -1144,6 +1234,10 @@ stbi_inline static int stbi__at_eof(stbi__context *s) static void stbi__skip(stbi__context *s, int n) { + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } if (s->io.read) { int blen = (int) (s->img_buffer_end - s->img_buffer); if (blen < n) { @@ -1552,6 +1646,7 @@ stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n) sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); j->code_buffer = k & ~stbi__bmask[n]; k &= stbi__bmask[n]; j->code_bits -= n; @@ -1757,8 +1852,11 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ if (r) j->eob_run += stbi__jpeg_get_bits(j, r); r = 64; // force end of block - } else - r = 16; // r=15 is the code for 16 0s + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } } else { if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); // sign bit @@ -1770,7 +1868,7 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ // advance by r while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k]]; + short *p = &data[stbi__jpeg_dezigzag[k++]]; if (*p != 0) { if (stbi__jpeg_get_bit(j)) if ((*p & bit)==0) { @@ -1779,15 +1877,12 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__ else *p -= bit; } - ++k; } else { if (r == 0) { - if (s) - data[stbi__jpeg_dezigzag[k++]] = (short) s; + *p = (short) s; break; } --r; - ++k; } } } while (k <= j->spec_end); @@ -2700,6 +2795,10 @@ static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) static int stbi__decode_jpeg_image(stbi__jpeg *j) { int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } j->restart_interval = 0; if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; m = stbi__get_marker(j); @@ -3379,7 +3478,8 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) ++sizes[sizelist[i]]; sizes[0] = 0; for (i=1; i < 16; ++i) - STBI_ASSERT(sizes[i] <= (1 << i)); + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); code = 0; for (i=1; i < 16; ++i) { next_code[i] = code; @@ -3387,7 +3487,7 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) z->firstsymbol[i] = (stbi__uint16) k; code = (code + sizes[i]); if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt JPEG"); + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); z->maxcode[i] = code << (16-i); // preshift for inner loop code <<= 1; k += sizes[i]; @@ -3556,9 +3656,9 @@ static int stbi__parse_huffman_block(stbi__zbuf *a) p = (stbi_uc *) (zout - dist); if (dist == 1) { // run of one byte; common in images. stbi_uc v = *p; - do *zout++ = v; while (--len); + if (len) { do *zout++ = v; while (--len); } } else { - do *zout++ = *p++; while (--len); + if (len) { do *zout++ = *p++; while (--len); } } } } @@ -3586,7 +3686,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) n = 0; while (n < hlit + hdist) { int c = stbi__zhuffman_decode(a, &z_codelength); - STBI_ASSERT(c >= 0 && c < 19); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); if (c < 16) lencodes[n++] = (stbi_uc) c; else if (c == 16) { @@ -4283,6 +4383,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; if (ioff + c.length > idata_limit) { stbi_uc *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; @@ -4642,7 +4743,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int } } else { for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s); + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); int a; out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); @@ -4799,7 +4900,7 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int *y = tga_height; if (comp) *comp = tga_comp; - tga_data = (unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp ); + tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp ); if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) @@ -5039,7 +5140,8 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int p = out+channel; if (channel >= channelCount) { // Fill this channel with default data. - for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); } else { // Read the RLE data. count = 0; @@ -5085,11 +5187,12 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int p = out + channel; if (channel > channelCount) { // Fill this channel with default data. - for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; + for (i = 0; i < pixelCount; i++, p += 4) + *p = channel == 3 ? 255 : 0; } else { // Read the data. - for (i = 0; i < pixelCount; i++) - *p = stbi__get8(s), p += 4; + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); } } } @@ -5099,7 +5202,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int if (out == NULL) return out; // stbi__convert_format frees input on failure } - if (comp) *comp = channelCount; + if (comp) *comp = 4; *y = h; *x = w; @@ -5347,9 +5450,6 @@ typedef struct int max_x, max_y; int cur_x, cur_y; int line_size; - int loop_count; - int delay; - int is_multiframe; } stbi__gif; static int stbi__gif_test_raw(stbi__context *s) @@ -5422,6 +5522,8 @@ static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) { + stbi_uc *p, *c; + // recurse to decode the prefixes, since the linked-list is backwards, // and working backwards through an interleaved image would be nasty if (g->codes[code].prefix >= 0) @@ -5429,8 +5531,16 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) if (g->cur_y >= g->max_y) return; - g->out[g->cur_x + g->cur_y] = g->codes[code].suffix; - g->cur_x++; + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; if (g->cur_x >= g->max_x) { g->cur_x = g->start_x; @@ -5453,6 +5563,7 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) stbi__gif_lzw *p; lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; clear = 1 << lzw_cs; first = 1; codesize = lzw_cs + 1; @@ -5538,11 +5649,10 @@ static void stbi__fill_gif_background(stbi__gif *g) } // this function is designed to support animated gifs, although stb_image doesn't support it -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *bgcolor) +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) { int i; stbi_uc *old_out = 0; - stbi_uc buffer[256]; if (g->out == 0) { if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header @@ -5596,17 +5706,9 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i g->color_table = (stbi_uc *) g->lpal; } else if (g->flags & 0x80) { for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent - g->pal[i][3] = 255; - if (g->transparent >= 0 && (g->eflags & 0x01)) { - if (bgcolor) { - g->pal[g->transparent][0] = bgcolor[2]; - g->pal[g->transparent][1] = bgcolor[1]; - g->pal[g->transparent][2] = bgcolor[0]; - g->pal[g->transparent][3] = 0xff; - } else { - g->pal[g->transparent][3] = 0; - } - } + g->pal[i][3] = 255; + if (g->transparent >= 0 && (g->eflags & 0x01)) + g->pal[g->transparent][3] = 0; g->color_table = (stbi_uc *) g->pal; } else return stbi__errpuc("missing color table", "Corrupt GIF"); @@ -5622,42 +5724,16 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i case 0x21: // Comment Extension. { int len; - switch (stbi__get8(s)) { - case 0x01: // Plain Text Extension - break; - case 0x21: // Comment Extension - break; - case 0xF9: // Graphic Control Extension - len = stbi__get8(s); // block size + if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); if (len == 4) { g->eflags = stbi__get8(s); - g->delay = stbi__get16le(s); // delay + stbi__get16le(s); // delay g->transparent = stbi__get8(s); } else { stbi__skip(s, len); break; } - break; - case 0xFF: // Application Extension - len = stbi__get8(s); // block size - stbi__getn(s, buffer, len); - buffer[len] = 0; - if (len == 11 && strcmp((char *)buffer, "NETSCAPE2.0") == 0) { - if (stbi__get8(s) == 0x03) { - // loop count - switch (stbi__get8(s)) { - case 0x00: - g->loop_count = 1; - break; - case 0x01: - g->loop_count = stbi__get16le(s); - break; - } - } - } - break; - default: - break; } while ((len = stbi__get8(s)) != 0) stbi__skip(s, len); @@ -5679,9 +5755,7 @@ static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int stbi__gif g; memset(&g, 0, sizeof(g)); - g.loop_count = -1; - - u = stbi__gif_load_next(s, &g, comp, req_comp, NULL); + u = stbi__gif_load_next(s, &g, comp, req_comp); if (u == (stbi_uc *) s) u = 0; // end of animated gif marker if (u) { *x = g.w; @@ -6221,6 +6295,12 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int /* revision history: + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support 2.02 (2015-01-19) fix incorrect assert, fix warning 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG @@ -6307,7 +6387,7 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int 1.21 fix use of 'stbi_uc' in header (reported by jon blow) 1.20 added support for Softimage PIC, by Tom Seddon 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 2008-08-02 + 1.18 (2008-08-02) fix a threading bug (local mutable static) 1.17 support interlaced PNG 1.16 major bugfix - stbi__convert_format converted one too many pixels @@ -6352,5 +6432,6 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments 0.51 obey req_comp requests, 1-component jpegs return as 1-component, on 'test' only check type, not whether we support this variant - 0.50 first released version + 0.50 (2006-11-19) + first released version */ From 1d9c97d0e77c87f6f05ec3e42b2a92d4cbce7bf0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 01:14:34 +0900 Subject: [PATCH 293/451] Remove directory "patches" --- patches/applied/stb_image.h.diff | 62 -------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 patches/applied/stb_image.h.diff diff --git a/patches/applied/stb_image.h.diff b/patches/applied/stb_image.h.diff deleted file mode 100644 index 662f4e3c..00000000 --- a/patches/applied/stb_image.h.diff +++ /dev/null @@ -1,62 +0,0 @@ ---- stb_image.h 2015-02-04 15:31:29.000000000 +0900 -+++ stb_image.h 2015-02-04 21:42:54.000000000 +0900 -@@ -5347,6 +5347,8 @@ - int max_x, max_y; - int cur_x, cur_y; - int line_size; -+ int loop_count; -+ int delay; - } stbi__gif; - - static int stbi__gif_test_raw(stbi__context *s) -@@ -5620,8 +5622,13 @@ - case 0x21: // Comment Extension. - { - int len; -- if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. -- len = stbi__get8(s); -+ switch (stbi__get8(s)) { -+ case 0x01: // Plain Text Extension -+ break; -+ case 0x21: // Comment Extension -+ break; -+ case 0xF9: // Graphic Control Extension -+ len = stbi__get8(s); // block size - if (len == 4) { - g->eflags = stbi__get8(s); - stbi__get16le(s); // delay -@@ -5630,6 +5637,34 @@ - stbi__skip(s, len); - break; - } -+ break; -+ case 0xFF: // Application Extension -+ len = stbi__get8(s); // block size -+ if (len != 11) break; -+ if (stbi__get8(s) != 'N') break; -+ if (stbi__get8(s) != 'E') break; -+ if (stbi__get8(s) != 'T') break; -+ if (stbi__get8(s) != 'S') break; -+ if (stbi__get8(s) != 'C') break; -+ if (stbi__get8(s) != 'A') break; -+ if (stbi__get8(s) != 'P') break; -+ if (stbi__get8(s) != 'E') break; -+ if (stbi__get8(s) != '2') break; -+ if (stbi__get8(s) != '.') break; -+ if (stbi__get8(s) != '0') break; -+ if (stbi__get8(s) != 0x03) break; -+ // loop count -+ switch (stbi__get8(s)) { -+ case 0x00: -+ g->loop_count = 1; -+ break; -+ case 0x01: -+ g->loop_count = stbi__get16le(s); -+ break; -+ } -+ break; -+ default: -+ break; - } - while ((len = stbi__get8(s)) != 0) - stbi__skip(s, len); From cb1da4a2cba29b8e5214848c792da75a3c865be7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:18:17 +0900 Subject: [PATCH 294/451] Minor fix --- src/fromsixel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fromsixel.c b/src/fromsixel.c index c81f6463..c10473d4 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -1,5 +1,5 @@ /* - * this file is derived from "sixel" original version (2014-3-2) + * This file is derived from "sixel" original version (2014-3-2) * http://nanno.dip.jp/softlib/man/rlogin/sixel.tar.gz * * Initial developer of this file is kmiya@culti. From 0bbd80dc03397db1a3a1d1f41ed420af983e22df Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:18:35 +0900 Subject: [PATCH 295/451] gif loader: update license notice --- src/fromgif.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/fromgif.c b/src/fromgif.c index b0636e6e..dd1a4675 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -1,4 +1,10 @@ /* + * This file is derived from "stb_image.h" that is in public domain. + * https://github.com/nothings/stb + * + * Hayaki Saito modified this and re-licensed + * it under the MIT license. + * * Copyright (c) 2015 Hayaki Saito * * Permission is hereby granted, free of charge, to any person obtaining a copy of From 582197d6b329f32d011ad17f87261fd44997662e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:18:47 +0900 Subject: [PATCH 296/451] gif loader: cleanup --- src/fromgif.c | 104 +++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/src/fromgif.c b/src/fromgif.c index dd1a4675..9f945e86 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -92,7 +92,7 @@ typedef struct /* initialize a memory-decode context */ static void -start_mem(gif_context_t *s, uint8_t const *buffer, int len) +gif_start_mem(gif_context_t *s, uint8_t const *buffer, int len) { s->img_buffer = s->img_buffer_original = (uint8_t *) buffer; s->img_buffer_end = (uint8_t *) buffer+len; @@ -100,7 +100,7 @@ start_mem(gif_context_t *s, uint8_t const *buffer, int len) static uint8_t -get8(gif_context_t *s) +gif_get8(gif_context_t *s) { if (s->img_buffer < s->img_buffer_end) { return *s->img_buffer++; @@ -110,10 +110,10 @@ get8(gif_context_t *s) static int -get16le(gif_context_t *s) +gif_get16le(gif_context_t *s) { - int z = get8(s); - return z + (get8(s) << 8); + int z = gif_get8(s); + return z + (gif_get8(s) << 8); } @@ -152,46 +152,46 @@ gif_parse_colortable( int i; for (i = 0; i < num_entries; ++i) { - pal[i][2] = get8(s); - pal[i][1] = get8(s); - pal[i][0] = get8(s); + pal[i][2] = gif_get8(s); + pal[i][1] = gif_get8(s); + pal[i][0] = gif_get8(s); } } static int -load_gif_header( +gif_load_header( gif_context_t /* in */ *s, gif_t /* in */ *g) { uint8_t version; - if (get8(s) != 'G') { + if (gif_get8(s) != 'G') { return (-1); } - if (get8(s) != 'I') { + if (gif_get8(s) != 'I') { return (-1); } - if (get8(s) != 'F') { + if (gif_get8(s) != 'F') { return (-1); } - if (get8(s) != '8') { + if (gif_get8(s) != '8') { return (-1); } - version = get8(s); + version = gif_get8(s); if (version != '7' && version != '9') { return (-1); } - if (get8(s) != 'a') { + if (gif_get8(s) != 'a') { return (-1); } - g->w = get16le(s); - g->h = get16le(s); - g->flags = get8(s); - g->bgindex = get8(s); - g->ratio = get8(s); + g->w = gif_get16le(s); + g->h = gif_get16le(s); + g->flags = gif_get8(s); + g->bgindex = gif_get8(s); + g->ratio = gif_get8(s); g->transparent = -1; g->loop_count = -1; @@ -203,8 +203,8 @@ load_gif_header( } -int -init_gif_frame( +static int +gif_init_frame( sixel_frame_t /* in */ *frame, gif_t /* in */ *pg, unsigned char /* in */ *bgcolor, @@ -268,7 +268,7 @@ init_gif_frame( } } if (frame->pixels == NULL) { - fprintf(stderr, "init_gif_frame() failed.\n"); + fprintf(stderr, "gif_init_frame() failed.\n"); return (-1); } frame->multiframe = (pg->loop_count != (-1)); @@ -278,7 +278,7 @@ init_gif_frame( static void -out_gif_code( +gif_out_code( gif_t /* in */ *g, uint16_t /* in */ code ) @@ -286,7 +286,7 @@ out_gif_code( /* recurse to decode the prefixes, since the linked-list is backwards, and working backwards through an interleaved image would be nasty */ if (g->codes[code].prefix >= 0) { - out_gif_code(g, g->codes[code].prefix); + gif_out_code(g, g->codes[code].prefix); } if (g->cur_y >= g->max_y) { @@ -310,7 +310,7 @@ out_gif_code( static int -process_gif_raster( +gif_process_raster( gif_context_t /* in */ *s, gif_t /* in */ *g ) @@ -321,7 +321,7 @@ process_gif_raster( int32_t codesize, codemask, avail, oldcode, bits, valid_bits, clear; gif_lzw *p; - lzw_cs = get8(s); + lzw_cs = gif_get8(s); clear = 1 << lzw_cs; first = 1; codesize = lzw_cs + 1; @@ -342,13 +342,13 @@ process_gif_raster( for(;;) { if (valid_bits < codesize) { if (len == 0) { - len = get8(s); /* start new block */ + len = gif_get8(s); /* start new block */ if (len == 0) { return SIXEL_SUCCESS; } } --len; - bits |= (int32_t) get8(s) << valid_bits; + bits |= (int32_t) gif_get8(s) << valid_bits; valid_bits += 8; } else { int32_t code = bits & codemask; @@ -363,7 +363,7 @@ process_gif_raster( first = 0; } else if (code == clear + 1) { /* end of stream code */ gif_skip(s, len); - while ((len = get8(s)) > 0) { + while ((len = gif_get8(s)) > 0) { gif_skip(s,len); } return SIXEL_SUCCESS; @@ -389,7 +389,7 @@ process_gif_raster( return SIXEL_FAILED; } - out_gif_code(g, (uint16_t) code); + gif_out_code(g, (uint16_t) code); if ((avail & codemask) == 0 && avail <= 0x0FFF) { codesize++; @@ -418,15 +418,15 @@ gif_load_next( uint8_t buffer[256]; for (;;) { - switch (get8(s)) { + switch (gif_get8(s)) { case 0x2C: /* Image Descriptor */ { int32_t x, y, w, h; - x = get16le(s); - y = get16le(s); - w = get16le(s); - h = get16le(s); + x = gif_get16le(s); + y = gif_get16le(s); + w = gif_get16le(s); + h = gif_get16le(s); if (((x + w) > (g->w)) || ((y + h) > (g->h))) { fprintf(stderr, "Corrupt GIF.\n" "reason: bad Image Descriptor.\n"); @@ -441,7 +441,7 @@ gif_load_next( g->cur_x = g->start_x; g->cur_y = g->start_y; - g->lflags = get8(s); + g->lflags = gif_get8(s); if (g->lflags & 0x40) { g->step = 8 * g->line_size; /* first interlaced spacing */ @@ -471,41 +471,41 @@ gif_load_next( return SIXEL_FAILED; } - return process_gif_raster(s, g); + return gif_process_raster(s, g); } case 0x21: /* Comment Extension. */ { int len; - switch (get8(s)) { + switch (gif_get8(s)) { case 0x01: /* Plain Text Extension */ break; case 0x21: /* Comment Extension */ break; case 0xF9: /* Graphic Control Extension */ - len = get8(s); /* block size */ + len = gif_get8(s); /* block size */ if (len == 4) { - g->eflags = get8(s); - g->delay = get16le(s); /* delay */ - g->transparent = get8(s); + g->eflags = gif_get8(s); + g->delay = gif_get16le(s); /* delay */ + g->transparent = gif_get8(s); } else { gif_skip(s, len); break; } break; case 0xFF: /* Application Extension */ - len = get8(s); /* block size */ + len = gif_get8(s); /* block size */ gif_getn(s, buffer, len); buffer[len] = 0; if (len == 11 && strcmp((char *)buffer, "NETSCAPE2.0") == 0) { - if (get8(s) == 0x03) { + if (gif_get8(s) == 0x03) { /* loop count */ - switch (get8(s)) { + switch (gif_get8(s)) { case 0x00: g->loop_count = 1; break; case 0x01: - g->loop_count = get16le(s); + g->loop_count = gif_get16le(s); break; } } @@ -514,7 +514,7 @@ gif_load_next( default: break; } - while ((len = get8(s)) != 0) { + while ((len = gif_get8(s)) != 0) { gif_skip(s, len); } break; @@ -557,9 +557,9 @@ load_gif( if (frame == NULL) { return SIXEL_FAILED; } - start_mem(&s, buffer, size); + gif_start_mem(&s, buffer, size); memset(&g, 0, sizeof(g)); - ret = load_gif_header(&s, &g); + ret = gif_load_header(&s, &g); if (ret != SIXEL_SUCCESS) { goto end; } @@ -577,7 +577,7 @@ load_gif( frame->frame_no = 0; gif_rewind(&s); - ret = load_gif_header(&s, &g); + ret = gif_load_header(&s, &g); if (ret != 0) { goto end; } @@ -593,7 +593,7 @@ load_gif( break; } - ret = init_gif_frame(frame, &g, bgcolor, reqcolors, fuse_palette); + ret = gif_init_frame(frame, &g, bgcolor, reqcolors, fuse_palette); if (ret != 0) { goto end; } From c41f20fee092ee76dcce9c1f25f290964d6a0e57 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:23:43 +0900 Subject: [PATCH 297/451] Update license file of stb --- LICENSE.stb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/LICENSE.stb b/LICENSE.stb index 32e84368..848baf1b 100644 --- a/LICENSE.stb +++ b/LICENSE.stb @@ -1,11 +1,9 @@ This software includes some part of stb(https://github.com/nothings/stb), -- converters/stb_image.h: public domain JPEG/PNG reader. -- converters/stb_image_write.h: public domain PNG/BMP/TGA writer. +- src/stb_image.h: public domain JPEG/PNG reader. +- src/stb_image_write.h: public domain PNG/BMP/TGA writer. These great works is written by Sean Barrett(@nothings) and some contributers. -Hayaki Saito(@saitoha) applied a small fix(patches/applied/stb_image.h.diff) for stb_image.h. -That patch is also in public domain. - +src/fromgif.c is origined from some part of stb_image.h. From 3b366f34ee9c585c2a86f9da4773914fa0ad977c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:24:01 +0900 Subject: [PATCH 298/451] Update README: update version of stb_image.h/stb_image_write.h --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 12c6c16d..71da9c81 100644 --- a/README.md +++ b/README.md @@ -827,15 +827,15 @@ date will be written clearly. kmiya also said this is compatible with MIT/BSD/GPL. -### stbi-1.41 +### stbi-2.06 -This software includes `stbi-1.41` (stb_image.h), +This software includes `stbi-2.06` (stb_image.h), public domain JPEG/PNG reader. https://github.com/nothings/stb -### stbiw-0.92 +### stbiw-0.94 This software includes `stbiw-0.94` (stb_image_write.h), public domain PNG/BMP/TGA writer. From 35cc40fc4b302f54981bc38f30af54ad5f3581c5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:38:37 +0900 Subject: [PATCH 299/451] Update NEWS for release 1.5 --- NEWS | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 34ab4421..6f3c935d 100644 --- a/NEWS +++ b/NEWS @@ -3,13 +3,56 @@ ------------------------------ * img2sixel: Add -B(--bgcolor) option. -* core: introduce new API for dither object, sixel_dither_set_transparent(). +* core: Introduce new API for dither object, sixel_dither_set_transparent(). + +* core: Introduce API set for generic image maniplation: + sixel_frame_get_pixels() + sixel_frame_ref() + sixel_frame_unref() + sixel_frame_init() + sixel_frame_get_pixels() + sixel_frame_get_palette() + sixel_frame_get_width() + sixel_frame_get_height() + sixel_frame_get_ncolors() + sixel_frame_get_pixelformat() + sixel_frame_get_transparent() + sixel_frame_get_multiframe() + sixel_frame_get_delay() + sixel_frame_get_frame_no() + sixel_frame_get_loop_no() + sixel_frame_strip_alpha() + sixel_frame_resize() + sixel_frame_clip() + +* core: Introduce API set for load/write well-known image formats: + sixel_helper_load_image_file() + sixel_helper_write_image_file() + +* core: Add more high level APIs (File-to-File conversion API): + sixel_encoder_create() + sixel_encoder_ref() + sixel_encoder_unref() + sixel_encoder_set_cancel_flag() + sixel_encoder_setopt() + sixel_encoder_encode() + sixel_decoder_create() + sixel_decoder_ref() + sixel_decoder_unref() + sixel_decoder_setopt() + sixel_decoder_decode() * core: Improve processing quality of loading paletted PNG images. * core: Improve processing quality and performance of loading GIF images. -* core: Add more high level APIs +* core: Update stb_image.h to version 2.06 + +* core: Update stb_image_write.h to version 0.94 + +* A lot of bug fixes and minor improvements. + Thanks to @msmhrt, @ttdoda, and @msmhrt. + ------------------------------ What's new in libsixel-1.4 ? From e6a69d5b4573877c2d062f8a0aeb53da71ed50f4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 9 Jun 2015 23:40:43 +0900 Subject: [PATCH 300/451] Update NEWS --- NEWS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 6f3c935d..2db4f0b0 100644 --- a/NEWS +++ b/NEWS @@ -50,6 +50,12 @@ * core: Update stb_image_write.h to version 0.94 +* Add Perl interface + +* Add Python interface + +* Add PHP interface + * A lot of bug fixes and minor improvements. Thanks to @msmhrt, @ttdoda, and @msmhrt. From ac5a7a03b8ebfc1d17f2128fba322f0e1328b8d6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 10 Jun 2015 00:28:00 +0900 Subject: [PATCH 301/451] Update README --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 2db4f0b0..b6d243fe 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ * core: Introduce new API for dither object, sixel_dither_set_transparent(). +* core: Respect transparency of paletted images(GIF/PNG). + * core: Introduce API set for generic image maniplation: sixel_frame_get_pixels() sixel_frame_ref() From 2184c5e18e2ff45fbf97fb269303b4350761bb08 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 10 Jun 2015 01:07:11 +0900 Subject: [PATCH 302/451] Strip unneeded substitution to palette type option when -B option is specified --- src/encoder.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index da7c2f4c..65c2874d 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1235,9 +1235,7 @@ sixel_encoder_setopt( if (encoder->bgcolor) { free(encoder->bgcolor); } - if (parse_x_colorspec(optarg, &encoder->bgcolor) == 0) { - encoder->palette_type = SIXEL_PALETTETYPE_AUTO; - } else { + if (parse_x_colorspec(optarg, &encoder->bgcolor) != 0) { fprintf(stderr, "Cannot parse bgcolor option.\n"); goto argerr; From a318c1996dcd98d8376bf8b14a92ae272cbcce19 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 10 Jun 2015 01:14:36 +0900 Subject: [PATCH 303/451] Introduce SIXEL_BGCOLOR environment (for Issue #27) --- src/encoder.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/encoder.c b/src/encoder.c index 65c2874d..c67fc74f 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -933,6 +933,8 @@ sixel_encoder_create(void) encoder->cancel_flag = NULL; encoder->dither_cache = NULL; + (void) parse_x_colorspec(getenv("SIXEL_BGCOLOR"), &encoder->bgcolor); + return encoder; } From f037da38887166d87f6043fb55915c1f63d8aa57 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 10 Jun 2015 02:52:56 +0900 Subject: [PATCH 304/451] Parse X11 color name which is specified with -B option --- src/Makefile.am | 9 +- src/Makefile.in | 3 +- src/encoder.c | 11 +- src/rgblookup.h | 1755 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1771 insertions(+), 7 deletions(-) create mode 100644 src/rgblookup.h diff --git a/src/Makefile.am b/src/Makefile.am index 4c5bd6e7..9eba2f5b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,7 @@ CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* tests lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ - output.c \ + output.c \ output.h \ fromsixel.c \ tosixel.c \ @@ -23,8 +23,8 @@ libsixel_la_SOURCES = \ loader.c \ frompnm.c \ frompnm.h \ - fromgif.c \ - fromgif.h \ + fromgif.c \ + fromgif.h \ encoder.c \ encoder.h \ decoder.c \ @@ -33,7 +33,8 @@ libsixel_la_SOURCES = \ writer.c \ writer.h \ stb_image_write.c \ - stb_image_write.h + stb_image_write.h \ + rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ $(LIBCURL_CFLAGS) \ diff --git a/src/Makefile.in b/src/Makefile.in index 0c3f290a..0d43b59a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -404,7 +404,8 @@ libsixel_la_SOURCES = \ writer.c \ writer.h \ stb_image_write.c \ - stb_image_write.h + stb_image_write.h \ + rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ diff --git a/src/encoder.c b/src/encoder.c index 65c2874d..053770b2 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -64,6 +64,7 @@ #endif #include "encoder.h" +#include "rgblookup.h" #include @@ -90,8 +91,14 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) unsigned long v; char *endptr; char *buf = NULL; - - if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { + struct color const *pcolor; + pcolor = lookup_rgb(s, strlen(s)); + if (pcolor) { + *bgcolor = malloc(3); + (*bgcolor)[0] = pcolor->r; + (*bgcolor)[1] = pcolor->g; + (*bgcolor)[2] = pcolor->b; + } else if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { p = buf = arg_strdup(s + 4); while (*p) { v = 0; diff --git a/src/rgblookup.h b/src/rgblookup.h new file mode 100644 index 00000000..c9e52f83 --- /dev/null +++ b/src/rgblookup.h @@ -0,0 +1,1755 @@ +/* C code produced by gperf version 3.0.3 */ +/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -C -Nlookup_rgb */ +/* Computed positions: -k'1,3,5-9,12-15,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +struct color { + char *name; + unsigned char r; + unsigned char g; + unsigned char b; +}; + +#define TOTAL_KEYWORDS 752 +#define MIN_WORD_LENGTH 3 +#define MAX_WORD_LENGTH 22 +#define MIN_HASH_VALUE 3 +#define MAX_HASH_VALUE 5574 +/* maximum key range = 5572, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +hash (str, len) +register const char *str; +register unsigned int len; +{ + static const unsigned short asso_values[] = + { + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 520, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 920, 25, + 20, 5, 0, 1007, 841, 16, 915, 840, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 80, 5, 980, + 0, 0, 55, 0, 670, 673, 0, 395, 215, 190, + 160, 100, 1015, 145, 0, 0, 155, 325, 740, 831, + 5575, 265, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 5575 + }; + register unsigned int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[14]]; + /*FALLTHROUGH*/ + case 14: + hval += asso_values[(unsigned char)str[13]]; + /*FALLTHROUGH*/ + case 13: + hval += asso_values[(unsigned char)str[12]]; + /*FALLTHROUGH*/ + case 12: + hval += asso_values[(unsigned char)str[11]]; + /*FALLTHROUGH*/ + case 11: + case 10: + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +const struct color * +lookup_rgb (str, len) +register const char *str; +register unsigned int len; +{ + static const struct color wordlist[] = + { + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"red", 0xff, 0x00, 0x00}, + {"red4", 0x8b, 0x00, 0x00}, + {"grey4", 0x0a, 0x0a, 0x0a}, + {"grey44", 0x70, 0x70, 0x70}, + {"darkred", 0x8b, 0x00, 0x00}, + {"", 0, 0, 0}, + {"red3", 0xcd, 0x00, 0x00}, + {"", 0, 0, 0}, + {"grey34", 0x57, 0x57, 0x57}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey3", 0x08, 0x08, 0x08}, + {"grey43", 0x6e, 0x6e, 0x6e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey33", 0x54, 0x54, 0x54}, + {"grey74", 0xbd, 0xbd, 0xbd}, + {"", 0, 0, 0}, + {"red2", 0xee, 0x00, 0x00}, + {"", 0, 0, 0}, + {"grey24", 0x3d, 0x3d, 0x3d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"red1", 0xff, 0x00, 0x00}, + {"", 0, 0, 0}, + {"grey14", 0x24, 0x24, 0x24}, + {"grey73", 0xba, 0xba, 0xba}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey23", 0x3b, 0x3b, 0x3b}, + {"grey7", 0x12, 0x12, 0x12}, + {"grey47", 0x78, 0x78, 0x78}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey13", 0x21, 0x21, 0x21}, + {"", 0, 0, 0}, + {"grey37", 0x5e, 0x5e, 0x5e}, + {"", 0, 0, 0}, + {"grey2", 0x05, 0x05, 0x05}, + {"grey42", 0x6b, 0x6b, 0x6b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey32", 0x52, 0x52, 0x52}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey77", 0xc4, 0xc4, 0xc4}, + {"grey1", 0x03, 0x03, 0x03}, + {"grey41", 0x69, 0x69, 0x69}, + {"", 0, 0, 0}, + {"grey27", 0x45, 0x45, 0x45}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey31", 0x4f, 0x4f, 0x4f}, + {"grey72", 0xb8, 0xb8, 0xb8}, + {"grey17", 0x2b, 0x2b, 0x2b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey22", 0x38, 0x38, 0x38}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey12", 0x1f, 0x1f, 0x1f}, + {"grey71", 0xb5, 0xb5, 0xb5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey21", 0x36, 0x36, 0x36}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey11", 0x1c, 0x1c, 0x1c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray4", 0x0a, 0x0a, 0x0a}, + {"gray44", 0x70, 0x70, 0x70}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray34", 0x57, 0x57, 0x57}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray3", 0x08, 0x08, 0x08}, + {"gray43", 0x6e, 0x6e, 0x6e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray33", 0x54, 0x54, 0x54}, + {"gray74", 0xbd, 0xbd, 0xbd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"snow4", 0x8b, 0x89, 0x89}, + {"gray24", 0x3d, 0x3d, 0x3d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray14", 0x24, 0x24, 0x24}, + {"gray73", 0xba, 0xba, 0xba}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"snow3", 0xcd, 0xc9, 0xc9}, + {"gray23", 0x3b, 0x3b, 0x3b}, + {"gray7", 0x12, 0x12, 0x12}, + {"gray47", 0x78, 0x78, 0x78}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray13", 0x21, 0x21, 0x21}, + {"", 0, 0, 0}, + {"gray37", 0x5e, 0x5e, 0x5e}, + {"", 0, 0, 0}, + {"gray2", 0x05, 0x05, 0x05}, + {"gray42", 0x6b, 0x6b, 0x6b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray32", 0x52, 0x52, 0x52}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray77", 0xc4, 0xc4, 0xc4}, + {"gray1", 0x03, 0x03, 0x03}, + {"gray41", 0x69, 0x69, 0x69}, + {"", 0, 0, 0}, + {"gray27", 0x45, 0x45, 0x45}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray31", 0x4f, 0x4f, 0x4f}, + {"gray72", 0xb8, 0xb8, 0xb8}, + {"gray17", 0x2b, 0x2b, 0x2b}, + {"", 0, 0, 0}, + {"snow2", 0xee, 0xe9, 0xe9}, + {"gray22", 0x38, 0x38, 0x38}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray12", 0x1f, 0x1f, 0x1f}, + {"gray71", 0xb5, 0xb5, 0xb5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"snow1", 0xff, 0xfa, 0xfa}, + {"gray21", 0x36, 0x36, 0x36}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray11", 0x1c, 0x1c, 0x1c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"green4", 0x00, 0x8b, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"springgreen4", 0x00, 0x8b, 0x45}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"green3", 0x00, 0xcd, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"springgreen3", 0x00, 0xcd, 0x66}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orange", 0xff, 0xa5, 0x00}, + {"orange4", 0x8b, 0x5a, 0x00}, + {"", 0, 0, 0}, + {"orangered", 0xff, 0x45, 0x00}, + {"orangered4", 0x8b, 0x25, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orangered3", 0xcd, 0x37, 0x00}, + {"", 0, 0, 0}, + {"orange3", 0xcd, 0x85, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"green2", 0x00, 0xee, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orangered2", 0xee, 0x40, 0x00}, + {"", 0, 0, 0}, + {"springgreen2", 0x00, 0xee, 0x76}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orangered1", 0xff, 0x45, 0x00}, + {"green1", 0x00, 0xff, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gold", 0xff, 0xd7, 0x00}, + {"gold4", 0x8b, 0x75, 0x00}, + {"", 0, 0, 0}, + {"springgreen1", 0x00, 0xff, 0x7f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orange2", 0xee, 0x9a, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gold3", 0xcd, 0xad, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orange1", 0xff, 0xa5, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"sienna4", 0x8b, 0x47, 0x26}, + {"", 0, 0, 0}, + {"seagreen4", 0x2e, 0x8b, 0x57}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkseagreen4", 0x69, 0x8b, 0x69}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"sienna3", 0xcd, 0x68, 0x39}, + {"", 0, 0, 0}, + {"seagreen3", 0x43, 0xcd, 0x80}, + {"gold2", 0xee, 0xc9, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkseagreen3", 0x9b, 0xcd, 0x9b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey", 0xbe, 0xbe, 0xbe}, + {"gold1", 0xff, 0xd7, 0x00}, + {"brown4", 0x8b, 0x23, 0x23}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"brown3", 0xcd, 0x33, 0x33}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"sienna2", 0xee, 0x79, 0x42}, + {"", 0, 0, 0}, + {"seagreen2", 0x4e, 0xee, 0x94}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkseagreen2", 0xb4, 0xee, 0xb4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"sienna1", 0xff, 0x82, 0x47}, + {"", 0, 0, 0}, + {"seagreen1", 0x54, 0xff, 0x9f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkseagreen1", 0xc1, 0xff, 0xc1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"brown2", 0xee, 0x3b, 0x3b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tan4", 0x8b, 0x5a, 0x2b}, + {"", 0, 0, 0}, + {"brown1", 0xff, 0x40, 0x40}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tan3", 0xcd, 0x85, 0x3f}, + {"green", 0x00, 0xff, 0x00}, + {"sienna", 0xa0, 0x52, 0x2d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkgreen", 0x00, 0x64, 0x00}, + {"", 0, 0, 0}, + {"springgreen", 0x00, 0xff, 0x7f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"blue", 0x00, 0x00, 0xff}, + {"blue4", 0x00, 0x00, 0x8b}, + {"bisque", 0xff, 0xe4, 0xc4}, + {"bisque4", 0x8b, 0x7d, 0x6b}, + {"", 0, 0, 0}, + {"tan2", 0xee, 0x9a, 0x49}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tan1", 0xff, 0xa5, 0x4f}, + {"blue3", 0x00, 0x00, 0xcd}, + {"", 0, 0, 0}, + {"bisque3", 0xcd, 0xb7, 0x9e}, + {"", 0, 0, 0}, + {"gray", 0xbe, 0xbe, 0xbe}, + {"darkorange", 0xff, 0x8c, 0x00}, + {"darkorange4", 0x8b, 0x45, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkorange3", 0xcd, 0x66, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkorange2", 0xee, 0x76, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"blue2", 0x00, 0x00, 0xee}, + {"darkorange1", 0xff, 0x7f, 0x00}, + {"bisque2", 0xee, 0xd5, 0xb7}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"forestgreen", 0x22, 0x8b, 0x22}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"blue1", 0x00, 0x00, 0xff}, + {"", 0, 0, 0}, + {"bisque1", 0xff, 0xe4, 0xc4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"seagreen", 0x2e, 0x8b, 0x57}, + {"sea green", 0x2e, 0x8b, 0x57}, + {"azure", 0xf0, 0xff, 0xff}, + {"azure4", 0x83, 0x8b, 0x8b}, + {"darkseagreen", 0x8f, 0xbc, 0x8f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"azure3", 0xc1, 0xcd, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkgoldenrod", 0xb8, 0x86, 0x0b}, + {"darkgoldenrod4", 0x8b, 0x65, 0x08}, + {"brown", 0xa5, 0x2a, 0x2a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slategray4", 0x6c, 0x7b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkgoldenrod3", 0xcd, 0x95, 0x0c}, + {"slategray3", 0x9f, 0xb6, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"azure2", 0xe0, 0xee, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slategray2", 0xb9, 0xd3, 0xee}, + {"", 0, 0, 0}, + {"maroon4", 0x8b, 0x1c, 0x62}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slategray1", 0xc6, 0xe2, 0xff}, + {"azure1", 0xf0, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"maroon3", 0xcd, 0x29, 0x90}, + {"", 0, 0, 0}, + {"darkgoldenrod2", 0xee, 0xad, 0x0e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tan", 0xd2, 0xb4, 0x8c}, + {"darkgoldenrod1", 0xff, 0xb9, 0x0f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"salmon4", 0x8b, 0x4c, 0x39}, + {"", 0, 0, 0}, + {"goldenrod", 0xda, 0xa5, 0x20}, + {"goldenrod4", 0x8b, 0x69, 0x14}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"goldenrod3", 0xcd, 0x9b, 0x1d}, + {"saddlebrown", 0x8b, 0x45, 0x13}, + {"salmon3", 0xcd, 0x70, 0x54}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"maroon2", 0xee, 0x30, 0xa7}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"goldenrod2", 0xee, 0xb4, 0x22}, + {"", 0, 0, 0}, + {"maroon1", 0xff, 0x34, 0xb3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"goldenrod1", 0xff, 0xc1, 0x25}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"darkmagenta", 0x8b, 0x00, 0x8b}, + {"salmon2", 0xee, 0x82, 0x62}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark red", 0x8b, 0x00, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"salmon1", 0xff, 0x8c, 0x69}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkgrey", 0xa9, 0xa9, 0xa9}, + {"", 0, 0, 0}, + {"lightgreen", 0x90, 0xee, 0x90}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkblue", 0x00, 0x00, 0x8b}, + {"", 0, 0, 0}, + {"dodgerblue", 0x1e, 0x90, 0xff}, + {"dodgerblue4", 0x10, 0x4e, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dodgerblue3", 0x18, 0x74, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mistyrose", 0xff, 0xe4, 0xe1}, + {"mistyrose4", 0x8b, 0x7d, 0x7b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mistyrose3", 0xcd, 0xb7, 0xb5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dodgerblue2", 0x1c, 0x86, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dodgerblue1", 0x1e, 0x90, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mistyrose2", 0xee, 0xd5, 0xd2}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mistyrose1", 0xff, 0xe4, 0xe1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"magenta4", 0x8b, 0x00, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"magenta3", 0xcd, 0x00, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tomato4", 0x8b, 0x36, 0x26}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"maroon", 0xb0, 0x30, 0x60}, + {"tomato3", 0xcd, 0x4f, 0x39}, + {"darkgray", 0xa9, 0xa9, 0xa9}, + {"slategrey", 0x70, 0x80, 0x90}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"magenta2", 0xee, 0x00, 0xee}, + {"slateblue", 0x6a, 0x5a, 0xcd}, + {"slateblue4", 0x47, 0x3c, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slateblue3", 0x69, 0x59, 0xcd}, + {"salmon", 0xfa, 0x80, 0x72}, + {"", 0, 0, 0}, + {"magenta1", 0xff, 0x00, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tomato2", 0xee, 0x5c, 0x42}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slateblue2", 0x7a, 0x67, 0xee}, + {"", 0, 0, 0}, + {"tomato1", 0xff, 0x63, 0x47}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slateblue1", 0x83, 0x6f, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"magenta", 0xff, 0x00, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"beige", 0xf5, 0xf5, 0xdc}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark green", 0x00, 0x64, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"slategray", 0x70, 0x80, 0x90}, + {"linen", 0xfa, 0xf0, 0xe6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"tomato", 0xff, 0x63, 0x47}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orange red", 0xff, 0x45, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dimgrey", 0x69, 0x69, 0x69}, + {"dim grey", 0x69, 0x69, 0x69}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"limegreen", 0x32, 0xcd, 0x32}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dodger blue", 0x1e, 0x90, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darksalmon", 0xe9, 0x96, 0x7a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"steelblue", 0x46, 0x82, 0xb4}, + {"steelblue4", 0x36, 0x64, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"steelblue3", 0x4f, 0x94, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightseagreen", 0x20, 0xb2, 0xaa}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkslateblue", 0x48, 0x3d, 0x8b}, + {"", 0, 0, 0}, + {"steelblue2", 0x5c, 0xac, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"steelblue1", 0x63, 0xb8, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightgoldenrod", 0xee, 0xdd, 0x82}, + {"lightgoldenrod4", 0x8b, 0x81, 0x4c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dimgray", 0x69, 0x69, 0x69}, + {"dim gray", 0x69, 0x69, 0x69}, + {"darkslategray4", 0x52, 0x8b, 0x8b}, + {"lightgoldenrod3", 0xcd, 0xbe, 0x70}, + {"", 0, 0, 0}, + {"skyblue", 0x87, 0xce, 0xeb}, + {"skyblue4", 0x4a, 0x70, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"sky blue", 0x87, 0xce, 0xeb}, + {"darkslategray3", 0x79, 0xcd, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"skyblue3", 0x6c, 0xa6, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightgoldenrod2", 0xee, 0xdc, 0x82}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey94", 0xf0, 0xf0, 0xf0}, + {"grey64", 0xa3, 0xa3, 0xa3}, + {"", 0, 0, 0}, + {"darkslategray2", 0x8d, 0xee, 0xee}, + {"lightgoldenrod1", 0xff, 0xec, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"skyblue2", 0x7e, 0xc0, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey93", 0xed, 0xed, 0xed}, + {"grey63", 0xa1, 0xa1, 0xa1}, + {"", 0, 0, 0}, + {"darkslategray1", 0x97, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"skyblue1", 0x87, 0xce, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightsalmon4", 0x8b, 0x57, 0x42}, + {"olivedrab4", 0x69, 0x8b, 0x22}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark orange", 0xff, 0x8c, 0x00}, + {"olivedrab", 0x6b, 0x8e, 0x23}, + {"olivedrab3", 0x9a, 0xcd, 0x32}, + {"", 0, 0, 0}, + {"slate grey", 0x70, 0x80, 0x90}, + {"", 0, 0, 0}, + {"lightsalmon3", 0xcd, 0x81, 0x62}, + {"grey97", 0xf7, 0xf7, 0xf7}, + {"grey67", 0xab, 0xab, 0xab}, + {"black", 0x00, 0x00, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey92", 0xeb, 0xeb, 0xeb}, + {"grey62", 0x9e, 0x9e, 0x9e}, + {"olivedrab2", 0xb3, 0xee, 0x3a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deepskyblue", 0x00, 0xbf, 0xff}, + {"deepskyblue4", 0x00, 0x68, 0x8b}, + {"olivedrab1", 0xc0, 0xff, 0x3e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey91", 0xe8, 0xe8, 0xe8}, + {"grey61", 0x9c, 0x9c, 0x9c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deepskyblue3", 0x00, 0x9a, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightsalmon2", 0xee, 0x95, 0x72}, + {"", 0, 0, 0}, + {"lightgrey", 0xd3, 0xd3, 0xd3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightsalmon1", 0xff, 0xa0, 0x7a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey84", 0xd6, 0xd6, 0xd6}, + {"indianred", 0xcd, 0x5c, 0x5c}, + {"indianred4", 0x8b, 0x3a, 0x3a}, + {"lightblue", 0xad, 0xd8, 0xe6}, + {"lightblue4", 0x68, 0x83, 0x8b}, + {"gray94", 0xf0, 0xf0, 0xf0}, + {"gray64", 0xa3, 0xa3, 0xa3}, + {"indianred3", 0xcd, 0x55, 0x55}, + {"", 0, 0, 0}, + {"lightblue3", 0x9a, 0xc0, 0xcd}, + {"grey83", 0xd4, 0xd4, 0xd4}, + {"deepskyblue2", 0x00, 0xb2, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"snow", 0xff, 0xfa, 0xfa}, + {"gray93", 0xed, 0xed, 0xed}, + {"gray63", 0xa1, 0xa1, 0xa1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deepskyblue1", 0x00, 0xbf, 0xff}, + {"indianred2", 0xee, 0x63, 0x63}, + {"", 0, 0, 0}, + {"lightblue2", 0xb2, 0xdf, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"indianred1", 0xff, 0x6a, 0x6a}, + {"dark goldenrod", 0xb8, 0x86, 0x0b}, + {"lightblue1", 0xbf, 0xef, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey87", 0xde, 0xde, 0xde}, + {"", 0, 0, 0}, + {"slate gray", 0x70, 0x80, 0x90}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray97", 0xf7, 0xf7, 0xf7}, + {"gray67", 0xab, 0xab, 0xab}, + {"", 0, 0, 0}, + {"grey82", 0xd1, 0xd1, 0xd1}, + {"dark magenta", 0x8b, 0x00, 0x8b}, + {"darkturquoise", 0x00, 0xce, 0xd1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray92", 0xeb, 0xeb, 0xeb}, + {"gray62", 0x9e, 0x9e, 0x9e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey81", 0xcf, 0xcf, 0xcf}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray91", 0xe8, 0xe8, 0xe8}, + {"gray61", 0x9c, 0x9c, 0x9c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gainsboro", 0xdc, 0xdc, 0xdc}, + {"", 0, 0, 0}, + {"lightgray", 0xd3, 0xd3, 0xd3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"wheat4", 0x8b, 0x7e, 0x66}, + {"darkslategrey", 0x2f, 0x4f, 0x4f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray84", 0xd6, 0xd6, 0xd6}, + {"wheat3", 0xcd, 0xba, 0x96}, + {"", 0, 0, 0}, + {"violetred", 0xd0, 0x20, 0x90}, + {"violetred4", 0x8b, 0x22, 0x52}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"violetred3", 0xcd, 0x32, 0x78}, + {"gray83", 0xd4, 0xd4, 0xd4}, + {"spring green", 0x00, 0xff, 0x7f}, + {"grey54", 0x8a, 0x8a, 0x8a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey53", 0x87, 0x87, 0x87}, + {"", 0, 0, 0}, + {"violetred2", 0xee, 0x3a, 0x8c}, + {"lightsalmon", 0xff, 0xa0, 0x7a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"violetred1", 0xff, 0x3e, 0x96}, + {"", 0, 0, 0}, + {"wheat2", 0xee, 0xd8, 0xae}, + {"gray87", 0xde, 0xde, 0xde}, + {"royalblue", 0x41, 0x69, 0xe1}, + {"royalblue4", 0x27, 0x40, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"royalblue3", 0x3a, 0x5f, 0xcd}, + {"gray82", 0xd1, 0xd1, 0xd1}, + {"wheat1", 0xff, 0xe7, 0xba}, + {"", 0, 0, 0}, + {"ivory4", 0x8b, 0x8b, 0x83}, + {"grey57", 0x91, 0x91, 0x91}, + {"", 0, 0, 0}, + {"lightskyblue", 0x87, 0xce, 0xfa}, + {"lightskyblue4", 0x60, 0x7b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray81", 0xcf, 0xcf, 0xcf}, + {"", 0, 0, 0}, + {"grey52", 0x85, 0x85, 0x85}, + {"ivory3", 0xcd, 0xcd, 0xc1}, + {"royalblue2", 0x43, 0x6e, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightskyblue3", 0x8d, 0xb6, 0xcd}, + {"dark grey", 0xa9, 0xa9, 0xa9}, + {"royalblue1", 0x48, 0x76, 0xff}, + {"light green", 0x90, 0xee, 0x90}, + {"forest green", 0x22, 0x8b, 0x22}, + {"grey51", 0x82, 0x82, 0x82}, + {"", 0, 0, 0}, + {"cyan4", 0x00, 0x8b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"saddle brown", 0x8b, 0x45, 0x13}, + {"darkslategray", 0x2f, 0x4f, 0x4f}, + {"dark blue", 0x00, 0x00, 0x8b}, + {"cyan3", 0x00, 0xcd, 0xcd}, + {"", 0, 0, 0}, + {"lightyellow4", 0x8b, 0x8b, 0x7a}, + {"", 0, 0, 0}, + {"lightsteelblue", 0xb0, 0xc4, 0xde}, + {"lightsteelblue4", 0x6e, 0x7b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"ivory2", 0xee, 0xee, 0xe0}, + {"misty rose", 0xff, 0xe4, 0xe1}, + {"", 0, 0, 0}, + {"lightyellow3", 0xcd, 0xcd, 0xb4}, + {"lightskyblue2", 0xa4, 0xd3, 0xee}, + {"", 0, 0, 0}, + {"lightsteelblue3", 0xa2, 0xb5, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray54", 0x8a, 0x8a, 0x8a}, + {"ivory1", 0xff, 0xff, 0xf0}, + {"lime green", 0x32, 0xcd, 0x32}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightskyblue1", 0xb0, 0xe2, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray53", 0x87, 0x87, 0x87}, + {"", 0, 0, 0}, + {"cyan2", 0x00, 0xee, 0xee}, + {"rosybrown4", 0x8b, 0x69, 0x69}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"rosybrown3", 0xcd, 0x9b, 0x9b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cyan1", 0x00, 0xff, 0xff}, + {"", 0, 0, 0}, + {"lightyellow2", 0xee, 0xee, 0xd1}, + {"", 0, 0, 0}, + {"mediumseagreen", 0x3c, 0xb3, 0x71}, + {"lightsteelblue2", 0xbc, 0xd2, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lavender", 0xe6, 0xe6, 0xfa}, + {"", 0, 0, 0}, + {"gray57", 0x91, 0x91, 0x91}, + {"rosybrown2", 0xee, 0xb4, 0xb4}, + {"lightyellow1", 0xff, 0xff, 0xe0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightsteelblue1", 0xca, 0xe1, 0xff}, + {"rosybrown1", 0xff, 0xc1, 0xc1}, + {"", 0, 0, 0}, + {"gray52", 0x85, 0x85, 0x85}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark gray", 0xa9, 0xa9, 0xa9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray51", 0x82, 0x82, 0x82}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"wheat", 0xf5, 0xde, 0xb3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"khaki4", 0x8b, 0x86, 0x4e}, + {"slate blue", 0x6a, 0x5a, 0xcd}, + {"violet", 0xee, 0x82, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"khaki3", 0xcd, 0xc6, 0x73}, + {"light grey", 0xd3, 0xd3, 0xd3}, + {"", 0, 0, 0}, + {"oldlace", 0xfd, 0xf5, 0xe6}, + {"", 0, 0, 0}, + {"navy", 0x00, 0x00, 0x80}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark salmon", 0xe9, 0x96, 0x7a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pink4", 0x8b, 0x63, 0x6c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"seashell4", 0x8b, 0x86, 0x82}, + {"pink3", 0xcd, 0x91, 0x9e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"khaki2", 0xee, 0xe6, 0x85}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"seashell3", 0xcd, 0xc5, 0xbf}, + {"", 0, 0, 0}, + {"coral4", 0x8b, 0x3e, 0x2f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"khaki1", 0xff, 0xf6, 0x8f}, + {"thistle", 0xd8, 0xbf, 0xd8}, + {"thistle4", 0x8b, 0x7b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"coral3", 0xcd, 0x5b, 0x45}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"thistle3", 0xcd, 0xb5, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pink2", 0xee, 0xa9, 0xb8}, + {"sandy brown", 0xf4, 0xa4, 0x60}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cyan", 0x00, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"seashell2", 0xee, 0xe5, 0xde}, + {"pink1", 0xff, 0xb5, 0xc5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"purple", 0xa0, 0x20, 0xf0}, + {"purple4", 0x55, 0x1a, 0x8b}, + {"", 0, 0, 0}, + {"seashell1", 0xff, 0xf5, 0xee}, + {"", 0, 0, 0}, + {"coral2", 0xee, 0x6a, 0x50}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light gray", 0xd3, 0xd3, 0xd3}, + {"thistle2", 0xee, 0xd2, 0xee}, + {"purple3", 0x7d, 0x26, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"coral1", 0xff, 0x72, 0x56}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"thistle1", 0xff, 0xe1, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumblue", 0x00, 0x00, 0xcd}, + {"", 0, 0, 0}, + {"turquoise", 0x40, 0xe0, 0xd0}, + {"turquoise4", 0x00, 0x86, 0x8b}, + {"", 0, 0, 0}, + {"rosybrown", 0xbc, 0x8f, 0x8f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"turquoise3", 0x00, 0xc5, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"purple2", 0x91, 0x2c, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"turquoise2", 0x00, 0xe5, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"purple1", 0x9b, 0x30, 0xff}, + {"turquoise1", 0x00, 0xf5, 0xff}, + {"", 0, 0, 0}, + {"steel blue", 0x46, 0x82, 0xb4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light sea green", 0x20, 0xb2, 0xaa}, + {"", 0, 0, 0}, + {"aliceblue", 0xf0, 0xf8, 0xff}, + {"ivory", 0xff, 0xff, 0xf0}, + {"", 0, 0, 0}, + {"burlywood", 0xde, 0xb8, 0x87}, + {"burlywood4", 0x8b, 0x73, 0x55}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"burlywood3", 0xcd, 0xaa, 0x7d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"burlywood2", 0xee, 0xc5, 0x91}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"burlywood1", 0xff, 0xd3, 0x9b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"peru", 0xcd, 0x85, 0x3f}, + {"plum4", 0x8b, 0x66, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"plum3", 0xcd, 0x96, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightslategrey", 0x77, 0x88, 0x99}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightslateblue", 0x84, 0x70, 0xff}, + {"lawngreen", 0x7c, 0xfc, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"old lace", 0xfd, 0xf5, 0xe6}, + {"", 0, 0, 0}, + {"plum2", 0xee, 0xae, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"olive drab", 0x6b, 0x8e, 0x23}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"plum1", 0xff, 0xbb, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palegreen4", 0x54, 0x8b, 0x54}, + {"medium sea green", 0x3c, 0xb3, 0x71}, + {"", 0, 0, 0}, + {"seashell", 0xff, 0xf5, 0xee}, + {"", 0, 0, 0}, + {"palegreen3", 0x7c, 0xcd, 0x7c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"coral", 0xff, 0x7f, 0x50}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"yellow4", 0x8b, 0x8b, 0x00}, + {"", 0, 0, 0}, + {"palegreen2", 0x90, 0xee, 0x90}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palegreen1", 0x9a, 0xff, 0x9a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"yellow3", 0xcd, 0xcd, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"indian red", 0xcd, 0x5c, 0x5c}, + {"lightslategray", 0x77, 0x88, 0x99}, + {"light blue", 0xad, 0xd8, 0xe6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"navyblue", 0x00, 0x00, 0x80}, + {"dark sea green", 0x8f, 0xbc, 0x8f}, + {"", 0, 0, 0}, + {"medium blue", 0x00, 0x00, 0xcd}, + {"", 0, 0, 0}, + {"yellow2", 0xee, 0xee, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"yellow1", 0xff, 0xff, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light goldenrod", 0xee, 0xdd, 0x82}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"white", 0xff, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark slate grey", 0x2f, 0x4f, 0x4f}, + {"", 0, 0, 0}, + {"light salmon", 0xff, 0xa0, 0x7a}, + {"aquamarine", 0x7f, 0xff, 0xd4}, + {"aquamarine4", 0x45, 0x8b, 0x74}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"aquamarine3", 0x66, 0xcd, 0xaa}, + {"violet red", 0xd0, 0x20, 0x90}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark slate blue", 0x48, 0x3d, 0x8b}, + {"sandybrown", 0xf4, 0xa4, 0x60}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"plum", 0xdd, 0xa0, 0xdd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"aquamarine2", 0x76, 0xee, 0xc6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"aquamarine1", 0x7f, 0xff, 0xd4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"chartreuse", 0x7f, 0xff, 0x00}, + {"chartreuse4", 0x45, 0x8b, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"royal blue", 0x41, 0x69, 0xe1}, + {"chartreuse3", 0x66, 0xcd, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palegreen", 0x98, 0xfb, 0x98}, + {"mediumslateblue", 0x7b, 0x68, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"chartreuse2", 0x76, 0xee, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pink", 0xff, 0xc0, 0xcb}, + {"", 0, 0, 0}, + {"chartreuse1", 0x7f, 0xff, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"yellowgreen", 0x9a, 0xcd, 0x32}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark slate gray", 0x2f, 0x4f, 0x4f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"rosy brown", 0xbc, 0x8f, 0x8f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"chocolate", 0xd2, 0x69, 0x1e}, + {"chocolate4", 0x8b, 0x45, 0x13}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"chocolate3", 0xcd, 0x66, 0x1d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkcyan", 0x00, 0x8b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palegoldenrod", 0xee, 0xe8, 0xaa}, + {"", 0, 0, 0}, + {"chocolate2", 0xee, 0x76, 0x21}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"chocolate1", 0xff, 0x7f, 0x24}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"grey9", 0x17, 0x17, 0x17}, + {"grey49", 0x7d, 0x7d, 0x7d}, + {"grey6", 0x0f, 0x0f, 0x0f}, + {"grey46", 0x75, 0x75, 0x75}, + {"cadetblue", 0x5f, 0x9e, 0xa0}, + {"cadetblue4", 0x53, 0x86, 0x8b}, + {"grey39", 0x63, 0x63, 0x63}, + {"", 0, 0, 0}, + {"grey36", 0x5c, 0x5c, 0x5c}, + {"", 0, 0, 0}, + {"cadetblue3", 0x7a, 0xc5, 0xcd}, + {"", 0, 0, 0}, + {"greenyellow", 0xad, 0xff, 0x2f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey79", 0xc9, 0xc9, 0xc9}, + {"", 0, 0, 0}, + {"grey76", 0xc2, 0xc2, 0xc2}, + {"midnightblue", 0x19, 0x19, 0x70}, + {"grey29", 0x4a, 0x4a, 0x4a}, + {"", 0, 0, 0}, + {"grey26", 0x42, 0x42, 0x42}, + {"", 0, 0, 0}, + {"cadetblue2", 0x8e, 0xe5, 0xee}, + {"grey19", 0x30, 0x30, 0x30}, + {"", 0, 0, 0}, + {"grey16", 0x29, 0x29, 0x29}, + {"", 0, 0, 0}, + {"cadetblue1", 0x98, 0xf5, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lawn green", 0x7c, 0xfc, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightcoral", 0xf0, 0x80, 0x80}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"orchid", 0xda, 0x70, 0xd6}, + {"orchid4", 0x8b, 0x47, 0x89}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray9", 0x17, 0x17, 0x17}, + {"gray49", 0x7d, 0x7d, 0x7d}, + {"gray6", 0x0f, 0x0f, 0x0f}, + {"gray46", 0x75, 0x75, 0x75}, + {"", 0, 0, 0}, + {"orchid3", 0xcd, 0x69, 0xc9}, + {"gray39", 0x63, 0x63, 0x63}, + {"", 0, 0, 0}, + {"gray36", 0x5c, 0x5c, 0x5c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray79", 0xc9, 0xc9, 0xc9}, + {"", 0, 0, 0}, + {"gray76", 0xc2, 0xc2, 0xc2}, + {"", 0, 0, 0}, + {"gray29", 0x4a, 0x4a, 0x4a}, + {"", 0, 0, 0}, + {"gray26", 0x42, 0x42, 0x42}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray19", 0x30, 0x30, 0x30}, + {"", 0, 0, 0}, + {"gray16", 0x29, 0x29, 0x29}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumorchid", 0xba, 0x55, 0xd3}, + {"mediumorchid4", 0x7a, 0x37, 0x8b}, + {"mintcream", 0xf5, 0xff, 0xfa}, + {"orchid2", 0xee, 0x7a, 0xe9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lavenderblush4", 0x8b, 0x83, 0x86}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumorchid3", 0xb4, 0x52, 0xcd}, + {"", 0, 0, 0}, + {"orchid1", 0xff, 0x83, 0xfa}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lavenderblush3", 0xcd, 0xc1, 0xc5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"khaki", 0xf0, 0xe6, 0x8c}, + {"", 0, 0, 0}, + {"alice blue", 0xf0, 0xf8, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark turquoise", 0x00, 0xce, 0xd1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey8", 0x14, 0x14, 0x14}, + {"grey48", 0x7a, 0x7a, 0x7a}, + {"", 0, 0, 0}, + {"mediumorchid2", 0xd1, 0x5f, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey38", 0x61, 0x61, 0x61}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lavenderblush2", 0xee, 0xe0, 0xe5}, + {"grey0", 0x00, 0x00, 0x00}, + {"grey40", 0x66, 0x66, 0x66}, + {"", 0, 0, 0}, + {"mediumorchid1", 0xe0, 0x66, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey30", 0x4d, 0x4d, 0x4d}, + {"grey78", 0xc7, 0xc7, 0xc7}, + {"", 0, 0, 0}, + {"lavenderblush1", 0xff, 0xf0, 0xf5}, + {"", 0, 0, 0}, + {"grey28", 0x47, 0x47, 0x47}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey18", 0x2e, 0x2e, 0x2e}, + {"grey70", 0xb3, 0xb3, 0xb3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightcyan4", 0x7a, 0x8b, 0x8b}, + {"grey20", 0x33, 0x33, 0x33}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightcyan3", 0xb4, 0xcd, 0xcd}, + {"grey10", 0x1a, 0x1a, 0x1a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightcyan2", 0xd1, 0xee, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightcyan1", 0xe0, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkviolet", 0x94, 0x00, 0xd3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumspringgreen", 0x00, 0xfa, 0x9a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightgoldenrodyellow", 0xfa, 0xfa, 0xd2}, + {"", 0, 0, 0}, + {"darkolivegreen4", 0x6e, 0x8b, 0x3d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightyellow", 0xff, 0xff, 0xe0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkolivegreen3", 0xa2, 0xcd, 0x5a}, + {"", 0, 0, 0}, + {"gray8", 0x14, 0x14, 0x14}, + {"gray48", 0x7a, 0x7a, 0x7a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pale green", 0x98, 0xfb, 0x98}, + {"gray38", 0x61, 0x61, 0x61}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray0", 0x00, 0x00, 0x00}, + {"gray40", 0x66, 0x66, 0x66}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray30", 0x4d, 0x4d, 0x4d}, + {"gray78", 0xc7, 0xc7, 0xc7}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"honeydew4", 0x83, 0x8b, 0x83}, + {"gray28", 0x47, 0x47, 0x47}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray18", 0x2e, 0x2e, 0x2e}, + {"gray70", 0xb3, 0xb3, 0xb3}, + {"darkolivegreen2", 0xbc, 0xee, 0x68}, + {"", 0, 0, 0}, + {"honeydew3", 0xc1, 0xcd, 0xc1}, + {"gray20", 0x33, 0x33, 0x33}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray10", 0x1a, 0x1a, 0x1a}, + {"", 0, 0, 0}, + {"darkolivegreen1", 0xca, 0xff, 0x70}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"mediumturquoise", 0x48, 0xd1, 0xcc}, + {"navy blue", 0x00, 0x00, 0x80}, + {"honeydew2", 0xe0, 0xee, 0xe0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"honeydew1", 0xf0, 0xff, 0xf0}, + {"light slate grey", 0x77, 0x88, 0x99}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"medium orchid", 0xba, 0x55, 0xd3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey5", 0x0d, 0x0d, 0x0d}, + {"grey45", 0x73, 0x73, 0x73}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightcyan", 0xe0, 0xff, 0xff}, + {"grey35", 0x59, 0x59, 0x59}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"grey75", 0xbf, 0xbf, 0xbf}, + {"", 0, 0, 0}, + {"deep sky blue", 0x00, 0xbf, 0xff}, + {"", 0, 0, 0}, + {"grey25", 0x40, 0x40, 0x40}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey15", 0x26, 0x26, 0x26}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumpurple", 0x93, 0x70, 0xdb}, + {"mediumpurple4", 0x5d, 0x47, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"hotpink4", 0x8b, 0x3a, 0x62}, + {"darkolivegreen", 0x55, 0x6b, 0x2f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light slate gray", 0x77, 0x88, 0x99}, + {"", 0, 0, 0}, + {"mediumpurple3", 0x89, 0x68, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"hotpink3", 0xcd, 0x60, 0x90}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"blanchedalmond", 0xff, 0xeb, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumpurple2", 0x9f, 0x79, 0xee}, + {"gray5", 0x0d, 0x0d, 0x0d}, + {"gray45", 0x73, 0x73, 0x73}, + {"hotpink2", 0xee, 0x6a, 0xa7}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light sky blue", 0x87, 0xce, 0xfa}, + {"gray35", 0x59, 0x59, 0x59}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumpurple1", 0xab, 0x82, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"hotpink1", 0xff, 0x6e, 0xb4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray75", 0xbf, 0xbf, 0xbf}, + {"", 0, 0, 0}, + {"firebrick4", 0x8b, 0x1a, 0x1a}, + {"", 0, 0, 0}, + {"gray25", 0x40, 0x40, 0x40}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"firebrick3", 0xcd, 0x26, 0x26}, + {"", 0, 0, 0}, + {"gray15", 0x26, 0x26, 0x26}, + {"light steel blue", 0xb0, 0xc4, 0xde}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mint cream", 0xf5, 0xff, 0xfa}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"firebrick2", 0xee, 0x2c, 0x2c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"firebrick1", 0xff, 0x30, 0x30}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark cyan", 0x00, 0x8b, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pale goldenrod", 0xee, 0xe8, 0xaa}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumaquamarine", 0x66, 0xcd, 0xaa}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"paleturquoise", 0xaf, 0xee, 0xee}, + {"paleturquoise4", 0x66, 0x8b, 0x8b}, + {"", 0, 0, 0}, + {"light coral", 0xf0, 0x80, 0x80}, + {"medium slate blue", 0x7b, 0x68, 0xee}, + {"", 0, 0, 0}, + {"whitesmoke", 0xf5, 0xf5, 0xf5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"paleturquoise3", 0x96, 0xcd, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cadet blue", 0x5f, 0x9e, 0xa0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"antiquewhite", 0xfa, 0xeb, 0xd7}, + {"antiquewhite4", 0x8b, 0x83, 0x78}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"blueviolet", 0x8a, 0x2b, 0xe2}, + {"antique white", 0xfa, 0xeb, 0xd7}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"antiquewhite3", 0xcd, 0xc0, 0xb0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"paleturquoise2", 0xae, 0xee, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"paleturquoise1", 0xbb, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"yellow", 0xff, 0xff, 0x00}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"moccasin", 0xff, 0xe4, 0xb5}, + {"deeppink4", 0x8b, 0x0a, 0x50}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"antiquewhite2", 0xee, 0xdf, 0xcc}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deeppink3", 0xcd, 0x10, 0x76}, + {"yellow green", 0x9a, 0xcd, 0x32}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light slate blue", 0x84, 0x70, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"antiquewhite1", 0xff, 0xef, 0xdb}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cornsilk4", 0x8b, 0x88, 0x78}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark orchid", 0x99, 0x32, 0xcc}, + {"cornsilk3", 0xcd, 0xc8, 0xb1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deeppink2", 0xee, 0x12, 0x89}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deeppink1", 0xff, 0x14, 0x93}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cornsilk2", 0xee, 0xe8, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light goldenrod yellow", 0xfa, 0xfa, 0xd2}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cornsilk1", 0xff, 0xf8, 0xdc}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"white smoke", 0xf5, 0xf5, 0xf5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light cyan", 0xe0, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"mediumvioletred", 0xc7, 0x15, 0x85}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"powderblue", 0xb0, 0xe0, 0xe6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"medium aquamarine", 0x66, 0xcd, 0xaa}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark violet", 0x94, 0x00, 0xd3}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"dark olive green", 0x55, 0x6b, 0x2f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkorchid", 0x99, 0x32, 0xcc}, + {"darkorchid4", 0x68, 0x22, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkorchid3", 0x9a, 0x32, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkorchid2", 0xb2, 0x3a, 0xee}, + {"hotpink", 0xff, 0x69, 0xb4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkorchid1", 0xbf, 0x3e, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lavenderblush", 0xff, 0xf0, 0xf5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"floral white", 0xff, 0xfa, 0xf0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"firebrick", 0xb2, 0x22, 0x22}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey99", 0xfc, 0xfc, 0xfc}, + {"grey69", 0xb0, 0xb0, 0xb0}, + {"grey96", 0xf5, 0xf5, 0xf5}, + {"grey66", 0xa8, 0xa8, 0xa8}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"midnight blue", 0x19, 0x19, 0x70}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"ghostwhite", 0xf8, 0xf8, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"powder blue", 0xb0, 0xe0, 0xe6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey89", 0xe3, 0xe3, 0xe3}, + {"", 0, 0, 0}, + {"grey86", 0xdb, 0xdb, 0xdb}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray99", 0xfc, 0xfc, 0xfc}, + {"gray69", 0xb0, 0xb0, 0xb0}, + {"gray96", 0xf5, 0xf5, 0xf5}, + {"gray66", 0xa8, 0xa8, 0xa8}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightpink4", 0x8b, 0x5f, 0x65}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightpink3", 0xcd, 0x8c, 0x95}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"floralwhite", 0xff, 0xfa, 0xf0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lightpink2", 0xee, 0xa2, 0xad}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"deeppink", 0xff, 0x14, 0x93}, + {"", 0, 0, 0}, + {"lightpink1", 0xff, 0xae, 0xb9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cornsilk", 0xff, 0xf8, 0xdc}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey98", 0xfa, 0xfa, 0xfa}, + {"grey68", 0xad, 0xad, 0xad}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray89", 0xe3, 0xe3, 0xe3}, + {"", 0, 0, 0}, + {"gray86", 0xdb, 0xdb, 0xdb}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey90", 0xe5, 0xe5, 0xe5}, + {"grey60", 0x99, 0x99, 0x99}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey59", 0x96, 0x96, 0x96}, + {"", 0, 0, 0}, + {"grey56", 0x8f, 0x8f, 0x8f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"blanched almond", 0xff, 0xeb, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cornflowerblue", 0x64, 0x95, 0xed}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"cornflower blue", 0x64, 0x95, 0xed}, + {"", 0, 0, 0}, + {"dark khaki", 0xbd, 0xb7, 0x6b}, + {"blue violet", 0x8a, 0x2b, 0xe2}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey88", 0xe0, 0xe0, 0xe0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray98", 0xfa, 0xfa, 0xfa}, + {"gray68", 0xad, 0xad, 0xad}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey80", 0xcc, 0xcc, 0xcc}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"honeydew", 0xf0, 0xff, 0xf0}, + {"gray90", 0xe5, 0xe5, 0xe5}, + {"gray60", 0x99, 0x99, 0x99}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray59", 0x96, 0x96, 0x96}, + {"", 0, 0, 0}, + {"gray56", 0x8f, 0x8f, 0x8f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey100", 0xff, 0xff, 0xff}, + {"medium purple", 0x93, 0x70, 0xdb}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"medium turquoise", 0x48, 0xd1, 0xcc}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray88", 0xe0, 0xe0, 0xe0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"green yellow", 0xad, 0xff, 0x2f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray80", 0xcc, 0xcc, 0xcc}, + {"", 0, 0, 0}, + {"grey58", 0x94, 0x94, 0x94}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey50", 0x7f, 0x7f, 0x7f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey95", 0xf2, 0xf2, 0xf2}, + {"grey65", 0xa6, 0xa6, 0xa6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"gray100", 0xff, 0xff, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"darkkhaki", 0xbd, 0xb7, 0x6b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray58", 0x94, 0x94, 0x94}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray50", 0x7f, 0x7f, 0x7f}, + {"", 0, 0, 0}, + {"grey85", 0xd9, 0xd9, 0xd9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray95", 0xf2, 0xf2, 0xf2}, + {"gray65", 0xa6, 0xa6, 0xa6}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"ghost white", 0xf8, 0xf8, 0xff}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"palevioletred", 0xdb, 0x70, 0x93}, + {"palevioletred4", 0x8b, 0x47, 0x5d}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palevioletred3", 0xcd, 0x68, 0x89}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palevioletred2", 0xee, 0x79, 0x9f}, + {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray85", 0xd9, 0xd9, 0xd9}, + {"", 0, 0, 0}, + {"lightpink", 0xff, 0xb6, 0xc1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"palevioletred1", 0xff, 0x82, 0xab}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"grey55", 0x8c, 0x8c, 0x8c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"navajo white", 0xff, 0xde, 0xad}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"light yellow", 0xff, 0xff, 0xe0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pale turquoise", 0xaf, 0xee, 0xee}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"medium spring green", 0x00, 0xfa, 0x9a}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"gray55", 0x8c, 0x8c, 0x8c}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lemonchiffon4", 0x8b, 0x89, 0x70}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lemonchiffon3", 0xcd, 0xc9, 0xa5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"light pink", 0xff, 0xb6, 0xc1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lemonchiffon2", 0xee, 0xe9, 0xbf}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lemonchiffon1", 0xff, 0xfa, 0xcd}, + {"deep pink", 0xff, 0x14, 0x93}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"navajowhite", 0xff, 0xde, 0xad}, + {"navajowhite4", 0x8b, 0x79, 0x5e}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"navajowhite3", 0xcd, 0xb3, 0x8b}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, + {"peachpuff4", 0x8b, 0x77, 0x65}, + {"navajowhite2", 0xee, 0xcf, 0xa1}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"peachpuff3", 0xcd, 0xaf, 0x95}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"navajowhite1", 0xff, 0xde, 0xad}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"peachpuff2", 0xee, 0xcb, 0xad}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"peachpuff1", 0xff, 0xda, 0xb9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lemonchiffon", 0xff, 0xfa, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"peachpuff", 0xff, 0xda, 0xb9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lavender blush", 0xff, 0xf0, 0xf5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"medium violet red", 0xc7, 0x15, 0x85}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"hot pink", 0xff, 0x69, 0xb4}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"peach puff", 0xff, 0xda, 0xb9}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"lemon chiffon", 0xff, 0xfa, 0xcd}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"pale violet red", 0xdb, 0x70, 0x93}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"papaya whip", 0xff, 0xef, 0xd5}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, + {"papayawhip", 0xff, 0xef, 0xd5} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + unsigned int key = hash (str, len); + + if (key <= MAX_HASH_VALUE) + { + register const char *s = wordlist[key].name; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &wordlist[key]; + } + } + return 0; +} From a6a7d0b4f29ec881e908c72790545e8e0ea8d732 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 10 Jun 2015 12:34:11 +0900 Subject: [PATCH 305/451] Fix segfault occurs when environment variable $SIXEL_BGCOLOR is not set --- src/encoder.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index c67fc74f..231fd86a 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -888,6 +888,7 @@ SIXELAPI sixel_encoder_t * sixel_encoder_create(void) { sixel_encoder_t *encoder; + char const *default_color; encoder = malloc(sizeof(sixel_encoder_t)); if (encoder == NULL) { @@ -933,7 +934,10 @@ sixel_encoder_create(void) encoder->cancel_flag = NULL; encoder->dither_cache = NULL; - (void) parse_x_colorspec(getenv("SIXEL_BGCOLOR"), &encoder->bgcolor); + default_color = getenv("SIXEL_BGCOLOR"); + if (default_color) { + (void) parse_x_colorspec(default_color, &encoder->bgcolor); + } return encoder; } From 45027ee083f005bdaaea3bcfd31769b9c3714d77 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 11 Jun 2015 00:06:07 +0900 Subject: [PATCH 306/451] Add gperf file generated from X11's rgb.txt --- src/rgblookup.gperf | 763 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 763 insertions(+) create mode 100644 src/rgblookup.gperf diff --git a/src/rgblookup.gperf b/src/rgblookup.gperf new file mode 100644 index 00000000..20d41295 --- /dev/null +++ b/src/rgblookup.gperf @@ -0,0 +1,763 @@ +%struct-type +struct color { + char *name; + unsigned char r; + unsigned char g; + unsigned char b; +}; +%{ +#include +%} +%% +snow, 0xff, 0xfa, 0xfa +ghost white, 0xf8, 0xf8, 0xff +ghostwhite, 0xf8, 0xf8, 0xff +white smoke, 0xf5, 0xf5, 0xf5 +whitesmoke, 0xf5, 0xf5, 0xf5 +gainsboro, 0xdc, 0xdc, 0xdc +floral white, 0xff, 0xfa, 0xf0 +floralwhite, 0xff, 0xfa, 0xf0 +old lace, 0xfd, 0xf5, 0xe6 +oldlace, 0xfd, 0xf5, 0xe6 +linen, 0xfa, 0xf0, 0xe6 +antique white, 0xfa, 0xeb, 0xd7 +antiquewhite, 0xfa, 0xeb, 0xd7 +papaya whip, 0xff, 0xef, 0xd5 +papayawhip, 0xff, 0xef, 0xd5 +blanched almond, 0xff, 0xeb, 0xcd +blanchedalmond, 0xff, 0xeb, 0xcd +bisque, 0xff, 0xe4, 0xc4 +peach puff, 0xff, 0xda, 0xb9 +peachpuff, 0xff, 0xda, 0xb9 +navajo white, 0xff, 0xde, 0xad +navajowhite, 0xff, 0xde, 0xad +moccasin, 0xff, 0xe4, 0xb5 +cornsilk, 0xff, 0xf8, 0xdc +ivory, 0xff, 0xff, 0xf0 +lemon chiffon, 0xff, 0xfa, 0xcd +lemonchiffon, 0xff, 0xfa, 0xcd +seashell, 0xff, 0xf5, 0xee +honeydew, 0xf0, 0xff, 0xf0 +mint cream, 0xf5, 0xff, 0xfa +mintcream, 0xf5, 0xff, 0xfa +azure, 0xf0, 0xff, 0xff +alice blue, 0xf0, 0xf8, 0xff +aliceblue, 0xf0, 0xf8, 0xff +lavender, 0xe6, 0xe6, 0xfa +lavender blush, 0xff, 0xf0, 0xf5 +lavenderblush, 0xff, 0xf0, 0xf5 +misty rose, 0xff, 0xe4, 0xe1 +mistyrose, 0xff, 0xe4, 0xe1 +white, 0xff, 0xff, 0xff +black, 0x00, 0x00, 0x00 +dark slate gray, 0x2f, 0x4f, 0x4f +darkslategray, 0x2f, 0x4f, 0x4f +dark slate grey, 0x2f, 0x4f, 0x4f +darkslategrey, 0x2f, 0x4f, 0x4f +dim gray, 0x69, 0x69, 0x69 +dimgray, 0x69, 0x69, 0x69 +dim grey, 0x69, 0x69, 0x69 +dimgrey, 0x69, 0x69, 0x69 +slate gray, 0x70, 0x80, 0x90 +slategray, 0x70, 0x80, 0x90 +slate grey, 0x70, 0x80, 0x90 +slategrey, 0x70, 0x80, 0x90 +light slate gray, 0x77, 0x88, 0x99 +lightslategray, 0x77, 0x88, 0x99 +light slate grey, 0x77, 0x88, 0x99 +lightslategrey, 0x77, 0x88, 0x99 +gray, 0xbe, 0xbe, 0xbe +grey, 0xbe, 0xbe, 0xbe +light grey, 0xd3, 0xd3, 0xd3 +lightgrey, 0xd3, 0xd3, 0xd3 +light gray, 0xd3, 0xd3, 0xd3 +lightgray, 0xd3, 0xd3, 0xd3 +midnight blue, 0x19, 0x19, 0x70 +midnightblue, 0x19, 0x19, 0x70 +navy, 0x00, 0x00, 0x80 +navy blue, 0x00, 0x00, 0x80 +navyblue, 0x00, 0x00, 0x80 +cornflower blue, 0x64, 0x95, 0xed +cornflowerblue, 0x64, 0x95, 0xed +dark slate blue, 0x48, 0x3d, 0x8b +darkslateblue, 0x48, 0x3d, 0x8b +slate blue, 0x6a, 0x5a, 0xcd +slateblue, 0x6a, 0x5a, 0xcd +medium slate blue, 0x7b, 0x68, 0xee +mediumslateblue, 0x7b, 0x68, 0xee +light slate blue, 0x84, 0x70, 0xff +lightslateblue, 0x84, 0x70, 0xff +medium blue, 0x00, 0x00, 0xcd +mediumblue, 0x00, 0x00, 0xcd +royal blue, 0x41, 0x69, 0xe1 +royalblue, 0x41, 0x69, 0xe1 +blue, 0x00, 0x00, 0xff +dodger blue, 0x1e, 0x90, 0xff +dodgerblue, 0x1e, 0x90, 0xff +deep sky blue, 0x00, 0xbf, 0xff +deepskyblue, 0x00, 0xbf, 0xff +sky blue, 0x87, 0xce, 0xeb +skyblue, 0x87, 0xce, 0xeb +light sky blue, 0x87, 0xce, 0xfa +lightskyblue, 0x87, 0xce, 0xfa +steel blue, 0x46, 0x82, 0xb4 +steelblue, 0x46, 0x82, 0xb4 +light steel blue, 0xb0, 0xc4, 0xde +lightsteelblue, 0xb0, 0xc4, 0xde +light blue, 0xad, 0xd8, 0xe6 +lightblue, 0xad, 0xd8, 0xe6 +powder blue, 0xb0, 0xe0, 0xe6 +powderblue, 0xb0, 0xe0, 0xe6 +pale turquoise, 0xaf, 0xee, 0xee +paleturquoise, 0xaf, 0xee, 0xee +dark turquoise, 0x00, 0xce, 0xd1 +darkturquoise, 0x00, 0xce, 0xd1 +medium turquoise, 0x48, 0xd1, 0xcc +mediumturquoise, 0x48, 0xd1, 0xcc +turquoise, 0x40, 0xe0, 0xd0 +cyan, 0x00, 0xff, 0xff +light cyan, 0xe0, 0xff, 0xff +lightcyan, 0xe0, 0xff, 0xff +cadet blue, 0x5f, 0x9e, 0xa0 +cadetblue, 0x5f, 0x9e, 0xa0 +medium aquamarine, 0x66, 0xcd, 0xaa +mediumaquamarine, 0x66, 0xcd, 0xaa +aquamarine, 0x7f, 0xff, 0xd4 +dark green, 0x00, 0x64, 0x00 +darkgreen, 0x00, 0x64, 0x00 +dark olive green, 0x55, 0x6b, 0x2f +darkolivegreen, 0x55, 0x6b, 0x2f +dark sea green, 0x8f, 0xbc, 0x8f +darkseagreen, 0x8f, 0xbc, 0x8f +sea green, 0x2e, 0x8b, 0x57 +seagreen, 0x2e, 0x8b, 0x57 +medium sea green, 0x3c, 0xb3, 0x71 +mediumseagreen, 0x3c, 0xb3, 0x71 +light sea green, 0x20, 0xb2, 0xaa +lightseagreen, 0x20, 0xb2, 0xaa +pale green, 0x98, 0xfb, 0x98 +palegreen, 0x98, 0xfb, 0x98 +spring green, 0x00, 0xff, 0x7f +springgreen, 0x00, 0xff, 0x7f +lawn green, 0x7c, 0xfc, 0x00 +lawngreen, 0x7c, 0xfc, 0x00 +green, 0x00, 0xff, 0x00 +chartreuse, 0x7f, 0xff, 0x00 +medium spring green, 0x00, 0xfa, 0x9a +mediumspringgreen, 0x00, 0xfa, 0x9a +green yellow, 0xad, 0xff, 0x2f +greenyellow, 0xad, 0xff, 0x2f +lime green, 0x32, 0xcd, 0x32 +limegreen, 0x32, 0xcd, 0x32 +yellow green, 0x9a, 0xcd, 0x32 +yellowgreen, 0x9a, 0xcd, 0x32 +forest green, 0x22, 0x8b, 0x22 +forestgreen, 0x22, 0x8b, 0x22 +olive drab, 0x6b, 0x8e, 0x23 +olivedrab, 0x6b, 0x8e, 0x23 +dark khaki, 0xbd, 0xb7, 0x6b +darkkhaki, 0xbd, 0xb7, 0x6b +khaki, 0xf0, 0xe6, 0x8c +pale goldenrod, 0xee, 0xe8, 0xaa +palegoldenrod, 0xee, 0xe8, 0xaa +light goldenrod yellow, 0xfa, 0xfa, 0xd2 +lightgoldenrodyellow, 0xfa, 0xfa, 0xd2 +light yellow, 0xff, 0xff, 0xe0 +lightyellow, 0xff, 0xff, 0xe0 +yellow, 0xff, 0xff, 0x00 +gold, 0xff, 0xd7, 0x00 +light goldenrod, 0xee, 0xdd, 0x82 +lightgoldenrod, 0xee, 0xdd, 0x82 +goldenrod, 0xda, 0xa5, 0x20 +dark goldenrod, 0xb8, 0x86, 0x0b +darkgoldenrod, 0xb8, 0x86, 0x0b +rosy brown, 0xbc, 0x8f, 0x8f +rosybrown, 0xbc, 0x8f, 0x8f +indian red, 0xcd, 0x5c, 0x5c +indianred, 0xcd, 0x5c, 0x5c +saddle brown, 0x8b, 0x45, 0x13 +saddlebrown, 0x8b, 0x45, 0x13 +sienna, 0xa0, 0x52, 0x2d +peru, 0xcd, 0x85, 0x3f +burlywood, 0xde, 0xb8, 0x87 +beige, 0xf5, 0xf5, 0xdc +wheat, 0xf5, 0xde, 0xb3 +sandy brown, 0xf4, 0xa4, 0x60 +sandybrown, 0xf4, 0xa4, 0x60 +tan, 0xd2, 0xb4, 0x8c +chocolate, 0xd2, 0x69, 0x1e +firebrick, 0xb2, 0x22, 0x22 +brown, 0xa5, 0x2a, 0x2a +dark salmon, 0xe9, 0x96, 0x7a +darksalmon, 0xe9, 0x96, 0x7a +salmon, 0xfa, 0x80, 0x72 +light salmon, 0xff, 0xa0, 0x7a +lightsalmon, 0xff, 0xa0, 0x7a +orange, 0xff, 0xa5, 0x00 +dark orange, 0xff, 0x8c, 0x00 +darkorange, 0xff, 0x8c, 0x00 +coral, 0xff, 0x7f, 0x50 +light coral, 0xf0, 0x80, 0x80 +lightcoral, 0xf0, 0x80, 0x80 +tomato, 0xff, 0x63, 0x47 +orange red, 0xff, 0x45, 0x00 +orangered, 0xff, 0x45, 0x00 +red, 0xff, 0x00, 0x00 +hot pink, 0xff, 0x69, 0xb4 +hotpink, 0xff, 0x69, 0xb4 +deep pink, 0xff, 0x14, 0x93 +deeppink, 0xff, 0x14, 0x93 +pink, 0xff, 0xc0, 0xcb +light pink, 0xff, 0xb6, 0xc1 +lightpink, 0xff, 0xb6, 0xc1 +pale violet red, 0xdb, 0x70, 0x93 +palevioletred, 0xdb, 0x70, 0x93 +maroon, 0xb0, 0x30, 0x60 +medium violet red, 0xc7, 0x15, 0x85 +mediumvioletred, 0xc7, 0x15, 0x85 +violet red, 0xd0, 0x20, 0x90 +violetred, 0xd0, 0x20, 0x90 +magenta, 0xff, 0x00, 0xff +violet, 0xee, 0x82, 0xee +plum, 0xdd, 0xa0, 0xdd +orchid, 0xda, 0x70, 0xd6 +medium orchid, 0xba, 0x55, 0xd3 +mediumorchid, 0xba, 0x55, 0xd3 +dark orchid, 0x99, 0x32, 0xcc +darkorchid, 0x99, 0x32, 0xcc +dark violet, 0x94, 0x00, 0xd3 +darkviolet, 0x94, 0x00, 0xd3 +blue violet, 0x8a, 0x2b, 0xe2 +blueviolet, 0x8a, 0x2b, 0xe2 +purple, 0xa0, 0x20, 0xf0 +medium purple, 0x93, 0x70, 0xdb +mediumpurple, 0x93, 0x70, 0xdb +thistle, 0xd8, 0xbf, 0xd8 +snow1, 0xff, 0xfa, 0xfa +snow2, 0xee, 0xe9, 0xe9 +snow3, 0xcd, 0xc9, 0xc9 +snow4, 0x8b, 0x89, 0x89 +seashell1, 0xff, 0xf5, 0xee +seashell2, 0xee, 0xe5, 0xde +seashell3, 0xcd, 0xc5, 0xbf +seashell4, 0x8b, 0x86, 0x82 +antiquewhite1, 0xff, 0xef, 0xdb +antiquewhite2, 0xee, 0xdf, 0xcc +antiquewhite3, 0xcd, 0xc0, 0xb0 +antiquewhite4, 0x8b, 0x83, 0x78 +bisque1, 0xff, 0xe4, 0xc4 +bisque2, 0xee, 0xd5, 0xb7 +bisque3, 0xcd, 0xb7, 0x9e +bisque4, 0x8b, 0x7d, 0x6b +peachpuff1, 0xff, 0xda, 0xb9 +peachpuff2, 0xee, 0xcb, 0xad +peachpuff3, 0xcd, 0xaf, 0x95 +peachpuff4, 0x8b, 0x77, 0x65 +navajowhite1, 0xff, 0xde, 0xad +navajowhite2, 0xee, 0xcf, 0xa1 +navajowhite3, 0xcd, 0xb3, 0x8b +navajowhite4, 0x8b, 0x79, 0x5e +lemonchiffon1, 0xff, 0xfa, 0xcd +lemonchiffon2, 0xee, 0xe9, 0xbf +lemonchiffon3, 0xcd, 0xc9, 0xa5 +lemonchiffon4, 0x8b, 0x89, 0x70 +cornsilk1, 0xff, 0xf8, 0xdc +cornsilk2, 0xee, 0xe8, 0xcd +cornsilk3, 0xcd, 0xc8, 0xb1 +cornsilk4, 0x8b, 0x88, 0x78 +ivory1, 0xff, 0xff, 0xf0 +ivory2, 0xee, 0xee, 0xe0 +ivory3, 0xcd, 0xcd, 0xc1 +ivory4, 0x8b, 0x8b, 0x83 +honeydew1, 0xf0, 0xff, 0xf0 +honeydew2, 0xe0, 0xee, 0xe0 +honeydew3, 0xc1, 0xcd, 0xc1 +honeydew4, 0x83, 0x8b, 0x83 +lavenderblush1, 0xff, 0xf0, 0xf5 +lavenderblush2, 0xee, 0xe0, 0xe5 +lavenderblush3, 0xcd, 0xc1, 0xc5 +lavenderblush4, 0x8b, 0x83, 0x86 +mistyrose1, 0xff, 0xe4, 0xe1 +mistyrose2, 0xee, 0xd5, 0xd2 +mistyrose3, 0xcd, 0xb7, 0xb5 +mistyrose4, 0x8b, 0x7d, 0x7b +azure1, 0xf0, 0xff, 0xff +azure2, 0xe0, 0xee, 0xee +azure3, 0xc1, 0xcd, 0xcd +azure4, 0x83, 0x8b, 0x8b +slateblue1, 0x83, 0x6f, 0xff +slateblue2, 0x7a, 0x67, 0xee +slateblue3, 0x69, 0x59, 0xcd +slateblue4, 0x47, 0x3c, 0x8b +royalblue1, 0x48, 0x76, 0xff +royalblue2, 0x43, 0x6e, 0xee +royalblue3, 0x3a, 0x5f, 0xcd +royalblue4, 0x27, 0x40, 0x8b +blue1, 0x00, 0x00, 0xff +blue2, 0x00, 0x00, 0xee +blue3, 0x00, 0x00, 0xcd +blue4, 0x00, 0x00, 0x8b +dodgerblue1, 0x1e, 0x90, 0xff +dodgerblue2, 0x1c, 0x86, 0xee +dodgerblue3, 0x18, 0x74, 0xcd +dodgerblue4, 0x10, 0x4e, 0x8b +steelblue1, 0x63, 0xb8, 0xff +steelblue2, 0x5c, 0xac, 0xee +steelblue3, 0x4f, 0x94, 0xcd +steelblue4, 0x36, 0x64, 0x8b +deepskyblue1, 0x00, 0xbf, 0xff +deepskyblue2, 0x00, 0xb2, 0xee +deepskyblue3, 0x00, 0x9a, 0xcd +deepskyblue4, 0x00, 0x68, 0x8b +skyblue1, 0x87, 0xce, 0xff +skyblue2, 0x7e, 0xc0, 0xee +skyblue3, 0x6c, 0xa6, 0xcd +skyblue4, 0x4a, 0x70, 0x8b +lightskyblue1, 0xb0, 0xe2, 0xff +lightskyblue2, 0xa4, 0xd3, 0xee +lightskyblue3, 0x8d, 0xb6, 0xcd +lightskyblue4, 0x60, 0x7b, 0x8b +slategray1, 0xc6, 0xe2, 0xff +slategray2, 0xb9, 0xd3, 0xee +slategray3, 0x9f, 0xb6, 0xcd +slategray4, 0x6c, 0x7b, 0x8b +lightsteelblue1, 0xca, 0xe1, 0xff +lightsteelblue2, 0xbc, 0xd2, 0xee +lightsteelblue3, 0xa2, 0xb5, 0xcd +lightsteelblue4, 0x6e, 0x7b, 0x8b +lightblue1, 0xbf, 0xef, 0xff +lightblue2, 0xb2, 0xdf, 0xee +lightblue3, 0x9a, 0xc0, 0xcd +lightblue4, 0x68, 0x83, 0x8b +lightcyan1, 0xe0, 0xff, 0xff +lightcyan2, 0xd1, 0xee, 0xee +lightcyan3, 0xb4, 0xcd, 0xcd +lightcyan4, 0x7a, 0x8b, 0x8b +paleturquoise1, 0xbb, 0xff, 0xff +paleturquoise2, 0xae, 0xee, 0xee +paleturquoise3, 0x96, 0xcd, 0xcd +paleturquoise4, 0x66, 0x8b, 0x8b +cadetblue1, 0x98, 0xf5, 0xff +cadetblue2, 0x8e, 0xe5, 0xee +cadetblue3, 0x7a, 0xc5, 0xcd +cadetblue4, 0x53, 0x86, 0x8b +turquoise1, 0x00, 0xf5, 0xff +turquoise2, 0x00, 0xe5, 0xee +turquoise3, 0x00, 0xc5, 0xcd +turquoise4, 0x00, 0x86, 0x8b +cyan1, 0x00, 0xff, 0xff +cyan2, 0x00, 0xee, 0xee +cyan3, 0x00, 0xcd, 0xcd +cyan4, 0x00, 0x8b, 0x8b +darkslategray1, 0x97, 0xff, 0xff +darkslategray2, 0x8d, 0xee, 0xee +darkslategray3, 0x79, 0xcd, 0xcd +darkslategray4, 0x52, 0x8b, 0x8b +aquamarine1, 0x7f, 0xff, 0xd4 +aquamarine2, 0x76, 0xee, 0xc6 +aquamarine3, 0x66, 0xcd, 0xaa +aquamarine4, 0x45, 0x8b, 0x74 +darkseagreen1, 0xc1, 0xff, 0xc1 +darkseagreen2, 0xb4, 0xee, 0xb4 +darkseagreen3, 0x9b, 0xcd, 0x9b +darkseagreen4, 0x69, 0x8b, 0x69 +seagreen1, 0x54, 0xff, 0x9f +seagreen2, 0x4e, 0xee, 0x94 +seagreen3, 0x43, 0xcd, 0x80 +seagreen4, 0x2e, 0x8b, 0x57 +palegreen1, 0x9a, 0xff, 0x9a +palegreen2, 0x90, 0xee, 0x90 +palegreen3, 0x7c, 0xcd, 0x7c +palegreen4, 0x54, 0x8b, 0x54 +springgreen1, 0x00, 0xff, 0x7f +springgreen2, 0x00, 0xee, 0x76 +springgreen3, 0x00, 0xcd, 0x66 +springgreen4, 0x00, 0x8b, 0x45 +green1, 0x00, 0xff, 0x00 +green2, 0x00, 0xee, 0x00 +green3, 0x00, 0xcd, 0x00 +green4, 0x00, 0x8b, 0x00 +chartreuse1, 0x7f, 0xff, 0x00 +chartreuse2, 0x76, 0xee, 0x00 +chartreuse3, 0x66, 0xcd, 0x00 +chartreuse4, 0x45, 0x8b, 0x00 +olivedrab1, 0xc0, 0xff, 0x3e +olivedrab2, 0xb3, 0xee, 0x3a +olivedrab3, 0x9a, 0xcd, 0x32 +olivedrab4, 0x69, 0x8b, 0x22 +darkolivegreen1, 0xca, 0xff, 0x70 +darkolivegreen2, 0xbc, 0xee, 0x68 +darkolivegreen3, 0xa2, 0xcd, 0x5a +darkolivegreen4, 0x6e, 0x8b, 0x3d +khaki1, 0xff, 0xf6, 0x8f +khaki2, 0xee, 0xe6, 0x85 +khaki3, 0xcd, 0xc6, 0x73 +khaki4, 0x8b, 0x86, 0x4e +lightgoldenrod1, 0xff, 0xec, 0x8b +lightgoldenrod2, 0xee, 0xdc, 0x82 +lightgoldenrod3, 0xcd, 0xbe, 0x70 +lightgoldenrod4, 0x8b, 0x81, 0x4c +lightyellow1, 0xff, 0xff, 0xe0 +lightyellow2, 0xee, 0xee, 0xd1 +lightyellow3, 0xcd, 0xcd, 0xb4 +lightyellow4, 0x8b, 0x8b, 0x7a +yellow1, 0xff, 0xff, 0x00 +yellow2, 0xee, 0xee, 0x00 +yellow3, 0xcd, 0xcd, 0x00 +yellow4, 0x8b, 0x8b, 0x00 +gold1, 0xff, 0xd7, 0x00 +gold2, 0xee, 0xc9, 0x00 +gold3, 0xcd, 0xad, 0x00 +gold4, 0x8b, 0x75, 0x00 +goldenrod1, 0xff, 0xc1, 0x25 +goldenrod2, 0xee, 0xb4, 0x22 +goldenrod3, 0xcd, 0x9b, 0x1d +goldenrod4, 0x8b, 0x69, 0x14 +darkgoldenrod1, 0xff, 0xb9, 0x0f +darkgoldenrod2, 0xee, 0xad, 0x0e +darkgoldenrod3, 0xcd, 0x95, 0x0c +darkgoldenrod4, 0x8b, 0x65, 0x08 +rosybrown1, 0xff, 0xc1, 0xc1 +rosybrown2, 0xee, 0xb4, 0xb4 +rosybrown3, 0xcd, 0x9b, 0x9b +rosybrown4, 0x8b, 0x69, 0x69 +indianred1, 0xff, 0x6a, 0x6a +indianred2, 0xee, 0x63, 0x63 +indianred3, 0xcd, 0x55, 0x55 +indianred4, 0x8b, 0x3a, 0x3a +sienna1, 0xff, 0x82, 0x47 +sienna2, 0xee, 0x79, 0x42 +sienna3, 0xcd, 0x68, 0x39 +sienna4, 0x8b, 0x47, 0x26 +burlywood1, 0xff, 0xd3, 0x9b +burlywood2, 0xee, 0xc5, 0x91 +burlywood3, 0xcd, 0xaa, 0x7d +burlywood4, 0x8b, 0x73, 0x55 +wheat1, 0xff, 0xe7, 0xba +wheat2, 0xee, 0xd8, 0xae +wheat3, 0xcd, 0xba, 0x96 +wheat4, 0x8b, 0x7e, 0x66 +tan1, 0xff, 0xa5, 0x4f +tan2, 0xee, 0x9a, 0x49 +tan3, 0xcd, 0x85, 0x3f +tan4, 0x8b, 0x5a, 0x2b +chocolate1, 0xff, 0x7f, 0x24 +chocolate2, 0xee, 0x76, 0x21 +chocolate3, 0xcd, 0x66, 0x1d +chocolate4, 0x8b, 0x45, 0x13 +firebrick1, 0xff, 0x30, 0x30 +firebrick2, 0xee, 0x2c, 0x2c +firebrick3, 0xcd, 0x26, 0x26 +firebrick4, 0x8b, 0x1a, 0x1a +brown1, 0xff, 0x40, 0x40 +brown2, 0xee, 0x3b, 0x3b +brown3, 0xcd, 0x33, 0x33 +brown4, 0x8b, 0x23, 0x23 +salmon1, 0xff, 0x8c, 0x69 +salmon2, 0xee, 0x82, 0x62 +salmon3, 0xcd, 0x70, 0x54 +salmon4, 0x8b, 0x4c, 0x39 +lightsalmon1, 0xff, 0xa0, 0x7a +lightsalmon2, 0xee, 0x95, 0x72 +lightsalmon3, 0xcd, 0x81, 0x62 +lightsalmon4, 0x8b, 0x57, 0x42 +orange1, 0xff, 0xa5, 0x00 +orange2, 0xee, 0x9a, 0x00 +orange3, 0xcd, 0x85, 0x00 +orange4, 0x8b, 0x5a, 0x00 +darkorange1, 0xff, 0x7f, 0x00 +darkorange2, 0xee, 0x76, 0x00 +darkorange3, 0xcd, 0x66, 0x00 +darkorange4, 0x8b, 0x45, 0x00 +coral1, 0xff, 0x72, 0x56 +coral2, 0xee, 0x6a, 0x50 +coral3, 0xcd, 0x5b, 0x45 +coral4, 0x8b, 0x3e, 0x2f +tomato1, 0xff, 0x63, 0x47 +tomato2, 0xee, 0x5c, 0x42 +tomato3, 0xcd, 0x4f, 0x39 +tomato4, 0x8b, 0x36, 0x26 +orangered1, 0xff, 0x45, 0x00 +orangered2, 0xee, 0x40, 0x00 +orangered3, 0xcd, 0x37, 0x00 +orangered4, 0x8b, 0x25, 0x00 +red1, 0xff, 0x00, 0x00 +red2, 0xee, 0x00, 0x00 +red3, 0xcd, 0x00, 0x00 +red4, 0x8b, 0x00, 0x00 +deeppink1, 0xff, 0x14, 0x93 +deeppink2, 0xee, 0x12, 0x89 +deeppink3, 0xcd, 0x10, 0x76 +deeppink4, 0x8b, 0x0a, 0x50 +hotpink1, 0xff, 0x6e, 0xb4 +hotpink2, 0xee, 0x6a, 0xa7 +hotpink3, 0xcd, 0x60, 0x90 +hotpink4, 0x8b, 0x3a, 0x62 +pink1, 0xff, 0xb5, 0xc5 +pink2, 0xee, 0xa9, 0xb8 +pink3, 0xcd, 0x91, 0x9e +pink4, 0x8b, 0x63, 0x6c +lightpink1, 0xff, 0xae, 0xb9 +lightpink2, 0xee, 0xa2, 0xad +lightpink3, 0xcd, 0x8c, 0x95 +lightpink4, 0x8b, 0x5f, 0x65 +palevioletred1, 0xff, 0x82, 0xab +palevioletred2, 0xee, 0x79, 0x9f +palevioletred3, 0xcd, 0x68, 0x89 +palevioletred4, 0x8b, 0x47, 0x5d +maroon1, 0xff, 0x34, 0xb3 +maroon2, 0xee, 0x30, 0xa7 +maroon3, 0xcd, 0x29, 0x90 +maroon4, 0x8b, 0x1c, 0x62 +violetred1, 0xff, 0x3e, 0x96 +violetred2, 0xee, 0x3a, 0x8c +violetred3, 0xcd, 0x32, 0x78 +violetred4, 0x8b, 0x22, 0x52 +magenta1, 0xff, 0x00, 0xff +magenta2, 0xee, 0x00, 0xee +magenta3, 0xcd, 0x00, 0xcd +magenta4, 0x8b, 0x00, 0x8b +orchid1, 0xff, 0x83, 0xfa +orchid2, 0xee, 0x7a, 0xe9 +orchid3, 0xcd, 0x69, 0xc9 +orchid4, 0x8b, 0x47, 0x89 +plum1, 0xff, 0xbb, 0xff +plum2, 0xee, 0xae, 0xee +plum3, 0xcd, 0x96, 0xcd +plum4, 0x8b, 0x66, 0x8b +mediumorchid1, 0xe0, 0x66, 0xff +mediumorchid2, 0xd1, 0x5f, 0xee +mediumorchid3, 0xb4, 0x52, 0xcd +mediumorchid4, 0x7a, 0x37, 0x8b +darkorchid1, 0xbf, 0x3e, 0xff +darkorchid2, 0xb2, 0x3a, 0xee +darkorchid3, 0x9a, 0x32, 0xcd +darkorchid4, 0x68, 0x22, 0x8b +purple1, 0x9b, 0x30, 0xff +purple2, 0x91, 0x2c, 0xee +purple3, 0x7d, 0x26, 0xcd +purple4, 0x55, 0x1a, 0x8b +mediumpurple1, 0xab, 0x82, 0xff +mediumpurple2, 0x9f, 0x79, 0xee +mediumpurple3, 0x89, 0x68, 0xcd +mediumpurple4, 0x5d, 0x47, 0x8b +thistle1, 0xff, 0xe1, 0xff +thistle2, 0xee, 0xd2, 0xee +thistle3, 0xcd, 0xb5, 0xcd +thistle4, 0x8b, 0x7b, 0x8b +gray0, 0x00, 0x00, 0x00 +grey0, 0x00, 0x00, 0x00 +gray1, 0x03, 0x03, 0x03 +grey1, 0x03, 0x03, 0x03 +gray2, 0x05, 0x05, 0x05 +grey2, 0x05, 0x05, 0x05 +gray3, 0x08, 0x08, 0x08 +grey3, 0x08, 0x08, 0x08 +gray4, 0x0a, 0x0a, 0x0a +grey4, 0x0a, 0x0a, 0x0a +gray5, 0x0d, 0x0d, 0x0d +grey5, 0x0d, 0x0d, 0x0d +gray6, 0x0f, 0x0f, 0x0f +grey6, 0x0f, 0x0f, 0x0f +gray7, 0x12, 0x12, 0x12 +grey7, 0x12, 0x12, 0x12 +gray8, 0x14, 0x14, 0x14 +grey8, 0x14, 0x14, 0x14 +gray9, 0x17, 0x17, 0x17 +grey9, 0x17, 0x17, 0x17 +gray10, 0x1a, 0x1a, 0x1a +grey10, 0x1a, 0x1a, 0x1a +gray11, 0x1c, 0x1c, 0x1c +grey11, 0x1c, 0x1c, 0x1c +gray12, 0x1f, 0x1f, 0x1f +grey12, 0x1f, 0x1f, 0x1f +gray13, 0x21, 0x21, 0x21 +grey13, 0x21, 0x21, 0x21 +gray14, 0x24, 0x24, 0x24 +grey14, 0x24, 0x24, 0x24 +gray15, 0x26, 0x26, 0x26 +grey15, 0x26, 0x26, 0x26 +gray16, 0x29, 0x29, 0x29 +grey16, 0x29, 0x29, 0x29 +gray17, 0x2b, 0x2b, 0x2b +grey17, 0x2b, 0x2b, 0x2b +gray18, 0x2e, 0x2e, 0x2e +grey18, 0x2e, 0x2e, 0x2e +gray19, 0x30, 0x30, 0x30 +grey19, 0x30, 0x30, 0x30 +gray20, 0x33, 0x33, 0x33 +grey20, 0x33, 0x33, 0x33 +gray21, 0x36, 0x36, 0x36 +grey21, 0x36, 0x36, 0x36 +gray22, 0x38, 0x38, 0x38 +grey22, 0x38, 0x38, 0x38 +gray23, 0x3b, 0x3b, 0x3b +grey23, 0x3b, 0x3b, 0x3b +gray24, 0x3d, 0x3d, 0x3d +grey24, 0x3d, 0x3d, 0x3d +gray25, 0x40, 0x40, 0x40 +grey25, 0x40, 0x40, 0x40 +gray26, 0x42, 0x42, 0x42 +grey26, 0x42, 0x42, 0x42 +gray27, 0x45, 0x45, 0x45 +grey27, 0x45, 0x45, 0x45 +gray28, 0x47, 0x47, 0x47 +grey28, 0x47, 0x47, 0x47 +gray29, 0x4a, 0x4a, 0x4a +grey29, 0x4a, 0x4a, 0x4a +gray30, 0x4d, 0x4d, 0x4d +grey30, 0x4d, 0x4d, 0x4d +gray31, 0x4f, 0x4f, 0x4f +grey31, 0x4f, 0x4f, 0x4f +gray32, 0x52, 0x52, 0x52 +grey32, 0x52, 0x52, 0x52 +gray33, 0x54, 0x54, 0x54 +grey33, 0x54, 0x54, 0x54 +gray34, 0x57, 0x57, 0x57 +grey34, 0x57, 0x57, 0x57 +gray35, 0x59, 0x59, 0x59 +grey35, 0x59, 0x59, 0x59 +gray36, 0x5c, 0x5c, 0x5c +grey36, 0x5c, 0x5c, 0x5c +gray37, 0x5e, 0x5e, 0x5e +grey37, 0x5e, 0x5e, 0x5e +gray38, 0x61, 0x61, 0x61 +grey38, 0x61, 0x61, 0x61 +gray39, 0x63, 0x63, 0x63 +grey39, 0x63, 0x63, 0x63 +gray40, 0x66, 0x66, 0x66 +grey40, 0x66, 0x66, 0x66 +gray41, 0x69, 0x69, 0x69 +grey41, 0x69, 0x69, 0x69 +gray42, 0x6b, 0x6b, 0x6b +grey42, 0x6b, 0x6b, 0x6b +gray43, 0x6e, 0x6e, 0x6e +grey43, 0x6e, 0x6e, 0x6e +gray44, 0x70, 0x70, 0x70 +grey44, 0x70, 0x70, 0x70 +gray45, 0x73, 0x73, 0x73 +grey45, 0x73, 0x73, 0x73 +gray46, 0x75, 0x75, 0x75 +grey46, 0x75, 0x75, 0x75 +gray47, 0x78, 0x78, 0x78 +grey47, 0x78, 0x78, 0x78 +gray48, 0x7a, 0x7a, 0x7a +grey48, 0x7a, 0x7a, 0x7a +gray49, 0x7d, 0x7d, 0x7d +grey49, 0x7d, 0x7d, 0x7d +gray50, 0x7f, 0x7f, 0x7f +grey50, 0x7f, 0x7f, 0x7f +gray51, 0x82, 0x82, 0x82 +grey51, 0x82, 0x82, 0x82 +gray52, 0x85, 0x85, 0x85 +grey52, 0x85, 0x85, 0x85 +gray53, 0x87, 0x87, 0x87 +grey53, 0x87, 0x87, 0x87 +gray54, 0x8a, 0x8a, 0x8a +grey54, 0x8a, 0x8a, 0x8a +gray55, 0x8c, 0x8c, 0x8c +grey55, 0x8c, 0x8c, 0x8c +gray56, 0x8f, 0x8f, 0x8f +grey56, 0x8f, 0x8f, 0x8f +gray57, 0x91, 0x91, 0x91 +grey57, 0x91, 0x91, 0x91 +gray58, 0x94, 0x94, 0x94 +grey58, 0x94, 0x94, 0x94 +gray59, 0x96, 0x96, 0x96 +grey59, 0x96, 0x96, 0x96 +gray60, 0x99, 0x99, 0x99 +grey60, 0x99, 0x99, 0x99 +gray61, 0x9c, 0x9c, 0x9c +grey61, 0x9c, 0x9c, 0x9c +gray62, 0x9e, 0x9e, 0x9e +grey62, 0x9e, 0x9e, 0x9e +gray63, 0xa1, 0xa1, 0xa1 +grey63, 0xa1, 0xa1, 0xa1 +gray64, 0xa3, 0xa3, 0xa3 +grey64, 0xa3, 0xa3, 0xa3 +gray65, 0xa6, 0xa6, 0xa6 +grey65, 0xa6, 0xa6, 0xa6 +gray66, 0xa8, 0xa8, 0xa8 +grey66, 0xa8, 0xa8, 0xa8 +gray67, 0xab, 0xab, 0xab +grey67, 0xab, 0xab, 0xab +gray68, 0xad, 0xad, 0xad +grey68, 0xad, 0xad, 0xad +gray69, 0xb0, 0xb0, 0xb0 +grey69, 0xb0, 0xb0, 0xb0 +gray70, 0xb3, 0xb3, 0xb3 +grey70, 0xb3, 0xb3, 0xb3 +gray71, 0xb5, 0xb5, 0xb5 +grey71, 0xb5, 0xb5, 0xb5 +gray72, 0xb8, 0xb8, 0xb8 +grey72, 0xb8, 0xb8, 0xb8 +gray73, 0xba, 0xba, 0xba +grey73, 0xba, 0xba, 0xba +gray74, 0xbd, 0xbd, 0xbd +grey74, 0xbd, 0xbd, 0xbd +gray75, 0xbf, 0xbf, 0xbf +grey75, 0xbf, 0xbf, 0xbf +gray76, 0xc2, 0xc2, 0xc2 +grey76, 0xc2, 0xc2, 0xc2 +gray77, 0xc4, 0xc4, 0xc4 +grey77, 0xc4, 0xc4, 0xc4 +gray78, 0xc7, 0xc7, 0xc7 +grey78, 0xc7, 0xc7, 0xc7 +gray79, 0xc9, 0xc9, 0xc9 +grey79, 0xc9, 0xc9, 0xc9 +gray80, 0xcc, 0xcc, 0xcc +grey80, 0xcc, 0xcc, 0xcc +gray81, 0xcf, 0xcf, 0xcf +grey81, 0xcf, 0xcf, 0xcf +gray82, 0xd1, 0xd1, 0xd1 +grey82, 0xd1, 0xd1, 0xd1 +gray83, 0xd4, 0xd4, 0xd4 +grey83, 0xd4, 0xd4, 0xd4 +gray84, 0xd6, 0xd6, 0xd6 +grey84, 0xd6, 0xd6, 0xd6 +gray85, 0xd9, 0xd9, 0xd9 +grey85, 0xd9, 0xd9, 0xd9 +gray86, 0xdb, 0xdb, 0xdb +grey86, 0xdb, 0xdb, 0xdb +gray87, 0xde, 0xde, 0xde +grey87, 0xde, 0xde, 0xde +gray88, 0xe0, 0xe0, 0xe0 +grey88, 0xe0, 0xe0, 0xe0 +gray89, 0xe3, 0xe3, 0xe3 +grey89, 0xe3, 0xe3, 0xe3 +gray90, 0xe5, 0xe5, 0xe5 +grey90, 0xe5, 0xe5, 0xe5 +gray91, 0xe8, 0xe8, 0xe8 +grey91, 0xe8, 0xe8, 0xe8 +gray92, 0xeb, 0xeb, 0xeb +grey92, 0xeb, 0xeb, 0xeb +gray93, 0xed, 0xed, 0xed +grey93, 0xed, 0xed, 0xed +gray94, 0xf0, 0xf0, 0xf0 +grey94, 0xf0, 0xf0, 0xf0 +gray95, 0xf2, 0xf2, 0xf2 +grey95, 0xf2, 0xf2, 0xf2 +gray96, 0xf5, 0xf5, 0xf5 +grey96, 0xf5, 0xf5, 0xf5 +gray97, 0xf7, 0xf7, 0xf7 +grey97, 0xf7, 0xf7, 0xf7 +gray98, 0xfa, 0xfa, 0xfa +grey98, 0xfa, 0xfa, 0xfa +gray99, 0xfc, 0xfc, 0xfc +grey99, 0xfc, 0xfc, 0xfc +gray100, 0xff, 0xff, 0xff +grey100, 0xff, 0xff, 0xff +dark grey, 0xa9, 0xa9, 0xa9 +darkgrey, 0xa9, 0xa9, 0xa9 +dark gray, 0xa9, 0xa9, 0xa9 +darkgray, 0xa9, 0xa9, 0xa9 +dark blue, 0x00, 0x00, 0x8b +darkblue, 0x00, 0x00, 0x8b +dark cyan, 0x00, 0x8b, 0x8b +darkcyan, 0x00, 0x8b, 0x8b +dark magenta, 0x8b, 0x00, 0x8b +darkmagenta, 0x8b, 0x00, 0x8b +dark red, 0x8b, 0x00, 0x00 +darkred, 0x8b, 0x00, 0x00 +light green, 0x90, 0xee, 0x90 +lightgreen, 0x90, 0xee, 0x90 From be2c9019cd484dae06f503b52802e078baa4cda3 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 11 Jun 2015 00:07:00 +0900 Subject: [PATCH 307/451] Re-generate rgblookup.h --- src/Makefile.am | 9 +- src/Makefile.in | 13 +- src/rgblookup.h | 5534 +++++++++++++++++++++++++++++++++-------------- 3 files changed, 3941 insertions(+), 1615 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 9eba2f5b..c46f5153 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -59,9 +59,16 @@ tests_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) tests_LDADD = $(top_builddir)/src/libsixel.la endif +dist_man_MANS = sixel.5 + unittest: all if COND_TESTS ./tests endif -dist_man_MANS = sixel.5 +gen-rgblookup: rgblookup.gperf + gperf -C -N=lookup_rgb --ignore-case -P $< |\ + sed 's/{""}/\{"", 0, 0, 0\}/g' |\ + astyle > rgblookup.h + + diff --git a/src/Makefile.in b/src/Makefile.in index 0d43b59a..266aa913 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -378,7 +378,7 @@ zshcompletiondir = @zshcompletiondir@ CLEANFILES = *.gcno *.gcda *.gcov *.log test-output.* tests lib_LTLIBRARIES = libsixel.la libsixel_la_SOURCES = \ - output.c \ + output.c \ output.h \ fromsixel.c \ tosixel.c \ @@ -394,8 +394,8 @@ libsixel_la_SOURCES = \ loader.c \ frompnm.c \ frompnm.h \ - fromgif.c \ - fromgif.h \ + fromgif.c \ + fromgif.h \ encoder.c \ encoder.h \ decoder.c \ @@ -405,7 +405,7 @@ libsixel_la_SOURCES = \ writer.h \ stb_image_write.c \ stb_image_write.h \ - rgblookup.h + rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ @@ -944,6 +944,11 @@ uninstall-man: uninstall-man5 unittest: all @COND_TESTS_TRUE@ ./tests +gen-rgblookup: rgblookup.gperf + gperf -C -N=lookup_rgb --ignore-case -P $< |\ + sed 's/{""}/\{"", 0, 0, 0\}/g' |\ + astyle > rgblookup.h + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/src/rgblookup.h b/src/rgblookup.h index c9e52f83..f874db4a 100644 --- a/src/rgblookup.h +++ b/src/rgblookup.h @@ -1,5 +1,5 @@ /* C code produced by gperf version 3.0.3 */ -/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -C -Nlookup_rgb */ +/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -C -N=lookup_rgb --ignore-case -P rgblookup.gperf */ /* Computed positions: -k'1,3,5-9,12-15,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ @@ -29,6 +29,10 @@ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif +#line 8 "rgblookup.gperf" + +#include +#line 2 "rgblookup.gperf" struct color { char *name; unsigned char r; @@ -43,6 +47,49 @@ struct color { #define MAX_HASH_VALUE 5574 /* maximum key range = 5572, duplicates = 0 */ +#ifndef GPERF_DOWNCASE +#define GPERF_DOWNCASE 1 +static unsigned char gperf_downcase[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255 +}; +#endif + +#ifndef GPERF_CASE_STRCMP +#define GPERF_CASE_STRCMP 1 +static int +gperf_case_strcmp (s1, s2) +register const char *s1; +register const char *s2; +{ + for (;;) + { + unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; + unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; + if (c1 != 0 && c1 == c2) + continue; + return (int)c1 - (int)c2; + } +} +#endif + #ifdef __GNUC__ __inline #else @@ -63,9 +110,9 @@ register unsigned int len; 5575, 5575, 520, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 920, 25, 20, 5, 0, 1007, 841, 16, 915, 840, 5575, 5575, - 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, - 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, - 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 5575, + 5575, 5575, 5575, 5575, 5575, 80, 5, 980, 0, 0, + 55, 0, 670, 673, 0, 395, 215, 190, 160, 100, + 1015, 145, 0, 0, 155, 325, 740, 831, 5575, 265, 5575, 5575, 5575, 5575, 5575, 5575, 5575, 80, 5, 980, 0, 0, 55, 0, 670, 673, 0, 395, 215, 190, 160, 100, 1015, 145, 0, 0, 155, 325, 740, 831, @@ -129,1614 +176,3877 @@ register unsigned int len; return hval + asso_values[(unsigned char)str[len - 1]]; } +struct stringpool_t +{ + char stringpool_str3[sizeof("red")]; + char stringpool_str4[sizeof("red4")]; + char stringpool_str5[sizeof("grey4")]; + char stringpool_str6[sizeof("grey44")]; + char stringpool_str7[sizeof("darkred")]; + char stringpool_str9[sizeof("red3")]; + char stringpool_str11[sizeof("grey34")]; + char stringpool_str15[sizeof("grey3")]; + char stringpool_str16[sizeof("grey43")]; + char stringpool_str21[sizeof("grey33")]; + char stringpool_str22[sizeof("grey74")]; + char stringpool_str24[sizeof("red2")]; + char stringpool_str26[sizeof("grey24")]; + char stringpool_str29[sizeof("red1")]; + char stringpool_str31[sizeof("grey14")]; + char stringpool_str32[sizeof("grey73")]; + char stringpool_str36[sizeof("grey23")]; + char stringpool_str37[sizeof("grey7")]; + char stringpool_str38[sizeof("grey47")]; + char stringpool_str41[sizeof("grey13")]; + char stringpool_str43[sizeof("grey37")]; + char stringpool_str45[sizeof("grey2")]; + char stringpool_str46[sizeof("grey42")]; + char stringpool_str51[sizeof("grey32")]; + char stringpool_str54[sizeof("grey77")]; + char stringpool_str55[sizeof("grey1")]; + char stringpool_str56[sizeof("grey41")]; + char stringpool_str58[sizeof("grey27")]; + char stringpool_str61[sizeof("grey31")]; + char stringpool_str62[sizeof("grey72")]; + char stringpool_str63[sizeof("grey17")]; + char stringpool_str66[sizeof("grey22")]; + char stringpool_str71[sizeof("grey12")]; + char stringpool_str72[sizeof("grey71")]; + char stringpool_str76[sizeof("grey21")]; + char stringpool_str81[sizeof("grey11")]; + char stringpool_str85[sizeof("gray4")]; + char stringpool_str86[sizeof("gray44")]; + char stringpool_str91[sizeof("gray34")]; + char stringpool_str95[sizeof("gray3")]; + char stringpool_str96[sizeof("gray43")]; + char stringpool_str101[sizeof("gray33")]; + char stringpool_str102[sizeof("gray74")]; + char stringpool_str105[sizeof("snow4")]; + char stringpool_str106[sizeof("gray24")]; + char stringpool_str111[sizeof("gray14")]; + char stringpool_str112[sizeof("gray73")]; + char stringpool_str115[sizeof("snow3")]; + char stringpool_str116[sizeof("gray23")]; + char stringpool_str117[sizeof("gray7")]; + char stringpool_str118[sizeof("gray47")]; + char stringpool_str121[sizeof("gray13")]; + char stringpool_str123[sizeof("gray37")]; + char stringpool_str125[sizeof("gray2")]; + char stringpool_str126[sizeof("gray42")]; + char stringpool_str131[sizeof("gray32")]; + char stringpool_str134[sizeof("gray77")]; + char stringpool_str135[sizeof("gray1")]; + char stringpool_str136[sizeof("gray41")]; + char stringpool_str138[sizeof("gray27")]; + char stringpool_str141[sizeof("gray31")]; + char stringpool_str142[sizeof("gray72")]; + char stringpool_str143[sizeof("gray17")]; + char stringpool_str145[sizeof("snow2")]; + char stringpool_str146[sizeof("gray22")]; + char stringpool_str151[sizeof("gray12")]; + char stringpool_str152[sizeof("gray71")]; + char stringpool_str155[sizeof("snow1")]; + char stringpool_str156[sizeof("gray21")]; + char stringpool_str161[sizeof("gray11")]; + char stringpool_str166[sizeof("green4")]; + char stringpool_str172[sizeof("springgreen4")]; + char stringpool_str176[sizeof("green3")]; + char stringpool_str182[sizeof("springgreen3")]; + char stringpool_str186[sizeof("orange")]; + char stringpool_str187[sizeof("orange4")]; + char stringpool_str189[sizeof("orangered")]; + char stringpool_str190[sizeof("orangered4")]; + char stringpool_str195[sizeof("orangered3")]; + char stringpool_str197[sizeof("orange3")]; + char stringpool_str206[sizeof("green2")]; + char stringpool_str210[sizeof("orangered2")]; + char stringpool_str212[sizeof("springgreen2")]; + char stringpool_str215[sizeof("orangered1")]; + char stringpool_str216[sizeof("green1")]; + char stringpool_str219[sizeof("gold")]; + char stringpool_str220[sizeof("gold4")]; + char stringpool_str222[sizeof("springgreen1")]; + char stringpool_str227[sizeof("orange2")]; + char stringpool_str230[sizeof("gold3")]; + char stringpool_str237[sizeof("orange1")]; + char stringpool_str247[sizeof("sienna4")]; + char stringpool_str249[sizeof("seagreen4")]; + char stringpool_str253[sizeof("darkseagreen4")]; + char stringpool_str257[sizeof("sienna3")]; + char stringpool_str259[sizeof("seagreen3")]; + char stringpool_str260[sizeof("gold2")]; + char stringpool_str263[sizeof("darkseagreen3")]; + char stringpool_str269[sizeof("grey")]; + char stringpool_str270[sizeof("gold1")]; + char stringpool_str271[sizeof("brown4")]; + char stringpool_str281[sizeof("brown3")]; + char stringpool_str287[sizeof("sienna2")]; + char stringpool_str289[sizeof("seagreen2")]; + char stringpool_str293[sizeof("darkseagreen2")]; + char stringpool_str297[sizeof("sienna1")]; + char stringpool_str299[sizeof("seagreen1")]; + char stringpool_str303[sizeof("darkseagreen1")]; + char stringpool_str311[sizeof("brown2")]; + char stringpool_str319[sizeof("tan4")]; + char stringpool_str321[sizeof("brown1")]; + char stringpool_str324[sizeof("tan3")]; + char stringpool_str325[sizeof("green")]; + char stringpool_str326[sizeof("sienna")]; + char stringpool_str329[sizeof("darkgreen")]; + char stringpool_str331[sizeof("springgreen")]; + char stringpool_str334[sizeof("blue")]; + char stringpool_str335[sizeof("blue4")]; + char stringpool_str336[sizeof("bisque")]; + char stringpool_str337[sizeof("bisque4")]; + char stringpool_str339[sizeof("tan2")]; + char stringpool_str344[sizeof("tan1")]; + char stringpool_str345[sizeof("blue3")]; + char stringpool_str347[sizeof("bisque3")]; + char stringpool_str349[sizeof("gray")]; + char stringpool_str350[sizeof("darkorange")]; + char stringpool_str351[sizeof("darkorange4")]; + char stringpool_str356[sizeof("darkorange3")]; + char stringpool_str371[sizeof("darkorange2")]; + char stringpool_str375[sizeof("blue2")]; + char stringpool_str376[sizeof("darkorange1")]; + char stringpool_str377[sizeof("bisque2")]; + char stringpool_str381[sizeof("forestgreen")]; + char stringpool_str385[sizeof("blue1")]; + char stringpool_str387[sizeof("bisque1")]; + char stringpool_str408[sizeof("seagreen")]; + char stringpool_str409[sizeof("sea green")]; + char stringpool_str410[sizeof("azure")]; + char stringpool_str411[sizeof("azure4")]; + char stringpool_str412[sizeof("darkseagreen")]; + char stringpool_str421[sizeof("azure3")]; + char stringpool_str428[sizeof("darkgoldenrod")]; + char stringpool_str429[sizeof("darkgoldenrod4")]; + char stringpool_str430[sizeof("brown")]; + char stringpool_str435[sizeof("slategray4")]; + char stringpool_str439[sizeof("darkgoldenrod3")]; + char stringpool_str440[sizeof("slategray3")]; + char stringpool_str451[sizeof("azure2")]; + char stringpool_str455[sizeof("slategray2")]; + char stringpool_str457[sizeof("maroon4")]; + char stringpool_str460[sizeof("slategray1")]; + char stringpool_str461[sizeof("azure1")]; + char stringpool_str467[sizeof("maroon3")]; + char stringpool_str469[sizeof("darkgoldenrod2")]; + char stringpool_str478[sizeof("tan")]; + char stringpool_str479[sizeof("darkgoldenrod1")]; + char stringpool_str482[sizeof("salmon4")]; + char stringpool_str484[sizeof("goldenrod")]; + char stringpool_str485[sizeof("goldenrod4")]; + char stringpool_str490[sizeof("goldenrod3")]; + char stringpool_str491[sizeof("saddlebrown")]; + char stringpool_str492[sizeof("salmon3")]; + char stringpool_str497[sizeof("maroon2")]; + char stringpool_str505[sizeof("goldenrod2")]; + char stringpool_str507[sizeof("maroon1")]; + char stringpool_str510[sizeof("goldenrod1")]; + char stringpool_str521[sizeof("darkmagenta")]; + char stringpool_str522[sizeof("salmon2")]; + char stringpool_str528[sizeof("dark red")]; + char stringpool_str532[sizeof("salmon1")]; + char stringpool_str538[sizeof("darkgrey")]; + char stringpool_str540[sizeof("lightgreen")]; + char stringpool_str553[sizeof("darkblue")]; + char stringpool_str555[sizeof("dodgerblue")]; + char stringpool_str556[sizeof("dodgerblue4")]; + char stringpool_str561[sizeof("dodgerblue3")]; + char stringpool_str564[sizeof("mistyrose")]; + char stringpool_str565[sizeof("mistyrose4")]; + char stringpool_str570[sizeof("mistyrose3")]; + char stringpool_str576[sizeof("dodgerblue2")]; + char stringpool_str581[sizeof("dodgerblue1")]; + char stringpool_str585[sizeof("mistyrose2")]; + char stringpool_str590[sizeof("mistyrose1")]; + char stringpool_str593[sizeof("magenta4")]; + char stringpool_str603[sizeof("magenta3")]; + char stringpool_str607[sizeof("tomato4")]; + char stringpool_str616[sizeof("maroon")]; + char stringpool_str617[sizeof("tomato3")]; + char stringpool_str618[sizeof("darkgray")]; + char stringpool_str619[sizeof("slategrey")]; + char stringpool_str633[sizeof("magenta2")]; + char stringpool_str634[sizeof("slateblue")]; + char stringpool_str635[sizeof("slateblue4")]; + char stringpool_str640[sizeof("slateblue3")]; + char stringpool_str641[sizeof("salmon")]; + char stringpool_str643[sizeof("magenta1")]; + char stringpool_str647[sizeof("tomato2")]; + char stringpool_str655[sizeof("slateblue2")]; + char stringpool_str657[sizeof("tomato1")]; + char stringpool_str660[sizeof("slateblue1")]; + char stringpool_str672[sizeof("magenta")]; + char stringpool_str683[sizeof("beige")]; + char stringpool_str690[sizeof("dark green")]; + char stringpool_str699[sizeof("slategray")]; + char stringpool_str700[sizeof("linen")]; + char stringpool_str706[sizeof("tomato")]; + char stringpool_str710[sizeof("orange red")]; + char stringpool_str727[sizeof("dimgrey")]; + char stringpool_str728[sizeof("dim grey")]; + char stringpool_str734[sizeof("limegreen")]; + char stringpool_str751[sizeof("dodger blue")]; + char stringpool_str755[sizeof("darksalmon")]; + char stringpool_str769[sizeof("steelblue")]; + char stringpool_str770[sizeof("steelblue4")]; + char stringpool_str775[sizeof("steelblue3")]; + char stringpool_str783[sizeof("lightseagreen")]; + char stringpool_str788[sizeof("darkslateblue")]; + char stringpool_str790[sizeof("steelblue2")]; + char stringpool_str795[sizeof("steelblue1")]; + char stringpool_str799[sizeof("lightgoldenrod")]; + char stringpool_str800[sizeof("lightgoldenrod4")]; + char stringpool_str807[sizeof("dimgray")]; + char stringpool_str808[sizeof("dim gray")]; + char stringpool_str809[sizeof("darkslategray4")]; + char stringpool_str810[sizeof("lightgoldenrod3")]; + char stringpool_str812[sizeof("skyblue")]; + char stringpool_str813[sizeof("skyblue4")]; + char stringpool_str818[sizeof("sky blue")]; + char stringpool_str819[sizeof("darkslategray3")]; + char stringpool_str823[sizeof("skyblue3")]; + char stringpool_str840[sizeof("lightgoldenrod2")]; + char stringpool_str846[sizeof("grey94")]; + char stringpool_str847[sizeof("grey64")]; + char stringpool_str849[sizeof("darkslategray2")]; + char stringpool_str850[sizeof("lightgoldenrod1")]; + char stringpool_str853[sizeof("skyblue2")]; + char stringpool_str856[sizeof("grey93")]; + char stringpool_str857[sizeof("grey63")]; + char stringpool_str859[sizeof("darkslategray1")]; + char stringpool_str863[sizeof("skyblue1")]; + char stringpool_str867[sizeof("lightsalmon4")]; + char stringpool_str868[sizeof("olivedrab4")]; + char stringpool_str871[sizeof("dark orange")]; + char stringpool_str872[sizeof("olivedrab")]; + char stringpool_str873[sizeof("olivedrab3")]; + char stringpool_str875[sizeof("slate grey")]; + char stringpool_str877[sizeof("lightsalmon3")]; + char stringpool_str878[sizeof("grey97")]; + char stringpool_str879[sizeof("grey67")]; + char stringpool_str880[sizeof("black")]; + char stringpool_str886[sizeof("grey92")]; + char stringpool_str887[sizeof("grey62")]; + char stringpool_str888[sizeof("olivedrab2")]; + char stringpool_str891[sizeof("deepskyblue")]; + char stringpool_str892[sizeof("deepskyblue4")]; + char stringpool_str893[sizeof("olivedrab1")]; + char stringpool_str896[sizeof("grey91")]; + char stringpool_str897[sizeof("grey61")]; + char stringpool_str902[sizeof("deepskyblue3")]; + char stringpool_str907[sizeof("lightsalmon2")]; + char stringpool_str909[sizeof("lightgrey")]; + char stringpool_str917[sizeof("lightsalmon1")]; + char stringpool_str921[sizeof("grey84")]; + char stringpool_str922[sizeof("indianred")]; + char stringpool_str923[sizeof("indianred4")]; + char stringpool_str924[sizeof("lightblue")]; + char stringpool_str925[sizeof("lightblue4")]; + char stringpool_str926[sizeof("gray94")]; + char stringpool_str927[sizeof("gray64")]; + char stringpool_str928[sizeof("indianred3")]; + char stringpool_str930[sizeof("lightblue3")]; + char stringpool_str931[sizeof("grey83")]; + char stringpool_str932[sizeof("deepskyblue2")]; + char stringpool_str935[sizeof("snow")]; + char stringpool_str936[sizeof("gray93")]; + char stringpool_str937[sizeof("gray63")]; + char stringpool_str942[sizeof("deepskyblue1")]; + char stringpool_str943[sizeof("indianred2")]; + char stringpool_str945[sizeof("lightblue2")]; + char stringpool_str948[sizeof("indianred1")]; + char stringpool_str949[sizeof("dark goldenrod")]; + char stringpool_str950[sizeof("lightblue1")]; + char stringpool_str953[sizeof("grey87")]; + char stringpool_str955[sizeof("slate gray")]; + char stringpool_str958[sizeof("gray97")]; + char stringpool_str959[sizeof("gray67")]; + char stringpool_str961[sizeof("grey82")]; + char stringpool_str962[sizeof("dark magenta")]; + char stringpool_str963[sizeof("darkturquoise")]; + char stringpool_str966[sizeof("gray92")]; + char stringpool_str967[sizeof("gray62")]; + char stringpool_str971[sizeof("grey81")]; + char stringpool_str976[sizeof("gray91")]; + char stringpool_str977[sizeof("gray61")]; + char stringpool_str987[sizeof("gainsboro")]; + char stringpool_str989[sizeof("lightgray")]; + char stringpool_str992[sizeof("wheat4")]; + char stringpool_str993[sizeof("darkslategrey")]; + char stringpool_str1001[sizeof("gray84")]; + char stringpool_str1002[sizeof("wheat3")]; + char stringpool_str1004[sizeof("violetred")]; + char stringpool_str1005[sizeof("violetred4")]; + char stringpool_str1010[sizeof("violetred3")]; + char stringpool_str1011[sizeof("gray83")]; + char stringpool_str1012[sizeof("spring green")]; + char stringpool_str1013[sizeof("grey54")]; + char stringpool_str1023[sizeof("grey53")]; + char stringpool_str1025[sizeof("violetred2")]; + char stringpool_str1026[sizeof("lightsalmon")]; + char stringpool_str1030[sizeof("violetred1")]; + char stringpool_str1032[sizeof("wheat2")]; + char stringpool_str1033[sizeof("gray87")]; + char stringpool_str1034[sizeof("royalblue")]; + char stringpool_str1035[sizeof("royalblue4")]; + char stringpool_str1040[sizeof("royalblue3")]; + char stringpool_str1041[sizeof("gray82")]; + char stringpool_str1042[sizeof("wheat1")]; + char stringpool_str1044[sizeof("ivory4")]; + char stringpool_str1045[sizeof("grey57")]; + char stringpool_str1047[sizeof("lightskyblue")]; + char stringpool_str1048[sizeof("lightskyblue4")]; + char stringpool_str1051[sizeof("gray81")]; + char stringpool_str1053[sizeof("grey52")]; + char stringpool_str1054[sizeof("ivory3")]; + char stringpool_str1055[sizeof("royalblue2")]; + char stringpool_str1058[sizeof("lightskyblue3")]; + char stringpool_str1059[sizeof("dark grey")]; + char stringpool_str1060[sizeof("royalblue1")]; + char stringpool_str1061[sizeof("light green")]; + char stringpool_str1062[sizeof("forest green")]; + char stringpool_str1063[sizeof("grey51")]; + char stringpool_str1065[sizeof("cyan4")]; + char stringpool_str1072[sizeof("saddle brown")]; + char stringpool_str1073[sizeof("darkslategray")]; + char stringpool_str1074[sizeof("dark blue")]; + char stringpool_str1075[sizeof("cyan3")]; + char stringpool_str1077[sizeof("lightyellow4")]; + char stringpool_str1079[sizeof("lightsteelblue")]; + char stringpool_str1080[sizeof("lightsteelblue4")]; + char stringpool_str1084[sizeof("ivory2")]; + char stringpool_str1085[sizeof("misty rose")]; + char stringpool_str1087[sizeof("lightyellow3")]; + char stringpool_str1088[sizeof("lightskyblue2")]; + char stringpool_str1090[sizeof("lightsteelblue3")]; + char stringpool_str1093[sizeof("gray54")]; + char stringpool_str1094[sizeof("ivory1")]; + char stringpool_str1095[sizeof("lime green")]; + char stringpool_str1098[sizeof("lightskyblue1")]; + char stringpool_str1103[sizeof("gray53")]; + char stringpool_str1105[sizeof("cyan2")]; + char stringpool_str1106[sizeof("rosybrown4")]; + char stringpool_str1111[sizeof("rosybrown3")]; + char stringpool_str1115[sizeof("cyan1")]; + char stringpool_str1117[sizeof("lightyellow2")]; + char stringpool_str1119[sizeof("mediumseagreen")]; + char stringpool_str1120[sizeof("lightsteelblue2")]; + char stringpool_str1123[sizeof("lavender")]; + char stringpool_str1125[sizeof("gray57")]; + char stringpool_str1126[sizeof("rosybrown2")]; + char stringpool_str1127[sizeof("lightyellow1")]; + char stringpool_str1130[sizeof("lightsteelblue1")]; + char stringpool_str1131[sizeof("rosybrown1")]; + char stringpool_str1133[sizeof("gray52")]; + char stringpool_str1139[sizeof("dark gray")]; + char stringpool_str1143[sizeof("gray51")]; + char stringpool_str1146[sizeof("wheat")]; + char stringpool_str1154[sizeof("khaki4")]; + char stringpool_str1155[sizeof("slate blue")]; + char stringpool_str1156[sizeof("violet")]; + char stringpool_str1164[sizeof("khaki3")]; + char stringpool_str1165[sizeof("light grey")]; + char stringpool_str1167[sizeof("oldlace")]; + char stringpool_str1169[sizeof("navy")]; + char stringpool_str1176[sizeof("dark salmon")]; + char stringpool_str1180[sizeof("pink4")]; + char stringpool_str1189[sizeof("seashell4")]; + char stringpool_str1190[sizeof("pink3")]; + char stringpool_str1194[sizeof("khaki2")]; + char stringpool_str1199[sizeof("seashell3")]; + char stringpool_str1201[sizeof("coral4")]; + char stringpool_str1204[sizeof("khaki1")]; + char stringpool_str1205[sizeof("thistle")]; + char stringpool_str1206[sizeof("thistle4")]; + char stringpool_str1211[sizeof("coral3")]; + char stringpool_str1216[sizeof("thistle3")]; + char stringpool_str1220[sizeof("pink2")]; + char stringpool_str1221[sizeof("sandy brown")]; + char stringpool_str1224[sizeof("cyan")]; + char stringpool_str1229[sizeof("seashell2")]; + char stringpool_str1230[sizeof("pink1")]; + char stringpool_str1236[sizeof("purple")]; + char stringpool_str1237[sizeof("purple4")]; + char stringpool_str1239[sizeof("seashell1")]; + char stringpool_str1241[sizeof("coral2")]; + char stringpool_str1245[sizeof("light gray")]; + char stringpool_str1246[sizeof("thistle2")]; + char stringpool_str1247[sizeof("purple3")]; + char stringpool_str1251[sizeof("coral1")]; + char stringpool_str1256[sizeof("thistle1")]; + char stringpool_str1260[sizeof("mediumblue")]; + char stringpool_str1262[sizeof("turquoise")]; + char stringpool_str1263[sizeof("turquoise4")]; + char stringpool_str1265[sizeof("rosybrown")]; + char stringpool_str1268[sizeof("turquoise3")]; + char stringpool_str1277[sizeof("purple2")]; + char stringpool_str1283[sizeof("turquoise2")]; + char stringpool_str1287[sizeof("purple1")]; + char stringpool_str1288[sizeof("turquoise1")]; + char stringpool_str1290[sizeof("steel blue")]; + char stringpool_str1305[sizeof("light sea green")]; + char stringpool_str1307[sizeof("aliceblue")]; + char stringpool_str1308[sizeof("ivory")]; + char stringpool_str1310[sizeof("burlywood")]; + char stringpool_str1311[sizeof("burlywood4")]; + char stringpool_str1316[sizeof("burlywood3")]; + char stringpool_str1331[sizeof("burlywood2")]; + char stringpool_str1336[sizeof("burlywood1")]; + char stringpool_str1344[sizeof("peru")]; + char stringpool_str1345[sizeof("plum4")]; + char stringpool_str1355[sizeof("plum3")]; + char stringpool_str1364[sizeof("lightslategrey")]; + char stringpool_str1374[sizeof("lightslateblue")]; + char stringpool_str1375[sizeof("lawngreen")]; + char stringpool_str1383[sizeof("old lace")]; + char stringpool_str1385[sizeof("plum2")]; + char stringpool_str1388[sizeof("olive drab")]; + char stringpool_str1395[sizeof("plum1")]; + char stringpool_str1400[sizeof("palegreen4")]; + char stringpool_str1401[sizeof("medium sea green")]; + char stringpool_str1403[sizeof("seashell")]; + char stringpool_str1405[sizeof("palegreen3")]; + char stringpool_str1415[sizeof("coral")]; + char stringpool_str1418[sizeof("yellow4")]; + char stringpool_str1420[sizeof("palegreen2")]; + char stringpool_str1425[sizeof("palegreen1")]; + char stringpool_str1428[sizeof("yellow3")]; + char stringpool_str1443[sizeof("indian red")]; + char stringpool_str1444[sizeof("lightslategray")]; + char stringpool_str1445[sizeof("light blue")]; + char stringpool_str1453[sizeof("navyblue")]; + char stringpool_str1454[sizeof("dark sea green")]; + char stringpool_str1456[sizeof("medium blue")]; + char stringpool_str1458[sizeof("yellow2")]; + char stringpool_str1468[sizeof("yellow1")]; + char stringpool_str1480[sizeof("light goldenrod")]; + char stringpool_str1509[sizeof("white")]; + char stringpool_str1515[sizeof("dark slate grey")]; + char stringpool_str1517[sizeof("light salmon")]; + char stringpool_str1518[sizeof("aquamarine")]; + char stringpool_str1519[sizeof("aquamarine4")]; + char stringpool_str1524[sizeof("aquamarine3")]; + char stringpool_str1525[sizeof("violet red")]; + char stringpool_str1530[sizeof("dark slate blue")]; + char stringpool_str1531[sizeof("sandybrown")]; + char stringpool_str1534[sizeof("plum")]; + char stringpool_str1539[sizeof("aquamarine2")]; + char stringpool_str1544[sizeof("aquamarine1")]; + char stringpool_str1550[sizeof("chartreuse")]; + char stringpool_str1551[sizeof("chartreuse4")]; + char stringpool_str1555[sizeof("royal blue")]; + char stringpool_str1556[sizeof("chartreuse3")]; + char stringpool_str1559[sizeof("palegreen")]; + char stringpool_str1560[sizeof("mediumslateblue")]; + char stringpool_str1571[sizeof("chartreuse2")]; + char stringpool_str1574[sizeof("pink")]; + char stringpool_str1576[sizeof("chartreuse1")]; + char stringpool_str1582[sizeof("yellowgreen")]; + char stringpool_str1595[sizeof("dark slate gray")]; + char stringpool_str1626[sizeof("rosy brown")]; + char stringpool_str1639[sizeof("chocolate")]; + char stringpool_str1640[sizeof("chocolate4")]; + char stringpool_str1645[sizeof("chocolate3")]; + char stringpool_str1653[sizeof("darkcyan")]; + char stringpool_str1658[sizeof("palegoldenrod")]; + char stringpool_str1660[sizeof("chocolate2")]; + char stringpool_str1665[sizeof("chocolate1")]; + char stringpool_str1685[sizeof("grey9")]; + char stringpool_str1686[sizeof("grey49")]; + char stringpool_str1687[sizeof("grey6")]; + char stringpool_str1688[sizeof("grey46")]; + char stringpool_str1689[sizeof("cadetblue")]; + char stringpool_str1690[sizeof("cadetblue4")]; + char stringpool_str1691[sizeof("grey39")]; + char stringpool_str1693[sizeof("grey36")]; + char stringpool_str1695[sizeof("cadetblue3")]; + char stringpool_str1697[sizeof("greenyellow")]; + char stringpool_str1702[sizeof("grey79")]; + char stringpool_str1704[sizeof("grey76")]; + char stringpool_str1705[sizeof("midnightblue")]; + char stringpool_str1706[sizeof("grey29")]; + char stringpool_str1708[sizeof("grey26")]; + char stringpool_str1710[sizeof("cadetblue2")]; + char stringpool_str1711[sizeof("grey19")]; + char stringpool_str1713[sizeof("grey16")]; + char stringpool_str1715[sizeof("cadetblue1")]; + char stringpool_str1736[sizeof("lawn green")]; + char stringpool_str1755[sizeof("lightcoral")]; + char stringpool_str1759[sizeof("orchid")]; + char stringpool_str1760[sizeof("orchid4")]; + char stringpool_str1765[sizeof("gray9")]; + char stringpool_str1766[sizeof("gray49")]; + char stringpool_str1767[sizeof("gray6")]; + char stringpool_str1768[sizeof("gray46")]; + char stringpool_str1770[sizeof("orchid3")]; + char stringpool_str1771[sizeof("gray39")]; + char stringpool_str1773[sizeof("gray36")]; + char stringpool_str1782[sizeof("gray79")]; + char stringpool_str1784[sizeof("gray76")]; + char stringpool_str1786[sizeof("gray29")]; + char stringpool_str1788[sizeof("gray26")]; + char stringpool_str1791[sizeof("gray19")]; + char stringpool_str1793[sizeof("gray16")]; + char stringpool_str1797[sizeof("mediumorchid")]; + char stringpool_str1798[sizeof("mediumorchid4")]; + char stringpool_str1799[sizeof("mintcream")]; + char stringpool_str1800[sizeof("orchid2")]; + char stringpool_str1804[sizeof("lavenderblush4")]; + char stringpool_str1808[sizeof("mediumorchid3")]; + char stringpool_str1810[sizeof("orchid1")]; + char stringpool_str1814[sizeof("lavenderblush3")]; + char stringpool_str1826[sizeof("khaki")]; + char stringpool_str1828[sizeof("alice blue")]; + char stringpool_str1832[sizeof("dark turquoise")]; + char stringpool_str1835[sizeof("grey8")]; + char stringpool_str1836[sizeof("grey48")]; + char stringpool_str1838[sizeof("mediumorchid2")]; + char stringpool_str1841[sizeof("grey38")]; + char stringpool_str1844[sizeof("lavenderblush2")]; + char stringpool_str1845[sizeof("grey0")]; + char stringpool_str1846[sizeof("grey40")]; + char stringpool_str1848[sizeof("mediumorchid1")]; + char stringpool_str1851[sizeof("grey30")]; + char stringpool_str1852[sizeof("grey78")]; + char stringpool_str1854[sizeof("lavenderblush1")]; + char stringpool_str1856[sizeof("grey28")]; + char stringpool_str1861[sizeof("grey18")]; + char stringpool_str1862[sizeof("grey70")]; + char stringpool_str1865[sizeof("lightcyan4")]; + char stringpool_str1866[sizeof("grey20")]; + char stringpool_str1870[sizeof("lightcyan3")]; + char stringpool_str1871[sizeof("grey10")]; + char stringpool_str1885[sizeof("lightcyan2")]; + char stringpool_str1890[sizeof("lightcyan1")]; + char stringpool_str1893[sizeof("darkviolet")]; + char stringpool_str1897[sizeof("mediumspringgreen")]; + char stringpool_str1901[sizeof("lightgoldenrodyellow")]; + char stringpool_str1903[sizeof("darkolivegreen4")]; + char stringpool_str1907[sizeof("lightyellow")]; + char stringpool_str1913[sizeof("darkolivegreen3")]; + char stringpool_str1915[sizeof("gray8")]; + char stringpool_str1916[sizeof("gray48")]; + char stringpool_str1920[sizeof("pale green")]; + char stringpool_str1921[sizeof("gray38")]; + char stringpool_str1925[sizeof("gray0")]; + char stringpool_str1926[sizeof("gray40")]; + char stringpool_str1931[sizeof("gray30")]; + char stringpool_str1932[sizeof("gray78")]; + char stringpool_str1935[sizeof("honeydew4")]; + char stringpool_str1936[sizeof("gray28")]; + char stringpool_str1941[sizeof("gray18")]; + char stringpool_str1942[sizeof("gray70")]; + char stringpool_str1943[sizeof("darkolivegreen2")]; + char stringpool_str1945[sizeof("honeydew3")]; + char stringpool_str1946[sizeof("gray20")]; + char stringpool_str1951[sizeof("gray10")]; + char stringpool_str1953[sizeof("darkolivegreen1")]; + char stringpool_str1973[sizeof("mediumturquoise")]; + char stringpool_str1974[sizeof("navy blue")]; + char stringpool_str1975[sizeof("honeydew2")]; + char stringpool_str1985[sizeof("honeydew1")]; + char stringpool_str1986[sizeof("light slate grey")]; + char stringpool_str2011[sizeof("medium orchid")]; + char stringpool_str2019[sizeof("grey5")]; + char stringpool_str2020[sizeof("grey45")]; + char stringpool_str2024[sizeof("lightcyan")]; + char stringpool_str2025[sizeof("grey35")]; + char stringpool_str2036[sizeof("grey75")]; + char stringpool_str2038[sizeof("deep sky blue")]; + char stringpool_str2040[sizeof("grey25")]; + char stringpool_str2045[sizeof("grey15")]; + char stringpool_str2057[sizeof("mediumpurple")]; + char stringpool_str2058[sizeof("mediumpurple4")]; + char stringpool_str2061[sizeof("hotpink4")]; + char stringpool_str2062[sizeof("darkolivegreen")]; + char stringpool_str2066[sizeof("light slate gray")]; + char stringpool_str2068[sizeof("mediumpurple3")]; + char stringpool_str2071[sizeof("hotpink3")]; + char stringpool_str2089[sizeof("blanchedalmond")]; + char stringpool_str2098[sizeof("mediumpurple2")]; + char stringpool_str2099[sizeof("gray5")]; + char stringpool_str2100[sizeof("gray45")]; + char stringpool_str2101[sizeof("hotpink2")]; + char stringpool_str2104[sizeof("light sky blue")]; + char stringpool_str2105[sizeof("gray35")]; + char stringpool_str2108[sizeof("mediumpurple1")]; + char stringpool_str2111[sizeof("hotpink1")]; + char stringpool_str2116[sizeof("gray75")]; + char stringpool_str2118[sizeof("firebrick4")]; + char stringpool_str2120[sizeof("gray25")]; + char stringpool_str2123[sizeof("firebrick3")]; + char stringpool_str2125[sizeof("gray15")]; + char stringpool_str2126[sizeof("light steel blue")]; + char stringpool_str2130[sizeof("mint cream")]; + char stringpool_str2138[sizeof("firebrick2")]; + char stringpool_str2143[sizeof("firebrick1")]; + char stringpool_str2174[sizeof("dark cyan")]; + char stringpool_str2179[sizeof("pale goldenrod")]; + char stringpool_str2184[sizeof("mediumaquamarine")]; + char stringpool_str2193[sizeof("paleturquoise")]; + char stringpool_str2194[sizeof("paleturquoise4")]; + char stringpool_str2196[sizeof("light coral")]; + char stringpool_str2197[sizeof("medium slate blue")]; + char stringpool_str2199[sizeof("whitesmoke")]; + char stringpool_str2204[sizeof("paleturquoise3")]; + char stringpool_str2210[sizeof("cadet blue")]; + char stringpool_str2218[sizeof("antiquewhite")]; + char stringpool_str2219[sizeof("antiquewhite4")]; + char stringpool_str2223[sizeof("blueviolet")]; + char stringpool_str2224[sizeof("antique white")]; + char stringpool_str2229[sizeof("antiquewhite3")]; + char stringpool_str2234[sizeof("paleturquoise2")]; + char stringpool_str2244[sizeof("paleturquoise1")]; + char stringpool_str2248[sizeof("yellow")]; + char stringpool_str2251[sizeof("moccasin")]; + char stringpool_str2252[sizeof("deeppink4")]; + char stringpool_str2259[sizeof("antiquewhite2")]; + char stringpool_str2262[sizeof("deeppink3")]; + char stringpool_str2263[sizeof("yellow green")]; + char stringpool_str2266[sizeof("light slate blue")]; + char stringpool_str2269[sizeof("antiquewhite1")]; + char stringpool_str2272[sizeof("cornsilk4")]; + char stringpool_str2281[sizeof("dark orchid")]; + char stringpool_str2282[sizeof("cornsilk3")]; + char stringpool_str2292[sizeof("deeppink2")]; + char stringpool_str2302[sizeof("deeppink1")]; + char stringpool_str2312[sizeof("cornsilk2")]; + char stringpool_str2318[sizeof("light goldenrod yellow")]; + char stringpool_str2322[sizeof("cornsilk1")]; + char stringpool_str2325[sizeof("white smoke")]; + char stringpool_str2385[sizeof("light cyan")]; + char stringpool_str2388[sizeof("mediumvioletred")]; + char stringpool_str2401[sizeof("powderblue")]; + char stringpool_str2410[sizeof("medium aquamarine")]; + char stringpool_str2414[sizeof("dark violet")]; + char stringpool_str2424[sizeof("dark olive green")]; + char stringpool_str2433[sizeof("darkorchid")]; + char stringpool_str2434[sizeof("darkorchid4")]; + char stringpool_str2439[sizeof("darkorchid3")]; + char stringpool_str2454[sizeof("darkorchid2")]; + char stringpool_str2455[sizeof("hotpink")]; + char stringpool_str2459[sizeof("darkorchid1")]; + char stringpool_str2473[sizeof("lavenderblush")]; + char stringpool_str2483[sizeof("floral white")]; + char stringpool_str2512[sizeof("firebrick")]; + char stringpool_str2526[sizeof("grey99")]; + char stringpool_str2527[sizeof("grey69")]; + char stringpool_str2528[sizeof("grey96")]; + char stringpool_str2529[sizeof("grey66")]; + char stringpool_str2546[sizeof("midnight blue")]; + char stringpool_str2594[sizeof("ghostwhite")]; + char stringpool_str2597[sizeof("powder blue")]; + char stringpool_str2601[sizeof("grey89")]; + char stringpool_str2603[sizeof("grey86")]; + char stringpool_str2606[sizeof("gray99")]; + char stringpool_str2607[sizeof("gray69")]; + char stringpool_str2608[sizeof("gray96")]; + char stringpool_str2609[sizeof("gray66")]; + char stringpool_str2623[sizeof("lightpink4")]; + char stringpool_str2628[sizeof("lightpink3")]; + char stringpool_str2635[sizeof("floralwhite")]; + char stringpool_str2643[sizeof("lightpink2")]; + char stringpool_str2646[sizeof("deeppink")]; + char stringpool_str2648[sizeof("lightpink1")]; + char stringpool_str2666[sizeof("cornsilk")]; + char stringpool_str2676[sizeof("grey98")]; + char stringpool_str2677[sizeof("grey68")]; + char stringpool_str2681[sizeof("gray89")]; + char stringpool_str2683[sizeof("gray86")]; + char stringpool_str2686[sizeof("grey90")]; + char stringpool_str2687[sizeof("grey60")]; + char stringpool_str2693[sizeof("grey59")]; + char stringpool_str2695[sizeof("grey56")]; + char stringpool_str2720[sizeof("blanched almond")]; + char stringpool_str2735[sizeof("cornflowerblue")]; + char stringpool_str2741[sizeof("cornflower blue")]; + char stringpool_str2743[sizeof("dark khaki")]; + char stringpool_str2744[sizeof("blue violet")]; + char stringpool_str2751[sizeof("grey88")]; + char stringpool_str2756[sizeof("gray98")]; + char stringpool_str2757[sizeof("gray68")]; + char stringpool_str2761[sizeof("grey80")]; + char stringpool_str2765[sizeof("honeydew")]; + char stringpool_str2766[sizeof("gray90")]; + char stringpool_str2767[sizeof("gray60")]; + char stringpool_str2773[sizeof("gray59")]; + char stringpool_str2775[sizeof("gray56")]; + char stringpool_str2792[sizeof("grey100")]; + char stringpool_str2793[sizeof("medium purple")]; + char stringpool_str2819[sizeof("medium turquoise")]; + char stringpool_str2831[sizeof("gray88")]; + char stringpool_str2834[sizeof("green yellow")]; + char stringpool_str2841[sizeof("gray80")]; + char stringpool_str2843[sizeof("grey58")]; + char stringpool_str2853[sizeof("grey50")]; + char stringpool_str2860[sizeof("grey95")]; + char stringpool_str2861[sizeof("grey65")]; + char stringpool_str2872[sizeof("gray100")]; + char stringpool_str2895[sizeof("darkkhaki")]; + char stringpool_str2923[sizeof("gray58")]; + char stringpool_str2933[sizeof("gray50")]; + char stringpool_str2935[sizeof("grey85")]; + char stringpool_str2940[sizeof("gray95")]; + char stringpool_str2941[sizeof("gray65")]; + char stringpool_str2960[sizeof("ghost white")]; + char stringpool_str2971[sizeof("palevioletred")]; + char stringpool_str2972[sizeof("palevioletred4")]; + char stringpool_str2982[sizeof("palevioletred3")]; + char stringpool_str3012[sizeof("palevioletred2")]; + char stringpool_str3015[sizeof("gray85")]; + char stringpool_str3017[sizeof("lightpink")]; + char stringpool_str3022[sizeof("palevioletred1")]; + char stringpool_str3027[sizeof("grey55")]; + char stringpool_str3033[sizeof("navajo white")]; + char stringpool_str3044[sizeof("light yellow")]; + char stringpool_str3062[sizeof("pale turquoise")]; + char stringpool_str3099[sizeof("medium spring green")]; + char stringpool_str3107[sizeof("gray55")]; + char stringpool_str3116[sizeof("lemonchiffon4")]; + char stringpool_str3126[sizeof("lemonchiffon3")]; + char stringpool_str3143[sizeof("light pink")]; + char stringpool_str3156[sizeof("lemonchiffon2")]; + char stringpool_str3166[sizeof("lemonchiffon1")]; + char stringpool_str3167[sizeof("deep pink")]; + char stringpool_str3185[sizeof("navajowhite")]; + char stringpool_str3186[sizeof("navajowhite4")]; + char stringpool_str3196[sizeof("navajowhite3")]; + char stringpool_str3225[sizeof("peachpuff4")]; + char stringpool_str3226[sizeof("navajowhite2")]; + char stringpool_str3230[sizeof("peachpuff3")]; + char stringpool_str3236[sizeof("navajowhite1")]; + char stringpool_str3245[sizeof("peachpuff2")]; + char stringpool_str3250[sizeof("peachpuff1")]; + char stringpool_str3275[sizeof("lemonchiffon")]; + char stringpool_str3279[sizeof("peachpuff")]; + char stringpool_str3314[sizeof("lavender blush")]; + char stringpool_str3330[sizeof("medium violet red")]; + char stringpool_str3471[sizeof("hot pink")]; + char stringpool_str3745[sizeof("peach puff")]; + char stringpool_str3841[sizeof("lemon chiffon")]; + char stringpool_str4013[sizeof("pale violet red")]; + char stringpool_str5422[sizeof("papaya whip")]; + char stringpool_str5574[sizeof("papayawhip")]; +}; +static const struct stringpool_t stringpool_contents = +{ + "red", + "red4", + "grey4", + "grey44", + "darkred", + "red3", + "grey34", + "grey3", + "grey43", + "grey33", + "grey74", + "red2", + "grey24", + "red1", + "grey14", + "grey73", + "grey23", + "grey7", + "grey47", + "grey13", + "grey37", + "grey2", + "grey42", + "grey32", + "grey77", + "grey1", + "grey41", + "grey27", + "grey31", + "grey72", + "grey17", + "grey22", + "grey12", + "grey71", + "grey21", + "grey11", + "gray4", + "gray44", + "gray34", + "gray3", + "gray43", + "gray33", + "gray74", + "snow4", + "gray24", + "gray14", + "gray73", + "snow3", + "gray23", + "gray7", + "gray47", + "gray13", + "gray37", + "gray2", + "gray42", + "gray32", + "gray77", + "gray1", + "gray41", + "gray27", + "gray31", + "gray72", + "gray17", + "snow2", + "gray22", + "gray12", + "gray71", + "snow1", + "gray21", + "gray11", + "green4", + "springgreen4", + "green3", + "springgreen3", + "orange", + "orange4", + "orangered", + "orangered4", + "orangered3", + "orange3", + "green2", + "orangered2", + "springgreen2", + "orangered1", + "green1", + "gold", + "gold4", + "springgreen1", + "orange2", + "gold3", + "orange1", + "sienna4", + "seagreen4", + "darkseagreen4", + "sienna3", + "seagreen3", + "gold2", + "darkseagreen3", + "grey", + "gold1", + "brown4", + "brown3", + "sienna2", + "seagreen2", + "darkseagreen2", + "sienna1", + "seagreen1", + "darkseagreen1", + "brown2", + "tan4", + "brown1", + "tan3", + "green", + "sienna", + "darkgreen", + "springgreen", + "blue", + "blue4", + "bisque", + "bisque4", + "tan2", + "tan1", + "blue3", + "bisque3", + "gray", + "darkorange", + "darkorange4", + "darkorange3", + "darkorange2", + "blue2", + "darkorange1", + "bisque2", + "forestgreen", + "blue1", + "bisque1", + "seagreen", + "sea green", + "azure", + "azure4", + "darkseagreen", + "azure3", + "darkgoldenrod", + "darkgoldenrod4", + "brown", + "slategray4", + "darkgoldenrod3", + "slategray3", + "azure2", + "slategray2", + "maroon4", + "slategray1", + "azure1", + "maroon3", + "darkgoldenrod2", + "tan", + "darkgoldenrod1", + "salmon4", + "goldenrod", + "goldenrod4", + "goldenrod3", + "saddlebrown", + "salmon3", + "maroon2", + "goldenrod2", + "maroon1", + "goldenrod1", + "darkmagenta", + "salmon2", + "dark red", + "salmon1", + "darkgrey", + "lightgreen", + "darkblue", + "dodgerblue", + "dodgerblue4", + "dodgerblue3", + "mistyrose", + "mistyrose4", + "mistyrose3", + "dodgerblue2", + "dodgerblue1", + "mistyrose2", + "mistyrose1", + "magenta4", + "magenta3", + "tomato4", + "maroon", + "tomato3", + "darkgray", + "slategrey", + "magenta2", + "slateblue", + "slateblue4", + "slateblue3", + "salmon", + "magenta1", + "tomato2", + "slateblue2", + "tomato1", + "slateblue1", + "magenta", + "beige", + "dark green", + "slategray", + "linen", + "tomato", + "orange red", + "dimgrey", + "dim grey", + "limegreen", + "dodger blue", + "darksalmon", + "steelblue", + "steelblue4", + "steelblue3", + "lightseagreen", + "darkslateblue", + "steelblue2", + "steelblue1", + "lightgoldenrod", + "lightgoldenrod4", + "dimgray", + "dim gray", + "darkslategray4", + "lightgoldenrod3", + "skyblue", + "skyblue4", + "sky blue", + "darkslategray3", + "skyblue3", + "lightgoldenrod2", + "grey94", + "grey64", + "darkslategray2", + "lightgoldenrod1", + "skyblue2", + "grey93", + "grey63", + "darkslategray1", + "skyblue1", + "lightsalmon4", + "olivedrab4", + "dark orange", + "olivedrab", + "olivedrab3", + "slate grey", + "lightsalmon3", + "grey97", + "grey67", + "black", + "grey92", + "grey62", + "olivedrab2", + "deepskyblue", + "deepskyblue4", + "olivedrab1", + "grey91", + "grey61", + "deepskyblue3", + "lightsalmon2", + "lightgrey", + "lightsalmon1", + "grey84", + "indianred", + "indianred4", + "lightblue", + "lightblue4", + "gray94", + "gray64", + "indianred3", + "lightblue3", + "grey83", + "deepskyblue2", + "snow", + "gray93", + "gray63", + "deepskyblue1", + "indianred2", + "lightblue2", + "indianred1", + "dark goldenrod", + "lightblue1", + "grey87", + "slate gray", + "gray97", + "gray67", + "grey82", + "dark magenta", + "darkturquoise", + "gray92", + "gray62", + "grey81", + "gray91", + "gray61", + "gainsboro", + "lightgray", + "wheat4", + "darkslategrey", + "gray84", + "wheat3", + "violetred", + "violetred4", + "violetred3", + "gray83", + "spring green", + "grey54", + "grey53", + "violetred2", + "lightsalmon", + "violetred1", + "wheat2", + "gray87", + "royalblue", + "royalblue4", + "royalblue3", + "gray82", + "wheat1", + "ivory4", + "grey57", + "lightskyblue", + "lightskyblue4", + "gray81", + "grey52", + "ivory3", + "royalblue2", + "lightskyblue3", + "dark grey", + "royalblue1", + "light green", + "forest green", + "grey51", + "cyan4", + "saddle brown", + "darkslategray", + "dark blue", + "cyan3", + "lightyellow4", + "lightsteelblue", + "lightsteelblue4", + "ivory2", + "misty rose", + "lightyellow3", + "lightskyblue2", + "lightsteelblue3", + "gray54", + "ivory1", + "lime green", + "lightskyblue1", + "gray53", + "cyan2", + "rosybrown4", + "rosybrown3", + "cyan1", + "lightyellow2", + "mediumseagreen", + "lightsteelblue2", + "lavender", + "gray57", + "rosybrown2", + "lightyellow1", + "lightsteelblue1", + "rosybrown1", + "gray52", + "dark gray", + "gray51", + "wheat", + "khaki4", + "slate blue", + "violet", + "khaki3", + "light grey", + "oldlace", + "navy", + "dark salmon", + "pink4", + "seashell4", + "pink3", + "khaki2", + "seashell3", + "coral4", + "khaki1", + "thistle", + "thistle4", + "coral3", + "thistle3", + "pink2", + "sandy brown", + "cyan", + "seashell2", + "pink1", + "purple", + "purple4", + "seashell1", + "coral2", + "light gray", + "thistle2", + "purple3", + "coral1", + "thistle1", + "mediumblue", + "turquoise", + "turquoise4", + "rosybrown", + "turquoise3", + "purple2", + "turquoise2", + "purple1", + "turquoise1", + "steel blue", + "light sea green", + "aliceblue", + "ivory", + "burlywood", + "burlywood4", + "burlywood3", + "burlywood2", + "burlywood1", + "peru", + "plum4", + "plum3", + "lightslategrey", + "lightslateblue", + "lawngreen", + "old lace", + "plum2", + "olive drab", + "plum1", + "palegreen4", + "medium sea green", + "seashell", + "palegreen3", + "coral", + "yellow4", + "palegreen2", + "palegreen1", + "yellow3", + "indian red", + "lightslategray", + "light blue", + "navyblue", + "dark sea green", + "medium blue", + "yellow2", + "yellow1", + "light goldenrod", + "white", + "dark slate grey", + "light salmon", + "aquamarine", + "aquamarine4", + "aquamarine3", + "violet red", + "dark slate blue", + "sandybrown", + "plum", + "aquamarine2", + "aquamarine1", + "chartreuse", + "chartreuse4", + "royal blue", + "chartreuse3", + "palegreen", + "mediumslateblue", + "chartreuse2", + "pink", + "chartreuse1", + "yellowgreen", + "dark slate gray", + "rosy brown", + "chocolate", + "chocolate4", + "chocolate3", + "darkcyan", + "palegoldenrod", + "chocolate2", + "chocolate1", + "grey9", + "grey49", + "grey6", + "grey46", + "cadetblue", + "cadetblue4", + "grey39", + "grey36", + "cadetblue3", + "greenyellow", + "grey79", + "grey76", + "midnightblue", + "grey29", + "grey26", + "cadetblue2", + "grey19", + "grey16", + "cadetblue1", + "lawn green", + "lightcoral", + "orchid", + "orchid4", + "gray9", + "gray49", + "gray6", + "gray46", + "orchid3", + "gray39", + "gray36", + "gray79", + "gray76", + "gray29", + "gray26", + "gray19", + "gray16", + "mediumorchid", + "mediumorchid4", + "mintcream", + "orchid2", + "lavenderblush4", + "mediumorchid3", + "orchid1", + "lavenderblush3", + "khaki", + "alice blue", + "dark turquoise", + "grey8", + "grey48", + "mediumorchid2", + "grey38", + "lavenderblush2", + "grey0", + "grey40", + "mediumorchid1", + "grey30", + "grey78", + "lavenderblush1", + "grey28", + "grey18", + "grey70", + "lightcyan4", + "grey20", + "lightcyan3", + "grey10", + "lightcyan2", + "lightcyan1", + "darkviolet", + "mediumspringgreen", + "lightgoldenrodyellow", + "darkolivegreen4", + "lightyellow", + "darkolivegreen3", + "gray8", + "gray48", + "pale green", + "gray38", + "gray0", + "gray40", + "gray30", + "gray78", + "honeydew4", + "gray28", + "gray18", + "gray70", + "darkolivegreen2", + "honeydew3", + "gray20", + "gray10", + "darkolivegreen1", + "mediumturquoise", + "navy blue", + "honeydew2", + "honeydew1", + "light slate grey", + "medium orchid", + "grey5", + "grey45", + "lightcyan", + "grey35", + "grey75", + "deep sky blue", + "grey25", + "grey15", + "mediumpurple", + "mediumpurple4", + "hotpink4", + "darkolivegreen", + "light slate gray", + "mediumpurple3", + "hotpink3", + "blanchedalmond", + "mediumpurple2", + "gray5", + "gray45", + "hotpink2", + "light sky blue", + "gray35", + "mediumpurple1", + "hotpink1", + "gray75", + "firebrick4", + "gray25", + "firebrick3", + "gray15", + "light steel blue", + "mint cream", + "firebrick2", + "firebrick1", + "dark cyan", + "pale goldenrod", + "mediumaquamarine", + "paleturquoise", + "paleturquoise4", + "light coral", + "medium slate blue", + "whitesmoke", + "paleturquoise3", + "cadet blue", + "antiquewhite", + "antiquewhite4", + "blueviolet", + "antique white", + "antiquewhite3", + "paleturquoise2", + "paleturquoise1", + "yellow", + "moccasin", + "deeppink4", + "antiquewhite2", + "deeppink3", + "yellow green", + "light slate blue", + "antiquewhite1", + "cornsilk4", + "dark orchid", + "cornsilk3", + "deeppink2", + "deeppink1", + "cornsilk2", + "light goldenrod yellow", + "cornsilk1", + "white smoke", + "light cyan", + "mediumvioletred", + "powderblue", + "medium aquamarine", + "dark violet", + "dark olive green", + "darkorchid", + "darkorchid4", + "darkorchid3", + "darkorchid2", + "hotpink", + "darkorchid1", + "lavenderblush", + "floral white", + "firebrick", + "grey99", + "grey69", + "grey96", + "grey66", + "midnight blue", + "ghostwhite", + "powder blue", + "grey89", + "grey86", + "gray99", + "gray69", + "gray96", + "gray66", + "lightpink4", + "lightpink3", + "floralwhite", + "lightpink2", + "deeppink", + "lightpink1", + "cornsilk", + "grey98", + "grey68", + "gray89", + "gray86", + "grey90", + "grey60", + "grey59", + "grey56", + "blanched almond", + "cornflowerblue", + "cornflower blue", + "dark khaki", + "blue violet", + "grey88", + "gray98", + "gray68", + "grey80", + "honeydew", + "gray90", + "gray60", + "gray59", + "gray56", + "grey100", + "medium purple", + "medium turquoise", + "gray88", + "green yellow", + "gray80", + "grey58", + "grey50", + "grey95", + "grey65", + "gray100", + "darkkhaki", + "gray58", + "gray50", + "grey85", + "gray95", + "gray65", + "ghost white", + "palevioletred", + "palevioletred4", + "palevioletred3", + "palevioletred2", + "gray85", + "lightpink", + "palevioletred1", + "grey55", + "navajo white", + "light yellow", + "pale turquoise", + "medium spring green", + "gray55", + "lemonchiffon4", + "lemonchiffon3", + "light pink", + "lemonchiffon2", + "lemonchiffon1", + "deep pink", + "navajowhite", + "navajowhite4", + "navajowhite3", + "peachpuff4", + "navajowhite2", + "peachpuff3", + "navajowhite1", + "peachpuff2", + "peachpuff1", + "lemonchiffon", + "peachpuff", + "lavender blush", + "medium violet red", + "hot pink", + "peach puff", + "lemon chiffon", + "pale violet red", + "papaya whip", + "papayawhip" +}; +#define stringpool ((const char *) &stringpool_contents) const struct color * -lookup_rgb (str, len) -register const char *str; + =lookup_rgb (str, len) + register const char *str; register unsigned int len; { static const struct color wordlist[] = { - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"red", 0xff, 0x00, 0x00}, - {"red4", 0x8b, 0x00, 0x00}, - {"grey4", 0x0a, 0x0a, 0x0a}, - {"grey44", 0x70, 0x70, 0x70}, - {"darkred", 0x8b, 0x00, 0x00}, - {"", 0, 0, 0}, - {"red3", 0xcd, 0x00, 0x00}, - {"", 0, 0, 0}, - {"grey34", 0x57, 0x57, 0x57}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey3", 0x08, 0x08, 0x08}, - {"grey43", 0x6e, 0x6e, 0x6e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey33", 0x54, 0x54, 0x54}, - {"grey74", 0xbd, 0xbd, 0xbd}, - {"", 0, 0, 0}, - {"red2", 0xee, 0x00, 0x00}, - {"", 0, 0, 0}, - {"grey24", 0x3d, 0x3d, 0x3d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"red1", 0xff, 0x00, 0x00}, - {"", 0, 0, 0}, - {"grey14", 0x24, 0x24, 0x24}, - {"grey73", 0xba, 0xba, 0xba}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey23", 0x3b, 0x3b, 0x3b}, - {"grey7", 0x12, 0x12, 0x12}, - {"grey47", 0x78, 0x78, 0x78}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey13", 0x21, 0x21, 0x21}, - {"", 0, 0, 0}, - {"grey37", 0x5e, 0x5e, 0x5e}, - {"", 0, 0, 0}, - {"grey2", 0x05, 0x05, 0x05}, - {"grey42", 0x6b, 0x6b, 0x6b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey32", 0x52, 0x52, 0x52}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey77", 0xc4, 0xc4, 0xc4}, - {"grey1", 0x03, 0x03, 0x03}, - {"grey41", 0x69, 0x69, 0x69}, - {"", 0, 0, 0}, - {"grey27", 0x45, 0x45, 0x45}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey31", 0x4f, 0x4f, 0x4f}, - {"grey72", 0xb8, 0xb8, 0xb8}, - {"grey17", 0x2b, 0x2b, 0x2b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey22", 0x38, 0x38, 0x38}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey12", 0x1f, 0x1f, 0x1f}, - {"grey71", 0xb5, 0xb5, 0xb5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey21", 0x36, 0x36, 0x36}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey11", 0x1c, 0x1c, 0x1c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray4", 0x0a, 0x0a, 0x0a}, - {"gray44", 0x70, 0x70, 0x70}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray34", 0x57, 0x57, 0x57}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray3", 0x08, 0x08, 0x08}, - {"gray43", 0x6e, 0x6e, 0x6e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray33", 0x54, 0x54, 0x54}, - {"gray74", 0xbd, 0xbd, 0xbd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"snow4", 0x8b, 0x89, 0x89}, - {"gray24", 0x3d, 0x3d, 0x3d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray14", 0x24, 0x24, 0x24}, - {"gray73", 0xba, 0xba, 0xba}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"snow3", 0xcd, 0xc9, 0xc9}, - {"gray23", 0x3b, 0x3b, 0x3b}, - {"gray7", 0x12, 0x12, 0x12}, - {"gray47", 0x78, 0x78, 0x78}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray13", 0x21, 0x21, 0x21}, - {"", 0, 0, 0}, - {"gray37", 0x5e, 0x5e, 0x5e}, - {"", 0, 0, 0}, - {"gray2", 0x05, 0x05, 0x05}, - {"gray42", 0x6b, 0x6b, 0x6b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray32", 0x52, 0x52, 0x52}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray77", 0xc4, 0xc4, 0xc4}, - {"gray1", 0x03, 0x03, 0x03}, - {"gray41", 0x69, 0x69, 0x69}, - {"", 0, 0, 0}, - {"gray27", 0x45, 0x45, 0x45}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray31", 0x4f, 0x4f, 0x4f}, - {"gray72", 0xb8, 0xb8, 0xb8}, - {"gray17", 0x2b, 0x2b, 0x2b}, - {"", 0, 0, 0}, - {"snow2", 0xee, 0xe9, 0xe9}, - {"gray22", 0x38, 0x38, 0x38}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray12", 0x1f, 0x1f, 0x1f}, - {"gray71", 0xb5, 0xb5, 0xb5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"snow1", 0xff, 0xfa, 0xfa}, - {"gray21", 0x36, 0x36, 0x36}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray11", 0x1c, 0x1c, 0x1c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"green4", 0x00, 0x8b, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"springgreen4", 0x00, 0x8b, 0x45}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"green3", 0x00, 0xcd, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"springgreen3", 0x00, 0xcd, 0x66}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orange", 0xff, 0xa5, 0x00}, - {"orange4", 0x8b, 0x5a, 0x00}, - {"", 0, 0, 0}, - {"orangered", 0xff, 0x45, 0x00}, - {"orangered4", 0x8b, 0x25, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orangered3", 0xcd, 0x37, 0x00}, - {"", 0, 0, 0}, - {"orange3", 0xcd, 0x85, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"green2", 0x00, 0xee, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orangered2", 0xee, 0x40, 0x00}, - {"", 0, 0, 0}, - {"springgreen2", 0x00, 0xee, 0x76}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orangered1", 0xff, 0x45, 0x00}, - {"green1", 0x00, 0xff, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gold", 0xff, 0xd7, 0x00}, - {"gold4", 0x8b, 0x75, 0x00}, - {"", 0, 0, 0}, - {"springgreen1", 0x00, 0xff, 0x7f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orange2", 0xee, 0x9a, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gold3", 0xcd, 0xad, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orange1", 0xff, 0xa5, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"sienna4", 0x8b, 0x47, 0x26}, - {"", 0, 0, 0}, - {"seagreen4", 0x2e, 0x8b, 0x57}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkseagreen4", 0x69, 0x8b, 0x69}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"sienna3", 0xcd, 0x68, 0x39}, - {"", 0, 0, 0}, - {"seagreen3", 0x43, 0xcd, 0x80}, - {"gold2", 0xee, 0xc9, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkseagreen3", 0x9b, 0xcd, 0x9b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey", 0xbe, 0xbe, 0xbe}, - {"gold1", 0xff, 0xd7, 0x00}, - {"brown4", 0x8b, 0x23, 0x23}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"brown3", 0xcd, 0x33, 0x33}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"sienna2", 0xee, 0x79, 0x42}, - {"", 0, 0, 0}, - {"seagreen2", 0x4e, 0xee, 0x94}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkseagreen2", 0xb4, 0xee, 0xb4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"sienna1", 0xff, 0x82, 0x47}, - {"", 0, 0, 0}, - {"seagreen1", 0x54, 0xff, 0x9f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkseagreen1", 0xc1, 0xff, 0xc1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"brown2", 0xee, 0x3b, 0x3b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tan4", 0x8b, 0x5a, 0x2b}, - {"", 0, 0, 0}, - {"brown1", 0xff, 0x40, 0x40}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tan3", 0xcd, 0x85, 0x3f}, - {"green", 0x00, 0xff, 0x00}, - {"sienna", 0xa0, 0x52, 0x2d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkgreen", 0x00, 0x64, 0x00}, - {"", 0, 0, 0}, - {"springgreen", 0x00, 0xff, 0x7f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"blue", 0x00, 0x00, 0xff}, - {"blue4", 0x00, 0x00, 0x8b}, - {"bisque", 0xff, 0xe4, 0xc4}, - {"bisque4", 0x8b, 0x7d, 0x6b}, - {"", 0, 0, 0}, - {"tan2", 0xee, 0x9a, 0x49}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tan1", 0xff, 0xa5, 0x4f}, - {"blue3", 0x00, 0x00, 0xcd}, - {"", 0, 0, 0}, - {"bisque3", 0xcd, 0xb7, 0x9e}, - {"", 0, 0, 0}, - {"gray", 0xbe, 0xbe, 0xbe}, - {"darkorange", 0xff, 0x8c, 0x00}, - {"darkorange4", 0x8b, 0x45, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkorange3", 0xcd, 0x66, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkorange2", 0xee, 0x76, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"blue2", 0x00, 0x00, 0xee}, - {"darkorange1", 0xff, 0x7f, 0x00}, - {"bisque2", 0xee, 0xd5, 0xb7}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"forestgreen", 0x22, 0x8b, 0x22}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"blue1", 0x00, 0x00, 0xff}, - {"", 0, 0, 0}, - {"bisque1", 0xff, 0xe4, 0xc4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"seagreen", 0x2e, 0x8b, 0x57}, - {"sea green", 0x2e, 0x8b, 0x57}, - {"azure", 0xf0, 0xff, 0xff}, - {"azure4", 0x83, 0x8b, 0x8b}, - {"darkseagreen", 0x8f, 0xbc, 0x8f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"azure3", 0xc1, 0xcd, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkgoldenrod", 0xb8, 0x86, 0x0b}, - {"darkgoldenrod4", 0x8b, 0x65, 0x08}, - {"brown", 0xa5, 0x2a, 0x2a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slategray4", 0x6c, 0x7b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkgoldenrod3", 0xcd, 0x95, 0x0c}, - {"slategray3", 0x9f, 0xb6, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"azure2", 0xe0, 0xee, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slategray2", 0xb9, 0xd3, 0xee}, - {"", 0, 0, 0}, - {"maroon4", 0x8b, 0x1c, 0x62}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slategray1", 0xc6, 0xe2, 0xff}, - {"azure1", 0xf0, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"maroon3", 0xcd, 0x29, 0x90}, - {"", 0, 0, 0}, - {"darkgoldenrod2", 0xee, 0xad, 0x0e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tan", 0xd2, 0xb4, 0x8c}, - {"darkgoldenrod1", 0xff, 0xb9, 0x0f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"salmon4", 0x8b, 0x4c, 0x39}, - {"", 0, 0, 0}, - {"goldenrod", 0xda, 0xa5, 0x20}, - {"goldenrod4", 0x8b, 0x69, 0x14}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"goldenrod3", 0xcd, 0x9b, 0x1d}, - {"saddlebrown", 0x8b, 0x45, 0x13}, - {"salmon3", 0xcd, 0x70, 0x54}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"maroon2", 0xee, 0x30, 0xa7}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"goldenrod2", 0xee, 0xb4, 0x22}, - {"", 0, 0, 0}, - {"maroon1", 0xff, 0x34, 0xb3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"goldenrod1", 0xff, 0xc1, 0x25}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"darkmagenta", 0x8b, 0x00, 0x8b}, - {"salmon2", 0xee, 0x82, 0x62}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark red", 0x8b, 0x00, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"salmon1", 0xff, 0x8c, 0x69}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkgrey", 0xa9, 0xa9, 0xa9}, - {"", 0, 0, 0}, - {"lightgreen", 0x90, 0xee, 0x90}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkblue", 0x00, 0x00, 0x8b}, - {"", 0, 0, 0}, - {"dodgerblue", 0x1e, 0x90, 0xff}, - {"dodgerblue4", 0x10, 0x4e, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dodgerblue3", 0x18, 0x74, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mistyrose", 0xff, 0xe4, 0xe1}, - {"mistyrose4", 0x8b, 0x7d, 0x7b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mistyrose3", 0xcd, 0xb7, 0xb5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dodgerblue2", 0x1c, 0x86, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dodgerblue1", 0x1e, 0x90, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mistyrose2", 0xee, 0xd5, 0xd2}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mistyrose1", 0xff, 0xe4, 0xe1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"magenta4", 0x8b, 0x00, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"magenta3", 0xcd, 0x00, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tomato4", 0x8b, 0x36, 0x26}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"maroon", 0xb0, 0x30, 0x60}, - {"tomato3", 0xcd, 0x4f, 0x39}, - {"darkgray", 0xa9, 0xa9, 0xa9}, - {"slategrey", 0x70, 0x80, 0x90}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"magenta2", 0xee, 0x00, 0xee}, - {"slateblue", 0x6a, 0x5a, 0xcd}, - {"slateblue4", 0x47, 0x3c, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slateblue3", 0x69, 0x59, 0xcd}, - {"salmon", 0xfa, 0x80, 0x72}, - {"", 0, 0, 0}, - {"magenta1", 0xff, 0x00, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tomato2", 0xee, 0x5c, 0x42}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slateblue2", 0x7a, 0x67, 0xee}, - {"", 0, 0, 0}, - {"tomato1", 0xff, 0x63, 0x47}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slateblue1", 0x83, 0x6f, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"magenta", 0xff, 0x00, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"beige", 0xf5, 0xf5, 0xdc}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark green", 0x00, 0x64, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"slategray", 0x70, 0x80, 0x90}, - {"linen", 0xfa, 0xf0, 0xe6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"tomato", 0xff, 0x63, 0x47}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orange red", 0xff, 0x45, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dimgrey", 0x69, 0x69, 0x69}, - {"dim grey", 0x69, 0x69, 0x69}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"limegreen", 0x32, 0xcd, 0x32}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dodger blue", 0x1e, 0x90, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darksalmon", 0xe9, 0x96, 0x7a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"steelblue", 0x46, 0x82, 0xb4}, - {"steelblue4", 0x36, 0x64, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"steelblue3", 0x4f, 0x94, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightseagreen", 0x20, 0xb2, 0xaa}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkslateblue", 0x48, 0x3d, 0x8b}, - {"", 0, 0, 0}, - {"steelblue2", 0x5c, 0xac, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"steelblue1", 0x63, 0xb8, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightgoldenrod", 0xee, 0xdd, 0x82}, - {"lightgoldenrod4", 0x8b, 0x81, 0x4c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dimgray", 0x69, 0x69, 0x69}, - {"dim gray", 0x69, 0x69, 0x69}, - {"darkslategray4", 0x52, 0x8b, 0x8b}, - {"lightgoldenrod3", 0xcd, 0xbe, 0x70}, - {"", 0, 0, 0}, - {"skyblue", 0x87, 0xce, 0xeb}, - {"skyblue4", 0x4a, 0x70, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"sky blue", 0x87, 0xce, 0xeb}, - {"darkslategray3", 0x79, 0xcd, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"skyblue3", 0x6c, 0xa6, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightgoldenrod2", 0xee, 0xdc, 0x82}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey94", 0xf0, 0xf0, 0xf0}, - {"grey64", 0xa3, 0xa3, 0xa3}, - {"", 0, 0, 0}, - {"darkslategray2", 0x8d, 0xee, 0xee}, - {"lightgoldenrod1", 0xff, 0xec, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"skyblue2", 0x7e, 0xc0, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey93", 0xed, 0xed, 0xed}, - {"grey63", 0xa1, 0xa1, 0xa1}, - {"", 0, 0, 0}, - {"darkslategray1", 0x97, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"skyblue1", 0x87, 0xce, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightsalmon4", 0x8b, 0x57, 0x42}, - {"olivedrab4", 0x69, 0x8b, 0x22}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark orange", 0xff, 0x8c, 0x00}, - {"olivedrab", 0x6b, 0x8e, 0x23}, - {"olivedrab3", 0x9a, 0xcd, 0x32}, - {"", 0, 0, 0}, - {"slate grey", 0x70, 0x80, 0x90}, - {"", 0, 0, 0}, - {"lightsalmon3", 0xcd, 0x81, 0x62}, - {"grey97", 0xf7, 0xf7, 0xf7}, - {"grey67", 0xab, 0xab, 0xab}, - {"black", 0x00, 0x00, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey92", 0xeb, 0xeb, 0xeb}, - {"grey62", 0x9e, 0x9e, 0x9e}, - {"olivedrab2", 0xb3, 0xee, 0x3a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deepskyblue", 0x00, 0xbf, 0xff}, - {"deepskyblue4", 0x00, 0x68, 0x8b}, - {"olivedrab1", 0xc0, 0xff, 0x3e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey91", 0xe8, 0xe8, 0xe8}, - {"grey61", 0x9c, 0x9c, 0x9c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deepskyblue3", 0x00, 0x9a, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightsalmon2", 0xee, 0x95, 0x72}, - {"", 0, 0, 0}, - {"lightgrey", 0xd3, 0xd3, 0xd3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightsalmon1", 0xff, 0xa0, 0x7a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey84", 0xd6, 0xd6, 0xd6}, - {"indianred", 0xcd, 0x5c, 0x5c}, - {"indianred4", 0x8b, 0x3a, 0x3a}, - {"lightblue", 0xad, 0xd8, 0xe6}, - {"lightblue4", 0x68, 0x83, 0x8b}, - {"gray94", 0xf0, 0xf0, 0xf0}, - {"gray64", 0xa3, 0xa3, 0xa3}, - {"indianred3", 0xcd, 0x55, 0x55}, - {"", 0, 0, 0}, - {"lightblue3", 0x9a, 0xc0, 0xcd}, - {"grey83", 0xd4, 0xd4, 0xd4}, - {"deepskyblue2", 0x00, 0xb2, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"snow", 0xff, 0xfa, 0xfa}, - {"gray93", 0xed, 0xed, 0xed}, - {"gray63", 0xa1, 0xa1, 0xa1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deepskyblue1", 0x00, 0xbf, 0xff}, - {"indianred2", 0xee, 0x63, 0x63}, - {"", 0, 0, 0}, - {"lightblue2", 0xb2, 0xdf, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"indianred1", 0xff, 0x6a, 0x6a}, - {"dark goldenrod", 0xb8, 0x86, 0x0b}, - {"lightblue1", 0xbf, 0xef, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey87", 0xde, 0xde, 0xde}, - {"", 0, 0, 0}, - {"slate gray", 0x70, 0x80, 0x90}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray97", 0xf7, 0xf7, 0xf7}, - {"gray67", 0xab, 0xab, 0xab}, - {"", 0, 0, 0}, - {"grey82", 0xd1, 0xd1, 0xd1}, - {"dark magenta", 0x8b, 0x00, 0x8b}, - {"darkturquoise", 0x00, 0xce, 0xd1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray92", 0xeb, 0xeb, 0xeb}, - {"gray62", 0x9e, 0x9e, 0x9e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey81", 0xcf, 0xcf, 0xcf}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray91", 0xe8, 0xe8, 0xe8}, - {"gray61", 0x9c, 0x9c, 0x9c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gainsboro", 0xdc, 0xdc, 0xdc}, - {"", 0, 0, 0}, - {"lightgray", 0xd3, 0xd3, 0xd3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"wheat4", 0x8b, 0x7e, 0x66}, - {"darkslategrey", 0x2f, 0x4f, 0x4f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray84", 0xd6, 0xd6, 0xd6}, - {"wheat3", 0xcd, 0xba, 0x96}, - {"", 0, 0, 0}, - {"violetred", 0xd0, 0x20, 0x90}, - {"violetred4", 0x8b, 0x22, 0x52}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"violetred3", 0xcd, 0x32, 0x78}, - {"gray83", 0xd4, 0xd4, 0xd4}, - {"spring green", 0x00, 0xff, 0x7f}, - {"grey54", 0x8a, 0x8a, 0x8a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey53", 0x87, 0x87, 0x87}, - {"", 0, 0, 0}, - {"violetred2", 0xee, 0x3a, 0x8c}, - {"lightsalmon", 0xff, 0xa0, 0x7a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"violetred1", 0xff, 0x3e, 0x96}, - {"", 0, 0, 0}, - {"wheat2", 0xee, 0xd8, 0xae}, - {"gray87", 0xde, 0xde, 0xde}, - {"royalblue", 0x41, 0x69, 0xe1}, - {"royalblue4", 0x27, 0x40, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"royalblue3", 0x3a, 0x5f, 0xcd}, - {"gray82", 0xd1, 0xd1, 0xd1}, - {"wheat1", 0xff, 0xe7, 0xba}, - {"", 0, 0, 0}, - {"ivory4", 0x8b, 0x8b, 0x83}, - {"grey57", 0x91, 0x91, 0x91}, - {"", 0, 0, 0}, - {"lightskyblue", 0x87, 0xce, 0xfa}, - {"lightskyblue4", 0x60, 0x7b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray81", 0xcf, 0xcf, 0xcf}, - {"", 0, 0, 0}, - {"grey52", 0x85, 0x85, 0x85}, - {"ivory3", 0xcd, 0xcd, 0xc1}, - {"royalblue2", 0x43, 0x6e, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightskyblue3", 0x8d, 0xb6, 0xcd}, - {"dark grey", 0xa9, 0xa9, 0xa9}, - {"royalblue1", 0x48, 0x76, 0xff}, - {"light green", 0x90, 0xee, 0x90}, - {"forest green", 0x22, 0x8b, 0x22}, - {"grey51", 0x82, 0x82, 0x82}, - {"", 0, 0, 0}, - {"cyan4", 0x00, 0x8b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"saddle brown", 0x8b, 0x45, 0x13}, - {"darkslategray", 0x2f, 0x4f, 0x4f}, - {"dark blue", 0x00, 0x00, 0x8b}, - {"cyan3", 0x00, 0xcd, 0xcd}, - {"", 0, 0, 0}, - {"lightyellow4", 0x8b, 0x8b, 0x7a}, - {"", 0, 0, 0}, - {"lightsteelblue", 0xb0, 0xc4, 0xde}, - {"lightsteelblue4", 0x6e, 0x7b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"ivory2", 0xee, 0xee, 0xe0}, - {"misty rose", 0xff, 0xe4, 0xe1}, - {"", 0, 0, 0}, - {"lightyellow3", 0xcd, 0xcd, 0xb4}, - {"lightskyblue2", 0xa4, 0xd3, 0xee}, - {"", 0, 0, 0}, - {"lightsteelblue3", 0xa2, 0xb5, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray54", 0x8a, 0x8a, 0x8a}, - {"ivory1", 0xff, 0xff, 0xf0}, - {"lime green", 0x32, 0xcd, 0x32}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightskyblue1", 0xb0, 0xe2, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray53", 0x87, 0x87, 0x87}, - {"", 0, 0, 0}, - {"cyan2", 0x00, 0xee, 0xee}, - {"rosybrown4", 0x8b, 0x69, 0x69}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"rosybrown3", 0xcd, 0x9b, 0x9b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cyan1", 0x00, 0xff, 0xff}, - {"", 0, 0, 0}, - {"lightyellow2", 0xee, 0xee, 0xd1}, - {"", 0, 0, 0}, - {"mediumseagreen", 0x3c, 0xb3, 0x71}, - {"lightsteelblue2", 0xbc, 0xd2, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lavender", 0xe6, 0xe6, 0xfa}, - {"", 0, 0, 0}, - {"gray57", 0x91, 0x91, 0x91}, - {"rosybrown2", 0xee, 0xb4, 0xb4}, - {"lightyellow1", 0xff, 0xff, 0xe0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightsteelblue1", 0xca, 0xe1, 0xff}, - {"rosybrown1", 0xff, 0xc1, 0xc1}, - {"", 0, 0, 0}, - {"gray52", 0x85, 0x85, 0x85}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark gray", 0xa9, 0xa9, 0xa9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray51", 0x82, 0x82, 0x82}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"wheat", 0xf5, 0xde, 0xb3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"khaki4", 0x8b, 0x86, 0x4e}, - {"slate blue", 0x6a, 0x5a, 0xcd}, - {"violet", 0xee, 0x82, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"khaki3", 0xcd, 0xc6, 0x73}, - {"light grey", 0xd3, 0xd3, 0xd3}, - {"", 0, 0, 0}, - {"oldlace", 0xfd, 0xf5, 0xe6}, - {"", 0, 0, 0}, - {"navy", 0x00, 0x00, 0x80}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark salmon", 0xe9, 0x96, 0x7a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pink4", 0x8b, 0x63, 0x6c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"seashell4", 0x8b, 0x86, 0x82}, - {"pink3", 0xcd, 0x91, 0x9e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"khaki2", 0xee, 0xe6, 0x85}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"seashell3", 0xcd, 0xc5, 0xbf}, - {"", 0, 0, 0}, - {"coral4", 0x8b, 0x3e, 0x2f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"khaki1", 0xff, 0xf6, 0x8f}, - {"thistle", 0xd8, 0xbf, 0xd8}, - {"thistle4", 0x8b, 0x7b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"coral3", 0xcd, 0x5b, 0x45}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"thistle3", 0xcd, 0xb5, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pink2", 0xee, 0xa9, 0xb8}, - {"sandy brown", 0xf4, 0xa4, 0x60}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cyan", 0x00, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"seashell2", 0xee, 0xe5, 0xde}, - {"pink1", 0xff, 0xb5, 0xc5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"purple", 0xa0, 0x20, 0xf0}, - {"purple4", 0x55, 0x1a, 0x8b}, - {"", 0, 0, 0}, - {"seashell1", 0xff, 0xf5, 0xee}, - {"", 0, 0, 0}, - {"coral2", 0xee, 0x6a, 0x50}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light gray", 0xd3, 0xd3, 0xd3}, - {"thistle2", 0xee, 0xd2, 0xee}, - {"purple3", 0x7d, 0x26, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"coral1", 0xff, 0x72, 0x56}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"thistle1", 0xff, 0xe1, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumblue", 0x00, 0x00, 0xcd}, - {"", 0, 0, 0}, - {"turquoise", 0x40, 0xe0, 0xd0}, - {"turquoise4", 0x00, 0x86, 0x8b}, - {"", 0, 0, 0}, - {"rosybrown", 0xbc, 0x8f, 0x8f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"turquoise3", 0x00, 0xc5, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"purple2", 0x91, 0x2c, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"turquoise2", 0x00, 0xe5, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"purple1", 0x9b, 0x30, 0xff}, - {"turquoise1", 0x00, 0xf5, 0xff}, - {"", 0, 0, 0}, - {"steel blue", 0x46, 0x82, 0xb4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light sea green", 0x20, 0xb2, 0xaa}, - {"", 0, 0, 0}, - {"aliceblue", 0xf0, 0xf8, 0xff}, - {"ivory", 0xff, 0xff, 0xf0}, - {"", 0, 0, 0}, - {"burlywood", 0xde, 0xb8, 0x87}, - {"burlywood4", 0x8b, 0x73, 0x55}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"burlywood3", 0xcd, 0xaa, 0x7d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"burlywood2", 0xee, 0xc5, 0x91}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"burlywood1", 0xff, 0xd3, 0x9b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"peru", 0xcd, 0x85, 0x3f}, - {"plum4", 0x8b, 0x66, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"plum3", 0xcd, 0x96, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightslategrey", 0x77, 0x88, 0x99}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightslateblue", 0x84, 0x70, 0xff}, - {"lawngreen", 0x7c, 0xfc, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"old lace", 0xfd, 0xf5, 0xe6}, - {"", 0, 0, 0}, - {"plum2", 0xee, 0xae, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"olive drab", 0x6b, 0x8e, 0x23}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"plum1", 0xff, 0xbb, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palegreen4", 0x54, 0x8b, 0x54}, - {"medium sea green", 0x3c, 0xb3, 0x71}, - {"", 0, 0, 0}, - {"seashell", 0xff, 0xf5, 0xee}, - {"", 0, 0, 0}, - {"palegreen3", 0x7c, 0xcd, 0x7c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"coral", 0xff, 0x7f, 0x50}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"yellow4", 0x8b, 0x8b, 0x00}, - {"", 0, 0, 0}, - {"palegreen2", 0x90, 0xee, 0x90}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palegreen1", 0x9a, 0xff, 0x9a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"yellow3", 0xcd, 0xcd, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"indian red", 0xcd, 0x5c, 0x5c}, - {"lightslategray", 0x77, 0x88, 0x99}, - {"light blue", 0xad, 0xd8, 0xe6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"navyblue", 0x00, 0x00, 0x80}, - {"dark sea green", 0x8f, 0xbc, 0x8f}, - {"", 0, 0, 0}, - {"medium blue", 0x00, 0x00, 0xcd}, - {"", 0, 0, 0}, - {"yellow2", 0xee, 0xee, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"yellow1", 0xff, 0xff, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light goldenrod", 0xee, 0xdd, 0x82}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"white", 0xff, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark slate grey", 0x2f, 0x4f, 0x4f}, - {"", 0, 0, 0}, - {"light salmon", 0xff, 0xa0, 0x7a}, - {"aquamarine", 0x7f, 0xff, 0xd4}, - {"aquamarine4", 0x45, 0x8b, 0x74}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"aquamarine3", 0x66, 0xcd, 0xaa}, - {"violet red", 0xd0, 0x20, 0x90}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark slate blue", 0x48, 0x3d, 0x8b}, - {"sandybrown", 0xf4, 0xa4, 0x60}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"plum", 0xdd, 0xa0, 0xdd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"aquamarine2", 0x76, 0xee, 0xc6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"aquamarine1", 0x7f, 0xff, 0xd4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"chartreuse", 0x7f, 0xff, 0x00}, - {"chartreuse4", 0x45, 0x8b, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"royal blue", 0x41, 0x69, 0xe1}, - {"chartreuse3", 0x66, 0xcd, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palegreen", 0x98, 0xfb, 0x98}, - {"mediumslateblue", 0x7b, 0x68, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"chartreuse2", 0x76, 0xee, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pink", 0xff, 0xc0, 0xcb}, - {"", 0, 0, 0}, - {"chartreuse1", 0x7f, 0xff, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"yellowgreen", 0x9a, 0xcd, 0x32}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark slate gray", 0x2f, 0x4f, 0x4f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"rosy brown", 0xbc, 0x8f, 0x8f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"chocolate", 0xd2, 0x69, 0x1e}, - {"chocolate4", 0x8b, 0x45, 0x13}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"chocolate3", 0xcd, 0x66, 0x1d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkcyan", 0x00, 0x8b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palegoldenrod", 0xee, 0xe8, 0xaa}, - {"", 0, 0, 0}, - {"chocolate2", 0xee, 0x76, 0x21}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"chocolate1", 0xff, 0x7f, 0x24}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"grey9", 0x17, 0x17, 0x17}, - {"grey49", 0x7d, 0x7d, 0x7d}, - {"grey6", 0x0f, 0x0f, 0x0f}, - {"grey46", 0x75, 0x75, 0x75}, - {"cadetblue", 0x5f, 0x9e, 0xa0}, - {"cadetblue4", 0x53, 0x86, 0x8b}, - {"grey39", 0x63, 0x63, 0x63}, - {"", 0, 0, 0}, - {"grey36", 0x5c, 0x5c, 0x5c}, - {"", 0, 0, 0}, - {"cadetblue3", 0x7a, 0xc5, 0xcd}, - {"", 0, 0, 0}, - {"greenyellow", 0xad, 0xff, 0x2f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey79", 0xc9, 0xc9, 0xc9}, - {"", 0, 0, 0}, - {"grey76", 0xc2, 0xc2, 0xc2}, - {"midnightblue", 0x19, 0x19, 0x70}, - {"grey29", 0x4a, 0x4a, 0x4a}, - {"", 0, 0, 0}, - {"grey26", 0x42, 0x42, 0x42}, - {"", 0, 0, 0}, - {"cadetblue2", 0x8e, 0xe5, 0xee}, - {"grey19", 0x30, 0x30, 0x30}, - {"", 0, 0, 0}, - {"grey16", 0x29, 0x29, 0x29}, - {"", 0, 0, 0}, - {"cadetblue1", 0x98, 0xf5, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lawn green", 0x7c, 0xfc, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightcoral", 0xf0, 0x80, 0x80}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"orchid", 0xda, 0x70, 0xd6}, - {"orchid4", 0x8b, 0x47, 0x89}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray9", 0x17, 0x17, 0x17}, - {"gray49", 0x7d, 0x7d, 0x7d}, - {"gray6", 0x0f, 0x0f, 0x0f}, - {"gray46", 0x75, 0x75, 0x75}, - {"", 0, 0, 0}, - {"orchid3", 0xcd, 0x69, 0xc9}, - {"gray39", 0x63, 0x63, 0x63}, - {"", 0, 0, 0}, - {"gray36", 0x5c, 0x5c, 0x5c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray79", 0xc9, 0xc9, 0xc9}, - {"", 0, 0, 0}, - {"gray76", 0xc2, 0xc2, 0xc2}, - {"", 0, 0, 0}, - {"gray29", 0x4a, 0x4a, 0x4a}, - {"", 0, 0, 0}, - {"gray26", 0x42, 0x42, 0x42}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray19", 0x30, 0x30, 0x30}, - {"", 0, 0, 0}, - {"gray16", 0x29, 0x29, 0x29}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumorchid", 0xba, 0x55, 0xd3}, - {"mediumorchid4", 0x7a, 0x37, 0x8b}, - {"mintcream", 0xf5, 0xff, 0xfa}, - {"orchid2", 0xee, 0x7a, 0xe9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lavenderblush4", 0x8b, 0x83, 0x86}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumorchid3", 0xb4, 0x52, 0xcd}, - {"", 0, 0, 0}, - {"orchid1", 0xff, 0x83, 0xfa}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lavenderblush3", 0xcd, 0xc1, 0xc5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"khaki", 0xf0, 0xe6, 0x8c}, - {"", 0, 0, 0}, - {"alice blue", 0xf0, 0xf8, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark turquoise", 0x00, 0xce, 0xd1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey8", 0x14, 0x14, 0x14}, - {"grey48", 0x7a, 0x7a, 0x7a}, - {"", 0, 0, 0}, - {"mediumorchid2", 0xd1, 0x5f, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey38", 0x61, 0x61, 0x61}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lavenderblush2", 0xee, 0xe0, 0xe5}, - {"grey0", 0x00, 0x00, 0x00}, - {"grey40", 0x66, 0x66, 0x66}, - {"", 0, 0, 0}, - {"mediumorchid1", 0xe0, 0x66, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey30", 0x4d, 0x4d, 0x4d}, - {"grey78", 0xc7, 0xc7, 0xc7}, - {"", 0, 0, 0}, - {"lavenderblush1", 0xff, 0xf0, 0xf5}, - {"", 0, 0, 0}, - {"grey28", 0x47, 0x47, 0x47}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey18", 0x2e, 0x2e, 0x2e}, - {"grey70", 0xb3, 0xb3, 0xb3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightcyan4", 0x7a, 0x8b, 0x8b}, - {"grey20", 0x33, 0x33, 0x33}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightcyan3", 0xb4, 0xcd, 0xcd}, - {"grey10", 0x1a, 0x1a, 0x1a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightcyan2", 0xd1, 0xee, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightcyan1", 0xe0, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkviolet", 0x94, 0x00, 0xd3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumspringgreen", 0x00, 0xfa, 0x9a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightgoldenrodyellow", 0xfa, 0xfa, 0xd2}, - {"", 0, 0, 0}, - {"darkolivegreen4", 0x6e, 0x8b, 0x3d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightyellow", 0xff, 0xff, 0xe0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkolivegreen3", 0xa2, 0xcd, 0x5a}, - {"", 0, 0, 0}, - {"gray8", 0x14, 0x14, 0x14}, - {"gray48", 0x7a, 0x7a, 0x7a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pale green", 0x98, 0xfb, 0x98}, - {"gray38", 0x61, 0x61, 0x61}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray0", 0x00, 0x00, 0x00}, - {"gray40", 0x66, 0x66, 0x66}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray30", 0x4d, 0x4d, 0x4d}, - {"gray78", 0xc7, 0xc7, 0xc7}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"honeydew4", 0x83, 0x8b, 0x83}, - {"gray28", 0x47, 0x47, 0x47}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray18", 0x2e, 0x2e, 0x2e}, - {"gray70", 0xb3, 0xb3, 0xb3}, - {"darkolivegreen2", 0xbc, 0xee, 0x68}, - {"", 0, 0, 0}, - {"honeydew3", 0xc1, 0xcd, 0xc1}, - {"gray20", 0x33, 0x33, 0x33}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray10", 0x1a, 0x1a, 0x1a}, - {"", 0, 0, 0}, - {"darkolivegreen1", 0xca, 0xff, 0x70}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"mediumturquoise", 0x48, 0xd1, 0xcc}, - {"navy blue", 0x00, 0x00, 0x80}, - {"honeydew2", 0xe0, 0xee, 0xe0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"honeydew1", 0xf0, 0xff, 0xf0}, - {"light slate grey", 0x77, 0x88, 0x99}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"medium orchid", 0xba, 0x55, 0xd3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey5", 0x0d, 0x0d, 0x0d}, - {"grey45", 0x73, 0x73, 0x73}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightcyan", 0xe0, 0xff, 0xff}, - {"grey35", 0x59, 0x59, 0x59}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"grey75", 0xbf, 0xbf, 0xbf}, - {"", 0, 0, 0}, - {"deep sky blue", 0x00, 0xbf, 0xff}, - {"", 0, 0, 0}, - {"grey25", 0x40, 0x40, 0x40}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey15", 0x26, 0x26, 0x26}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumpurple", 0x93, 0x70, 0xdb}, - {"mediumpurple4", 0x5d, 0x47, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"hotpink4", 0x8b, 0x3a, 0x62}, - {"darkolivegreen", 0x55, 0x6b, 0x2f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light slate gray", 0x77, 0x88, 0x99}, - {"", 0, 0, 0}, - {"mediumpurple3", 0x89, 0x68, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"hotpink3", 0xcd, 0x60, 0x90}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"blanchedalmond", 0xff, 0xeb, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumpurple2", 0x9f, 0x79, 0xee}, - {"gray5", 0x0d, 0x0d, 0x0d}, - {"gray45", 0x73, 0x73, 0x73}, - {"hotpink2", 0xee, 0x6a, 0xa7}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light sky blue", 0x87, 0xce, 0xfa}, - {"gray35", 0x59, 0x59, 0x59}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumpurple1", 0xab, 0x82, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"hotpink1", 0xff, 0x6e, 0xb4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray75", 0xbf, 0xbf, 0xbf}, - {"", 0, 0, 0}, - {"firebrick4", 0x8b, 0x1a, 0x1a}, - {"", 0, 0, 0}, - {"gray25", 0x40, 0x40, 0x40}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"firebrick3", 0xcd, 0x26, 0x26}, - {"", 0, 0, 0}, - {"gray15", 0x26, 0x26, 0x26}, - {"light steel blue", 0xb0, 0xc4, 0xde}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mint cream", 0xf5, 0xff, 0xfa}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"firebrick2", 0xee, 0x2c, 0x2c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"firebrick1", 0xff, 0x30, 0x30}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark cyan", 0x00, 0x8b, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pale goldenrod", 0xee, 0xe8, 0xaa}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumaquamarine", 0x66, 0xcd, 0xaa}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"paleturquoise", 0xaf, 0xee, 0xee}, - {"paleturquoise4", 0x66, 0x8b, 0x8b}, - {"", 0, 0, 0}, - {"light coral", 0xf0, 0x80, 0x80}, - {"medium slate blue", 0x7b, 0x68, 0xee}, - {"", 0, 0, 0}, - {"whitesmoke", 0xf5, 0xf5, 0xf5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"paleturquoise3", 0x96, 0xcd, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cadet blue", 0x5f, 0x9e, 0xa0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"antiquewhite", 0xfa, 0xeb, 0xd7}, - {"antiquewhite4", 0x8b, 0x83, 0x78}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"blueviolet", 0x8a, 0x2b, 0xe2}, - {"antique white", 0xfa, 0xeb, 0xd7}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"antiquewhite3", 0xcd, 0xc0, 0xb0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"paleturquoise2", 0xae, 0xee, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"paleturquoise1", 0xbb, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"yellow", 0xff, 0xff, 0x00}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"moccasin", 0xff, 0xe4, 0xb5}, - {"deeppink4", 0x8b, 0x0a, 0x50}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"antiquewhite2", 0xee, 0xdf, 0xcc}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deeppink3", 0xcd, 0x10, 0x76}, - {"yellow green", 0x9a, 0xcd, 0x32}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light slate blue", 0x84, 0x70, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"antiquewhite1", 0xff, 0xef, 0xdb}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cornsilk4", 0x8b, 0x88, 0x78}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark orchid", 0x99, 0x32, 0xcc}, - {"cornsilk3", 0xcd, 0xc8, 0xb1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deeppink2", 0xee, 0x12, 0x89}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deeppink1", 0xff, 0x14, 0x93}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cornsilk2", 0xee, 0xe8, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light goldenrod yellow", 0xfa, 0xfa, 0xd2}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cornsilk1", 0xff, 0xf8, 0xdc}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"white smoke", 0xf5, 0xf5, 0xf5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light cyan", 0xe0, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"mediumvioletred", 0xc7, 0x15, 0x85}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"powderblue", 0xb0, 0xe0, 0xe6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"medium aquamarine", 0x66, 0xcd, 0xaa}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark violet", 0x94, 0x00, 0xd3}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"dark olive green", 0x55, 0x6b, 0x2f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkorchid", 0x99, 0x32, 0xcc}, - {"darkorchid4", 0x68, 0x22, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkorchid3", 0x9a, 0x32, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkorchid2", 0xb2, 0x3a, 0xee}, - {"hotpink", 0xff, 0x69, 0xb4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkorchid1", 0xbf, 0x3e, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lavenderblush", 0xff, 0xf0, 0xf5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"floral white", 0xff, 0xfa, 0xf0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"firebrick", 0xb2, 0x22, 0x22}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey99", 0xfc, 0xfc, 0xfc}, - {"grey69", 0xb0, 0xb0, 0xb0}, - {"grey96", 0xf5, 0xf5, 0xf5}, - {"grey66", 0xa8, 0xa8, 0xa8}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"midnight blue", 0x19, 0x19, 0x70}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"ghostwhite", 0xf8, 0xf8, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"powder blue", 0xb0, 0xe0, 0xe6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey89", 0xe3, 0xe3, 0xe3}, - {"", 0, 0, 0}, - {"grey86", 0xdb, 0xdb, 0xdb}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray99", 0xfc, 0xfc, 0xfc}, - {"gray69", 0xb0, 0xb0, 0xb0}, - {"gray96", 0xf5, 0xf5, 0xf5}, - {"gray66", 0xa8, 0xa8, 0xa8}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightpink4", 0x8b, 0x5f, 0x65}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightpink3", 0xcd, 0x8c, 0x95}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"floralwhite", 0xff, 0xfa, 0xf0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lightpink2", 0xee, 0xa2, 0xad}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"deeppink", 0xff, 0x14, 0x93}, - {"", 0, 0, 0}, - {"lightpink1", 0xff, 0xae, 0xb9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cornsilk", 0xff, 0xf8, 0xdc}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey98", 0xfa, 0xfa, 0xfa}, - {"grey68", 0xad, 0xad, 0xad}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray89", 0xe3, 0xe3, 0xe3}, - {"", 0, 0, 0}, - {"gray86", 0xdb, 0xdb, 0xdb}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey90", 0xe5, 0xe5, 0xe5}, - {"grey60", 0x99, 0x99, 0x99}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey59", 0x96, 0x96, 0x96}, - {"", 0, 0, 0}, - {"grey56", 0x8f, 0x8f, 0x8f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"blanched almond", 0xff, 0xeb, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cornflowerblue", 0x64, 0x95, 0xed}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"cornflower blue", 0x64, 0x95, 0xed}, - {"", 0, 0, 0}, - {"dark khaki", 0xbd, 0xb7, 0x6b}, - {"blue violet", 0x8a, 0x2b, 0xe2}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey88", 0xe0, 0xe0, 0xe0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray98", 0xfa, 0xfa, 0xfa}, - {"gray68", 0xad, 0xad, 0xad}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey80", 0xcc, 0xcc, 0xcc}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"honeydew", 0xf0, 0xff, 0xf0}, - {"gray90", 0xe5, 0xe5, 0xe5}, - {"gray60", 0x99, 0x99, 0x99}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray59", 0x96, 0x96, 0x96}, - {"", 0, 0, 0}, - {"gray56", 0x8f, 0x8f, 0x8f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey100", 0xff, 0xff, 0xff}, - {"medium purple", 0x93, 0x70, 0xdb}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"medium turquoise", 0x48, 0xd1, 0xcc}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray88", 0xe0, 0xe0, 0xe0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"green yellow", 0xad, 0xff, 0x2f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray80", 0xcc, 0xcc, 0xcc}, - {"", 0, 0, 0}, - {"grey58", 0x94, 0x94, 0x94}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey50", 0x7f, 0x7f, 0x7f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey95", 0xf2, 0xf2, 0xf2}, - {"grey65", 0xa6, 0xa6, 0xa6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"gray100", 0xff, 0xff, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"darkkhaki", 0xbd, 0xb7, 0x6b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray58", 0x94, 0x94, 0x94}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray50", 0x7f, 0x7f, 0x7f}, - {"", 0, 0, 0}, - {"grey85", 0xd9, 0xd9, 0xd9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray95", 0xf2, 0xf2, 0xf2}, - {"gray65", 0xa6, 0xa6, 0xa6}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"ghost white", 0xf8, 0xf8, 0xff}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"palevioletred", 0xdb, 0x70, 0x93}, - {"palevioletred4", 0x8b, 0x47, 0x5d}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palevioletred3", 0xcd, 0x68, 0x89}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palevioletred2", 0xee, 0x79, 0x9f}, - {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray85", 0xd9, 0xd9, 0xd9}, - {"", 0, 0, 0}, - {"lightpink", 0xff, 0xb6, 0xc1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"palevioletred1", 0xff, 0x82, 0xab}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"grey55", 0x8c, 0x8c, 0x8c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"navajo white", 0xff, 0xde, 0xad}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"light yellow", 0xff, 0xff, 0xe0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pale turquoise", 0xaf, 0xee, 0xee}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"medium spring green", 0x00, 0xfa, 0x9a}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"gray55", 0x8c, 0x8c, 0x8c}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lemonchiffon4", 0x8b, 0x89, 0x70}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lemonchiffon3", 0xcd, 0xc9, 0xa5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"light pink", 0xff, 0xb6, 0xc1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lemonchiffon2", 0xee, 0xe9, 0xbf}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lemonchiffon1", 0xff, 0xfa, 0xcd}, - {"deep pink", 0xff, 0x14, 0x93}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"navajowhite", 0xff, 0xde, 0xad}, - {"navajowhite4", 0x8b, 0x79, 0x5e}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"navajowhite3", 0xcd, 0xb3, 0x8b}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"peachpuff4", 0x8b, 0x77, 0x65}, - {"navajowhite2", 0xee, 0xcf, 0xa1}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"peachpuff3", 0xcd, 0xaf, 0x95}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"navajowhite1", 0xff, 0xde, 0xad}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"peachpuff2", 0xee, 0xcb, 0xad}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"peachpuff1", 0xff, 0xda, 0xb9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lemonchiffon", 0xff, 0xfa, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"peachpuff", 0xff, 0xda, 0xb9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lavender blush", 0xff, 0xf0, 0xf5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"medium violet red", 0xc7, 0x15, 0x85}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"hot pink", 0xff, 0x69, 0xb4}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"peach puff", 0xff, 0xda, 0xb9}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"lemon chiffon", 0xff, 0xfa, 0xcd}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"pale violet red", 0xdb, 0x70, 0x93}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"papaya whip", 0xff, 0xef, 0xd5}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, {"", 0, 0, 0}, - {"papayawhip", 0xff, 0xef, 0xd5} + {-1}, {-1}, {-1}, +#line 205 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3), 0xff, 0x00, 0x00}, +#line 487 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str4), 0x8b, 0x00, 0x00}, +#line 557 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str5), 0x0a, 0x0a, 0x0a}, +#line 637 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str6), 0x70, 0x70, 0x70}, +#line 761 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str7), 0x8b, 0x00, 0x00}, + {-1}, +#line 486 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str9), 0xcd, 0x00, 0x00}, + {-1}, +#line 617 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str11), 0x57, 0x57, 0x57}, + {-1}, {-1}, {-1}, +#line 555 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str15), 0x08, 0x08, 0x08}, +#line 635 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str16), 0x6e, 0x6e, 0x6e}, + {-1}, {-1}, {-1}, {-1}, +#line 615 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str21), 0x54, 0x54, 0x54}, +#line 697 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str22), 0xbd, 0xbd, 0xbd}, + {-1}, +#line 485 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str24), 0xee, 0x00, 0x00}, + {-1}, +#line 597 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str26), 0x3d, 0x3d, 0x3d}, + {-1}, {-1}, +#line 484 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str29), 0xff, 0x00, 0x00}, + {-1}, +#line 577 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str31), 0x24, 0x24, 0x24}, +#line 695 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str32), 0xba, 0xba, 0xba}, + {-1}, {-1}, {-1}, +#line 595 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str36), 0x3b, 0x3b, 0x3b}, +#line 563 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str37), 0x12, 0x12, 0x12}, +#line 643 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str38), 0x78, 0x78, 0x78}, + {-1}, {-1}, +#line 575 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str41), 0x21, 0x21, 0x21}, + {-1}, +#line 623 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str43), 0x5e, 0x5e, 0x5e}, + {-1}, +#line 553 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str45), 0x05, 0x05, 0x05}, +#line 633 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str46), 0x6b, 0x6b, 0x6b}, + {-1}, {-1}, {-1}, {-1}, +#line 613 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str51), 0x52, 0x52, 0x52}, + {-1}, {-1}, +#line 703 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str54), 0xc4, 0xc4, 0xc4}, +#line 551 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str55), 0x03, 0x03, 0x03}, +#line 631 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str56), 0x69, 0x69, 0x69}, + {-1}, +#line 603 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str58), 0x45, 0x45, 0x45}, + {-1}, {-1}, +#line 611 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str61), 0x4f, 0x4f, 0x4f}, +#line 693 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str62), 0xb8, 0xb8, 0xb8}, +#line 583 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str63), 0x2b, 0x2b, 0x2b}, + {-1}, {-1}, +#line 593 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str66), 0x38, 0x38, 0x38}, + {-1}, {-1}, {-1}, {-1}, +#line 573 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str71), 0x1f, 0x1f, 0x1f}, +#line 691 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str72), 0xb5, 0xb5, 0xb5}, + {-1}, {-1}, {-1}, +#line 591 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str76), 0x36, 0x36, 0x36}, + {-1}, {-1}, {-1}, {-1}, +#line 571 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str81), 0x1c, 0x1c, 0x1c}, + {-1}, {-1}, {-1}, +#line 556 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str85), 0x0a, 0x0a, 0x0a}, +#line 636 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str86), 0x70, 0x70, 0x70}, + {-1}, {-1}, {-1}, {-1}, +#line 616 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str91), 0x57, 0x57, 0x57}, + {-1}, {-1}, {-1}, +#line 554 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str95), 0x08, 0x08, 0x08}, +#line 634 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str96), 0x6e, 0x6e, 0x6e}, + {-1}, {-1}, {-1}, {-1}, +#line 614 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str101), 0x54, 0x54, 0x54}, +#line 696 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str102), 0xbd, 0xbd, 0xbd}, + {-1}, {-1}, +#line 239 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str105), 0x8b, 0x89, 0x89}, +#line 596 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str106), 0x3d, 0x3d, 0x3d}, + {-1}, {-1}, {-1}, {-1}, +#line 576 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str111), 0x24, 0x24, 0x24}, +#line 694 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str112), 0xba, 0xba, 0xba}, + {-1}, {-1}, +#line 238 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str115), 0xcd, 0xc9, 0xc9}, +#line 594 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str116), 0x3b, 0x3b, 0x3b}, +#line 562 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str117), 0x12, 0x12, 0x12}, +#line 642 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str118), 0x78, 0x78, 0x78}, + {-1}, {-1}, +#line 574 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str121), 0x21, 0x21, 0x21}, + {-1}, +#line 622 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str123), 0x5e, 0x5e, 0x5e}, + {-1}, +#line 552 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str125), 0x05, 0x05, 0x05}, +#line 632 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str126), 0x6b, 0x6b, 0x6b}, + {-1}, {-1}, {-1}, {-1}, +#line 612 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str131), 0x52, 0x52, 0x52}, + {-1}, {-1}, +#line 702 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str134), 0xc4, 0xc4, 0xc4}, +#line 550 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str135), 0x03, 0x03, 0x03}, +#line 630 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str136), 0x69, 0x69, 0x69}, + {-1}, +#line 602 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str138), 0x45, 0x45, 0x45}, + {-1}, {-1}, +#line 610 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str141), 0x4f, 0x4f, 0x4f}, +#line 692 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str142), 0xb8, 0xb8, 0xb8}, +#line 582 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str143), 0x2b, 0x2b, 0x2b}, + {-1}, +#line 237 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str145), 0xee, 0xe9, 0xe9}, +#line 592 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str146), 0x38, 0x38, 0x38}, + {-1}, {-1}, {-1}, {-1}, +#line 572 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str151), 0x1f, 0x1f, 0x1f}, +#line 690 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str152), 0xb5, 0xb5, 0xb5}, + {-1}, {-1}, +#line 236 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str155), 0xff, 0xfa, 0xfa}, +#line 590 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str156), 0x36, 0x36, 0x36}, + {-1}, {-1}, {-1}, {-1}, +#line 570 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str161), 0x1c, 0x1c, 0x1c}, + {-1}, {-1}, {-1}, {-1}, +#line 379 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str166), 0x00, 0x8b, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 375 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str172), 0x00, 0x8b, 0x45}, + {-1}, {-1}, {-1}, +#line 378 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str176), 0x00, 0xcd, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 374 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str182), 0x00, 0xcd, 0x66}, + {-1}, {-1}, {-1}, +#line 196 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str186), 0xff, 0xa5, 0x00}, +#line 467 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str187), 0x8b, 0x5a, 0x00}, + {-1}, +#line 204 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str189), 0xff, 0x45, 0x00}, +#line 483 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str190), 0x8b, 0x25, 0x00}, + {-1}, {-1}, {-1}, {-1}, +#line 482 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str195), 0xcd, 0x37, 0x00}, + {-1}, +#line 466 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str197), 0xcd, 0x85, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 377 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str206), 0x00, 0xee, 0x00}, + {-1}, {-1}, {-1}, +#line 481 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str210), 0xee, 0x40, 0x00}, + {-1}, +#line 373 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str212), 0x00, 0xee, 0x76}, + {-1}, {-1}, +#line 480 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str215), 0xff, 0x45, 0x00}, +#line 376 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str216), 0x00, 0xff, 0x00}, + {-1}, {-1}, +#line 168 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str219), 0xff, 0xd7, 0x00}, +#line 411 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str220), 0x8b, 0x75, 0x00}, + {-1}, +#line 372 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str222), 0x00, 0xff, 0x7f}, + {-1}, {-1}, {-1}, {-1}, +#line 465 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str227), 0xee, 0x9a, 0x00}, + {-1}, {-1}, +#line 410 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str230), 0xcd, 0xad, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 464 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str237), 0xff, 0xa5, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 431 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str247), 0x8b, 0x47, 0x26}, + {-1}, +#line 367 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str249), 0x2e, 0x8b, 0x57}, + {-1}, {-1}, {-1}, +#line 363 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str253), 0x69, 0x8b, 0x69}, + {-1}, {-1}, {-1}, +#line 430 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str257), 0xcd, 0x68, 0x39}, + {-1}, +#line 366 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str259), 0x43, 0xcd, 0x80}, +#line 409 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str260), 0xee, 0xc9, 0x00}, + {-1}, {-1}, +#line 362 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str263), 0x9b, 0xcd, 0x9b}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 70 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str269), 0xbe, 0xbe, 0xbe}, +#line 408 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str270), 0xff, 0xd7, 0x00}, +#line 455 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str271), 0x8b, 0x23, 0x23}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 454 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str281), 0xcd, 0x33, 0x33}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 429 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str287), 0xee, 0x79, 0x42}, + {-1}, +#line 365 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str289), 0x4e, 0xee, 0x94}, + {-1}, {-1}, {-1}, +#line 361 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str293), 0xb4, 0xee, 0xb4}, + {-1}, {-1}, {-1}, +#line 428 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str297), 0xff, 0x82, 0x47}, + {-1}, +#line 364 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str299), 0x54, 0xff, 0x9f}, + {-1}, {-1}, {-1}, +#line 360 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str303), 0xc1, 0xff, 0xc1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 453 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str311), 0xee, 0x3b, 0x3b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 443 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str319), 0x8b, 0x5a, 0x2b}, + {-1}, +#line 452 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str321), 0xff, 0x40, 0x40}, + {-1}, {-1}, +#line 442 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str324), 0xcd, 0x85, 0x3f}, +#line 144 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str325), 0x00, 0xff, 0x00}, +#line 180 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str326), 0xa0, 0x52, 0x2d}, + {-1}, {-1}, +#line 127 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str329), 0x00, 0x64, 0x00}, + {-1}, +#line 141 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str331), 0x00, 0xff, 0x7f}, + {-1}, {-1}, +#line 94 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str334), 0x00, 0x00, 0xff}, +#line 299 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str335), 0x00, 0x00, 0x8b}, +#line 29 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str336), 0xff, 0xe4, 0xc4}, +#line 251 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str337), 0x8b, 0x7d, 0x6b}, + {-1}, +#line 441 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str339), 0xee, 0x9a, 0x49}, + {-1}, {-1}, {-1}, {-1}, +#line 440 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str344), 0xff, 0xa5, 0x4f}, +#line 298 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str345), 0x00, 0x00, 0xcd}, + {-1}, +#line 250 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str347), 0xcd, 0xb7, 0x9e}, + {-1}, +#line 69 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str349), 0xbe, 0xbe, 0xbe}, +#line 198 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str350), 0xff, 0x8c, 0x00}, +#line 471 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str351), 0x8b, 0x45, 0x00}, + {-1}, {-1}, {-1}, {-1}, +#line 470 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str356), 0xcd, 0x66, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 469 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str371), 0xee, 0x76, 0x00}, + {-1}, {-1}, {-1}, +#line 297 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str375), 0x00, 0x00, 0xee}, +#line 468 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str376), 0xff, 0x7f, 0x00}, +#line 249 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str377), 0xee, 0xd5, 0xb7}, + {-1}, {-1}, {-1}, +#line 155 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str381), 0x22, 0x8b, 0x22}, + {-1}, {-1}, {-1}, +#line 296 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str385), 0x00, 0x00, 0xff}, + {-1}, +#line 248 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str387), 0xff, 0xe4, 0xc4}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 133 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str408), 0x2e, 0x8b, 0x57}, +#line 132 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str409), 0x2e, 0x8b, 0x57}, +#line 43 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str410), 0xf0, 0xff, 0xff}, +#line 287 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str411), 0x83, 0x8b, 0x8b}, +#line 131 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str412), 0x8f, 0xbc, 0x8f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 286 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str421), 0xc1, 0xcd, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 173 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str428), 0xb8, 0x86, 0x0b}, +#line 419 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str429), 0x8b, 0x65, 0x08}, +#line 190 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str430), 0xa5, 0x2a, 0x2a}, + {-1}, {-1}, {-1}, {-1}, +#line 323 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str435), 0x6c, 0x7b, 0x8b}, + {-1}, {-1}, {-1}, +#line 418 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str439), 0xcd, 0x95, 0x0c}, +#line 322 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str440), 0x9f, 0xb6, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 285 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str451), 0xe0, 0xee, 0xee}, + {-1}, {-1}, {-1}, +#line 321 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str455), 0xb9, 0xd3, 0xee}, + {-1}, +#line 511 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str457), 0x8b, 0x1c, 0x62}, + {-1}, {-1}, +#line 320 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str460), 0xc6, 0xe2, 0xff}, +#line 284 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str461), 0xf0, 0xff, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 510 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str467), 0xcd, 0x29, 0x90}, + {-1}, +#line 417 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str469), 0xee, 0xad, 0x0e}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 187 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str478), 0xd2, 0xb4, 0x8c}, +#line 416 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str479), 0xff, 0xb9, 0x0f}, + {-1}, {-1}, +#line 459 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str482), 0x8b, 0x4c, 0x39}, + {-1}, +#line 171 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str484), 0xda, 0xa5, 0x20}, +#line 415 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str485), 0x8b, 0x69, 0x14}, + {-1}, {-1}, {-1}, {-1}, +#line 414 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str490), 0xcd, 0x9b, 0x1d}, +#line 179 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str491), 0x8b, 0x45, 0x13}, +#line 458 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str492), 0xcd, 0x70, 0x54}, + {-1}, {-1}, {-1}, {-1}, +#line 509 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str497), 0xee, 0x30, 0xa7}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 413 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str505), 0xee, 0xb4, 0x22}, + {-1}, +#line 508 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str507), 0xff, 0x34, 0xb3}, + {-1}, {-1}, +#line 412 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str510), 0xff, 0xc1, 0x25}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 759 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str521), 0x8b, 0x00, 0x8b}, +#line 457 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str522), 0xee, 0x82, 0x62}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 760 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str528), 0x8b, 0x00, 0x00}, + {-1}, {-1}, {-1}, +#line 456 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str532), 0xff, 0x8c, 0x69}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 751 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str538), 0xa9, 0xa9, 0xa9}, + {-1}, +#line 763 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str540), 0x90, 0xee, 0x90}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 755 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str553), 0x00, 0x00, 0x8b}, + {-1}, +#line 96 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str555), 0x1e, 0x90, 0xff}, +#line 303 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str556), 0x10, 0x4e, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 302 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str561), 0x18, 0x74, 0xcd}, + {-1}, {-1}, +#line 50 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str564), 0xff, 0xe4, 0xe1}, +#line 283 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str565), 0x8b, 0x7d, 0x7b}, + {-1}, {-1}, {-1}, {-1}, +#line 282 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str570), 0xcd, 0xb7, 0xb5}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 301 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str576), 0x1c, 0x86, 0xee}, + {-1}, {-1}, {-1}, {-1}, +#line 300 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str581), 0x1e, 0x90, 0xff}, + {-1}, {-1}, {-1}, +#line 281 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str585), 0xee, 0xd5, 0xd2}, + {-1}, {-1}, {-1}, {-1}, +#line 280 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str590), 0xff, 0xe4, 0xe1}, + {-1}, {-1}, +#line 519 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str593), 0x8b, 0x00, 0x8b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 518 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str603), 0xcd, 0x00, 0xcd}, + {-1}, {-1}, {-1}, +#line 479 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str607), 0x8b, 0x36, 0x26}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 215 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str616), 0xb0, 0x30, 0x60}, +#line 478 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str617), 0xcd, 0x4f, 0x39}, +#line 753 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str618), 0xa9, 0xa9, 0xa9}, +#line 64 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str619), 0x70, 0x80, 0x90}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 517 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str633), 0xee, 0x00, 0xee}, +#line 85 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str634), 0x6a, 0x5a, 0xcd}, +#line 291 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str635), 0x47, 0x3c, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 290 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str640), 0x69, 0x59, 0xcd}, +#line 193 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str641), 0xfa, 0x80, 0x72}, + {-1}, +#line 516 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str643), 0xff, 0x00, 0xff}, + {-1}, {-1}, {-1}, +#line 477 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str647), 0xee, 0x5c, 0x42}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 289 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str655), 0x7a, 0x67, 0xee}, + {-1}, +#line 476 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str657), 0xff, 0x63, 0x47}, + {-1}, {-1}, +#line 288 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str660), 0x83, 0x6f, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 220 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str672), 0xff, 0x00, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 183 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str683), 0xf5, 0xf5, 0xdc}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 126 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str690), 0x00, 0x64, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 62 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str699), 0x70, 0x80, 0x90}, +#line 22 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str700), 0xfa, 0xf0, 0xe6}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 202 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str706), 0xff, 0x63, 0x47}, + {-1}, {-1}, {-1}, +#line 203 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str710), 0xff, 0x45, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 60 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str727), 0x69, 0x69, 0x69}, +#line 59 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str728), 0x69, 0x69, 0x69}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 151 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str734), 0x32, 0xcd, 0x32}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 95 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str751), 0x1e, 0x90, 0xff}, + {-1}, {-1}, {-1}, +#line 192 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str755), 0xe9, 0x96, 0x7a}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 104 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str769), 0x46, 0x82, 0xb4}, +#line 307 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str770), 0x36, 0x64, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 306 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str775), 0x4f, 0x94, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 137 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str783), 0x20, 0xb2, 0xaa}, + {-1}, {-1}, {-1}, {-1}, +#line 83 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str788), 0x48, 0x3d, 0x8b}, + {-1}, +#line 305 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str790), 0x5c, 0xac, 0xee}, + {-1}, {-1}, {-1}, {-1}, +#line 304 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str795), 0x63, 0xb8, 0xff}, + {-1}, {-1}, {-1}, +#line 170 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str799), 0xee, 0xdd, 0x82}, +#line 399 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str800), 0x8b, 0x81, 0x4c}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 58 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str807), 0x69, 0x69, 0x69}, +#line 57 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str808), 0x69, 0x69, 0x69}, +#line 355 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str809), 0x52, 0x8b, 0x8b}, +#line 398 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str810), 0xcd, 0xbe, 0x70}, + {-1}, +#line 100 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str812), 0x87, 0xce, 0xeb}, +#line 315 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str813), 0x4a, 0x70, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 99 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str818), 0x87, 0xce, 0xeb}, +#line 354 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str819), 0x79, 0xcd, 0xcd}, + {-1}, {-1}, {-1}, +#line 314 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str823), 0x6c, 0xa6, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 397 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str840), 0xee, 0xdc, 0x82}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 737 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str846), 0xf0, 0xf0, 0xf0}, +#line 677 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str847), 0xa3, 0xa3, 0xa3}, + {-1}, +#line 353 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str849), 0x8d, 0xee, 0xee}, +#line 396 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str850), 0xff, 0xec, 0x8b}, + {-1}, {-1}, +#line 313 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str853), 0x7e, 0xc0, 0xee}, + {-1}, {-1}, +#line 735 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str856), 0xed, 0xed, 0xed}, +#line 675 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str857), 0xa1, 0xa1, 0xa1}, + {-1}, +#line 352 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str859), 0x97, 0xff, 0xff}, + {-1}, {-1}, {-1}, +#line 312 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str863), 0x87, 0xce, 0xff}, + {-1}, {-1}, {-1}, +#line 463 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str867), 0x8b, 0x57, 0x42}, +#line 387 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str868), 0x69, 0x8b, 0x22}, + {-1}, {-1}, +#line 197 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str871), 0xff, 0x8c, 0x00}, +#line 157 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str872), 0x6b, 0x8e, 0x23}, +#line 386 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str873), 0x9a, 0xcd, 0x32}, + {-1}, +#line 63 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str875), 0x70, 0x80, 0x90}, + {-1}, +#line 462 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str877), 0xcd, 0x81, 0x62}, +#line 743 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str878), 0xf7, 0xf7, 0xf7}, +#line 683 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str879), 0xab, 0xab, 0xab}, +#line 52 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str880), 0x00, 0x00, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 733 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str886), 0xeb, 0xeb, 0xeb}, +#line 673 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str887), 0x9e, 0x9e, 0x9e}, +#line 385 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str888), 0xb3, 0xee, 0x3a}, + {-1}, {-1}, +#line 98 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str891), 0x00, 0xbf, 0xff}, +#line 311 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str892), 0x00, 0x68, 0x8b}, +#line 384 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str893), 0xc0, 0xff, 0x3e}, + {-1}, {-1}, +#line 731 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str896), 0xe8, 0xe8, 0xe8}, +#line 671 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str897), 0x9c, 0x9c, 0x9c}, + {-1}, {-1}, {-1}, {-1}, +#line 310 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str902), 0x00, 0x9a, 0xcd}, + {-1}, {-1}, {-1}, {-1}, +#line 461 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str907), 0xee, 0x95, 0x72}, + {-1}, +#line 72 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str909), 0xd3, 0xd3, 0xd3}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 460 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str917), 0xff, 0xa0, 0x7a}, + {-1}, {-1}, {-1}, +#line 717 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str921), 0xd6, 0xd6, 0xd6}, +#line 177 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str922), 0xcd, 0x5c, 0x5c}, +#line 427 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str923), 0x8b, 0x3a, 0x3a}, +#line 108 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str924), 0xad, 0xd8, 0xe6}, +#line 331 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str925), 0x68, 0x83, 0x8b}, +#line 736 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str926), 0xf0, 0xf0, 0xf0}, +#line 676 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str927), 0xa3, 0xa3, 0xa3}, +#line 426 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str928), 0xcd, 0x55, 0x55}, + {-1}, +#line 330 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str930), 0x9a, 0xc0, 0xcd}, +#line 715 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str931), 0xd4, 0xd4, 0xd4}, +#line 309 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str932), 0x00, 0xb2, 0xee}, + {-1}, {-1}, +#line 12 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str935), 0xff, 0xfa, 0xfa}, +#line 734 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str936), 0xed, 0xed, 0xed}, +#line 674 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str937), 0xa1, 0xa1, 0xa1}, + {-1}, {-1}, {-1}, {-1}, +#line 308 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str942), 0x00, 0xbf, 0xff}, +#line 425 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str943), 0xee, 0x63, 0x63}, + {-1}, +#line 329 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str945), 0xb2, 0xdf, 0xee}, + {-1}, {-1}, +#line 424 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str948), 0xff, 0x6a, 0x6a}, +#line 172 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str949), 0xb8, 0x86, 0x0b}, +#line 328 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str950), 0xbf, 0xef, 0xff}, + {-1}, {-1}, +#line 723 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str953), 0xde, 0xde, 0xde}, + {-1}, +#line 61 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str955), 0x70, 0x80, 0x90}, + {-1}, {-1}, +#line 742 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str958), 0xf7, 0xf7, 0xf7}, +#line 682 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str959), 0xab, 0xab, 0xab}, + {-1}, +#line 713 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str961), 0xd1, 0xd1, 0xd1}, +#line 758 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str962), 0x8b, 0x00, 0x8b}, +#line 114 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str963), 0x00, 0xce, 0xd1}, + {-1}, {-1}, +#line 732 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str966), 0xeb, 0xeb, 0xeb}, +#line 672 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str967), 0x9e, 0x9e, 0x9e}, + {-1}, {-1}, {-1}, +#line 711 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str971), 0xcf, 0xcf, 0xcf}, + {-1}, {-1}, {-1}, {-1}, +#line 730 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str976), 0xe8, 0xe8, 0xe8}, +#line 670 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str977), 0x9c, 0x9c, 0x9c}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 17 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str987), 0xdc, 0xdc, 0xdc}, + {-1}, +#line 74 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str989), 0xd3, 0xd3, 0xd3}, + {-1}, {-1}, +#line 439 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str992), 0x8b, 0x7e, 0x66}, +#line 56 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str993), 0x2f, 0x4f, 0x4f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 716 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1001), 0xd6, 0xd6, 0xd6}, +#line 438 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1002), 0xcd, 0xba, 0x96}, + {-1}, +#line 219 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1004), 0xd0, 0x20, 0x90}, +#line 515 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1005), 0x8b, 0x22, 0x52}, + {-1}, {-1}, {-1}, {-1}, +#line 514 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1010), 0xcd, 0x32, 0x78}, +#line 714 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1011), 0xd4, 0xd4, 0xd4}, +#line 140 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1012), 0x00, 0xff, 0x7f}, +#line 657 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1013), 0x8a, 0x8a, 0x8a}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 655 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1023), 0x87, 0x87, 0x87}, + {-1}, +#line 513 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1025), 0xee, 0x3a, 0x8c}, +#line 195 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1026), 0xff, 0xa0, 0x7a}, + {-1}, {-1}, {-1}, +#line 512 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1030), 0xff, 0x3e, 0x96}, + {-1}, +#line 437 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1032), 0xee, 0xd8, 0xae}, +#line 722 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1033), 0xde, 0xde, 0xde}, +#line 93 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1034), 0x41, 0x69, 0xe1}, +#line 295 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1035), 0x27, 0x40, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 294 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1040), 0x3a, 0x5f, 0xcd}, +#line 712 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1041), 0xd1, 0xd1, 0xd1}, +#line 436 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1042), 0xff, 0xe7, 0xba}, + {-1}, +#line 271 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1044), 0x8b, 0x8b, 0x83}, +#line 663 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1045), 0x91, 0x91, 0x91}, + {-1}, +#line 102 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1047), 0x87, 0xce, 0xfa}, +#line 319 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1048), 0x60, 0x7b, 0x8b}, + {-1}, {-1}, +#line 710 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1051), 0xcf, 0xcf, 0xcf}, + {-1}, +#line 653 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1053), 0x85, 0x85, 0x85}, +#line 270 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1054), 0xcd, 0xcd, 0xc1}, +#line 293 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1055), 0x43, 0x6e, 0xee}, + {-1}, {-1}, +#line 318 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1058), 0x8d, 0xb6, 0xcd}, +#line 750 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1059), 0xa9, 0xa9, 0xa9}, +#line 292 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1060), 0x48, 0x76, 0xff}, +#line 762 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1061), 0x90, 0xee, 0x90}, +#line 154 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1062), 0x22, 0x8b, 0x22}, +#line 651 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1063), 0x82, 0x82, 0x82}, + {-1}, +#line 351 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1065), 0x00, 0x8b, 0x8b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 178 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1072), 0x8b, 0x45, 0x13}, +#line 54 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1073), 0x2f, 0x4f, 0x4f}, +#line 754 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1074), 0x00, 0x00, 0x8b}, +#line 350 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1075), 0x00, 0xcd, 0xcd}, + {-1}, +#line 403 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1077), 0x8b, 0x8b, 0x7a}, + {-1}, +#line 106 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1079), 0xb0, 0xc4, 0xde}, +#line 327 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1080), 0x6e, 0x7b, 0x8b}, + {-1}, {-1}, {-1}, +#line 269 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1084), 0xee, 0xee, 0xe0}, +#line 49 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1085), 0xff, 0xe4, 0xe1}, + {-1}, +#line 402 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1087), 0xcd, 0xcd, 0xb4}, +#line 317 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1088), 0xa4, 0xd3, 0xee}, + {-1}, +#line 326 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1090), 0xa2, 0xb5, 0xcd}, + {-1}, {-1}, +#line 656 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1093), 0x8a, 0x8a, 0x8a}, +#line 268 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1094), 0xff, 0xff, 0xf0}, +#line 150 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1095), 0x32, 0xcd, 0x32}, + {-1}, {-1}, +#line 316 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1098), 0xb0, 0xe2, 0xff}, + {-1}, {-1}, {-1}, {-1}, +#line 654 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1103), 0x87, 0x87, 0x87}, + {-1}, +#line 349 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1105), 0x00, 0xee, 0xee}, +#line 423 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1106), 0x8b, 0x69, 0x69}, + {-1}, {-1}, {-1}, {-1}, +#line 422 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1111), 0xcd, 0x9b, 0x9b}, + {-1}, {-1}, {-1}, +#line 348 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1115), 0x00, 0xff, 0xff}, + {-1}, +#line 401 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1117), 0xee, 0xee, 0xd1}, + {-1}, +#line 135 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1119), 0x3c, 0xb3, 0x71}, +#line 325 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1120), 0xbc, 0xd2, 0xee}, + {-1}, {-1}, +#line 46 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1123), 0xe6, 0xe6, 0xfa}, + {-1}, +#line 662 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1125), 0x91, 0x91, 0x91}, +#line 421 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1126), 0xee, 0xb4, 0xb4}, +#line 400 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1127), 0xff, 0xff, 0xe0}, + {-1}, {-1}, +#line 324 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1130), 0xca, 0xe1, 0xff}, +#line 420 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1131), 0xff, 0xc1, 0xc1}, + {-1}, +#line 652 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1133), 0x85, 0x85, 0x85}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 752 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1139), 0xa9, 0xa9, 0xa9}, + {-1}, {-1}, {-1}, +#line 650 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1143), 0x82, 0x82, 0x82}, + {-1}, {-1}, +#line 184 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1146), 0xf5, 0xde, 0xb3}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 395 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1154), 0x8b, 0x86, 0x4e}, +#line 84 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1155), 0x6a, 0x5a, 0xcd}, +#line 221 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1156), 0xee, 0x82, 0xee}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 394 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1164), 0xcd, 0xc6, 0x73}, +#line 71 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1165), 0xd3, 0xd3, 0xd3}, + {-1}, +#line 21 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1167), 0xfd, 0xf5, 0xe6}, + {-1}, +#line 77 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1169), 0x00, 0x00, 0x80}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 191 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1176), 0xe9, 0x96, 0x7a}, + {-1}, {-1}, {-1}, +#line 499 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1180), 0x8b, 0x63, 0x6c}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 243 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1189), 0x8b, 0x86, 0x82}, +#line 498 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1190), 0xcd, 0x91, 0x9e}, + {-1}, {-1}, {-1}, +#line 393 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1194), 0xee, 0xe6, 0x85}, + {-1}, {-1}, {-1}, {-1}, +#line 242 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1199), 0xcd, 0xc5, 0xbf}, + {-1}, +#line 475 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1201), 0x8b, 0x3e, 0x2f}, + {-1}, {-1}, +#line 392 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1204), 0xff, 0xf6, 0x8f}, +#line 235 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1205), 0xd8, 0xbf, 0xd8}, +#line 547 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1206), 0x8b, 0x7b, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 474 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1211), 0xcd, 0x5b, 0x45}, + {-1}, {-1}, {-1}, {-1}, +#line 546 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1216), 0xcd, 0xb5, 0xcd}, + {-1}, {-1}, {-1}, +#line 497 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1220), 0xee, 0xa9, 0xb8}, +#line 185 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1221), 0xf4, 0xa4, 0x60}, + {-1}, {-1}, +#line 118 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1224), 0x00, 0xff, 0xff}, + {-1}, {-1}, {-1}, {-1}, +#line 241 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1229), 0xee, 0xe5, 0xde}, +#line 496 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1230), 0xff, 0xb5, 0xc5}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 232 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1236), 0xa0, 0x20, 0xf0}, +#line 539 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1237), 0x55, 0x1a, 0x8b}, + {-1}, +#line 240 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1239), 0xff, 0xf5, 0xee}, + {-1}, +#line 473 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1241), 0xee, 0x6a, 0x50}, + {-1}, {-1}, {-1}, +#line 73 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1245), 0xd3, 0xd3, 0xd3}, +#line 545 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1246), 0xee, 0xd2, 0xee}, +#line 538 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1247), 0x7d, 0x26, 0xcd}, + {-1}, {-1}, {-1}, +#line 472 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1251), 0xff, 0x72, 0x56}, + {-1}, {-1}, {-1}, {-1}, +#line 544 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1256), 0xff, 0xe1, 0xff}, + {-1}, {-1}, {-1}, +#line 91 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1260), 0x00, 0x00, 0xcd}, + {-1}, +#line 117 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1262), 0x40, 0xe0, 0xd0}, +#line 347 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1263), 0x00, 0x86, 0x8b}, + {-1}, +#line 175 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1265), 0xbc, 0x8f, 0x8f}, + {-1}, {-1}, +#line 346 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1268), 0x00, 0xc5, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 537 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1277), 0x91, 0x2c, 0xee}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 345 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1283), 0x00, 0xe5, 0xee}, + {-1}, {-1}, {-1}, +#line 536 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1287), 0x9b, 0x30, 0xff}, +#line 344 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1288), 0x00, 0xf5, 0xff}, + {-1}, +#line 103 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1290), 0x46, 0x82, 0xb4}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 136 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1305), 0x20, 0xb2, 0xaa}, + {-1}, +#line 45 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1307), 0xf0, 0xf8, 0xff}, +#line 36 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1308), 0xff, 0xff, 0xf0}, + {-1}, +#line 182 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1310), 0xde, 0xb8, 0x87}, +#line 435 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1311), 0x8b, 0x73, 0x55}, + {-1}, {-1}, {-1}, {-1}, +#line 434 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1316), 0xcd, 0xaa, 0x7d}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 433 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1331), 0xee, 0xc5, 0x91}, + {-1}, {-1}, {-1}, {-1}, +#line 432 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1336), 0xff, 0xd3, 0x9b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 181 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1344), 0xcd, 0x85, 0x3f}, +#line 527 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1345), 0x8b, 0x66, 0x8b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 526 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1355), 0xcd, 0x96, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 68 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1364), 0x77, 0x88, 0x99}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 89 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1374), 0x84, 0x70, 0xff}, +#line 143 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1375), 0x7c, 0xfc, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 20 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1383), 0xfd, 0xf5, 0xe6}, + {-1}, +#line 525 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1385), 0xee, 0xae, 0xee}, + {-1}, {-1}, +#line 156 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1388), 0x6b, 0x8e, 0x23}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 524 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1395), 0xff, 0xbb, 0xff}, + {-1}, {-1}, {-1}, {-1}, +#line 371 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1400), 0x54, 0x8b, 0x54}, +#line 134 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1401), 0x3c, 0xb3, 0x71}, + {-1}, +#line 39 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1403), 0xff, 0xf5, 0xee}, + {-1}, +#line 370 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1405), 0x7c, 0xcd, 0x7c}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 199 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1415), 0xff, 0x7f, 0x50}, + {-1}, {-1}, +#line 407 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1418), 0x8b, 0x8b, 0x00}, + {-1}, +#line 369 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1420), 0x90, 0xee, 0x90}, + {-1}, {-1}, {-1}, {-1}, +#line 368 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1425), 0x9a, 0xff, 0x9a}, + {-1}, {-1}, +#line 406 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1428), 0xcd, 0xcd, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 176 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1443), 0xcd, 0x5c, 0x5c}, +#line 66 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1444), 0x77, 0x88, 0x99}, +#line 107 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1445), 0xad, 0xd8, 0xe6}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 79 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1453), 0x00, 0x00, 0x80}, +#line 130 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1454), 0x8f, 0xbc, 0x8f}, + {-1}, +#line 90 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1456), 0x00, 0x00, 0xcd}, + {-1}, +#line 405 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1458), 0xee, 0xee, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 404 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1468), 0xff, 0xff, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 169 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1480), 0xee, 0xdd, 0x82}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 51 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1509), 0xff, 0xff, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 55 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1515), 0x2f, 0x4f, 0x4f}, + {-1}, +#line 194 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1517), 0xff, 0xa0, 0x7a}, +#line 125 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1518), 0x7f, 0xff, 0xd4}, +#line 359 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1519), 0x45, 0x8b, 0x74}, + {-1}, {-1}, {-1}, {-1}, +#line 358 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1524), 0x66, 0xcd, 0xaa}, +#line 218 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1525), 0xd0, 0x20, 0x90}, + {-1}, {-1}, {-1}, {-1}, +#line 82 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1530), 0x48, 0x3d, 0x8b}, +#line 186 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1531), 0xf4, 0xa4, 0x60}, + {-1}, {-1}, +#line 222 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1534), 0xdd, 0xa0, 0xdd}, + {-1}, {-1}, {-1}, {-1}, +#line 357 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1539), 0x76, 0xee, 0xc6}, + {-1}, {-1}, {-1}, {-1}, +#line 356 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1544), 0x7f, 0xff, 0xd4}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 145 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1550), 0x7f, 0xff, 0x00}, +#line 383 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1551), 0x45, 0x8b, 0x00}, + {-1}, {-1}, {-1}, +#line 92 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1555), 0x41, 0x69, 0xe1}, +#line 382 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1556), 0x66, 0xcd, 0x00}, + {-1}, {-1}, +#line 139 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1559), 0x98, 0xfb, 0x98}, +#line 87 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1560), 0x7b, 0x68, 0xee}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 381 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1571), 0x76, 0xee, 0x00}, + {-1}, {-1}, +#line 210 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1574), 0xff, 0xc0, 0xcb}, + {-1}, +#line 380 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1576), 0x7f, 0xff, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 153 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1582), 0x9a, 0xcd, 0x32}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 53 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1595), 0x2f, 0x4f, 0x4f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 174 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1626), 0xbc, 0x8f, 0x8f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 188 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1639), 0xd2, 0x69, 0x1e}, +#line 447 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1640), 0x8b, 0x45, 0x13}, + {-1}, {-1}, {-1}, {-1}, +#line 446 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1645), 0xcd, 0x66, 0x1d}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 757 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1653), 0x00, 0x8b, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 162 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1658), 0xee, 0xe8, 0xaa}, + {-1}, +#line 445 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1660), 0xee, 0x76, 0x21}, + {-1}, {-1}, {-1}, {-1}, +#line 444 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1665), 0xff, 0x7f, 0x24}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 567 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1685), 0x17, 0x17, 0x17}, +#line 647 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1686), 0x7d, 0x7d, 0x7d}, +#line 561 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1687), 0x0f, 0x0f, 0x0f}, +#line 641 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1688), 0x75, 0x75, 0x75}, +#line 122 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1689), 0x5f, 0x9e, 0xa0}, +#line 343 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1690), 0x53, 0x86, 0x8b}, +#line 627 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1691), 0x63, 0x63, 0x63}, + {-1}, +#line 621 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1693), 0x5c, 0x5c, 0x5c}, + {-1}, +#line 342 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1695), 0x7a, 0xc5, 0xcd}, + {-1}, +#line 149 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1697), 0xad, 0xff, 0x2f}, + {-1}, {-1}, {-1}, {-1}, +#line 707 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1702), 0xc9, 0xc9, 0xc9}, + {-1}, +#line 701 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1704), 0xc2, 0xc2, 0xc2}, +#line 76 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1705), 0x19, 0x19, 0x70}, +#line 607 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1706), 0x4a, 0x4a, 0x4a}, + {-1}, +#line 601 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1708), 0x42, 0x42, 0x42}, + {-1}, +#line 341 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1710), 0x8e, 0xe5, 0xee}, +#line 587 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1711), 0x30, 0x30, 0x30}, + {-1}, +#line 581 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1713), 0x29, 0x29, 0x29}, + {-1}, +#line 340 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1715), 0x98, 0xf5, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 142 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1736), 0x7c, 0xfc, 0x00}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 201 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1755), 0xf0, 0x80, 0x80}, + {-1}, {-1}, {-1}, +#line 223 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1759), 0xda, 0x70, 0xd6}, +#line 523 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1760), 0x8b, 0x47, 0x89}, + {-1}, {-1}, {-1}, {-1}, +#line 566 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1765), 0x17, 0x17, 0x17}, +#line 646 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1766), 0x7d, 0x7d, 0x7d}, +#line 560 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1767), 0x0f, 0x0f, 0x0f}, +#line 640 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1768), 0x75, 0x75, 0x75}, + {-1}, +#line 522 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1770), 0xcd, 0x69, 0xc9}, +#line 626 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1771), 0x63, 0x63, 0x63}, + {-1}, +#line 620 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1773), 0x5c, 0x5c, 0x5c}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 706 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1782), 0xc9, 0xc9, 0xc9}, + {-1}, +#line 700 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1784), 0xc2, 0xc2, 0xc2}, + {-1}, +#line 606 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1786), 0x4a, 0x4a, 0x4a}, + {-1}, +#line 600 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1788), 0x42, 0x42, 0x42}, + {-1}, {-1}, +#line 586 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1791), 0x30, 0x30, 0x30}, + {-1}, +#line 580 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1793), 0x29, 0x29, 0x29}, + {-1}, {-1}, {-1}, +#line 225 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1797), 0xba, 0x55, 0xd3}, +#line 531 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1798), 0x7a, 0x37, 0x8b}, +#line 42 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1799), 0xf5, 0xff, 0xfa}, +#line 521 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1800), 0xee, 0x7a, 0xe9}, + {-1}, {-1}, {-1}, +#line 279 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1804), 0x8b, 0x83, 0x86}, + {-1}, {-1}, {-1}, +#line 530 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1808), 0xb4, 0x52, 0xcd}, + {-1}, +#line 520 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1810), 0xff, 0x83, 0xfa}, + {-1}, {-1}, {-1}, +#line 278 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1814), 0xcd, 0xc1, 0xc5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 160 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1826), 0xf0, 0xe6, 0x8c}, + {-1}, +#line 44 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1828), 0xf0, 0xf8, 0xff}, + {-1}, {-1}, {-1}, +#line 113 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1832), 0x00, 0xce, 0xd1}, + {-1}, {-1}, +#line 565 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1835), 0x14, 0x14, 0x14}, +#line 645 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1836), 0x7a, 0x7a, 0x7a}, + {-1}, +#line 529 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1838), 0xd1, 0x5f, 0xee}, + {-1}, {-1}, +#line 625 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1841), 0x61, 0x61, 0x61}, + {-1}, {-1}, +#line 277 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1844), 0xee, 0xe0, 0xe5}, +#line 549 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1845), 0x00, 0x00, 0x00}, +#line 629 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1846), 0x66, 0x66, 0x66}, + {-1}, +#line 528 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1848), 0xe0, 0x66, 0xff}, + {-1}, {-1}, +#line 609 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1851), 0x4d, 0x4d, 0x4d}, +#line 705 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1852), 0xc7, 0xc7, 0xc7}, + {-1}, +#line 276 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1854), 0xff, 0xf0, 0xf5}, + {-1}, +#line 605 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1856), 0x47, 0x47, 0x47}, + {-1}, {-1}, {-1}, {-1}, +#line 585 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1861), 0x2e, 0x2e, 0x2e}, +#line 689 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1862), 0xb3, 0xb3, 0xb3}, + {-1}, {-1}, +#line 335 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1865), 0x7a, 0x8b, 0x8b}, +#line 589 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1866), 0x33, 0x33, 0x33}, + {-1}, {-1}, {-1}, +#line 334 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1870), 0xb4, 0xcd, 0xcd}, +#line 569 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1871), 0x1a, 0x1a, 0x1a}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 333 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1885), 0xd1, 0xee, 0xee}, + {-1}, {-1}, {-1}, {-1}, +#line 332 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1890), 0xe0, 0xff, 0xff}, + {-1}, {-1}, +#line 229 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1893), 0x94, 0x00, 0xd3}, + {-1}, {-1}, {-1}, +#line 147 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1897), 0x00, 0xfa, 0x9a}, + {-1}, {-1}, {-1}, +#line 164 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1901), 0xfa, 0xfa, 0xd2}, + {-1}, +#line 391 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1903), 0x6e, 0x8b, 0x3d}, + {-1}, {-1}, {-1}, +#line 166 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1907), 0xff, 0xff, 0xe0}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 390 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1913), 0xa2, 0xcd, 0x5a}, + {-1}, +#line 564 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1915), 0x14, 0x14, 0x14}, +#line 644 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1916), 0x7a, 0x7a, 0x7a}, + {-1}, {-1}, {-1}, +#line 138 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1920), 0x98, 0xfb, 0x98}, +#line 624 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1921), 0x61, 0x61, 0x61}, + {-1}, {-1}, {-1}, +#line 548 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1925), 0x00, 0x00, 0x00}, +#line 628 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1926), 0x66, 0x66, 0x66}, + {-1}, {-1}, {-1}, {-1}, +#line 608 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1931), 0x4d, 0x4d, 0x4d}, +#line 704 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1932), 0xc7, 0xc7, 0xc7}, + {-1}, {-1}, +#line 275 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1935), 0x83, 0x8b, 0x83}, +#line 604 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1936), 0x47, 0x47, 0x47}, + {-1}, {-1}, {-1}, {-1}, +#line 584 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1941), 0x2e, 0x2e, 0x2e}, +#line 688 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1942), 0xb3, 0xb3, 0xb3}, +#line 389 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1943), 0xbc, 0xee, 0x68}, + {-1}, +#line 274 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1945), 0xc1, 0xcd, 0xc1}, +#line 588 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1946), 0x33, 0x33, 0x33}, + {-1}, {-1}, {-1}, {-1}, +#line 568 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1951), 0x1a, 0x1a, 0x1a}, + {-1}, +#line 388 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1953), 0xca, 0xff, 0x70}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 116 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1973), 0x48, 0xd1, 0xcc}, +#line 78 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1974), 0x00, 0x00, 0x80}, +#line 273 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1975), 0xe0, 0xee, 0xe0}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 272 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1985), 0xf0, 0xff, 0xf0}, +#line 67 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str1986), 0x77, 0x88, 0x99}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 224 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2011), 0xba, 0x55, 0xd3}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 559 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2019), 0x0d, 0x0d, 0x0d}, +#line 639 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2020), 0x73, 0x73, 0x73}, + {-1}, {-1}, {-1}, +#line 120 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2024), 0xe0, 0xff, 0xff}, +#line 619 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2025), 0x59, 0x59, 0x59}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 699 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2036), 0xbf, 0xbf, 0xbf}, + {-1}, +#line 97 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2038), 0x00, 0xbf, 0xff}, + {-1}, +#line 599 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2040), 0x40, 0x40, 0x40}, + {-1}, {-1}, {-1}, {-1}, +#line 579 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2045), 0x26, 0x26, 0x26}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 234 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2057), 0x93, 0x70, 0xdb}, +#line 543 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2058), 0x5d, 0x47, 0x8b}, + {-1}, {-1}, +#line 495 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2061), 0x8b, 0x3a, 0x62}, +#line 129 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2062), 0x55, 0x6b, 0x2f}, + {-1}, {-1}, {-1}, +#line 65 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2066), 0x77, 0x88, 0x99}, + {-1}, +#line 542 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2068), 0x89, 0x68, 0xcd}, + {-1}, {-1}, +#line 494 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2071), 0xcd, 0x60, 0x90}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 28 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2089), 0xff, 0xeb, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 541 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2098), 0x9f, 0x79, 0xee}, +#line 558 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2099), 0x0d, 0x0d, 0x0d}, +#line 638 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2100), 0x73, 0x73, 0x73}, +#line 493 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2101), 0xee, 0x6a, 0xa7}, + {-1}, {-1}, +#line 101 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2104), 0x87, 0xce, 0xfa}, +#line 618 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2105), 0x59, 0x59, 0x59}, + {-1}, {-1}, +#line 540 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2108), 0xab, 0x82, 0xff}, + {-1}, {-1}, +#line 492 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2111), 0xff, 0x6e, 0xb4}, + {-1}, {-1}, {-1}, {-1}, +#line 698 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2116), 0xbf, 0xbf, 0xbf}, + {-1}, +#line 451 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2118), 0x8b, 0x1a, 0x1a}, + {-1}, +#line 598 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2120), 0x40, 0x40, 0x40}, + {-1}, {-1}, +#line 450 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2123), 0xcd, 0x26, 0x26}, + {-1}, +#line 578 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2125), 0x26, 0x26, 0x26}, +#line 105 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2126), 0xb0, 0xc4, 0xde}, + {-1}, {-1}, {-1}, +#line 41 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2130), 0xf5, 0xff, 0xfa}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 449 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2138), 0xee, 0x2c, 0x2c}, + {-1}, {-1}, {-1}, {-1}, +#line 448 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2143), 0xff, 0x30, 0x30}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 756 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2174), 0x00, 0x8b, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 161 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2179), 0xee, 0xe8, 0xaa}, + {-1}, {-1}, {-1}, {-1}, +#line 124 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2184), 0x66, 0xcd, 0xaa}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 112 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2193), 0xaf, 0xee, 0xee}, +#line 339 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2194), 0x66, 0x8b, 0x8b}, + {-1}, +#line 200 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2196), 0xf0, 0x80, 0x80}, +#line 86 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2197), 0x7b, 0x68, 0xee}, + {-1}, +#line 16 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2199), 0xf5, 0xf5, 0xf5}, + {-1}, {-1}, {-1}, {-1}, +#line 338 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2204), 0x96, 0xcd, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 121 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2210), 0x5f, 0x9e, 0xa0}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 24 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2218), 0xfa, 0xeb, 0xd7}, +#line 247 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2219), 0x8b, 0x83, 0x78}, + {-1}, {-1}, {-1}, +#line 231 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2223), 0x8a, 0x2b, 0xe2}, +#line 23 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2224), 0xfa, 0xeb, 0xd7}, + {-1}, {-1}, {-1}, {-1}, +#line 246 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2229), 0xcd, 0xc0, 0xb0}, + {-1}, {-1}, {-1}, {-1}, +#line 337 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2234), 0xae, 0xee, 0xee}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 336 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2244), 0xbb, 0xff, 0xff}, + {-1}, {-1}, {-1}, +#line 167 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2248), 0xff, 0xff, 0x00}, + {-1}, {-1}, +#line 34 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2251), 0xff, 0xe4, 0xb5}, +#line 491 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2252), 0x8b, 0x0a, 0x50}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 245 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2259), 0xee, 0xdf, 0xcc}, + {-1}, {-1}, +#line 490 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2262), 0xcd, 0x10, 0x76}, +#line 152 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2263), 0x9a, 0xcd, 0x32}, + {-1}, {-1}, +#line 88 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2266), 0x84, 0x70, 0xff}, + {-1}, {-1}, +#line 244 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2269), 0xff, 0xef, 0xdb}, + {-1}, {-1}, +#line 267 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2272), 0x8b, 0x88, 0x78}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 226 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2281), 0x99, 0x32, 0xcc}, +#line 266 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2282), 0xcd, 0xc8, 0xb1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 489 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2292), 0xee, 0x12, 0x89}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 488 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2302), 0xff, 0x14, 0x93}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 265 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2312), 0xee, 0xe8, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 163 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2318), 0xfa, 0xfa, 0xd2}, + {-1}, {-1}, {-1}, +#line 264 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2322), 0xff, 0xf8, 0xdc}, + {-1}, {-1}, +#line 15 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2325), 0xf5, 0xf5, 0xf5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 119 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2385), 0xe0, 0xff, 0xff}, + {-1}, {-1}, +#line 217 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2388), 0xc7, 0x15, 0x85}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 110 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2401), 0xb0, 0xe0, 0xe6}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 123 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2410), 0x66, 0xcd, 0xaa}, + {-1}, {-1}, {-1}, +#line 228 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2414), 0x94, 0x00, 0xd3}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 128 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2424), 0x55, 0x6b, 0x2f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 227 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2433), 0x99, 0x32, 0xcc}, +#line 535 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2434), 0x68, 0x22, 0x8b}, + {-1}, {-1}, {-1}, {-1}, +#line 534 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2439), 0x9a, 0x32, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 533 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2454), 0xb2, 0x3a, 0xee}, +#line 207 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2455), 0xff, 0x69, 0xb4}, + {-1}, {-1}, {-1}, +#line 532 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2459), 0xbf, 0x3e, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 48 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2473), 0xff, 0xf0, 0xf5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 18 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2483), 0xff, 0xfa, 0xf0}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 189 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2512), 0xb2, 0x22, 0x22}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 747 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2526), 0xfc, 0xfc, 0xfc}, +#line 687 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2527), 0xb0, 0xb0, 0xb0}, +#line 741 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2528), 0xf5, 0xf5, 0xf5}, +#line 681 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2529), 0xa8, 0xa8, 0xa8}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 75 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2546), 0x19, 0x19, 0x70}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 14 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2594), 0xf8, 0xf8, 0xff}, + {-1}, {-1}, +#line 109 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2597), 0xb0, 0xe0, 0xe6}, + {-1}, {-1}, {-1}, +#line 727 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2601), 0xe3, 0xe3, 0xe3}, + {-1}, +#line 721 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2603), 0xdb, 0xdb, 0xdb}, + {-1}, {-1}, +#line 746 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2606), 0xfc, 0xfc, 0xfc}, +#line 686 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2607), 0xb0, 0xb0, 0xb0}, +#line 740 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2608), 0xf5, 0xf5, 0xf5}, +#line 680 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2609), 0xa8, 0xa8, 0xa8}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 503 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2623), 0x8b, 0x5f, 0x65}, + {-1}, {-1}, {-1}, {-1}, +#line 502 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2628), 0xcd, 0x8c, 0x95}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 19 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2635), 0xff, 0xfa, 0xf0}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 501 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2643), 0xee, 0xa2, 0xad}, + {-1}, {-1}, +#line 209 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2646), 0xff, 0x14, 0x93}, + {-1}, +#line 500 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2648), 0xff, 0xae, 0xb9}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 35 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2666), 0xff, 0xf8, 0xdc}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 745 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2676), 0xfa, 0xfa, 0xfa}, +#line 685 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2677), 0xad, 0xad, 0xad}, + {-1}, {-1}, {-1}, +#line 726 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2681), 0xe3, 0xe3, 0xe3}, + {-1}, +#line 720 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2683), 0xdb, 0xdb, 0xdb}, + {-1}, {-1}, +#line 729 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2686), 0xe5, 0xe5, 0xe5}, +#line 669 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2687), 0x99, 0x99, 0x99}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 667 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2693), 0x96, 0x96, 0x96}, + {-1}, +#line 661 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2695), 0x8f, 0x8f, 0x8f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 27 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2720), 0xff, 0xeb, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 81 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2735), 0x64, 0x95, 0xed}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 80 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2741), 0x64, 0x95, 0xed}, + {-1}, +#line 158 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2743), 0xbd, 0xb7, 0x6b}, +#line 230 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2744), 0x8a, 0x2b, 0xe2}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 725 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2751), 0xe0, 0xe0, 0xe0}, + {-1}, {-1}, {-1}, {-1}, +#line 744 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2756), 0xfa, 0xfa, 0xfa}, +#line 684 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2757), 0xad, 0xad, 0xad}, + {-1}, {-1}, {-1}, +#line 709 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2761), 0xcc, 0xcc, 0xcc}, + {-1}, {-1}, {-1}, +#line 40 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2765), 0xf0, 0xff, 0xf0}, +#line 728 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2766), 0xe5, 0xe5, 0xe5}, +#line 668 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2767), 0x99, 0x99, 0x99}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 666 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2773), 0x96, 0x96, 0x96}, + {-1}, +#line 660 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2775), 0x8f, 0x8f, 0x8f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 749 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2792), 0xff, 0xff, 0xff}, +#line 233 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2793), 0x93, 0x70, 0xdb}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 115 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2819), 0x48, 0xd1, 0xcc}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 724 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2831), 0xe0, 0xe0, 0xe0}, + {-1}, {-1}, +#line 148 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2834), 0xad, 0xff, 0x2f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 708 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2841), 0xcc, 0xcc, 0xcc}, + {-1}, +#line 665 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2843), 0x94, 0x94, 0x94}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 649 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2853), 0x7f, 0x7f, 0x7f}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 739 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2860), 0xf2, 0xf2, 0xf2}, +#line 679 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2861), 0xa6, 0xa6, 0xa6}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 748 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2872), 0xff, 0xff, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 159 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2895), 0xbd, 0xb7, 0x6b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 664 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2923), 0x94, 0x94, 0x94}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 648 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2933), 0x7f, 0x7f, 0x7f}, + {-1}, +#line 719 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2935), 0xd9, 0xd9, 0xd9}, + {-1}, {-1}, {-1}, {-1}, +#line 738 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2940), 0xf2, 0xf2, 0xf2}, +#line 678 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2941), 0xa6, 0xa6, 0xa6}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 13 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2960), 0xf8, 0xf8, 0xff}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 214 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2971), 0xdb, 0x70, 0x93}, +#line 507 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2972), 0x8b, 0x47, 0x5d}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 506 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str2982), 0xcd, 0x68, 0x89}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 505 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3012), 0xee, 0x79, 0x9f}, + {-1}, {-1}, +#line 718 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3015), 0xd9, 0xd9, 0xd9}, + {-1}, +#line 212 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3017), 0xff, 0xb6, 0xc1}, + {-1}, {-1}, {-1}, {-1}, +#line 504 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3022), 0xff, 0x82, 0xab}, + {-1}, {-1}, {-1}, {-1}, +#line 659 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3027), 0x8c, 0x8c, 0x8c}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 32 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3033), 0xff, 0xde, 0xad}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 165 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3044), 0xff, 0xff, 0xe0}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 111 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3062), 0xaf, 0xee, 0xee}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 146 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3099), 0x00, 0xfa, 0x9a}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 658 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3107), 0x8c, 0x8c, 0x8c}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 263 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3116), 0x8b, 0x89, 0x70}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 262 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3126), 0xcd, 0xc9, 0xa5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 211 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3143), 0xff, 0xb6, 0xc1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 261 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3156), 0xee, 0xe9, 0xbf}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 260 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3166), 0xff, 0xfa, 0xcd}, +#line 208 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3167), 0xff, 0x14, 0x93}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 33 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3185), 0xff, 0xde, 0xad}, +#line 259 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3186), 0x8b, 0x79, 0x5e}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 258 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3196), 0xcd, 0xb3, 0x8b}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 255 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3225), 0x8b, 0x77, 0x65}, +#line 257 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3226), 0xee, 0xcf, 0xa1}, + {-1}, {-1}, {-1}, +#line 254 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3230), 0xcd, 0xaf, 0x95}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 256 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3236), 0xff, 0xde, 0xad}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 253 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3245), 0xee, 0xcb, 0xad}, + {-1}, {-1}, {-1}, {-1}, +#line 252 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3250), 0xff, 0xda, 0xb9}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 38 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3275), 0xff, 0xfa, 0xcd}, + {-1}, {-1}, {-1}, +#line 31 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3279), 0xff, 0xda, 0xb9}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 47 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3314), 0xff, 0xf0, 0xf5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 216 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3330), 0xc7, 0x15, 0x85}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 206 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3471), 0xff, 0x69, 0xb4}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 30 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3745), 0xff, 0xda, 0xb9}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 37 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str3841), 0xff, 0xfa, 0xcd}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 213 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str4013), 0xdb, 0x70, 0x93}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 25 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str5422), 0xff, 0xef, 0xd5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 26 "rgblookup.gperf" + {offsetof(struct stringpool_t, stringpool_str5574), 0xff, 0xef, 0xd5} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) @@ -1745,10 +4055,14 @@ register unsigned int len; if (key <= MAX_HASH_VALUE) { - register const char *s = wordlist[key].name; + register int o = wordlist[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; - if (*str == *s && !strcmp (str + 1, s + 1)) - return &wordlist[key]; + if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s)) + return &wordlist[key]; + } } } return 0; From cdb6497d76330df52ea73211ae5a9dfeb1e7feb0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 11 Jun 2015 00:25:43 +0900 Subject: [PATCH 308/451] Add rgblookup.gprf to distributed files --- src/Makefile.am | 1 + src/Makefile.in | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index b3d7ed0f..7c792fc9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -60,6 +60,7 @@ tests_LDADD = $(top_builddir)/src/libsixel.la endif dist_man_MANS = sixel.5 +EXTRA_DIST = rgblookup.gperf unittest: all if COND_TESTS diff --git a/src/Makefile.in b/src/Makefile.in index ae10c2cf..e88dafa8 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -430,6 +430,7 @@ libsixel_la_LIBADD = -lm \ @COND_TESTS_TRUE@tests_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) @COND_TESTS_TRUE@tests_LDADD = $(top_builddir)/src/libsixel.la dist_man_MANS = sixel.5 +EXTRA_DIST = rgblookup.gperf all: all-am .SUFFIXES: From eda35db1f91878707bd957cb2ac0bcf497ce03b8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 12 Jun 2015 09:51:32 +0900 Subject: [PATCH 309/451] Update ChangeLog --- ChangeLog | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/ChangeLog b/ChangeLog index 41fd2738..0070a3d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,69 @@ +2015-06-11 Hayaki Saito + + * src/Makefile.am, src/Makefile.in: Add rgblookup.gprf to distributed files + + * src/Makefile.am, src/Makefile.in, src/rgblookup.h: Re-generate rgblookup.h + + * src/rgblookup.gperf: Add gperf file generated from X11's rgb.txt + +2015-06-10 Hayaki Saito + + * src/encoder.c: Fix segfault occurs when environment variable $SIXEL_BGCOLOR + is not set + + * src/Makefile.am, src/Makefile.in, src/encoder.c, src/rgblookup.h: Parse X11 + color name which is specified with -B option + + * src/encoder.c: Introduce SIXEL_BGCOLOR environment (for Issue #27) + + * src/encoder.c: Strip unneeded substitution to palette type option when -B + option is specified + +2015-06-09 Hayaki Saito + + * NEWS: Update NEWS + + * NEWS: Update NEWS for release 1.5 + + * LICENSE.stb: Update license file of stb + + * src/fromgif.c: gif loader: cleanup + + * src/fromgif.c: gif loader: update license notice + + * src/fromsixel.c: Minor fix + + * patches/applied/stb_image.h.diff: Remove directory "patches" + + * src/loader.c, src/stb_image.h: Update stb_image to version 2.06 + +2015-06-08 Hayaki Saito + + * LICENSE: Update LICENCE file + + * include/sixel.h.in, src/decoder.c, src/dither.c, src/encoder.c, + src/frame.c, src/fromgif.c, src/frompnm.c, src/loader.c, src/output.c, + src/pixelformat.c, src/quant.c, src/scale.c, src/tosixel.c, src/writer.c: Use + constant symbols which start with the prefix SIXEL_ + + * perl/cpanfile: Add cpanfile for perl interface + +2015-06-07 Hayaki Saito + + * perl/README.md, perl/t/sixel.t: Minor fixes + + * perl/MANIFEST, perl/README, perl/README.md: Rename the README of perl + module + +2015-06-05 Hayaki Saito + + * converters/loader.c: Copy gdk's pixbuf memory to libsixel-internal chunk + with attention to image stride (reported by @ttdoda, Issue #43) + +2015-06-02 Hayaki Saito + + * NEWS: Update NEWS + 2015-05-29 Hayaki Saito * configure, configure.ac: Correct wrong help string of ./configure From 2782ac23a0b3eede1fe6170a66bfdfe21a8fa214 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 13 Jun 2015 02:54:24 +0900 Subject: [PATCH 310/451] Correct typoed version macro --- include/sixel.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index f51421ad..88b7b5d5 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -24,8 +24,8 @@ #ifndef LIBSIXEL_SIXEL_H #define LIBSIXEL_SIXEL_H -#define LIBSIXEL_VRTSION @PACKAGE_VERSION@ -#define LIBSIXEL_ABI_VRTSION @LS_LTVERSION@ +#define LIBSIXEL_VERSION @PACKAGE_VERSION@ +#define LIBSIXEL_ABI_VERSION @LS_LTVERSION@ #define SIXEL_OUTPUT_PACKET_SIZE 1024 #define SIXEL_PALETTE_MAX 256 From b450caf84c2d3279a4b9db9a9b3c2a75a0ad23ab Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 13 Jun 2015 02:54:24 +0900 Subject: [PATCH 311/451] Correct typoed version macro --- include/sixel.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 0d2b9e49..2e30b83f 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -30,8 +30,8 @@ # define SIXELAPI #endif -#define LIBSIXEL_VRTSION @PACKAGE_VERSION@ -#define LIBSIXEL_ABI_VRTSION @LS_LTVERSION@ +#define LIBSIXEL_VERSION @PACKAGE_VERSION@ +#define LIBSIXEL_ABI_VERSION @LS_LTVERSION@ #define SIXEL_OUTPUT_PACKET_SIZE 16384 #define SIXEL_PALETTE_MAX 256 From 96508aa5bb171c33ad185e3d269741c7145afd92 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 13 Jun 2015 09:54:26 +0900 Subject: [PATCH 312/451] Define LIBSIXEL_VERSION and LIBSIXEL_ABI_VERSION as string --- include/sixel.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 88b7b5d5..28771ec2 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -24,8 +24,8 @@ #ifndef LIBSIXEL_SIXEL_H #define LIBSIXEL_SIXEL_H -#define LIBSIXEL_VERSION @PACKAGE_VERSION@ -#define LIBSIXEL_ABI_VERSION @LS_LTVERSION@ +#define LIBSIXEL_VERSION "@PACKAGE_VERSION@" +#define LIBSIXEL_ABI_VERSION "@LS_LTVERSION@" #define SIXEL_OUTPUT_PACKET_SIZE 1024 #define SIXEL_PALETTE_MAX 256 From d8bc2838a0045ee8ccfe863ba5e9b1d2fd86aa45 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 13 Jun 2015 20:31:25 +0900 Subject: [PATCH 313/451] Introduce SIXELSTATUS and related macros --- include/sixel.h.in | 56 ++++++++------ src/encoder.c | 180 ++++++++++++++++++++++----------------------- src/fromgif.c | 48 ++++++------ src/loader.c | 28 +++---- 4 files changed, 160 insertions(+), 152 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index d80fa2d2..4dbaff16 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -38,9 +38,17 @@ #define SIXEL_USE_DEPRECATED_SYMBOLS 1 /* return value */ -#define SIXEL_SUCCESS 0x0000 /* succeeded */ -#define SIXEL_FAILED 0x1000 /* failed */ -#define SIXEL_INTERRUPTED (SIXEL_SUCCESS | 0x001) /* interrupted by a signal */ +typedef int SIXELSTATUS; +#define SIXEL_OK 0x0000 /* succeeded */ +#define SIXEL_FALSE 0x1000 /* failed */ +#define SIXEL_RUNTIME_ERROR (SIXEL_FALSE | 0x0100) /* runtime error */ +#define SIXEL_LOGIC_ERROR (SIXEL_FALSE | 0x0200) /* logic error */ +#define SIXEL_INTERRUPTED (SIXEL_OK | 0x0001) /* interrupted by a signal */ +#define SIXEL_BAD_ALLOCATION (SIXEL_RUNTIME_ERROR | 0x0001) /* malloc() failed */ +#define SIXEL_BAD_ARGUMENT (SIXEL_RUNTIME_ERROR | 0x0002) /* bad argument detected */ + +#define SIXEL_SUCCEEDED(status) (((status) & 0x1000) == 0) +#define SIXEL_FAILED(status) (((status) & 0x1000) != 0) /* method for finding the largest dimension for splitting, * and sorting by that component */ @@ -307,7 +315,7 @@ sixel_output_ref(sixel_output_t /* in */ *output); /* output context */ SIXELAPI void sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_output_get_8bit_availability( sixel_output_t /* in */ *output); /* output context */ @@ -373,7 +381,7 @@ SIXELAPI void sixel_dither_unref(sixel_dither_t *dither); /* dither context object */ /* initialize internal palette from specified pixel buffer */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_dither_initialize( sixel_dither_t *dither, /* dither context object */ unsigned char /* in */ *data, /* sample image */ @@ -391,16 +399,16 @@ sixel_dither_set_diffusion_type( int /* in */ method_for_diffuse); /* one of enum methodForDiffuse */ /* get number of palette colors */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_dither_get_num_of_palette_colors( sixel_dither_t /* in */ *dither); /* dither context object */ /* get number of histogram colors */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_dither_get_num_of_histogram_colors( sixel_dither_t /* in */ *dither); /* dither context object */ -SIXELAPI @attr_func_deprecated@ int /* typoed! remains for compatibility. */ +SIXELAPI @attr_func_deprecated@ SIXELSTATUS /* typoed! remains for compatibility. */ sixel_dither_get_num_of_histgram_colors( sixel_dither_t /* in */ *dither); /* dither context object */ @@ -455,7 +463,7 @@ extern "C" { #endif /* convert pixels into sixel format and write it to output context */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encode( unsigned char /* in */ *pixels, /* pixel bytes */ int /* in */ width, /* image width */ @@ -465,7 +473,7 @@ sixel_encode( sixel_output_t /* in */ *context); /* output context */ /* convert sixel data into indexed pixel bytes and palette data */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_decode( unsigned char /* in */ *sixels, /* sixel bytes */ int /* in */ size, /* size of sixel bytes */ @@ -487,13 +495,13 @@ extern "C" { #endif /* compute pixel depth from pixelformat */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_compute_depth( int /* in */ pixelformat /* one of enum pixelFormat */ ); /* convert pixelFormat into PIXELFORMAT_RGB888 */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_normalize_pixelformat( unsigned char /* out */ *dst, /* destination buffer */ int /* out */ *dst_pixelformat, /* converted pixelformat */ @@ -504,7 +512,7 @@ sixel_helper_normalize_pixelformat( ); /* scale image to specified size */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_scale_image( unsigned char /* out */ *dst, /* destination buffer */ unsigned char const /* in */ *src, /* source image data */ @@ -567,7 +575,7 @@ sixel_frame_ref(sixel_frame_t *frame); SIXELAPI void sixel_frame_unref(sixel_frame_t *frame); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_init( sixel_frame_t *frame, unsigned char *pixels, @@ -628,14 +636,14 @@ sixel_frame_strip_alpha( sixel_frame_t /* in */ *frame, unsigned char /* in */ *bgcolor); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_resize( sixel_frame_t /* in */ *frame, int /* in */ width, int /* in */ height, int /* in */ method_for_resampling); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_clip( sixel_frame_t /* in */ *frame, int /* in */ x, @@ -643,11 +651,11 @@ sixel_frame_clip( int /* in */ width, int /* in */ height); -typedef int (* sixel_load_image_function)( +typedef SIXELSTATUS (* sixel_load_image_function)( sixel_frame_t /* in */ *frame, void /* in/out */ *context); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_load_image_file( char const /* in */ *filename, /* source file name */ int /* in */ fstatic, /* whether to extract static image */ @@ -661,7 +669,7 @@ sixel_helper_load_image_file( void /* in/out */ *context); /* private data for callback */ /* write image to file */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_write_image_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ @@ -699,18 +707,18 @@ sixel_encoder_ref(sixel_encoder_t *encoder); SIXELAPI void sixel_encoder_unref(sixel_encoder_t *encoder); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encoder_set_cancel_flag( sixel_encoder_t /* in */ *encoder, int /* in */ *cancel_flag); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, char const /* in */ *optarg); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, char const /* in */ *filename); @@ -743,13 +751,13 @@ sixel_decoder_ref(sixel_decoder_t *decoder); SIXELAPI void sixel_decoder_unref(sixel_decoder_t *decoder); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_decoder_setopt( sixel_decoder_t /* in */ *decoder, int /* in */ arg, char const /* in */ *optarg); -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_decoder_decode( sixel_decoder_t /* in */ *decoder); diff --git a/src/encoder.c b/src/encoder.c index 0a85ce05..fa675141 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -425,13 +425,13 @@ prepare_palette(sixel_dither_t *former_dither, } -static int +static SIXELSTATUS do_resize( sixel_frame_t *frame, sixel_encoder_t *encoder ) { - int nret; + SIXELSTATUS status = SIXEL_OK; if (encoder->percentwidth > 0) { encoder->pixelwidth = sixel_frame_get_width(frame) * encoder->percentwidth / 100; @@ -450,26 +450,26 @@ do_resize( if (encoder->pixelwidth > 0 && encoder->pixelheight > 0) { - nret = sixel_frame_resize(frame, - encoder->pixelwidth, - encoder->pixelheight, - encoder->method_for_resampling); - if (nret != 0) { - return nret; + status = sixel_frame_resize(frame, + encoder->pixelwidth, + encoder->pixelheight, + encoder->method_for_resampling); + if (SIXEL_FAILED(status)) { + return status; } } - return 0; + return status; } -static int +static SIXELSTATUS do_crop( sixel_frame_t *frame, sixel_encoder_t *encoder ) { - int ret; + SIXELSTATUS status = SIXEL_OK; int width; int height; @@ -492,17 +492,17 @@ do_crop( } } if (encoder->clipwidth > 0 && encoder->clipheight > 0) { - ret = sixel_frame_clip(frame, - encoder->clipx, - encoder->clipy, - encoder->clipwidth, - encoder->clipheight); - if (ret != 0) { - return ret; + status = sixel_frame_clip(frame, + encoder->clipx, + encoder->clipy, + encoder->clipwidth, + encoder->clipheight); + if (SIXEL_FAILED(status)) { + return status; } } - return 0; + return status; } @@ -546,7 +546,7 @@ wait_stdin(int usec) } -static int +static SIXELSTATUS output_sixel_without_macro( unsigned char *buffer, int width, @@ -558,7 +558,7 @@ output_sixel_without_macro( sixel_encoder_t *encoder ) { - int nret = 0; + SIXELSTATUS status = SIXEL_OK; int dulation = 0; static unsigned char *p; int depth; @@ -575,12 +575,13 @@ output_sixel_without_macro( depth = sixel_helper_compute_depth(pixelformat); if (depth == (-1)) { - nret = (-1); + status = SIXEL_FALSE; goto end; } p = malloc(width * height * depth); - if (nret != 0) { + if (p == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } #if HAVE_USLEEP && HAVE_CLOCK @@ -608,18 +609,18 @@ output_sixel_without_macro( goto end; } - nret = sixel_encode(p, width, height, depth, dither, context); - if (nret != 0) { + status = sixel_encode(p, width, height, depth, dither, context); + if (status != 0) { goto end; } end: free(p); - return nret; + return status; } -static int +static SIXELSTATUS output_sixel_with_macro( unsigned char *frame, int sx, @@ -632,7 +633,7 @@ output_sixel_with_macro( sixel_encoder_t *encoder ) { - int nret = 0; + SIXELSTATUS status = SIXEL_OK; int dulation = 0; char buffer[256]; #if HAVE_USLEEP @@ -653,8 +654,8 @@ output_sixel_with_macro( } sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); - nret = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); - if (nret != 0) { + status = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); + if (SIXEL_FAILED(status)) { goto end; } @@ -681,7 +682,7 @@ output_sixel_with_macro( } end: - return nret; + return status; } @@ -746,10 +747,10 @@ scroll_on_demand(sixel_encoder_t *encoder, sixel_frame_t *frame) } -static int +static SIXELSTATUS load_image_callback(sixel_frame_t *frame, void *data) { - int nret = SIXEL_FAILED; + SIXELSTATUS status = SIXEL_FALSE; sixel_encoder_t *encoder; sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; @@ -759,26 +760,26 @@ load_image_callback(sixel_frame_t *frame, void *data) /* evaluate -w, -h, and -c option: crop/scale input source */ if (encoder->clipfirst) { /* clipping */ - nret = do_crop(frame, encoder); - if (nret != 0) { + status = do_crop(frame, encoder); + if (SIXEL_FAILED(status)) { goto end; } /* scaling */ - nret = do_resize(frame, encoder); - if (nret != SIXEL_SUCCESS) { + status = do_resize(frame, encoder); + if (SIXEL_FAILED(status)) { goto end; } } else { /* scaling */ - nret = do_resize(frame, encoder); - if (nret != 0) { + status = do_resize(frame, encoder); + if (SIXEL_FAILED(status)) { goto end; } /* clipping */ - nret = do_crop(frame, encoder); - if (nret != 0) { + status = do_crop(frame, encoder); + if (SIXEL_FAILED(status)) { goto end; } } @@ -786,7 +787,7 @@ load_image_callback(sixel_frame_t *frame, void *data) /* prepare dither context */ dither = prepare_palette(encoder->dither_cache, frame, encoder); if (!dither) { - nret = (-1); + status = SIXEL_FALSE; goto end; } @@ -830,51 +831,51 @@ load_image_callback(sixel_frame_t *frame, void *data) } if (encoder->cancel_flag && *encoder->cancel_flag) { - nret = SIXEL_INTERRUPTED; + status = SIXEL_INTERRUPTED; goto end; } /* output sixel: junction of multi-frame processing strategy */ if (encoder->fuse_macro) { /* -u option */ /* use macro */ - nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_delay(frame), - sixel_frame_get_frame_no(frame), - sixel_frame_get_loop_no(frame), - dither, - output, - encoder); + status = output_sixel_with_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_delay(frame), + sixel_frame_get_frame_no(frame), + sixel_frame_get_loop_no(frame), + dither, + output, + encoder); } else if (encoder->macro_number >= 0) { /* -n option */ /* use macro */ - nret = output_sixel_with_macro(sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_delay(frame), - sixel_frame_get_frame_no(frame), - sixel_frame_get_loop_no(frame), - dither, - output, - encoder); + status = output_sixel_with_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_delay(frame), + sixel_frame_get_frame_no(frame), + sixel_frame_get_loop_no(frame), + dither, + output, + encoder); } else { /* do not use macro */ - nret = output_sixel_without_macro(sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_pixelformat(frame), - sixel_frame_get_delay(frame), - dither, - output, - encoder); + status = output_sixel_without_macro(sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), + sixel_frame_get_delay(frame), + dither, + output, + encoder); } if (encoder->cancel_flag && *encoder->cancel_flag) { sixel_write_callback("\x18\033\\", 3, &encoder->outfd); - nret = SIXEL_INTERRUPTED; + status = SIXEL_INTERRUPTED; } - if (nret != 0) { + if (SIXEL_FAILED(status)) { goto end; } @@ -886,7 +887,7 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_dither_unref(dither); } - return nret; + return status; } @@ -1377,12 +1378,12 @@ sixel_encoder_setopt( } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, char const /* in */ *filename) { - int nret = (-1); + SIXELSTATUS status = (-1); int fuse_palette = 1; if (encoder == NULL) { @@ -1427,18 +1428,17 @@ sixel_encoder_encode( } reload: - nret = sixel_helper_load_image_file(filename, - encoder->fstatic, - fuse_palette, - encoder->reqcolors, - encoder->bgcolor, - encoder->loop_mode, - load_image_callback, - encoder->finsecure, - encoder->cancel_flag, - (void *)encoder); - - if (nret != 0) { + status = sixel_helper_load_image_file(filename, + encoder->fstatic, + fuse_palette, + encoder->reqcolors, + encoder->bgcolor, + encoder->loop_mode, + load_image_callback, + encoder->finsecure, + encoder->cancel_flag, + (void *)encoder); + if (status != 0) { goto end; } @@ -1447,11 +1447,11 @@ sixel_encoder_encode( clearerr(stdin); #endif /* HAVE_FSEEK */ while (encoder->cancel_flag && !*encoder->cancel_flag) { - nret = wait_stdin(1000000); - if (nret == (-1)) { + status = wait_stdin(1000000); + if (SIXEL_FAILED(status)) { goto end; } - if (nret != 0) { + if (status != SIXEL_OK) { break; } } @@ -1463,7 +1463,7 @@ sixel_encoder_encode( end: sixel_encoder_unref(encoder); - return nret; + return status; } diff --git a/src/fromgif.c b/src/fromgif.c index 9f945e86..c116e007 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -344,7 +344,7 @@ gif_process_raster( if (len == 0) { len = gif_get8(s); /* start new block */ if (len == 0) { - return SIXEL_SUCCESS; + return SIXEL_OK; } } --len; @@ -366,19 +366,19 @@ gif_process_raster( while ((len = gif_get8(s)) > 0) { gif_skip(s,len); } - return SIXEL_SUCCESS; + return SIXEL_OK; } else if (code <= avail) { if (first) { fprintf(stderr, "Corrupt GIF\n" "reason: no clear code\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } if (oldcode >= 0) { p = &g->codes[avail++]; if (avail > 4096) { fprintf(stderr, "Corrupt GIF\n" "reason: too many codes\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } p->prefix = (int16_t) oldcode; p->first = g->codes[oldcode].first; @@ -386,7 +386,7 @@ gif_process_raster( } else if (code == avail) { fprintf(stderr, "Corrupt GIF\n" "reason: illegal code in raster\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } gif_out_code(g, (uint16_t) code); @@ -400,7 +400,7 @@ gif_process_raster( } else { fprintf(stderr, "Corrupt GIF\n" "reason: illegal code in raster\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } } } @@ -430,7 +430,7 @@ gif_load_next( if (((x + w) > (g->w)) || ((y + h) > (g->h))) { fprintf(stderr, "Corrupt GIF.\n" "reason: bad Image Descriptor.\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } g->line_size = g->w; @@ -468,7 +468,7 @@ gif_load_next( } else { fprintf(stderr, "Corrupt GIF.\n" "reason: missing color table.\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } return gif_process_raster(s, g); @@ -522,20 +522,20 @@ gif_load_next( case 0x3B: /* gif stream termination code */ g->is_terminated = 1; - return SIXEL_SUCCESS; + return SIXEL_OK; default: fprintf(stderr, "Corrupt GIF.\n" "reason: unknown code.\n"); - return SIXEL_FAILED; + return SIXEL_FALSE; } } - return SIXEL_SUCCESS; + return SIXEL_OK; } -int +SIXELSTATUS load_gif( unsigned char /* in */ *buffer, int /* in */ size, @@ -550,17 +550,17 @@ load_gif( { gif_context_t s; gif_t g; - int ret; + SIXELSTATUS status; sixel_frame_t *frame; frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } gif_start_mem(&s, buffer, size); memset(&g, 0, sizeof(g)); - ret = gif_load_header(&s, &g); - if (ret != SIXEL_SUCCESS) { + status = gif_load_header(&s, &g); + if (status != SIXEL_OK) { goto end; } frame->width = g.w, @@ -577,29 +577,29 @@ load_gif( frame->frame_no = 0; gif_rewind(&s); - ret = gif_load_header(&s, &g); - if (ret != 0) { + status = gif_load_header(&s, &g); + if (status != SIXEL_OK) { goto end; } g.is_terminated = 0; for (;;) { /* per frame */ - ret = gif_load_next(&s, &g, bgcolor); - if (ret != 0) { + status = gif_load_next(&s, &g, bgcolor); + if (status != SIXEL_OK) { goto end; } if (g.is_terminated) { break; } - ret = gif_init_frame(frame, &g, bgcolor, reqcolors, fuse_palette); - if (ret != 0) { + status = gif_init_frame(frame, &g, bgcolor, reqcolors, fuse_palette); + if (status != SIXEL_OK) { goto end; } - ret = ((sixel_load_image_function)fn_load)(frame, context); - if (ret != 0) { + status = ((sixel_load_image_function)fn_load)(frame, context); + if (status != SIXEL_OK) { goto end; } diff --git a/src/loader.c b/src/loader.c index e2baa9b3..edd8c20b 100644 --- a/src/loader.c +++ b/src/loader.c @@ -927,7 +927,7 @@ load_with_builtin( if (chunk_is_sixel(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } frame->pixels = load_sixel(pchunk->buffer, pchunk->size, @@ -943,7 +943,7 @@ load_with_builtin( } else if (chunk_is_pnm(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } /* pnm */ frame->pixels = load_pnm(pchunk->buffer, @@ -965,7 +965,7 @@ load_with_builtin( else if (chunk_is_jpeg(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } frame->pixels = load_jpeg(pchunk->buffer, pchunk->size, @@ -981,7 +981,7 @@ load_with_builtin( else if (chunk_is_png(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } frame->pixels = load_png(pchunk->buffer, pchunk->size, @@ -1018,7 +1018,7 @@ load_with_builtin( frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } stbi__start_mem(&s, pchunk->buffer, pchunk->size); frame->pixels = stbi__load_main(&s, &frame->width, &frame->height, &depth, 3); @@ -1082,7 +1082,7 @@ load_with_gdkpixbuf( #endif sixel_frame_t *frame; int stride; - int ret = SIXEL_FAILED; + int ret = SIXEL_FALSE; unsigned char *p; int i; int depth; @@ -1093,7 +1093,7 @@ load_with_gdkpixbuf( frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } #if (!GLIB_CHECK_VERSION(2, 36, 0)) @@ -1304,7 +1304,7 @@ load_with_gd( frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } switch(detect_file_format(pchunk->size, pchunk->buffer)) { @@ -1353,20 +1353,20 @@ load_with_gd( break; #endif /* HAVE_DECL_GDIMAGECREATEFROMGD2PTR */ default: - return SIXEL_FAILED; + return SIXEL_FALSE; } if (im == NULL) { - return SIXEL_FAILED; + return SIXEL_FALSE; } if (!gdImageTrueColor(im)) { #if HAVE_DECL_GDIMAGEPALETTETOTRUECOLOR if (!gdImagePaletteToTrueColor(im)) { - return SIXEL_FAILED; + return SIXEL_FALSE; } #else - return SIXEL_FAILED; + return SIXEL_FALSE; #endif } @@ -1380,7 +1380,7 @@ load_with_gd( strerror(errno)); #endif /* HAVE_ERRNO_H */ gdImageDestroy(im); - return SIXEL_FAILED; + return SIXEL_FALSE; } for (y = 0; y < frame->height; y++) { for (x = 0; x < frame->width; x++) { @@ -1400,7 +1400,7 @@ load_with_gd( /* load image from file */ -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_load_image_file( char const /* in */ *filename, /* source file name */ int /* in */ fstatic, /* whether to extract static image */ From 87beac935cc684f4aca00882d339210c23535a1c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 13 Jun 2015 21:10:01 +0900 Subject: [PATCH 314/451] Do semantic error handling (on progress) --- src/dither.c | 18 ++--- src/encoder.c | 185 ++++++++++++++++++++++++++++---------------------- 2 files changed, 113 insertions(+), 90 deletions(-) diff --git a/src/dither.c b/src/dither.c index ebc5764a..a5343b15 100644 --- a/src/dither.c +++ b/src/dither.c @@ -328,7 +328,7 @@ sixel_dither_set_quality_mode(sixel_dither_t *dither, int quality_mode) } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, int width, int height, int pixelformat, int method_for_largest, int method_for_rep, @@ -337,7 +337,7 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, unsigned char *buf = NULL; unsigned char *normalized_pixels = NULL; unsigned char *input_pixels; - int nret = (-1); + SIXELSTATUS status = SIXEL_FALSE; if (pixelformat != SIXEL_PIXELFORMAT_RGB888) { @@ -347,11 +347,11 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, goto end; } - nret = sixel_helper_normalize_pixelformat(normalized_pixels, - &pixelformat, - data, pixelformat, - width, height); - if (nret != 0) { + status = sixel_helper_normalize_pixelformat(normalized_pixels, + &pixelformat, + data, pixelformat, + width, height); + if (SIXEL_FAILED(status)) { goto end; } input_pixels = normalized_pixels; @@ -382,11 +382,11 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, } sixel_quant_free_palette(buf); - nret = 0; + status = SIXEL_OK; end: free(normalized_pixels); - return nret; + return status; } diff --git a/src/encoder.c b/src/encoder.c index fa675141..8c151c11 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -81,13 +81,13 @@ arg_strdup(char const *s) } -static int +static SIXELSTATUS parse_x_colorspec(char const *s, unsigned char **bgcolor) { + SIXELSTATUS status = SIXEL_FALSE; char *p; unsigned char components[3]; int index = 0; - int ret = 0; unsigned long v; char *endptr; char *buf = NULL; @@ -95,6 +95,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) pcolor = lookup_rgb(s, strlen(s)); if (pcolor) { *bgcolor = malloc(3); + if (*bgcolor == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } (*bgcolor)[0] = pcolor->r; (*bgcolor)[1] = pcolor->g; (*bgcolor)[2] = pcolor->b; @@ -134,10 +138,14 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) ++p; } if (index != 3 || *p != '\0' || *p == '/') { - ret = (-1); + status = SIXEL_BAD_ARGUMENT; goto end; } *bgcolor = malloc(3); + if (*bgcolor == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } (*bgcolor)[0] = components[0]; (*bgcolor)[1] = components[1]; (*bgcolor)[2] = components[2]; @@ -153,15 +161,19 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) } else if (*endptr == '\0') { break; } else { - ret = (-1); + status = SIXEL_BAD_ARGUMENT; goto end; } } if (endptr - p > 12) { - ret = (-1); + status = SIXEL_BAD_ARGUMENT; goto end; } *bgcolor = malloc(3); + if (*bgcolor == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } switch (endptr - p) { case 3: (*bgcolor)[0] = (unsigned char)(p[0] << 4); @@ -184,20 +196,19 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[2] = (unsigned char)(p[8] << 4 | p[9]); break; default: - ret = (-1); + status = SIXEL_BAD_ARGUMENT; goto end; } } else { - ret = (-1); + status = SIXEL_BAD_ARGUMENT; goto end; } - ret = 0; - + status = SIXEL_OK; end: free(buf); - return ret; + return status; } @@ -265,11 +276,11 @@ typedef struct sixel_callback_context_for_mapfile { } sixel_callback_context_for_mapfile_t; -static int +static SIXELSTATUS load_image_callback_for_palette(sixel_frame_t *frame, void *data) { + SIXELSTATUS status = SIXEL_FALSE; sixel_callback_context_for_mapfile_t *callback_context; - int ret = (-1); callback_context = (sixel_callback_context_for_mapfile_t *)data; @@ -287,7 +298,7 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) } sixel_dither_set_palette(callback_context->dither, sixel_frame_get_palette(frame)); - ret = 0; + status = SIXEL_OK; break; default: callback_context->dither = sixel_dither_create(callback_context->reqcolors); @@ -295,15 +306,15 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) goto end; } - ret = sixel_dither_initialize(callback_context->dither, - sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_pixelformat(frame), - SIXEL_LARGE_NORM, - SIXEL_REP_CENTER_BOX, - SIXEL_QUALITY_HIGH); - if (ret != 0) { + status = sixel_dither_initialize(callback_context->dither, + sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), + SIXEL_LARGE_NORM, + SIXEL_REP_CENTER_BOX, + SIXEL_QUALITY_HIGH); + if (SIXEL_FAILED(status)) { sixel_dither_unref(callback_context->dither); goto end; } @@ -311,117 +322,129 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) } end: - return ret; + return status; } -static sixel_dither_t * +static SIXELSTATUS prepare_specified_palette( + sixel_dither_t **dither, char const *mapfile, int reqcolors, unsigned char *bgcolor, int finsecure, int const *cancel_flag) { - int ret = (-1); + int status = SIXEL_FALSE; sixel_callback_context_for_mapfile_t callback_context; callback_context.reqcolors = reqcolors; callback_context.dither = NULL; - ret = sixel_helper_load_image_file(mapfile, - 1, /* fstatic */ - 1, /* fuse_palette */ - 256, /* reqcolors */ - bgcolor, - SIXEL_LOOP_DISABLE, - load_image_callback_for_palette, - finsecure, - cancel_flag, - &callback_context); - if (ret != 0) { - return NULL; + status = sixel_helper_load_image_file(mapfile, + 1, /* fstatic */ + 1, /* fuse_palette */ + 256, /* reqcolors */ + bgcolor, + SIXEL_LOOP_DISABLE, + load_image_callback_for_palette, + finsecure, + cancel_flag, + &callback_context); + if (SIXEL_FAILED(status)) { + return status; } - return callback_context.dither; + *dither = callback_context.dither; + + return status; } -static sixel_dither_t * -prepare_palette(sixel_dither_t *former_dither, +static SIXELSTATUS +prepare_palette(sixel_dither_t **dither, + sixel_dither_t *former_dither, sixel_frame_t *frame, sixel_encoder_t *encoder) { - sixel_dither_t *dither; - int ret; + SIXELSTATUS status = SIXEL_OK; int histogram_colors; if (encoder->highcolor) { if (former_dither) { - return former_dither; + *dither = former_dither; + } else { + *dither = sixel_dither_create(-1); } - dither = sixel_dither_create(-1); } else if (encoder->monochrome) { if (former_dither) { - return former_dither; + *dither = former_dither; + } else { + *dither = prepare_monochrome_palette(encoder->finvert); } - dither = prepare_monochrome_palette(encoder->finvert); } else if (encoder->mapfile) { if (former_dither) { - return former_dither; + *dither = former_dither; + } else { + status = prepare_specified_palette(dither, + encoder->mapfile, + encoder->reqcolors, + encoder->bgcolor, + encoder->finsecure, + encoder->cancel_flag); + if (SIXEL_FAILED(status)) { + return status; + } } - dither = prepare_specified_palette(encoder->mapfile, - encoder->reqcolors, - encoder->bgcolor, - encoder->finsecure, - encoder->cancel_flag); } else if (encoder->builtin_palette) { if (former_dither) { - return former_dither; + *dither = former_dither; + } else { + *dither = prepare_builtin_palette(encoder->builtin_palette); } - dither = prepare_builtin_palette(encoder->builtin_palette); } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_PALETTE)) { - dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); - if (!dither) { - return NULL; + *dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); + if (!*dither) { + return SIXEL_FALSE; } - sixel_dither_set_palette(dither, sixel_frame_get_palette(frame)); - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + sixel_dither_set_palette(*dither, sixel_frame_get_palette(frame)); + sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); if (sixel_frame_get_transparent(frame) != (-1)) { - sixel_dither_set_transparent(dither, sixel_frame_get_transparent(frame)); + sixel_dither_set_transparent(*dither, sixel_frame_get_transparent(frame)); } } else if (sixel_frame_get_pixelformat(frame) == SIXEL_PIXELFORMAT_G8) { - dither = sixel_dither_create(-1); - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + *dither = sixel_dither_create(-1); + sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); } else { if (former_dither) { sixel_dither_unref(former_dither); } - dither = sixel_dither_create(encoder->reqcolors); - if (!dither) { - return NULL; + *dither = sixel_dither_create(encoder->reqcolors); + if (*dither == NULL) { + return SIXEL_BAD_ALLOCATION; } - ret = sixel_dither_initialize(dither, - sixel_frame_get_pixels(frame), - sixel_frame_get_width(frame), - sixel_frame_get_height(frame), - sixel_frame_get_pixelformat(frame), - encoder->method_for_largest, - encoder->method_for_rep, - encoder->quality_mode); - if (ret != 0) { - sixel_dither_unref(dither); - return NULL; + status = sixel_dither_initialize(*dither, + sixel_frame_get_pixels(frame), + sixel_frame_get_width(frame), + sixel_frame_get_height(frame), + sixel_frame_get_pixelformat(frame), + encoder->method_for_largest, + encoder->method_for_rep, + encoder->quality_mode); + if (SIXEL_FAILED(status)) { + sixel_dither_unref(*dither); + return SIXEL_FALSE; } - histogram_colors = sixel_dither_get_num_of_histogram_colors(dither); + histogram_colors = sixel_dither_get_num_of_histogram_colors(*dither); if (histogram_colors <= encoder->reqcolors) { encoder->method_for_diffuse = SIXEL_DIFFUSE_NONE; } - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); } - return dither; + + return status; } @@ -785,8 +808,8 @@ load_image_callback(sixel_frame_t *frame, void *data) } /* prepare dither context */ - dither = prepare_palette(encoder->dither_cache, frame, encoder); - if (!dither) { + status = prepare_palette(&dither, encoder->dither_cache, frame, encoder); + if (SIXEL_FAILED(status)) { status = SIXEL_FALSE; goto end; } From caae7c629918901eba339c0bc6e41a2bd972bec0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 00:11:40 +0900 Subject: [PATCH 315/451] Do semantic error handling (on progress) --- examples/opengl/main.c | 40 +++--- include/sixel.h.in | 8 +- src/dither.c | 2 + src/tosixel.c | 289 +++++++++++++++++++++++++++-------------- 4 files changed, 226 insertions(+), 113 deletions(-) diff --git a/examples/opengl/main.c b/examples/opengl/main.c index d5a4902b..71884a80 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -324,30 +324,35 @@ sixel_write(char *data, int size, void *priv) } -static int +static SIXELSTATUS output_sixel(unsigned char *pixbuf, int width, int height, - int ncolors, int depth) + int ncolors, int pixelformat) { sixel_output_t *context; sixel_dither_t *dither; - int ret; + SIXELSTATUS status; - context = sixel_output_create(sixel_write, stdout); - dither = sixel_dither_create(ncolors); #if USE_OSMESA - sixel_dither_set_pixelformat(dither, PIXELFORMAT_RGBA8888); + pixelformat = SIXEL_PIXELFORMAT_RGBA8888; #endif - ret = sixel_dither_initialize(dither, pixbuf, width, height, depth, - LARGE_AUTO, REP_AUTO, QUALITY_AUTO); - if (ret != 0) - return ret; - ret = sixel_encode(pixbuf, width, height, depth, dither, context); - if (ret != 0) - return ret; + context = sixel_output_create(sixel_write, stdout); + dither = sixel_dither_create(ncolors); + status = sixel_dither_initialize(dither, pixbuf, + width, height, + pixelformat, + SIXEL_LARGE_AUTO, + SIXEL_REP_AUTO, + SIXEL_QUALITY_AUTO); + if (SIXEL_FAILED(status)) + return status; + status = sixel_encode(pixbuf, width, height, + pixelformat, dither, context); + if (SIXEL_FAILED(status)) + return status; sixel_output_unref(context); sixel_dither_unref(dither); - return 0; + return status; } static int @@ -426,6 +431,7 @@ scroll_on_demand(int pixelheight) int main(int argc, char** argv) { + SIXELSTATUS status; unsigned char *pixbuf; int width = 400; @@ -487,7 +493,11 @@ int main(int argc, char** argv) #else glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixbuf); #endif - output_sixel(pixbuf, width, height, ncolors, /* unused */ 3); + status = output_sixel(pixbuf, width, height, ncolors, + SIXEL_PIXELFORMAT_RGB888); + if (SIXEL_FAILED(status)) { + break; + } } #if !defined(USE_OSMESA) diff --git a/include/sixel.h.in b/include/sixel.h.in index 4dbaff16..4761194b 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -315,7 +315,7 @@ sixel_output_ref(sixel_output_t /* in */ *output); /* output context */ SIXELAPI void sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ -SIXELAPI SIXELSTATUS +SIXELAPI int sixel_output_get_8bit_availability( sixel_output_t /* in */ *output); /* output context */ @@ -399,16 +399,16 @@ sixel_dither_set_diffusion_type( int /* in */ method_for_diffuse); /* one of enum methodForDiffuse */ /* get number of palette colors */ -SIXELAPI SIXELSTATUS +SIXELAPI int sixel_dither_get_num_of_palette_colors( sixel_dither_t /* in */ *dither); /* dither context object */ /* get number of histogram colors */ -SIXELAPI SIXELSTATUS +SIXELAPI int sixel_dither_get_num_of_histogram_colors( sixel_dither_t /* in */ *dither); /* dither context object */ -SIXELAPI @attr_func_deprecated@ SIXELSTATUS /* typoed! remains for compatibility. */ +SIXELAPI @attr_func_deprecated@ int /* typoed! remains for compatibility. */ sixel_dither_get_num_of_histgram_colors( sixel_dither_t /* in */ *dither); /* dither context object */ diff --git a/src/dither.c b/src/dither.c index a5343b15..736317c2 100644 --- a/src/dither.c +++ b/src/dither.c @@ -339,6 +339,8 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, unsigned char *input_pixels; SIXELSTATUS status = SIXEL_FALSE; + sixel_dither_set_pixelformat(dither, pixelformat); + if (pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ diff --git a/src/tosixel.c b/src/tosixel.c index d4218ac4..a375509d 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -89,7 +89,7 @@ sixel_advance(sixel_output_t *context, int nwrite) } -static int +static SIXELSTATUS sixel_put_flash(sixel_output_t *const context) { int n; @@ -129,9 +129,11 @@ sixel_put_flash(sixel_output_t *const context) } -static void +static SIXELSTATUS sixel_put_pixel(sixel_output_t *const context, int pix) { + SIXELSTATUS status = SIXEL_FALSE; + if (pix < 0 || pix > '?') { pix = 0; } @@ -141,10 +143,18 @@ sixel_put_pixel(sixel_output_t *const context, int pix) if (pix == context->save_pixel) { context->save_count++; } else { - sixel_put_flash(context); + status = sixel_put_flash(context); + if (SIXEL_FAILED(status)) { + goto end; + } context->save_pixel = pix; context->save_count = 1; } + + status = SIXEL_OK; + +end: + return status; } @@ -155,9 +165,7 @@ sixel_node_del(sixel_output_t *const context, sixel_node_t *np) if ((tp = context->node_top) == np) { context->node_top = np->next; - } - - else { + } else { while (tp->next != NULL) { if (tp->next == np) { tp->next = np->next; @@ -172,10 +180,14 @@ sixel_node_del(sixel_output_t *const context, sixel_node_t *np) } -static int -sixel_put_node(sixel_output_t *const context, int x, - sixel_node_t *np, int ncolors, int keycolor) +static SIXELSTATUS +sixel_put_node(sixel_output_t *const context, + int *x, + sixel_node_t *np, + int ncolors, + int keycolor) { + SIXELSTATUS status = SIXEL_FALSE; int nwrite; if (ncolors != 2 || keycolor == -1) { @@ -183,32 +195,46 @@ sixel_put_node(sixel_output_t *const context, int x, if (context->active_palette != np->pal) { nwrite = sprintf((char *)context->buffer + context->pos, "#%d", np->pal); + if (nwrite <= 0) { + return status; + } sixel_advance(context, nwrite); context->active_palette = np->pal; } } - for (; x < np->sx; x++) { - if (x != keycolor) { - sixel_put_pixel(context, 0); + for (; *x < np->sx; ++*x) { + if (*x != keycolor) { + status = sixel_put_pixel(context, 0); + if (SIXEL_FAILED(status)) { + goto end; + } } } - for (; x < np->mx; x++) { - if (x != keycolor) { - sixel_put_pixel(context, np->map[x]); + for (; *x < np->mx; ++*x) { + if (*x != keycolor) { + status = sixel_put_pixel(context, np->map[*x]); + if (SIXEL_FAILED(status)) { + goto end; + } } } - sixel_put_flash(context); + status = sixel_put_flash(context); + if (SIXEL_FAILED(status)) { + goto end; + } - return x; +end: + return status; } -static int +static SIXELSTATUS sixel_encode_header(int width, int height, sixel_output_t *context) { + SIXELSTATUS status = SIXEL_FALSE; int nwrite; int p[3] = {0, 0, 0}; int pcount = 3; @@ -223,7 +249,7 @@ sixel_encode_header(int width, int height, sixel_output_t *context) nwrite = sprintf((char *)context->buffer, DCS_START_7BIT); } if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(context, nwrite); } @@ -242,21 +268,21 @@ sixel_encode_header(int width, int height, sixel_output_t *context) nwrite = sprintf((char *)context->buffer + context->pos, "%d", p[0]); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(context, nwrite); if (pcount > 1) { nwrite = sprintf((char *)context->buffer + context->pos, ";%d", p[1]); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(context, nwrite); if (pcount > 2) { nwrite = sprintf((char *)context->buffer + context->pos, ";%d", p[2]); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(context, nwrite); } @@ -265,7 +291,7 @@ sixel_encode_header(int width, int height, sixel_output_t *context) nwrite = sprintf((char *)context->buffer + context->pos, "q"); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(context, nwrite); @@ -273,16 +299,18 @@ sixel_encode_header(int width, int height, sixel_output_t *context) nwrite = sprintf((char *)context->buffer + context->pos, "\"1;1;%d;%d", width, height); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(context, nwrite); } - return 0; + status = SIXEL_OK; + + return status; } -static int +static SIXELSTATUS output_rgb_palette_definition( sixel_output_t /* in */ *output, unsigned char /* in */ *palette, @@ -290,6 +318,7 @@ output_rgb_palette_definition( int /* in */ keycolor ) { + SIXELSTATUS status = SIXEL_FALSE; int nwrite; if (n != keycolor) { @@ -301,16 +330,18 @@ output_rgb_palette_definition( (palette[n * 3 + 1] * 100 + 127) / 255, (palette[n * 3 + 2] * 100 + 127) / 255); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(output, nwrite); } - return (0); + status = SIXEL_OK; + + return status; } -static int +static SIXELSTATUS output_hls_palette_definition( sixel_output_t /* in */ *output, unsigned char /* in */ *palette, @@ -318,6 +349,7 @@ output_hls_palette_definition( int /* in */ keycolor ) { + SIXELSTATUS status = SIXEL_FALSE; int h; int l; int s; @@ -357,29 +389,38 @@ output_hls_palette_definition( nwrite = sprintf((char *)output->buffer + output->pos, "#%d;1;%d;%d;%d", n, h, l, s); if (nwrite <= 0) { - return (-1); + return status; } sixel_advance(output, nwrite); } - return (0); + status = SIXEL_OK; + return status; } -static int +static SIXELSTATUS sixel_encode_body(unsigned char *pixels, int width, int height, unsigned char *palette, int ncolors, int keycolor, int bodyonly, sixel_output_t *context, unsigned char *palstate) { - int x, y, i, n, c; - int sx, mx; - int len, pix; + SIXELSTATUS status = SIXEL_FALSE; + int x; + int y; + int i; + int n; + int c; + int sx; + int mx; + int len; + int pix; unsigned char *map = NULL; sixel_node_t *np, *tp, top; - int nret = (-1); + int fillable; if (ncolors < 1) { + status = SIXEL_BAD_ARGUMENT; goto end; } len = ncolors * width; @@ -388,11 +429,13 @@ sixel_encode_body(unsigned char *pixels, int width, int height, #if HAVE_CALLOC map = (unsigned char *)calloc(len, sizeof(unsigned char)); if (map == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } #else map = (unsigned char *)malloc(len); if (map == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } memset(map, 0, len); @@ -401,15 +444,15 @@ sixel_encode_body(unsigned char *pixels, int width, int height, if (!bodyonly && (ncolors != 2 || keycolor == (-1))) { if (context->palette_type == SIXEL_PALETTETYPE_HLS) { for (n = 0; n < ncolors; n++) { - nret = output_hls_palette_definition(context, palette, n, keycolor); - if (nret != 0) { + status = output_hls_palette_definition(context, palette, n, keycolor); + if (SIXEL_FAILED(status)) { goto end; } } } else { for (n = 0; n < ncolors; n++) { - nret = output_rgb_palette_definition(context, palette, n, keycolor); - if (nret != 0) { + status = output_rgb_palette_definition(context, palette, n, keycolor); + if (SIXEL_FAILED(status)) { goto end; } } @@ -417,7 +460,6 @@ sixel_encode_body(unsigned char *pixels, int width, int height, } for (y = i = 0; y < height; y++) { - int fillable; if (context->encode_policy != SIXEL_ENCODEPOLICY_SIZE) { fillable = 0; } @@ -475,6 +517,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, } else { np = (sixel_node_t *)malloc(sizeof(sixel_node_t)); if (np == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } } @@ -523,7 +566,10 @@ sixel_encode_body(unsigned char *pixels, int width, int height, if (fillable) { memset(np->map + np->sx, (1 << i) - 1, np->mx - np->sx); } - x = sixel_put_node(context, x, np, ncolors, keycolor); + status = sixel_put_node(context, &x, np, ncolors, keycolor); + if (SIXEL_FAILED(status)) { + goto end; + } next = np->next; sixel_node_del(context, np); np = next; @@ -537,7 +583,10 @@ sixel_encode_body(unsigned char *pixels, int width, int height, if (fillable) { memset(np->map + np->sx, (1 << i) - 1, np->mx - np->sx); } - x = sixel_put_node(context, x, np, ncolors, keycolor); + status = sixel_put_node(context, &x, np, ncolors, keycolor); + if (SIXEL_FAILED(status)) { + goto end; + } next = np->next; sixel_node_del(context, np); np = next; @@ -555,7 +604,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, sixel_advance(context, 1); } - nret = 0; + status = SIXEL_OK; end: /* free nodes */ @@ -567,13 +616,14 @@ sixel_encode_body(unsigned char *pixels, int width, int height, free(map); - return nret; + return status; } -static int +static SIXELSTATUS sixel_encode_footer(sixel_output_t *context) { + SIXELSTATUS status = SIXEL_FALSE; int nwrite; if (!context->skip_dcs_envelope && !context->penetrate_multiplexer) { @@ -583,7 +633,7 @@ sixel_encode_footer(sixel_output_t *context) nwrite = sprintf((char *)context->buffer + context->pos, DCS_END_7BIT); } if (nwrite <= 0) { - return (-1); + goto end; } sixel_advance(context, nwrite); } @@ -603,17 +653,20 @@ sixel_encode_footer(sixel_output_t *context) } } - return 0; + status = SIXEL_OK; + +end: + return status; } -static int +static SIXELSTATUS sixel_encode_dither(unsigned char *pixels, int width, int height, sixel_dither_t *dither, sixel_output_t *context) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *paletted_pixels = NULL; unsigned char *input_pixels; - int nret = (-1); switch (dither->pixelformat) { case SIXEL_PIXELFORMAT_PAL1: @@ -621,14 +674,15 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, case SIXEL_PIXELFORMAT_PAL4: paletted_pixels = malloc(width * height * 3); if (paletted_pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } - nret = sixel_helper_normalize_pixelformat(paletted_pixels, - &dither->pixelformat, - pixels, - dither->pixelformat, - width, height); - if (nret != 0) { + status = sixel_helper_normalize_pixelformat(paletted_pixels, + &dither->pixelformat, + pixels, + dither->pixelformat, + width, height); + if (SIXEL_FAILED(status)) { goto end; } input_pixels = paletted_pixels; @@ -644,23 +698,40 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, paletted_pixels = sixel_dither_apply_palette(dither, pixels, width, height); if (paletted_pixels == NULL) { + status = SIXEL_RUNTIME_ERROR; goto end; } input_pixels = paletted_pixels; break; } - sixel_encode_header(width, height, context); - sixel_encode_body(input_pixels, width, height, - dither->palette, dither->ncolors, - dither->keycolor, dither->bodyonly, context, NULL); - sixel_encode_footer(context); - nret = 0; + status = sixel_encode_header(width, height, context); + if (SIXEL_FAILED(status)) { + goto end; + } + + status = sixel_encode_body(input_pixels, + width, + height, + dither->palette, + dither->ncolors, + dither->keycolor, + dither->bodyonly, + context, + NULL); + if (SIXEL_FAILED(status)) { + goto end; + } + + status = sixel_encode_footer(context); + if (SIXEL_FAILED(status)) { + goto end; + } end: free(paletted_pixels); - return nret; + return status; } @@ -1047,10 +1118,11 @@ sixel_apply_15bpp_dither( } -static int +static SIXELSTATUS sixel_encode_highcolor(unsigned char *pixels, int width, int height, sixel_dither_t *dither, sixel_output_t *context) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *paletted_pixels = NULL; unsigned char *normalized_pixels = NULL; /* Mark sixel line pixels which have been already drawn. */ @@ -1060,7 +1132,6 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, unsigned char palhitcount[256]; unsigned char palstate[256]; int output_count; - int nret = (-1); int const maxcolors = 1 << 15; int whole_size = width * height /* for paletted_pixels */ + maxcolors /* for rgbhit */ @@ -1073,12 +1144,12 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, if (normalized_pixels == NULL) { goto error; } - nret = sixel_helper_normalize_pixelformat(normalized_pixels, - &dither->pixelformat, - pixels, - dither->pixelformat, - width, height); - if (nret != 0) { + status = sixel_helper_normalize_pixelformat(normalized_pixels, + &dither->pixelformat, + pixels, + dither->pixelformat, + width, height); + if (SIXEL_FAILED(status)) { goto error; } pixels = normalized_pixels; @@ -1101,6 +1172,9 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, int mod_y; int nextpal; int threshold; + int pix; + int orig_height; + unsigned char *pal; dst = paletted_pixels; nextpal = 0; @@ -1116,9 +1190,9 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, *dst = 255; } else { - int pix = ((pixels[0] & 0xf8) << 7) | - ((pixels[1] & 0xf8) << 2) | - ((pixels[2] >> 3) & 0x1f); + pix = ((pixels[0] & 0xf8) << 7) | + ((pixels[1] & 0xf8) << 2) | + ((pixels[2] >> 3) & 0x1f); sixel_apply_15bpp_dither(pixels, x, y, width, height, dither->method_for_diffuse); @@ -1147,7 +1221,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, *dst = 255; } else { - unsigned char *pal = dither->palette + (nextpal * 3); + pal = dither->palette + (nextpal * 3); rgbhit[pix] = 1; if (output_count > 0) { @@ -1186,15 +1260,27 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, } } if (dirty && mod_y == 5) { - int orig_height = height; + orig_height = height; if (output_count++ == 0) { - sixel_encode_header(width, height, context); + status = sixel_encode_header(width, height, context); + if (SIXEL_FAILED(status)) { + goto error; + } } height = y; - sixel_encode_body(paletted_pixels, width, height, - dither->palette, 255, 255, - dither->bodyonly, context, palstate); + status = sixel_encode_body(paletted_pixels, + width, + height, + dither->palette, + 255, + 255, + dither->bodyonly, + context, + palstate); + if (SIXEL_FAILED(status)) { + goto error; + } pixels -= (6 * width * 3); height = orig_height - height + 6; break; @@ -1209,23 +1295,38 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, end: if (output_count == 0) { - sixel_encode_header(width, height, context); + status = sixel_encode_header(width, height, context); + if (SIXEL_FAILED(status)) { + goto error; + } + } + status = sixel_encode_body(paletted_pixels, + width, + height, + dither->palette, + 255, + 255, + dither->bodyonly, + context, + palstate); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_encode_footer(context); + if (SIXEL_FAILED(status)) { + goto error; } - sixel_encode_body(paletted_pixels, width, height, - dither->palette, 255, 255, - dither->bodyonly, context, palstate); - sixel_encode_footer(context); - nret = 0; error: free(paletted_pixels); free(normalized_pixels); - return nret; + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encode(unsigned char /* in */ *pixels, /* pixel bytes */ int /* in */ width, /* image width */ int /* in */ height, /* image height */ @@ -1233,7 +1334,7 @@ sixel_encode(unsigned char /* in */ *pixels, /* pixel bytes */ sixel_dither_t /* in */ *dither, /* dither context */ sixel_output_t /* in */ *context) /* output context */ { - int nret = (-1); + SIXELSTATUS status = SIXEL_FALSE; /* TODO: reference counting should be thread-safe */ sixel_dither_ref(dither); @@ -1242,17 +1343,17 @@ sixel_encode(unsigned char /* in */ *pixels, /* pixel bytes */ (void) depth; if (dither->quality_mode == SIXEL_QUALITY_HIGHCOLOR) { - nret = sixel_encode_highcolor(pixels, width, height, - dither, context); + status = sixel_encode_highcolor(pixels, width, height, + dither, context); } else { - nret = sixel_encode_dither(pixels, width, height, - dither, context); + status = sixel_encode_dither(pixels, width, height, + dither, context); } sixel_output_unref(context); sixel_dither_unref(dither); - return nret; + return status; } From 71a2fb608f8cf499fd4b41251ec186fa0861820a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 03:19:54 +0900 Subject: [PATCH 316/451] Do semantic error handling (on progress) --- src/encoder.c | 7 ++++++- src/loader.c | 49 +++++++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 8c151c11..066b98e3 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -290,10 +290,12 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) case SIXEL_PIXELFORMAT_PAL4: case SIXEL_PIXELFORMAT_PAL8: if (sixel_frame_get_palette(frame) == NULL) { + status = SIXEL_LOGIC_ERROR; goto end; } callback_context->dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (callback_context->dither == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } sixel_dither_set_palette(callback_context->dither, @@ -303,6 +305,7 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) default: callback_context->dither = sixel_dither_create(callback_context->reqcolors); if (callback_context->dither == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } @@ -318,6 +321,9 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) sixel_dither_unref(callback_context->dither); goto end; } + + status = SIXEL_OK; + break; } @@ -810,7 +816,6 @@ load_image_callback(sixel_frame_t *frame, void *data) /* prepare dither context */ status = prepare_palette(&dither, encoder->dither_cache, frame, encoder); if (SIXEL_FAILED(status)) { - status = SIXEL_FALSE; goto end; } diff --git a/src/loader.c b/src/loader.c index edd8c20b..363a0d4f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -909,7 +909,7 @@ chunk_is_jpeg(chunk_t const *chunk) -int +static SIXELSTATUS load_with_builtin( chunk_t const /* in */ *pchunk, /* image data */ int /* in */ fstatic, /* static */ @@ -921,13 +921,14 @@ load_with_builtin( void /* in/out */ *context /* private data for callback */ ) { + SIXELSTATUS status = SIXEL_FALSE; sixel_frame_t *frame = NULL; - int ret = (-1); if (chunk_is_sixel(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto error; } frame->pixels = load_sixel(pchunk->buffer, pchunk->size, @@ -943,7 +944,8 @@ load_with_builtin( } else if (chunk_is_pnm(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto error; } /* pnm */ frame->pixels = load_pnm(pchunk->buffer, @@ -965,7 +967,8 @@ load_with_builtin( else if (chunk_is_jpeg(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto error; } frame->pixels = load_jpeg(pchunk->buffer, pchunk->size, @@ -981,7 +984,8 @@ load_with_builtin( else if (chunk_is_png(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto error; } frame->pixels = load_png(pchunk->buffer, pchunk->size, @@ -999,16 +1003,16 @@ load_with_builtin( } #endif /* HAVE_LIBPNG */ else if (chunk_is_gif(pchunk)) { - ret = load_gif(pchunk->buffer, - pchunk->size, - bgcolor, - reqcolors, - fuse_palette, - fstatic, - loop_control, - fn_load, - context); - if (ret != 0) { + status = load_gif(pchunk->buffer, + pchunk->size, + bgcolor, + reqcolors, + fuse_palette, + fstatic, + loop_control, + fn_load, + context); + if (SIXEL_FAILED(status)) { goto error; } goto end; @@ -1018,7 +1022,8 @@ load_with_builtin( frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto error; } stbi__start_mem(&s, pchunk->buffer, pchunk->size); frame->pixels = stbi__load_main(&s, &frame->width, &frame->height, &depth, 3); @@ -1042,13 +1047,13 @@ load_with_builtin( } } - ret = sixel_frame_strip_alpha(frame, bgcolor); - if (ret != 0) { + status = sixel_frame_strip_alpha(frame, bgcolor); + if (SIXEL_FAILED(status)) { goto error; } - ret = fn_load(frame, context); - if (ret != 0) { + status = fn_load(frame, context); + if (SIXEL_FAILED(status)) { goto error; } @@ -1056,7 +1061,7 @@ load_with_builtin( end: sixel_frame_unref(frame); - return ret; + return status; } From 68abb0e3295895e5fc952f0a05d0ad7729927db0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 03:22:02 +0900 Subject: [PATCH 317/451] Add new built-in palette profiles, gray1/2/4/8 --- include/sixel.h.in | 64 +++++++++++++-------------- src/dither.c | 107 +++++++++++++++++++++++++++++++++++++++++++++ src/encoder.c | 36 +++++++++++++-- 3 files changed, 172 insertions(+), 35 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index d80fa2d2..3eec3fbf 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -44,42 +44,46 @@ /* method for finding the largest dimension for splitting, * and sorting by that component */ -#define SIXEL_LARGE_AUTO 0 /* choose automatically the method for finding the largest - dimension */ -#define SIXEL_LARGE_NORM 1 /* simply comparing the range in RGB space */ -#define SIXEL_LARGE_LUM 2 /* transforming into luminosities before the comparison */ +#define SIXEL_LARGE_AUTO 0x0 /* choose automatically the method for finding the largest + dimension */ +#define SIXEL_LARGE_NORM 0x1 /* simply comparing the range in RGB space */ +#define SIXEL_LARGE_LUM 0x2 /* transforming into luminosities before the comparison */ /* method for choosing a color from the box */ -#define SIXEL_REP_AUTO 0 /* choose automatically the method for selecting - representative color from each box */ -#define SIXEL_REP_CENTER_BOX 1 /* choose the center of the box */ -#define SIXEL_REP_AVERAGE_COLORS 2 /* choose the average all the color - in the box (specified in Heckbert's paper) */ -#define SIXEL_REP_AVERAGE_PIXELS 3 /* choose the average all the pixels in the box */ +#define SIXEL_REP_AUTO 0x0 /* choose automatically the method for selecting + representative color from each box */ +#define SIXEL_REP_CENTER_BOX 0x1 /* choose the center of the box */ +#define SIXEL_REP_AVERAGE_COLORS 0x2 /* choose the average all the color + in the box (specified in Heckbert's paper) */ +#define SIXEL_REP_AVERAGE_PIXELS 0x3 /* choose the average all the pixels in the box */ /* method for diffusing */ -#define SIXEL_DIFFUSE_AUTO 0 /* choose diffusion type automatically */ -#define SIXEL_DIFFUSE_NONE 1 /* don't diffuse */ -#define SIXEL_DIFFUSE_ATKINSON 2 /* diffuse with Bill Atkinson's method */ -#define SIXEL_DIFFUSE_FS 3 /* diffuse with Floyd-Steinberg method */ -#define SIXEL_DIFFUSE_JAJUNI 4 /* diffuse with Jarvis, Judice & Ninke method */ -#define SIXEL_DIFFUSE_STUCKI 5 /* diffuse with Stucki's method */ -#define SIXEL_DIFFUSE_BURKES 6 /* diffuse with Burkes' method */ +#define SIXEL_DIFFUSE_AUTO 0x0 /* choose diffusion type automatically */ +#define SIXEL_DIFFUSE_NONE 0x1 /* don't diffuse */ +#define SIXEL_DIFFUSE_ATKINSON 0x2 /* diffuse with Bill Atkinson's method */ +#define SIXEL_DIFFUSE_FS 0x3 /* diffuse with Floyd-Steinberg method */ +#define SIXEL_DIFFUSE_JAJUNI 0x4 /* diffuse with Jarvis, Judice & Ninke method */ +#define SIXEL_DIFFUSE_STUCKI 0x5 /* diffuse with Stucki's method */ +#define SIXEL_DIFFUSE_BURKES 0x6 /* diffuse with Burkes' method */ /* quality modes */ -#define SIXEL_QUALITY_AUTO 0 /* choose quality mode automatically */ -#define SIXEL_QUALITY_HIGH 1 /* high quality palette construction */ -#define SIXEL_QUALITY_LOW 2 /* low quality palette construction */ -#define SIXEL_QUALITY_FULL 3 /* full quality palette construction */ -#define SIXEL_QUALITY_HIGHCOLOR 4 /* high color */ +#define SIXEL_QUALITY_AUTO 0x0 /* choose quality mode automatically */ +#define SIXEL_QUALITY_HIGH 0x1 /* high quality palette construction */ +#define SIXEL_QUALITY_LOW 0x2 /* low quality palette construction */ +#define SIXEL_QUALITY_FULL 0x3 /* full quality palette construction */ +#define SIXEL_QUALITY_HIGHCOLOR 0x4 /* high color */ /* built-in dither */ -#define SIXEL_BUILTIN_MONO_DARK 0 /* monochrome terminal with dark background */ -#define SIXEL_BUILTIN_MONO_LIGHT 1 /* monochrome terminal with dark background */ -#define SIXEL_BUILTIN_XTERM16 2 /* xterm 16color */ -#define SIXEL_BUILTIN_XTERM256 3 /* xterm 256color */ -#define SIXEL_BUILTIN_VT340_MONO 4 /* vt340 monochrome */ -#define SIXEL_BUILTIN_VT340_COLOR 5 /* vt340 color */ +#define SIXEL_BUILTIN_MONO_DARK 0x0 /* monochrome terminal with dark background */ +#define SIXEL_BUILTIN_MONO_LIGHT 0x1 /* monochrome terminal with dark background */ +#define SIXEL_BUILTIN_XTERM16 0x2 /* xterm 16color */ +#define SIXEL_BUILTIN_XTERM256 0x3 /* xterm 256color */ +#define SIXEL_BUILTIN_VT340_MONO 0x4 /* vt340 monochrome */ +#define SIXEL_BUILTIN_VT340_COLOR 0x5 /* vt340 color */ +#define SIXEL_BUILTIN_G1 0x6 /* 1bit grayscale */ +#define SIXEL_BUILTIN_G2 0x7 /* 2bit grayscale */ +#define SIXEL_BUILTIN_G4 0x8 /* 4bit grayscale */ +#define SIXEL_BUILTIN_G8 0x9 /* 8bit grayscale */ /* offset value of pixelFormat */ #define SIXEL_FORMATTYPE_COLOR (0) @@ -95,11 +99,9 @@ #define SIXEL_PIXELFORMAT_BGR888 (SIXEL_FORMATTYPE_COLOR | 0x06) /* 24bpp */ #define SIXEL_PIXELFORMAT_ARGB8888 (SIXEL_FORMATTYPE_COLOR | 0x10) /* 32bpp */ #define SIXEL_PIXELFORMAT_RGBA8888 (SIXEL_FORMATTYPE_COLOR | 0x11) /* 32bpp */ -#if 0 #define SIXEL_PIXELFORMAT_G1 (SIXEL_FORMATTYPE_GRAYSCALE | 0x00) /* 1bpp grayscale */ #define SIXEL_PIXELFORMAT_G2 (SIXEL_FORMATTYPE_GRAYSCALE | 0x01) /* 2bpp grayscale */ #define SIXEL_PIXELFORMAT_G4 (SIXEL_FORMATTYPE_GRAYSCALE | 0x02) /* 4bpp grayscale */ -#endif #define SIXEL_PIXELFORMAT_G8 (SIXEL_FORMATTYPE_GRAYSCALE | 0x03) /* 8bpp grayscale */ #define SIXEL_PIXELFORMAT_AG88 (SIXEL_FORMATTYPE_GRAYSCALE | 0x13) /* 16bpp gray+alpha */ #define SIXEL_PIXELFORMAT_GA88 (SIXEL_FORMATTYPE_GRAYSCALE | 0x23) /* 16bpp gray+alpha */ @@ -223,11 +225,9 @@ enum pixelFormat { PIXELFORMAT_BGR888 = FORMATTYPE_COLOR | 0x06, /* 24bpp */ PIXELFORMAT_ARGB8888 = FORMATTYPE_COLOR | 0x10, /* 32bpp */ PIXELFORMAT_RGBA8888 = FORMATTYPE_COLOR | 0x11, /* 32bpp */ -#if 0 PIXELFORMAT_G1 = FORMATTYPE_GRAYSCALE | 0x00, /* 1bpp grayscale */ PIXELFORMAT_G2 = FORMATTYPE_GRAYSCALE | 0x01, /* 2bpp grayscale */ PIXELFORMAT_G4 = FORMATTYPE_GRAYSCALE | 0x02, /* 4bpp grayscale */ -#endif PIXELFORMAT_G8 = FORMATTYPE_GRAYSCALE | 0x03, /* 8bpp grayscale */ PIXELFORMAT_AG88 = FORMATTYPE_GRAYSCALE | 0x13, /* 16bpp gray+alpha */ PIXELFORMAT_GA88 = FORMATTYPE_GRAYSCALE | 0x23, /* 16bpp gray+alpha */ diff --git a/src/dither.c b/src/dither.c index ebc5764a..88983446 100644 --- a/src/dither.c +++ b/src/dither.c @@ -43,10 +43,97 @@ static const unsigned char pal_mono_dark[] = { 0x00, 0x00, 0x00, 0xff, 0xff, 0xff }; + static const unsigned char pal_mono_light[] = { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }; +static const unsigned char pal_gray_1bit[] = { + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff +}; + + +static const unsigned char pal_gray_2bit[] = { + 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff +}; + + +static const unsigned char pal_gray_4bit[] = { + 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, + 0x44, 0x44, 0x44, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, + 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, + 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff +}; + + +static const unsigned char pal_gray_8bit[] = { + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, + 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, + 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, + 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, + 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, + 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, + 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, + 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, + 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, + 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, + 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, + 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, + 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, + 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, + 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, + 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, + 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, + 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, + 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, + 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, + 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, + 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, + 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, + 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, + 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, + 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, + 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, + 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, + 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, + 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, + 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, + 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x93, 0x93, 0x93, + 0x94, 0x94, 0x94, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, + 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, + 0x9c, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, 0x9f, + 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, + 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, + 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, + 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbb, + 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, + 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, + 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, + 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xcb, 0xcb, 0xcb, + 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xcf, 0xcf, 0xcf, + 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, + 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, + 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xd9, 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, + 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, + 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, + 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, + 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, + 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, + 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, + 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, + 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, + 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff +}; + + static const unsigned char pal_xterm256[] = { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, @@ -278,6 +365,26 @@ sixel_dither_get(int builtin_dither) palette = (unsigned char *)pal_vt340_color; keycolor = (-1); break; + case SIXEL_BUILTIN_G1: + ncolors = 2; + palette = (unsigned char *)pal_gray_1bit; + keycolor = (-1); + break; + case SIXEL_BUILTIN_G2: + ncolors = 4; + palette = (unsigned char *)pal_gray_2bit; + keycolor = (-1); + break; + case SIXEL_BUILTIN_G4: + ncolors = 16; + palette = (unsigned char *)pal_gray_4bit; + keycolor = (-1); + break; + case SIXEL_BUILTIN_G8: + ncolors = 256; + palette = (unsigned char *)pal_gray_8bit; + keycolor = (-1); + break; default: return NULL; } diff --git a/src/encoder.c b/src/encoder.c index 0a85ce05..c095255f 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -289,6 +289,22 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) sixel_frame_get_palette(frame)); ret = 0; break; + case SIXEL_PIXELFORMAT_G1: + callback_context->dither = sixel_dither_get(SIXEL_BUILTIN_G1); + ret = 0; + break; + case SIXEL_PIXELFORMAT_G2: + callback_context->dither = sixel_dither_get(SIXEL_BUILTIN_G2); + ret = 0; + break; + case SIXEL_PIXELFORMAT_G4: + callback_context->dither = sixel_dither_get(SIXEL_BUILTIN_G4); + ret = 0; + break; + case SIXEL_PIXELFORMAT_G8: + callback_context->dither = sixel_dither_get(SIXEL_BUILTIN_G8); + ret = 0; + break; default: callback_context->dither = sixel_dither_create(callback_context->reqcolors); if (callback_context->dither == NULL) { @@ -392,9 +408,23 @@ prepare_palette(sixel_dither_t *former_dither, if (sixel_frame_get_transparent(frame) != (-1)) { sixel_dither_set_transparent(dither, sixel_frame_get_transparent(frame)); } - } else if (sixel_frame_get_pixelformat(frame) == SIXEL_PIXELFORMAT_G8) { - dither = sixel_dither_create(-1); - sixel_dither_set_pixelformat(dither, sixel_frame_get_pixelformat(frame)); + } else if (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_PALETTE) { + switch (sixel_frame_get_pixelformat(frame)) { + case SIXEL_PIXELFORMAT_G1: + dither = sixel_dither_get(SIXEL_BUILTIN_G1); + break; + case SIXEL_PIXELFORMAT_G2: + dither = sixel_dither_get(SIXEL_BUILTIN_G2); + break; + case SIXEL_PIXELFORMAT_G4: + dither = sixel_dither_get(SIXEL_BUILTIN_G4); + break; + case SIXEL_PIXELFORMAT_G8: + dither = sixel_dither_get(SIXEL_BUILTIN_G8); + break; + default: + return NULL; + } } else { if (former_dither) { sixel_dither_unref(former_dither); From 19325fcaf0572d49a3b088768562b2f8745180e5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 13:20:25 +0900 Subject: [PATCH 318/451] Add new -b option values: gray1/2/4/8 --- README.md | 6 ++++++ converters/Makefile.am | 6 +++++- converters/Makefile.in | 6 +++++- converters/img2sixel.c | 4 ++++ converters/shell-completion/bash/img2sixel | 6 +++++- converters/shell-completion/zsh/_img2sixel | 6 +++++- src/encoder.c | 8 ++++++++ 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 71da9c81..161d7dd3 100644 --- a/README.md +++ b/README.md @@ -296,6 +296,8 @@ Usage: img2sixel [Options] imagefiles img2sixel [Options] < imagefile Options: +-o, --outfile specify output file name. + (default:stdout) -7, --7bit-mode generate a sixel image for 7bit terminals or printers (default) -8, --8bit-mode generate a sixel image for 8bit @@ -441,6 +443,10 @@ Options: xterm256 -> X default 256 color map vt340mono -> VT340 monochrome map vt340color -> VT340 color map + gray1 -> 1bit grayscale map + gray2 -> 2bit grayscale map + gray4 -> 4bit grayscale map + gray8 -> 8bit grayscale map -E ENCODEPOLICY, --encode-policy=ENCODEPOLICY select encoding policy auto -> choose encoding policy diff --git a/converters/Makefile.am b/converters/Makefile.am index a9b78cda..b734e3c8 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -79,7 +79,7 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -H $(WINE) ./img2sixel -V $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel - $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel + $(WINE) ./img2sixel -w50% -h150% -dfs -thls -shistogram < ../images/snake.jpg | tee snake2.sixel $(WINE) ./img2sixel -w2100 -h2100 -djajuni -bxterm256 -o snake3.sixel < ../images/snake.jpg $(WINE) ./img2sixel -w105% -h100 -B\#000000000 -rnearest < ../images/snake.gif $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga @@ -92,6 +92,10 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -I -dstucki -thls -B\#a0B030 ../images/snake.ppm $(WINE) ./img2sixel -bvt340color ../images/snake.ppm $(WINE) ./img2sixel -bvt340mono ../images/snake.tga + $(WINE) ./img2sixel -bgray1 -w120 ../images/snake.tga + $(WINE) ./img2sixel -bgray2 -w120 ../images/snake.tga + $(WINE) ./img2sixel -bgray4 -w120 ../images/snake.tga + $(WINE) ./img2sixel -bgray8 -w120 ../images/snake.tga $(WINE) ./img2sixel -I -8 -dburkes -B\#ffffffffffff ../images/snake-ascii.ppm $(WINE) ./img2sixel -I -C10 -djajuni ../images/snake.png $(WINE) ./img2sixel -I -Eauto ../images/snake-ascii.pgm diff --git a/converters/Makefile.in b/converters/Makefile.in index 2322619e..e09f7e3f 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1045,7 +1045,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -H @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -V @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -thls < ../images/snake.jpg -shistogram | tee snake2.sixel +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -thls -shistogram < ../images/snake.jpg | tee snake2.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -djajuni -bxterm256 -o snake3.sixel < ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -B\#000000000 -rnearest < ../images/snake.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga @@ -1058,6 +1058,10 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -dstucki -thls -B\#a0B030 ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340color ../images/snake.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bvt340mono ../images/snake.tga +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bgray1 -w120 ../images/snake.tga +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bgray2 -w120 ../images/snake.tga +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bgray4 -w120 ../images/snake.tga +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -bgray8 -w120 ../images/snake.tga @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -8 -dburkes -B\#ffffffffffff ../images/snake-ascii.ppm @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -C10 -djajuni ../images/snake.png @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -I -Eauto ../images/snake-ascii.pgm diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 5842af8d..6d2cfd4e 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -235,6 +235,10 @@ void show_help(void) " xterm256 -> X default 256 color map\n" " vt340mono -> VT340 monochrome map\n" " vt340color -> VT340 color map\n" + " gray1 -> 1bit grayscale map\n" + " gray2 -> 2bit grayscale map\n" + " gray4 -> 4bit grayscale map\n" + " gray8 -> 8bit grayscale map\n" "-E ENCODEPOLICY, --encode-policy=ENCODEPOLICY\n" " select encoding policy\n" " auto -> choose encoding policy\n" diff --git a/converters/shell-completion/bash/img2sixel b/converters/shell-completion/bash/img2sixel index 25606c98..ea758fda 100644 --- a/converters/shell-completion/bash/img2sixel +++ b/converters/shell-completion/bash/img2sixel @@ -95,7 +95,11 @@ _img2sixel() COMPREPLY=( $( compgen -W 'xterm16 \ xterm256 \ vt340mono \ - vt340color' -- "$cur" ) ) + vt340color \ + gray1 \ + gray2 \ + gray4 \ + gray8 ' -- "$cur" ) ) return 0 ;; -E|--encode-policy) diff --git a/converters/shell-completion/zsh/_img2sixel b/converters/shell-completion/zsh/_img2sixel index 00d710f9..bcafe807 100644 --- a/converters/shell-completion/zsh/_img2sixel +++ b/converters/shell-completion/zsh/_img2sixel @@ -87,7 +87,11 @@ _builtinpalette() { 'xterm16[X default 16 color map]' \ 'xterm256[X default 256 color map]' \ 'vt340mono[VT340 monochrome map]' \ - 'vt340color[VT340 color map]' + 'vt340color[VT340 color map]' \ + 'gray1[1bit grayscale map]' \ + 'gray2[2bit grayscale map]' \ + 'gray4[4bit grayscale map]' \ + 'gray8[8bit grayscale map]' } _encodepolicy() { diff --git a/src/encoder.c b/src/encoder.c index c095255f..17401660 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1081,6 +1081,14 @@ sixel_encoder_setopt( encoder->builtin_palette = SIXEL_BUILTIN_VT340_MONO; } else if (strcmp(optarg, "vt340color") == 0) { encoder->builtin_palette = SIXEL_BUILTIN_VT340_COLOR; + } else if (strcmp(optarg, "gray1") == 0) { + encoder->builtin_palette = SIXEL_BUILTIN_G1; + } else if (strcmp(optarg, "gray2") == 0) { + encoder->builtin_palette = SIXEL_BUILTIN_G2; + } else if (strcmp(optarg, "gray4") == 0) { + encoder->builtin_palette = SIXEL_BUILTIN_G4; + } else if (strcmp(optarg, "gray8") == 0) { + encoder->builtin_palette = SIXEL_BUILTIN_G8; } else { fprintf(stderr, "Cannot parse builtin palette option.\n"); From ab30850a00adaee77a375e4db108fb894abc5f1b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 13:54:21 +0900 Subject: [PATCH 319/451] Fix compile errors caused by missing symbol --- src/loader.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/loader.c b/src/loader.c index 363a0d4f..074a903f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1141,7 +1141,7 @@ load_with_gdkpixbuf( } ret = fn_load(frame, context); - if (ret != SIXEL_SUCCESS) { + if (ret != SIXEL_OK) { goto end; } } else { @@ -1187,7 +1187,7 @@ load_with_gdkpixbuf( frame->multiframe = 1; gdk_pixbuf_animation_iter_advance(it, &time); ret = fn_load(frame, context); - if (ret != SIXEL_SUCCESS) { + if (ret != SIXEL_OK) { goto end; } frame->frame_no++; @@ -1205,7 +1205,7 @@ load_with_gdkpixbuf( } } - ret = SIXEL_SUCCESS; + ret = SIXEL_OK; end: gdk_pixbuf_loader_close(loader, NULL); From 89e5c96e4dd961045f016e85d789a58ed5add766 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 14:14:57 +0900 Subject: [PATCH 320/451] Do semantic error handling (on progress) --- src/encoder.c | 8 ++-- src/loader.c | 119 ++++++++++++++++++++++++++------------------------ 2 files changed, 67 insertions(+), 60 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index b74fddeb..630c3f7e 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -374,7 +374,7 @@ prepare_specified_palette( finsecure, cancel_flag, &callback_context); - if (SIXEL_FAILED(status)) { + if (status != SIXEL_OK) { return status; } @@ -415,7 +415,7 @@ prepare_palette(sixel_dither_t **dither, encoder->bgcolor, encoder->finsecure, encoder->cancel_flag); - if (SIXEL_FAILED(status)) { + if (status != SIXEL_OK) { return status; } } @@ -845,7 +845,7 @@ load_image_callback(sixel_frame_t *frame, void *data) /* prepare dither context */ status = prepare_palette(&dither, encoder->dither_cache, frame, encoder); - if (SIXEL_FAILED(status)) { + if (status != SIXEL_OK) { goto end; } @@ -1504,7 +1504,7 @@ sixel_encoder_encode( encoder->finsecure, encoder->cancel_flag, (void *)encoder); - if (status != 0) { + if (status != SIXEL_OK) { goto end; } diff --git a/src/loader.c b/src/loader.c index 074a903f..2f7be811 100644 --- a/src/loader.c +++ b/src/loader.c @@ -219,16 +219,17 @@ open_binary_file(char const *filename) } -static int +static SIXELSTATUS get_chunk_from_file( char const *filename, chunk_t *pchunk, int const *cancel_flag ) { + SIXELSTATUS status = SIXEL_FALSE; + int ret; FILE *f; int n; - int ret; f = open_binary_file(filename); if (!f) { @@ -263,11 +264,11 @@ get_chunk_from_file( if (isatty(fileno(f))) { for (;;) { if (*cancel_flag) { - return (-1); + return SIXEL_INTERRUPTED; } ret = wait_file(fileno(f), 10000); if (ret < 0) { - return ret; + return SIXEL_RUNTIME_ERROR; } if (ret == 0) { break; @@ -284,16 +285,21 @@ get_chunk_from_file( if (f != stdin) { fclose(f); } - return 0; + + status = SIXEL_OK; + + return status; } -static int +static SIXELSTATUS get_chunk_from_url( char const *url, chunk_t *pchunk, int finsecure) { + SIXELSTATUS status = SIXEL_FALSE; + # ifdef HAVE_LIBCURL CURL *curl; CURLcode code; @@ -305,7 +311,7 @@ get_chunk_from_url( "reason: %s.\n", url, strerror(errno)); # endif /* HAVE_ERRNO_H */ - return (-1); + goto end; } curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); @@ -321,10 +327,11 @@ get_chunk_from_url( fprintf(stderr, "curl_easy_perform('%s') failed.\n" "code: %d.\n", url, code); curl_easy_cleanup(curl); - return (-1); + goto end; } curl_easy_cleanup(curl); - return 0; + + status = SIXEL_OK; # else (void) url; (void) pchunk; @@ -332,8 +339,10 @@ get_chunk_from_url( fprintf(stderr, "To specify URI schemes, you have to " "configure this program with --with-libcurl " "option at compile time.\n"); - return (-1); # endif /* HAVE_LIBCURL */ + +end: + return status; } @@ -793,7 +802,7 @@ load_sixel(unsigned char *buffer, } -static int +static SIXELSTATUS get_chunk( char const *filename, chunk_t *pchunk, @@ -801,7 +810,7 @@ get_chunk( int const *cancel_flag ) { - if (filename != NULL && strstr(filename, "://")) { + if (filename == NULL && strstr(filename, "://")) { return get_chunk_from_url(filename, pchunk, finsecure); } @@ -1066,7 +1075,7 @@ load_with_builtin( #ifdef HAVE_GDK_PIXBUF2 -static int +static SIXELSTATUS load_with_gdkpixbuf( chunk_t const /* in */ *pchunk, /* image data */ int /* in */ fstatic, /* static */ @@ -1087,7 +1096,7 @@ load_with_gdkpixbuf( #endif sixel_frame_t *frame; int stride; - int ret = SIXEL_FALSE; + int status = SIXEL_FALSE; unsigned char *p; int i; int depth; @@ -1140,8 +1149,8 @@ load_with_gdkpixbuf( } } - ret = fn_load(frame, context); - if (ret != SIXEL_OK) { + status = fn_load(frame, context); + if (status != SIXEL_OK) { goto end; } } else { @@ -1186,8 +1195,8 @@ load_with_gdkpixbuf( } frame->multiframe = 1; gdk_pixbuf_animation_iter_advance(it, &time); - ret = fn_load(frame, context); - if (ret != SIXEL_OK) { + status = fn_load(frame, context); + if (status != SIXEL_OK) { goto end; } frame->frame_no++; @@ -1205,7 +1214,7 @@ load_with_gdkpixbuf( } } - ret = SIXEL_OK; + status = SIXEL_OK; end: gdk_pixbuf_loader_close(loader, NULL); @@ -1214,7 +1223,7 @@ load_with_gdkpixbuf( free(frame->palette); free(frame); - return ret; + return status; } #endif /* HAVE_GDK_PIXBUF2 */ @@ -1419,12 +1428,12 @@ sixel_helper_load_image_file( void /* in/out */ *context /* private data */ ) { - int ret = (-1); + SIXELSTATUS status = SIXEL_FALSE; chunk_t chunk; - ret = get_chunk(filename, &chunk, finsecure, cancel_flag); - if (ret != 0) { - return ret; + status = get_chunk(filename, &chunk, finsecure, cancel_flag); + if (status != SIXEL_OK) { + return status; } /* if input date is empty or 1 byte LF, ignore it and return successfully */ @@ -1432,51 +1441,49 @@ sixel_helper_load_image_file( return 0; } - ret = (-1); + status = SIXEL_FALSE; #ifdef HAVE_GDK_PIXBUF2 - if (ret != 0) { - ret = load_with_gdkpixbuf(&chunk, - fstatic, - fuse_palette, - reqcolors, - bgcolor, - loop_control, - fn_load, - context); + if (SIXEL_FAILED(status)) { + status = load_with_gdkpixbuf(&chunk, + fstatic, + fuse_palette, + reqcolors, + bgcolor, + loop_control, + fn_load, + context); } #endif /* HAVE_GDK_PIXBUF2 */ #if HAVE_GD - if (!ret != 0) { - ret = load_with_gd(&chunk, - fstatic, - fuse_palette, - reqcolors, - bgcolor, - loop_control, - fn_load, - context); + if (SIXEL_FAILED(status)) { + status = load_with_gd(&chunk, + fstatic, + fuse_palette, + reqcolors, + bgcolor, + loop_control, + fn_load, + context); } #endif /* HAVE_GD */ - if (ret != 0) { - ret = load_with_builtin(&chunk, - fstatic, - fuse_palette, - reqcolors, - bgcolor, - loop_control, - fn_load, - context); + if (SIXEL_FAILED(status)) { + status = load_with_builtin(&chunk, + fstatic, + fuse_palette, + reqcolors, + bgcolor, + loop_control, + fn_load, + context); } free(chunk.buffer); - if (ret != 0) { + if (SIXEL_FAILED(status)) { goto end; } - ret = 0; - end: - return ret; + return status; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ From 33301c8821a37bd286f85d52141dcddaf1543be0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 15:27:48 +0900 Subject: [PATCH 321/451] Handle curl errors --- include/sixel.h.in | 8 +++++++ src/loader.c | 53 ++++++++++++++++++++++++++++++---------------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 75eeaec5..4df79b3e 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -41,12 +41,20 @@ typedef int SIXELSTATUS; #define SIXEL_OK 0x0000 /* succeeded */ #define SIXEL_FALSE 0x1000 /* failed */ + #define SIXEL_RUNTIME_ERROR (SIXEL_FALSE | 0x0100) /* runtime error */ #define SIXEL_LOGIC_ERROR (SIXEL_FALSE | 0x0200) /* logic error */ +#define SIXEL_FEATURE_ERROR (SIXEL_FALSE | 0x0300) /* feature not enabled */ +#define SIXEL_LIBC_ERROR (SIXEL_FALSE | 0x0400) /* errors caused by curl */ +#define SIXEL_CURL_ERROR (SIXEL_FALSE | 0x0500) /* errors occures in libc functions */ + #define SIXEL_INTERRUPTED (SIXEL_OK | 0x0001) /* interrupted by a signal */ + #define SIXEL_BAD_ALLOCATION (SIXEL_RUNTIME_ERROR | 0x0001) /* malloc() failed */ #define SIXEL_BAD_ARGUMENT (SIXEL_RUNTIME_ERROR | 0x0002) /* bad argument detected */ +#define SIXEL_NOT_IMPLEMENTED (SIXEL_FEATURE_ERROR | 0x0001) /* bad argument detected */ + #define SIXEL_SUCCEEDED(status) (((status) & 0x1000) == 0) #define SIXEL_FAILED(status) (((status) & 0x1000) != 0) diff --git a/src/loader.c b/src/loader.c index 2f7be811..2f31a71f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -173,10 +173,10 @@ wait_file(int fd, int usec) } -static FILE * -open_binary_file(char const *filename) +static SIXELSTATUS +open_binary_file(FILE **f, char const *filename) { - FILE *f; + SIXELSTATUS status = SIXEL_FALSE; #if HAVE_STAT struct stat sb; #endif /* HAVE_STAT */ @@ -190,32 +190,41 @@ open_binary_file(char const *filename) setmode(fileno(stdin), O_BINARY); # endif /* HAVE_SETMODE */ #endif /* defined(O_BINARY) */ - return stdin; + *f = stdin; + + status = SIXEL_OK; + goto end; } #if HAVE_STAT if (stat(filename, &sb) != 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); # if HAVE_ERRNO_H fprintf(stderr, "stat(%s) failed.\n" "reason: %s.\n", filename, strerror(errno)); # endif /* HAVE_ERRNO_H */ - return NULL; + goto end; } if ((sb.st_mode & S_IFMT) == S_IFDIR) { fprintf(stderr, "'%s' is directory.\n", filename); - return NULL; + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + goto end; } #endif /* HAVE_STAT */ - f = fopen(filename, "rb"); - if (!f) { + *f = fopen(filename, "rb"); + if (!*f) { #if HAVE_ERRNO_H fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", filename, strerror(errno)); #endif /* HAVE_ERRNO_H */ - return NULL; + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + goto end; } - return f; + + status = SIXEL_OK; +end: + return status; } @@ -231,9 +240,9 @@ get_chunk_from_file( FILE *f; int n; - f = open_binary_file(filename); - if (!f) { - return (-1); + status = open_binary_file(&f, filename); + if (SIXEL_FAILED(status)) { + goto end; } chunk_init(pchunk, 64 * 1024); @@ -243,7 +252,8 @@ get_chunk_from_file( "reason: %s.\n", filename, strerror(errno)); #endif /* HAVE_ERRNO_H */ - return (-1); + status = SIXEL_BAD_ALLOCATION; + goto end; } for (;;) { @@ -257,18 +267,21 @@ get_chunk_from_file( "reason: %s.\n", filename, strerror(errno)); #endif /* HAVE_ERRNO_H */ - return (-1); + status = SIXEL_BAD_ALLOCATION; + goto end; } } if (isatty(fileno(f))) { for (;;) { if (*cancel_flag) { - return SIXEL_INTERRUPTED; + status = SIXEL_INTERRUPTED; + goto end; } ret = wait_file(fileno(f), 10000); if (ret < 0) { - return SIXEL_RUNTIME_ERROR; + status = SIXEL_RUNTIME_ERROR; + goto end; } if (ret == 0) { break; @@ -288,6 +301,7 @@ get_chunk_from_file( status = SIXEL_OK; +end: return status; } @@ -311,6 +325,7 @@ get_chunk_from_url( "reason: %s.\n", url, strerror(errno)); # endif /* HAVE_ERRNO_H */ + status = SIXEL_BAD_ALLOCATION; goto end; } curl = curl_easy_init(); @@ -327,6 +342,7 @@ get_chunk_from_url( fprintf(stderr, "curl_easy_perform('%s') failed.\n" "code: %d.\n", url, code); curl_easy_cleanup(curl); + status = SIXEL_CURL_ERROR & (code & 0xff); goto end; } curl_easy_cleanup(curl); @@ -339,6 +355,7 @@ get_chunk_from_url( fprintf(stderr, "To specify URI schemes, you have to " "configure this program with --with-libcurl " "option at compile time.\n"); + status = SIXEL_NOT_IMPLEMENTED; # endif /* HAVE_LIBCURL */ end: @@ -810,7 +827,7 @@ get_chunk( int const *cancel_flag ) { - if (filename == NULL && strstr(filename, "://")) { + if (filename != NULL && strstr(filename, "://")) { return get_chunk_from_url(filename, pchunk, finsecure); } From 89e8f4b7b25014922485ce58636e4a47faa2c4c1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 15:37:54 +0900 Subject: [PATCH 322/451] Do semantic error handling (on progress) --- src/encoder.c | 106 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 70 insertions(+), 36 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 630c3f7e..81dfe3c6 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1044,23 +1044,27 @@ sixel_encoder_unref(sixel_encoder_t *encoder) } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encoder_set_cancel_flag( sixel_encoder_t /* in */ *encoder, int /* in */ *cancel_flag ) { + SIXELSTATUS status = SIXEL_OK; + encoder->cancel_flag = cancel_flag; - return 0; + + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, char const /* in */ *optarg) { + SIXELSTATUS status = SIXEL_FALSE; int number; int parsed; char unit[32]; @@ -1069,7 +1073,8 @@ sixel_encoder_setopt( case 'o': if (*optarg == '\0') { fprintf(stderr, "Invalid file name.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (strcmp(optarg, "-") != 0) { if (encoder->outfd && encoder->outfd != STDOUT_FILENO) { @@ -1121,7 +1126,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse builtin palette option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'd': @@ -1144,7 +1150,8 @@ sixel_encoder_setopt( fprintf(stderr, "Diffusion method '%s' is not supported.\n", optarg); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'f': @@ -1160,7 +1167,8 @@ sixel_encoder_setopt( fprintf(stderr, "Finding method '%s' is not supported.\n", optarg); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } } break; @@ -1179,7 +1187,8 @@ sixel_encoder_setopt( fprintf(stderr, "Finding method '%s' is not supported.\n", optarg); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'c': @@ -1187,13 +1196,16 @@ sixel_encoder_setopt( &encoder->clipwidth, &encoder->clipheight, &encoder->clipx, &encoder->clipy); if (number != 4) { - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->clipwidth <= 0 || encoder->clipheight <= 0) { - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->clipx < 0 || encoder->clipy < 0) { - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } encoder->clipfirst = 0; break; @@ -1211,7 +1223,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse -w/--width option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->clipwidth) { encoder->clipfirst = 1; @@ -1231,7 +1244,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse -h/--height option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->clipheight) { encoder->clipfirst = 1; @@ -1263,7 +1277,8 @@ sixel_encoder_setopt( fprintf(stderr, "Resampling method '%s' is not supported.\n", optarg); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'q': @@ -1279,7 +1294,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse quality option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'l': @@ -1293,7 +1309,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse loop-control option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 't': @@ -1307,7 +1324,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse palette type option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'B': @@ -1318,7 +1336,8 @@ sixel_encoder_setopt( if (parse_x_colorspec(optarg, &encoder->bgcolor) != 0) { fprintf(stderr, "Cannot parse bgcolor option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'k': @@ -1333,7 +1352,8 @@ sixel_encoder_setopt( case 'n': encoder->macro_number = atoi(optarg); if (encoder->macro_number < 0) { - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'g': @@ -1358,7 +1378,8 @@ sixel_encoder_setopt( } else { fprintf(stderr, "Cannot parse encode policy option.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'C': @@ -1366,7 +1387,8 @@ sixel_encoder_setopt( if (encoder->complexion < 1) { fprintf(stderr, "complexion parameter must be 1 or more.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } break; case 'D': @@ -1377,70 +1399,82 @@ sixel_encoder_setopt( /* exit if unknown options are specified */ fprintf(stderr, "Unknwon option '-%c' is specified.\n", arg); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } /* detects arguments conflictions */ if (encoder->reqcolors != -1 && encoder->mapfile) { fprintf(stderr, "option -p, --colors conflicts " "with -m, --mapfile.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->mapfile && encoder->monochrome) { fprintf(stderr, "option -m, --mapfile conflicts " "with -e, --monochrome.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->monochrome && encoder->reqcolors != (-1)) { fprintf(stderr, "option -e, --monochrome conflicts" " with -p, --colors.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->monochrome && encoder->highcolor) { fprintf(stderr, "option -e, --monochrome conflicts" " with -I, --high-color.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->reqcolors != (-1) && encoder->highcolor) { fprintf(stderr, "option -p, --colors conflicts" " with -I, --high-color.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->mapfile && encoder->highcolor) { fprintf(stderr, "option -m, --mapfile conflicts" " with -I, --high-color.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->builtin_palette && encoder->highcolor) { fprintf(stderr, "option -b, --builtin-palette conflicts" " with -I, --high-color.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->monochrome && encoder->builtin_palette) { fprintf(stderr, "option -e, --monochrome conflicts" " with -b, --builtin-palette.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->mapfile && encoder->builtin_palette) { fprintf(stderr, "option -m, --mapfile conflicts" " with -b, --builtin-palette.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->reqcolors != (-1) && encoder->builtin_palette) { fprintf(stderr, "option -p, --colors conflicts" " with -b, --builtin-palette.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } if (encoder->f8bit && encoder->penetrate_multiplexer) { fprintf(stderr, "option -8 --8bit-mode conflicts" " with -P, --penetrate.\n"); - goto argerr; + status = SIXEL_BAD_ARGUMENT; + goto end; } - return (0); + status = SIXEL_OK; -argerr: - return (-1); +end: + return status; } From 1365bcd62503374aad37e899cd94969248c32895 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 22:13:25 +0900 Subject: [PATCH 323/451] Suppress unused-label GCC warning --- src/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/loader.c b/src/loader.c index 2f31a71f..5b820427 100644 --- a/src/loader.c +++ b/src/loader.c @@ -356,6 +356,7 @@ get_chunk_from_url( "configure this program with --with-libcurl " "option at compile time.\n"); status = SIXEL_NOT_IMPLEMENTED; + goto end; # endif /* HAVE_LIBCURL */ end: From ea0a65cc2bce22aa57d6fd3d6799d2267e3af423 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 22:22:44 +0900 Subject: [PATCH 324/451] Do semantic error handling (on progress) --- converters/img2sixel.c | 32 ++++++++++++++------------------ converters/sixel2png.c | 30 +++++++++++++++++------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 6d2cfd4e..07cc2535 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -283,13 +283,12 @@ signal_handler(int sig) int main(int argc, char *argv[]) { + SIXELSTATUS status = SIXEL_FALSE; int n; #if HAVE_GETOPT_LONG int long_opt; int option_index; #endif /* HAVE_GETOPT_LONG */ - int ret; - int exit_code; sixel_encoder_t *encoder; char const *optstring = "o:78p:m:eb:Id:f:s:c:w:h:r:q:kil:t:ugvSn:PE:B:C:DVH"; @@ -352,15 +351,16 @@ main(int argc, char *argv[]) switch (n) { case 'V': show_version(); - exit_code = EXIT_SUCCESS; + status = SIXEL_OK; goto end; case 'H': show_help(); - exit_code = EXIT_SUCCESS; + status = SIXEL_OK; + goto end; goto end; default: - ret = sixel_encoder_setopt(encoder, n, optarg); - if (ret != 0) { + status = sixel_encoder_setopt(encoder, n, optarg); + if (SIXEL_FAILED(status)) { goto argerr; } break; @@ -381,34 +381,30 @@ main(int argc, char *argv[]) #else (void) signal_handler; #endif - ret = sixel_encoder_set_cancel_flag(encoder, &signaled); - if (ret != 0) { - exit_code = EXIT_FAILURE; + status = sixel_encoder_set_cancel_flag(encoder, &signaled); + if (SIXEL_FAILED(status)) { goto end; } if (optind == argc) { - ret = sixel_encoder_encode(encoder, NULL); - if (ret != 0) { - exit_code = EXIT_FAILURE; + status = sixel_encoder_encode(encoder, NULL); + if (SIXEL_FAILED(status)) { goto end; } } else { for (n = optind; n < argc; n++) { - ret = sixel_encoder_encode(encoder, argv[n]); - if (ret != 0) { - exit_code = EXIT_FAILURE; + status = sixel_encoder_encode(encoder, argv[n]); + if (SIXEL_FAILED(status)) { goto end; } } } /* mark as success */ - exit_code = EXIT_SUCCESS; + status = SIXEL_OK; goto end; argerr: - exit_code = EXIT_FAILURE; fprintf(stderr, "usage: img2sixel [-78eIkiugvSPDVH] [-p colors] [-m file] [-d diffusiontype]\n" " [-f findtype] [-s selecttype] [-c geometory] [-w width]\n" @@ -419,7 +415,7 @@ main(int argc, char *argv[]) end: sixel_encoder_unref(encoder); - return exit_code; + return status; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/converters/sixel2png.c b/converters/sixel2png.c index a210c2b6..7d7b5561 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -102,13 +102,13 @@ show_help(void) int main(int argc, char *argv[]) { + SIXELSTATUS status = SIXEL_FALSE; int n; sixel_decoder_t *decoder; #if HAVE_GETOPT_LONG int long_opt; int option_index; #endif /* HAVE_GETOPT_LONG */ - int nret = 0; char const *optstring = "i:o:VH"; #if HAVE_GETOPT_LONG @@ -122,7 +122,7 @@ main(int argc, char *argv[]) decoder = sixel_decoder_create(); if (decoder == NULL) { - nret = (-1); + status = SIXEL_BAD_ALLOCATION; goto end; } @@ -135,8 +135,8 @@ main(int argc, char *argv[]) n = getopt(argc, argv, optstring); #endif /* HAVE_GETOPT_LONG */ - if (n == -1) { - nret = (-1); + if (n == (-1)) { + /* parsed successfully */ break; } #if HAVE_GETOPT_LONG @@ -148,13 +148,15 @@ main(int argc, char *argv[]) switch (n) { case 'V': show_version(); + status = SIXEL_OK; goto end; case 'H': show_help(); + status = SIXEL_OK; goto end; default: - nret = sixel_decoder_setopt(decoder, n, optarg); - if (nret != 0) { + status = sixel_decoder_setopt(decoder, n, optarg); + if (SIXEL_FAILED(status)) { goto argerr; } } @@ -166,23 +168,25 @@ main(int argc, char *argv[]) } if (optind < argc) { - nret = sixel_decoder_setopt(decoder, 'i', argv[optind++]); - if (nret != 0) { + status = sixel_decoder_setopt(decoder, 'i', argv[optind++]); + if (SIXEL_FAILED(status)) { goto argerr; } } + if (optind < argc) { - nret = sixel_decoder_setopt(decoder, 'o', argv[optind++]); - if (nret != 0) { + status = sixel_decoder_setopt(decoder, 'o', argv[optind++]); + if (SIXEL_FAILED(status)) { goto argerr; } } + if (optind != argc) { - nret = (-1); + status = SIXEL_BAD_ARGUMENT; goto argerr; } - nret = sixel_decoder_decode(decoder); + status = sixel_decoder_decode(decoder); goto end; argerr: @@ -190,7 +194,7 @@ main(int argc, char *argv[]) end: sixel_decoder_unref(decoder); - return nret; + return status; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ From c09509137dc08fcef16b17ca7432818571b6fb82 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 22:49:57 +0900 Subject: [PATCH 325/451] Handle some ignored allocation errors --- src/decoder.c | 61 ++++++++++++++++++++++++++++++++++++--------------- src/encoder.c | 12 ++++++++++ 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/decoder.c b/src/decoder.c index b75b9d4b..45a168fb 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -81,10 +81,15 @@ sixel_decoder_create(void) sixel_decoder_t *decoder; decoder = malloc(sizeof(sixel_decoder_t)); - - decoder->ref = 1; - decoder->output = arg_strdup("-"); - decoder->input = arg_strdup("-"); + if (decoder != NULL) { + decoder->ref = 1; + decoder->output = arg_strdup("-"); + decoder->input = arg_strdup("-"); + if (decoder->output == NULL || decoder->input == NULL) { + free(decoder); + return NULL; + } + } return decoder; } @@ -119,37 +124,53 @@ sixel_decoder_unref(sixel_decoder_t *decoder) } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_decoder_setopt( sixel_decoder_t /* in */ *decoder, int /* in */ arg, char const /* in */ *optarg ) { + SIXELSTATUS status = SIXEL_FALSE; + switch(arg) { case 'i': free(decoder->input); decoder->input = arg_strdup(optarg); + if (decoder->input == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } break; case 'o': free(decoder->output); decoder->output = arg_strdup(optarg); + if (decoder->input == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } break; case '?': default: - return (-1); + status = SIXEL_BAD_ARGUMENT; + goto end; } - return 0; + status = SIXEL_OK; + +end: + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_decoder_decode( sixel_decoder_t /* in */ *decoder) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *raw_data; - int sx, sy; + int sx; + int sy; int raw_len; int max; int n; @@ -158,7 +179,6 @@ sixel_decoder_decode( unsigned char *palette; int ncolors; unsigned char *pixels = NULL; - int ret = 0; if (strcmp(decoder->input, "-") == 0) { /* for windows */ @@ -213,22 +233,27 @@ sixel_decoder_decode( fclose(input_fp); } - ret = sixel_decode(raw_data, raw_len, &indexed_pixels, - &sx, &sy, &palette, &ncolors, malloc); + status = sixel_decode(raw_data, raw_len, &indexed_pixels, + &sx, &sy, &palette, &ncolors, malloc); - if (ret != 0) { + if (SIXEL_FAILED(status)) { fprintf(stderr, "sixel_decode failed.\n"); goto end; } - ret = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, - SIXEL_PIXELFORMAT_PAL8, - decoder->output, - SIXEL_FORMAT_PNG); + status = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, + SIXEL_PIXELFORMAT_PAL8, + decoder->output, + SIXEL_FORMAT_PNG); + + if (SIXEL_FAILED(status)) { + fprintf(stderr, "sixel_helper_write_image_file failed.\n"); + goto end; + } end: free(pixels); - return ret; + return status; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/encoder.c b/src/encoder.c index 81dfe3c6..b9a84d4a 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -104,6 +104,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[2] = pcolor->b; } else if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { p = buf = arg_strdup(s + 4); + if (buf == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } while (*p) { v = 0; for (endptr = p; endptr - p <= 12; ++endptr) { @@ -151,6 +155,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[2] = components[2]; } else if (*s == '#') { buf = arg_strdup(s + 1); + if (buf == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } for (p = endptr = buf; endptr - p <= 12; ++endptr) { if (*endptr >= '0' && *endptr <= '9') { *endptr -= '0'; @@ -1099,6 +1107,10 @@ sixel_encoder_setopt( free(encoder->mapfile); } encoder->mapfile = arg_strdup(optarg); + if (encoder->mapfile == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } break; case 'e': encoder->monochrome = 1; From 94218d0a9f28c44c4e1419c995af85e99e8f16c0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 14 Jun 2015 23:50:33 +0900 Subject: [PATCH 326/451] Add initial implementation of ruby interface --- ruby/README | 8 ++ ruby/images/egret.jpg | Bin 0 -> 18986 bytes ruby/images/egret.six | 7 ++ ruby/setup.rb | 6 ++ ruby/sixel.c | 173 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 194 insertions(+) create mode 100644 ruby/README create mode 100644 ruby/images/egret.jpg create mode 100644 ruby/images/egret.six create mode 100644 ruby/setup.rb create mode 100644 ruby/sixel.c diff --git a/ruby/README b/ruby/README new file mode 100644 index 00000000..93b02609 --- /dev/null +++ b/ruby/README @@ -0,0 +1,8 @@ +Build and Install +================= + +``` +$ ruby setup.rb +$ make install +``` + diff --git a/ruby/images/egret.jpg b/ruby/images/egret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb87c099057f832f99042efdab612676fdfa6704 GIT binary patch literal 18986 zcmb5VWmH?;6E_+PrIZ3K#l5AtYbf3p4M9q932wpNrHac#kYELhdvJFP5Zv9pw73Pk z{NH!obwA&8KAfDj&zhONXOCp|{2pc>RspY+-m$Q{(oN&?Eqpttj;I8*jS8!C&XCT#8?mA09pV5 z`%&2c$@~9aSWmDY<$Z?tI4b)J@Z<^B6C7;Z$NL#J4mJRQ^@JE3=k3$i{2$d#U2sVl zzsCN4CQw28?h~YAOmOXpOvcRh8~m8uJWEJJv(vq@>X8c7|7Gz1arhsVM;?zu{KQy~ z901t3Palc@-wz&#h;iQXKYdLi@KK$V(bVPlr`U?GV~?Z-Asr9%0D{Nw9%Uc~NCR$N zKICFMs-Mu(>7F=^l1fB1JR2Yj4~bP`Y0hOE!?k7ZWeI0y`_C#i+^!U;kOb?tnBM7NN`Ut zbHPu`{#Dw%eevhr1U_?TH0zdgqr%AyvsC>MmYL{Ys_am2>? zqRGMYQ^r)sRQ*%tk2VzPJNKuVvz=zePDj32qT-!eo9|DXLdC zsDmgB;_PzR60-)>xn)x|+2XToVnJ9bGFw8KTiC+H1u0BIU-SI4)Pb2>Pe?z?))40q zGQS;z5q+z&?UAqMz!t+7`tAA^|6M5>`F18#Q;R5Ki`wXel3b2ZxH=c1lryTffuSh=1eJ*zVB8OM0&%xTjRcY+}7LG|A<0=T2jiMrW#}XD8 zTt_hu@Pu>qB2*CX)E)n5-CcV!!FDe#=U#&&gc1V7y=%AwT#i zm4J#xsEJj-%~+QHEC*#1h3qJaY~^kuj(|RQ)~B~{bS!Uv(yK9U@-c3#H)8l$Pw*+R zUv)ph3d{UI)`q7cYe4`txyiGM}>AIoLcJ3_N8rS%Uw&4f#MS^nEmk@U=nw ze~-(PHU9dPomhoCLNTF25jSy*Q2`dKaz-}u`GE0@vRL@-hfgN6sj~&Lmy}7LY*g%l zZ%AZ?448j_WrZ!_@pznOTn-0NFz_AE&veSP(|~ zB}aJ6EKCuX6gvw?to-GZ;4fldgm9VozIrgY00=(L6aWIhlZ7~EX32l?G9bgig`P6T zzH9k1Mr!RBA6l%ObGiSC?%?U$x#!V+`KD$S0wHF&tlO`?wgDQM}z)T#SP6d-%GN&7^s zS#dxKE`iZIEc{+f=##GcZtrFlqD)LQcjuIO_yF2saOdu9- z^Xs){F|U&P*d(5sp5o>7s*Da$>V5%uGWD2z)&r8i>cHcSpU|I^gub4lup<0mC5ab`{UO;j0t z3r{-x$|2aY;)0N4a|qrvhBWqU7b7w;f` zg&y~J`$Cr45^a^M9~x$r2EUC~q5sXMva}Zy1Ie-NRl+;I@R{us;DF8T5sfb@Ed-JY zaQYqZa4~UyUy=#q`>>w3bcAA;BTe~Co?uCS;nLZDizOo)RZeqC7T(!TgZxZlLMZuy zE*VJM@wO&JYzHntsg?9Z$CBpMcdEB3@B?ZPWEE1e41SFduTg;z(J}X7<`-DpxnedzSg$rc@@z9$xk}HkBUc~u4 zG=!uK$9979G(iKUcQIvaD_?z|Ku11(y|fBCh5<*U zXKN0IVdnV4U@n(BrmC5~?Veuxz&vAi#nR0|+WI}%_-HSiVYKa~#c}rBZ3NSdm5g-J zIYV$@&pur%cJRvwfHjYDP)-c1-j(1%de&X%y1vc>pr&XWyv2n2>TOKTFhr0Tcv^b< zY@*dGbK`pb&suagm@2?f|L$e%2E%vyDVw;&XfYnx zM%Ql{LXZ4o7|2I$t2OrYj^DHHE|2W{+|}kas|R0_jE1p&026=0k0omTh9_kLcv5ac z@Rkqo#3y9Xd}y1tH+jL)1R|hp`_XeD$yT02j-A+ZNfHg=QyZ-BgO^Tl3zDLhIV~_` zR-oukq3zNTD{Z0n@m;Qn7f%jELz{5hi%l(zI?IKWRbo9BwV%#5gjM`+mn^2T+*o*HAj-$cO6%)oAnKmtc*Vw9K?gxvO^sV7IK;4QX?*l?df64` zt%u>Qd;olF76dV8%u5^A?RK-gtjuv^#B#c|pdqD}(snTAfuxdkI5FIbk z#OnB7W^GR}KCvBhfm0^XlbVMr9f`J1SVlAlYN6^zJMpD+vGk z-GTen(Ox-zp z`2AMw^bnIZ*T98U7V#X{e+M&@y&4ANvzv)oiQ|0f`GIYGWe))F=5RemALHtpMj8F& zwgJRwqe8)nmSgL;%jyd_hCZkT=I_|t6kqjq<#6RRGaBYS|31-RPtlGwiSC+}c6OO- zELhp8gq4h~Elx^2=AOony?1dZF1SmfAo2c2_HME@Vl7B!Z$n5w%~<=6I5|g6D{Mw# zEq&}B&(8Vd=7nFV`84u=IIm*3Ij1(r{FF%i-~m9ks%Ip{pE;5Pn*l1`@{U6pChxnp zW5THJmi^Vpy=8#x9M1h@O!vwg_Qbn;hPBbi^*qp>nd7XfpkL7HDAR2rNU9~ z?dmzJ36lE?VxJ1HOweGHKa{!UXJhM61Ir~>f7p)g))w8&ul|Pa*3C2Yd z8B(oXS6F`kfhh7zx~6oW)0q^De8Pl_Lo$o?W&Hi2bIafXuba&rpYlL&GI5bRBsNkH zlvx@dMZ%|C-^T_14R*K5aqE@qN!H$*os85B-^O1^BCX|z(EV^2r0vzFZMPfR<}nv} z3&c(97_>Iq#@6A*5~VtQkwi%QW7FEqshd;P)Qw8ik+y?c_d3$&D|nD+;n6+%gm2^h z&%S7T*q_?xKw`heDt&Mmn)P3xT;ABmU2wx6L-1XP3T;0|UD_V`#f3AR|Km|>#SiQ{ z>jUc|>?(HajSxVjPTa|Q7d=cT;>gI!{Ne#%67-B8Mk>5Kd(%9peYAFz0epYG3BMh= zC##FFDhAcbJJ=v~w$l4may8On(V$RJj222x1e(nZUp7GQF-CTZ*UU#|_ zdk^DvHr%;HH{HBhhd|$3o^rLp6pxv*$D65Efhdq^i?vO4_iTbd zC#~Lq2|eFm7_N1lj6w+4xdn#NOF<1&=G9{m+HPBuCvp;T*Lw4`%UzR@dZywg0UyIu z*eSUCD8HNcq*~!d{{8-@`d=_td|{>lrBBMmjdHqzVtw;S#eJw`&WVV>`7}(a{x%rQ1oC z093W~&*f=n`(&E6WZ`-5ma5%0@08;$gkHtK%YU&0X6D5? z`pluvv}*tKV3BQ}zDz zKt$sQBAffl5_q=Q(*`tk_z4?DzbfwRoU*H#IJEJ(QM$#X(frSdIBZ0});4!o8Fp^t z&Yxn(BKRfR7aYxeA{%~etrJ#1CM!IqZrBbDUqML?go=dm!8xXb;w%57aUH1{oP+zw zQT};+4q+YSF~2cgNdnF!aiNn$OCo9)JBAt(uIT(ZL-w!A+Q=h9O!_ml5++TbP7Jli z#zgqNt+pIeS^)9v?9%t$Q@FHB#^56L`aA1A_2XS_Nqk)8E`z07qcvO9N-s2yZhqbf zcUNQ51q)FmHSV-R21ZxH6IwdG38>fyT;zdWu$w6_%1@lDY34XGANa>zqxfR)I4LJ0nBF5 zk+S?_-DS1W;1jTo)NVn^kuiil0L*FqooG{1``>>uPS9{PW>i)D-o#tkUwQ@q76+Y& z5>(n|A~ROEmbaL#`?fEtz&{O-hh5r&c?|3J?PBI>sl!U(W9#u-m0O0B&9NB_w1L@8 zyg6NEzG-EYiF&z94y5i}#p&@AWz{1HLmm1+8*OEsCRJ6=?I`j_z8H>pm^U4xnNO!w zp5Aef*20l;%mU-ecd0Lc#yD~UsTc^FT zTg!HKJp)AV+7U#Z&Cy%9wXN0dO8dbvyb6;qt*Ep-c$a;uefZJBI?qn5inZ7pBi~W1 zPL)ea`+#p=Z)5UYP(r!>{Y+AR|L&FTy<|AG+C~@XWd}vwKKP| zLJIk~^ji(6T;iW;LoaG}`zDn{kLzts31*jvMa}Xu`se!cpXqn>*^8KLfAn`EL#6L=IA5L ze<{|yDf`J7AML@7hA{qZ{O|gbU)jH#hMiEchd+<7cAG&uIVyw?xR53~=o4ZJoJkXn zECGy-n7TR2g?H36yxx@Y`)&bjHQ5#{FK>bkiVLV>aB{K@hj?{lWQ?qIfIWLc`YmQH z^l@4RIyxZ)+sLVRE2B5h|4LPKEgkt^ne(ns4!nmv02)?icl;;w)5jQm9IIQJE9ypA zAl5534*>kD_{?17dYZK2p?8m(ASMT~c;Vg_+)VMJ#hPShzqvx5@-ZW>k`VPX{@ycv zEbV|EQ++0h(Yn@zqD&$u;NfuBfVjFdX}3{7k%O{tWJH8{LmVqSWso7>dsW2fdG)Oh zIO~VYuF#dxF!_4*?C+Q}g>*kRf(O71iFAnXg_YWrSRh5ts-d;+%t0D!s8!29G1$yh zk>nEZ+Ddi98kNO3?5qOu0EjF6L4B??hvBK3Pvg--K(;fqJP-HfiFi(GkIaS-vt3}c ztTiViO5F<6(2Xh>JuKNj5pmR}zZm4WKF`HbTJnA;5&UPMb!Xz}0no)@^)?J_(BpBv za|`itS&bQE4=g#`h|^2wadU3J_EfQNZBaFxe}99LXzc5O8ve=tH|+V>J|QXnOgTVQ zn3kN|Zpu60zl(PSDwN9q#%nM55ABpLkQWmQ`w3 zhDYAscjo+-_)oRg86la#E%mjaYZ+wWS3hraYO!&$+?eWgBv0U;uAX0cm7c+4u|{h+ z;>E_XGRO=k?#mnhV`ttyguqP)FZO_#rwyF;y_;o1Evm=+63(D6xt;u$J%$5MhH746 zN}3J8;m{$t_8L6n@v;`MhDM^(&VjkknuH zE8pJdqt?EuIR9{}x9Ss}0G@d!vd1_w)Q$yBw(n0+*3M@0DCpA`iwZ+>DCFieqDD-S&@=`w4EbXQcKNU5~> z_;CvZu`7y8u%kF+yNlBUs()-`tsMvD271eoF6Iku;Z6;-#{27#I6bSOe(6=c<&xT3 z0b9y&Ihf3rNHWamqILCbrdgQy-Aa8Cp#x2h#g6jjqOj8OUV!Iz(F&TYQOg#|r&5v^HZtQBDiRYk32qEDI)4PNIjK z(Frs$3Pz66QjUuYn2KJlY1cN9JHWq4P3t#zyIacaR2B7N}Vn06a(D`$pgE-AI;1yk(7G9n)%}z z#KlSg@;%AB->JyD@R|!?y`p^y7BS9{FoFf0It09=cbw`7_p53^Wc|uWJZ_kj#(`+S zBlY9c7b}+Ti2oiPTHO6!heWy?QW#6w7J^@(7;f?v?*?eqRJyX!`91k#>rExLlsaQf zKJzhlLa`Y=B`7%TFC}Q`E{3eh_EZcNgIKwdnJ^lR@}Iu@eU!q`87P_JQ99+^@*3(> z)m*7I{v6qGMs3{jmjh&bHH-wxHBYC4X`PMFRoV*o)#jH1?Xpc4@6O{O;U0bYcblmUhLEyLL03xWl@x4)_igdiF`X5-^ z+2sot1mWtfIIdz5q$@An?!J(f^Hj=KEbwhCZ$Js^sh95Y%Kn(k>eb1}<@_&sJ&}oD za?)@KDsctjd)>NIUg&!Xt)2YQKP}~PJ^xN@^}j8#a@rgTOHFh7C-dI<&?tP{UBBn1 z-9F6Tu{IQ%J?bsr-H7HaX_=_%@OMk}S58g#<+Pm^*7X*=KxiaR6X;cf&Pp7TH-=Ec za0l2q-B7eTgP`_q(}|-e>k%+O7Y6e( zEr?bf6?UrZ+#xmEj$DyVQs04w_1DbbHDbhV=Og3wF%c?-Qx@Ba{(>Epr8~(p_p0gS z&`Uee%FV&x=Axr@+;+wOiSsq@TtLdymYpMPQ}w=U@&^2uHft^O0=5>XH56NCtaPVV ziY}Ni{lUzw>L0Ds%Ep#+D^lyS|Ni^7(FTv9Q`JzSMCnCK?M-^jyxY zktA!}+Uc%j-Flp!z~)F^gcmxP{~M;sY2W59?jl2-$ne%!1FyBvLj3`N$=(zAa~0R- zyM{Zx()QhH7ent^9O}a3T_T8zYwJjtl*-##XAIPr4N`mnNDuVt-#h@AyWSHagKdJW z`g@AF?|q!4Wk+&QAs=%(DA8JRK$yn1>%!RIODPSBEiNKe*Fj{i6W*J*-)=)`1A441-0AZd8q;ahJ&o!mb zKBBpHiR?atr;E#@dqTeHTE!7*bW#d-!_oH3vo`#e8eMT3u}lr=;wr6o{sox#?_Vgp zmgSzhZbhAM-q9Fz9V_v!>M>6#y;jd%A3JGwlR=PKOl(EkS>-YZ?YT=CsQ>k>W3uFa z_V<*W!fvC8yqbZn>75gy0QVA)%Ufo}< zhGC$U@UrxfY;uD48yY-1H9KQtF?w)Yy|>}z(|?v~s7sd~02(SpRTl-tDVH&pj{k-w zwGB@v&}u&ibPWoXC~Y-PmRe$@ye;#G&~ZYUi6^S!lBG;-Eicwlj_N!vz-XkO3>|r} zekm9K`q1x5>E+#%CY`08Hu{>4@zAv^Z{8gN+;eK@ zA&80*YV%AKWmiz6n8%2=hP^wNdY;vlGcKx9<^x%HJUZn3=e>-wxsq@}0VVxC^h_(` zqPPN5J_jLo1MGz`_LcSf*1~hD2E1~k7+NVhwZLJW+BrF{m`hljtV4`)W51M>V4=k& z7?CK{=o-tdV=;d&IqZ=AjB*jO(DwB;;#4rjH!(qBJ&-#I)F2)0v3+<$nBqRd!dzLm zS<6Vp%z|KS?N2Uo`9pK+p)Iec#BaMpw#D>JxzevTegm(KASNh_d7lR1-kk6*SllD8 z>7To){|bC&j2K!kFh36o%s12#I8tEYMrhxrikaNnXB(*dwPiB5^b-0Ws0sNSj}|oU zA}60gnv|qv6qUff@0J~=ShwUp*4=`>jy+r4{c#(2B5Ic5K9rfdcZrRpO`NjUmPlA! zkAS%wS*0yatguPzzCFlp-jYQDf9s~EoMLd*I8sMsC= zIk>U698#OJMmu3k+BmZlPfB2MCdp*5#K;Mb_UZxUA1IIAk6AXbf7%jMt_mr9whSX2 zk%35aB>4AbC1_}LDrT;S(G@ElzF?>l)OGNmx;4a2dLYtb_Xh-oF zX41B_X9CA4+%O1d%sX(xP|EpGdVhG|3OavwJ8)_fW%S4PAcF(LA(2>OJOZ~0TB(*4 z&Y3|ghD?k^*@}1{?Qd`08m1xl_tJbkn!%E2@(dNcBEz{;17jxtRwvl0sw2cj6$%S_ z3?F{t4*8tcFU-zLl<$_qr>)b_f6VVk`{0OI!O~om(#3E0-o`E$LyJ=aS}u9#7^o1@ z`xY683`6IltUWca9}VRJ@K5ll!FonDgGp*@&s&v>9gNG4zOM8SDx8W4hdFnkaJkgO zq402NkvpV%EHFDA+)L~irp7A(R!dPiQx(3fyd}*4Rnp2FkdfWWpZ%?*aq#`ErV~?Z zgi}LL>OA-B)Gc%>lb=7n$hrMhsOj_;;$QUuyU}0dsbG5C=Y^gAa89QomIr`LwX^P> z;SQJVc|f|F9e?jMH&E2z0pQ2VTba#%1*{oDfV3mph1=#ekZ#c$z2fUBnH;ecMS^dB z%r{BfZy_<1U@(loboA2Ij3*(>FTEb}+ghl0rJ&r9v0g;W7&9heXQLBv%xz*9njA0&Q|C*HF(M0QC=mibPecblb{5?u)JXTNjda(gcah{^R{) zj&U`o*14Ihx>XkNbdb`e76-_??(uJ{W`qLBwT+k_`Kza0s6KUPQr@Gpvght@^SQedA_ zUg7%CvygV1fS;(sZ;Afi8-t}>a37kRu~vqzA?j2$aIlIu@6g2@LjY|(GukP!iFa?+ zF`sS?Pd{MC(<2(cf;u^4Y1lhLS`2;VmFZ&GNGq7|_f}-47(YWS8CAds`DGry~+>P?dH>ekaNz&A#E+b(BVr zw*E0OaaAoYVLI#DPv7cQH%C#9eUOhPPC5e<9H$o8Dw*((ub z6}@$J?1-=V>lKrqB;b)*)58KP((-n3(jvzqtLZ4;3+eALbLrV?-LnaVo>|SE=NVtd zvuN($aT4>#QR&e(YdZ)*s01eUlY=|rl3WF-C>GDm0AzkHXTLu4qn3+M@}P0)?g5~F z+F*Rh`R8u%(epGmC~T(SHOIh&9{>)d#+-8tZL(3vg+9n%aWQlr$nl|U!XiZW;tSO} z2VQw6f~a$cyFpX7o}4}Z=o0UVWr4^x&8PC}$4HsPEYvWV$eCo>}SH%+zE72h4 zDIfAeo>ss4_O4%^0aDYV*-WUoz8}cZe$dn&f`~NG$OpyiSNoBysf0 zxZKbz6`wT9YG!S9P4a+*dg9{{%ZCHttn$$dBkvUyMhzh>08Q}y~KtUrIRYfZ}+ zaks5%eOq65b9Seuppe@y%IgwLIkAuqP6uya7&AF!k15bGl_E(dx9*fYfL{ z@(Nw7_lJt)#m1BPu{1B;VckR{q#Ro)&aH`5e81aL>p*?~nbll3z*e`RX}{D%JNP*z z=9^kYDOsAOdt}c<=nAg|%icin=EL{QZg(h8suOWaUR0V8qPGss1 zo^^|hCR+_|=`6l7`4q3eYZzU37%lcswt@@AqS=WQdo24_0(Bk!Gz|T-$R?9$w2|kv z3=J{~cCy?k+DWAKuEg*>dyF1?pa$HjEjtEJDK(GYk|6bC{@Mtn;-8s?g{W-}bP9>XskuAij@6MSxP^DQ@6-})AYXLm0_HmISq-Kz;waebiDq}RW2TJ* zJNEPL`w#oa{a68VwR+Hl&x@<_Uy}9=v>c>(fa(;cOS&a0G4?*?8;133q$}UFJ$N%}3UY%Q>l0&7cTuiKeD=?k;i4_W!D z)8&G@6Id|sybD>|jJjt(YebJnoFDTDlx|g|x+a{uAA^4z_H!SmP851Zy?x4_FQPc_ z(#3!d5~OuQu`OCk-hi~ItokNzqdIw|Bp^}m^8=qDQsoO7` znla9QjnwNIaoBnM;2cEacDPecTHD{Mbb*+Y+9-2)8#l&Hmo)uOgGc--e^aG502oL} z_LK?3iLHoibGLh;+7M@iqY&2&yRP#0EXuxo;~XBq6ya@=IB;*SH6^$5on7R%ln`$M z#oRxnV-cmf;wK!gN@jbfYzS*Y7W%%E;}dMb*aLz{Uz&Pi_w8HF9w~ixOVvH*-9QAX zk&tBR7lKKGmA!WYm^PXN#EH%K(ezmYeHFXTXrR$Jysb{wS4{PJw=jHXQh}E@P*GIm zRDmZo)J~}0^0B^yjv)P2->I40c4HTA-!@NOo!HM+%6uYfSqs~WQNL-N=!*6XL$u|t zUb_!SZG>3GBlIjHg3OUXdgd7*k=A(5q|Su-MsCTJ+UdR!uE=0tb1$<6MR-bts%@cXW4mP&B_$Pi z2S)mT^U6H!wp5EZ#mRqTX&6FO$k-M<5kTo|s z4*LP1vqyTJJHm8vWwv0f;V(5~! zToQ8ZZc19v>yq0LBEuxhp%A8HbT3hxOg;n2^hPUGRWrkmgzc_Qp@&>YBhC2dFTI-9 zZ2@%N5HmaXctYOY%ii}v)hR7PYa@CljWb=m8i(E@loKvc-sY|ZFq3q57k5rGowrX) zn3d^Sj21ysew;*nKKJs<=yp#CuJ`HCN7k_#g`wjz=@_-nt)jI#_c=oWHp__}Rl%|- z*K-x=1YdgXn1x7}?hOQ3!a<3f>ADmO@)4>t5|*#~mlF7up5mLjD)B5&OffC#45g%WIvUZwm#P6ZbiU}! z3%*j#hO6rS*^coexAS5t?jVy?v&ph0JGtfqtB$7xh)E6`#u+0j&U|P6cK_8Pe{X{2 z>jL^~TtBThXw+XQqt$uzz_tN1=J`NTg(>FK_ox3b24G~EXNqa^>ESrIir)_@D^YmU zgZ3*n{^X&KjLU)M-iwx1VGELFK`_{Nuy5&HL%$5qYgvkIkr$c6n`ykl2c2Y8+NwcpGQkcA!?(&{B92qSoc2q-Zkc$pDshJ<`%t{*9%p)>{@^e?OEYXP1h#ryKq{EVCV@1qC5a>viB6BrO zoZ{u0zP&G$OZwZ3Q|axvKkPn_rH4j3X~I$1nHT|IM{Wlhf%nEZdmyqYV8MR(2mDw6 z%1`>nadsj%abMlytJdI3w0g1K=xVer6mqtR=CNx+a6t81D)-Z^{p{VWhM<@HK9;;k zGaUEUQ;&TX2m!cC{%OFlXDvdt(3bnL_&o>~K2y7)x3FfKcXmB(2{~M=16pOA6r}C2 z%ulBmr4|R3zV+LMva|crySsJ<(B}RjDI&>rEUEbg-@hzuqq!lR@Ehwtj0=>x9H?~~ zqhqAf_UF*X=yk=ZI2Lbv`t?p9I_X!^Zj8B~@VfgnRC^3u&Tb6C7bY)RCbOY2tkB#V zmueLopDH-K8k6hkyt9>;y34Iu1>2sCbMY)qS4CyQC!$9kkd?q8x_Yv| zEG6Y4-NjXQ-Mim(#7jxqF)HXlC#FoVVK}D{ipNRyb z{FSoTn`lg(2?Dk zjuk8G$9_kw^kRc3g;2ZsekRODH==`Lrz!4SVaxc(;!~Fq+X}QgkpoK@*R_U$NDzT> z@eNCm!T{7@fB4D{lT?in3)o%|q=@rs$dKwK>04iN3K+gHov&ir!}k2A;y=s=>fxRd z6xLWso)>sLEn4~{ElR>ZAf4iVuOM}LJH8nc;vC-H#^jR`A#VkwZS$F$O@zPnjI~ud zv=E7NEE#d1*Jh46ft;JG9=gxHPGAKgA-_H9hNEP07mITN?FnQ1a#UH{=nLT!Oo^7bFX*`ia zF?nVWPMdGR``|}bR%EN(?|Of^%b+3>awi@Dk02m?=TmDI2WifQ@~<8JO-6)S75XV^ z4YSpy9rO2`k3cxwl!JkgpE|0M2Pm4NUANVc?!R8*6*87k^#U5Rhyb3Ol#QRY%BGEW zR_9DSR;sMt8; z0%~`CRriE9Mn?!p-x-`-iC7i7)j(em=fu)_ae`Rv%lL~c*Qi;n+H>oP{k}ds8toSB zJOBW`UQn}^kCM$QzUoZE@Dl=VqMrK@eEW|li;`4GiBbcL;0*wfDFgVyxXZ@DCO0Nr z@dT@;{tLzDS6I+?8LZ!MA>t1|a7fADV0{Up&kWqUdYg4AH8P@6saJ_+S~(3O(CL?J zOU5Wy>YW$|i}}FrzOGil*e$zH#f*noX69oGZ;J;nw1tU@T*tt7-Z;OC_brgc9K2Kg z7e^eV22F`u4d;iflVR>o4bQy|1UXvm{Qiae7!4#x=C*L7Xqxs{G(S#|FAscoY(`HH zZfG{7oGA)e>}f->Q&zSu-5?7|9h)mwh|I~&8xT^71L(R^2wGmC?CEcrI8&U+52`Q$ z-f9u;IoKghF^@W+zf2S8roWJOjM2>INeP*Yw^puSbp7!YK1V^gz;M zG+YV(&mBcB+Snvs1&c4z3S{M~ZZ2D&KV#w)rqtJNobCp{l$o;Bha{dMm z>^+MS5OXx@Ev6sJ@f>E?`I)RFY}Z$iB(t{X?y-S_iO-@*z3BbZ_sQ06v0|51lH@_& zdIKlm8q%DL){@Xakw`nSYINUvH?nXkY*NZ9(_P=j&TsDNKG0{5 z5Hv-%lj1y~492E@)tN&5n)*%VKRiI@C!D9B#~vX?=C3IM(}SW|wdwi&bb1l4IaD&8? zhB|hS#7$A2k_(I|LhTJ%?QVeBf6Rtuka>2hVMmp7^_w=vtz#d#z-;GSC;=zij80u9 zyHp`l2wPh$H^lP~28YP0CwE^aajARdr1Vx#dVhdN@SHQlje;rh;;`;xuj&o&r|jPr zF_vxd5gJaG6h?W(u6`_IC1Qu1Y}0&@Wdk1yx{NMhSfqmo%$GEq%yYpAV3S(ox-vLU zS0~RQbYWPqLW7h}qG5wN$j3%Wzc#rzzE0h^A$);?L)K$^bSCHGf6|p7{#{A!Dnr)i zj}8c!mTw@2EQiy<>d%X5nUDWn-VssRt_Uh2Ja2wcYc7dQE2rv|5@tn*ihoz&GU_c) zP#>qV8b{aH<|=b7(J1qzhEzQOW(Q}%@ki}VdH zw$#W`81J1&PCR0(D+SztqH}KDlf5rZP<0dIaOGsYEc$q=&`2=l+X==nTh>B;UA}h) z^&Nbhz3?!trsL&PLAyd)bD1_ynWElR=1!fRQ0sV1G`)`EzBvzM3742o?039m3HC2i zb4<5rHXLGh_h55}^7iGyqq}5&t|4V;W0w&!W0#Ilu`t+#ALkLZLVVWpScAwCwE_v) zeQYmqczh`tO{?xMN-7ay;IVX}X@C3xC}NG}%*0u`hw;+IX1Nz_u~=k$lk1()3e2=k z*;7SF_lseY^TwAjqkoN6+V@es+8*W^p3a?`PSHx27*cm7g9F*EwR08?=ISxo0S7&V zq=9R@|^*e|GfiM`m1<|A1$kDuLxfrM4oH=sxWKBxdwPGo*khOzPns}S56gWi%ry_ z<6wiwng*XMtp$uuVyWMCc36M~lF6gyEZ};I{qAZM+Dq!a6pGs|2jIht{rSu}FZgXH zC8h%F(Tq7W$K*(V1cw%}GpgJDmVwGQe|3MvSYq*Ed0~Y-;t8Sc;{V}PgyOIO8F9wA z@>pJlSX@$LWxjeP_!z?R+>u&;FTQ2Fbj1K+KFm=)(j~FSA%7UY%qy0pSsSgFagwLJ z?EL3?$LJW_^hx<7u;DunzkK>ZkvfdgJXWghO_O6&I!Z(qLTgfK;nf&p&Nh%SSZ1}l zL0=MHpfaG+Mv_fpM8n%K)IR`^k@4rNZ#x|QBpiI)deCa{$6iY_HplMd>*sH_E3TV` z_OGBTMtwBLE2G)$EQf8ek#R>zmDn-XIV7Af)hP>`ox52%_w2Db#fduwYiY`-%e6=c1@9Q-*_l)`Enx1I&G1wxp=j-m!NofMp`+He) zQBlSTThh-WpCI;Oio*hnO$tg$n|~?U<8wgRaoV_Uj}X}V4_FZmo1SkD`2Gi~e|w1w z5YU1A2k4o#E5w%h)Y2P)UoFHuX@f79#i&b2pa?Jn07w`<@&U?8u)e=~1!z}(x+p_} z^*o+M_QNx0tnhX~_Jvaiv(canI}g&Z?E&z3Htu#DA#Hz4qTGqxU?o~{l`?Ef6!cTst5|g%6bg6hUuVbDvwPnV4&?8AbfQIM@ zKarS=WS&QGF2fGMAOIi%fB+!w9l!=1zyM_;I~5Qu6uJ;npsR^!&LyBJ0DuO-FU&wT zAO->eVz3(!F?tX%U?u_v0s!(PeZ{{5>D8 z{ts$-y`RzGnO= znxvPJP>rQ;uI7@8UqCZk$?e$bf~c=9hEYj+oA;y!xT9wAOX$pC>W!1wqgZuDiFJE< zBN)G_v|Yg>fkxxhZF4U&()fO5V@snT=AJn{m8IlkEHUr*XQbmu&n7P~L80e3^7g+& zDW$&Bze9Yuq_>iaeg-nOt))a9^5(wv=1-pOBT4n7l3%He{OuqnZS!?9x^~^S(|(B2 z$}6*v`tUMxSHCiTf6${BC4P6YmP)^itLsM6X)WD+xBmbmB&92KytfGFnzlsTlG#=G z9jY9Q&(FD*SjLw(t#@E~`6VRfPj+FM$*A4!D?8;Ix>ea(%b8WW>(I=r&DFIzx8%O3 z(D2PaxY4C8q}|E+o@R$m^J)`+mK)cJ^my?&<4N`E#3ZK{UQCMaj@P=i)Z=U9ywSWQ z+&s~!5kAbqZ+(q&y^eXk{X#1n>{>8`rf+Fb8a>bnY})Jqem<5W!qyim)?ENS3a%ny*6)oSoZa?>KerkR1;O0iS{<{_YGtxI+ zYH_dCo2Qv2`vwW8x!H>`-UZtgyBAJj|FH+m>H5*u^T_sdB}SEMJeH z(mrxfbrZE74lz&yE4tsRPoDwlDAfSu+e9p z(8DI5@p95%Ql-FhG4-CDDBa`-`u^?@p04V$q(G%lm7sx`-&VFHcj&?zN#+Y)cbj3jdV$RocVDk z{{Sj}R!OP1&*}Jb#Fg?wE3$X@H_MOV_tcsHYUA z`C`eHCaE>#6&Y6B9N8a6Z$9hjVJC5*h+E5Jc*#6!*~;GLxaG4<4y)!#_yIWNxljau zD6&d@Nj$FN#0(h#03rZZF)$9}M4^DjA%KPe7Ea0_U|K0XwlhU028oo6;>t`40a()j z5HJ82Z~zMc5CafCqF@3BOClR&SU0%4fb0Y?1TscIA7A)csr{eY>{0&!?_tT0?4|zz z>U@Ff`zxwiFKIY-qD@9I&lM*8CGfx0)N+)U^c3WsJL+1UzPl)+g=OvF{{X3LCwuKj zrX`o6@^0(E)){MK%Ey(rzmd}%o2%ThCZ3DUYCc0#T}~L}P5P#730f}E-Hu(&;U{R} z$34J#iXqk5z!aFT4Q))l2LN%jFkO74ROnDpU9}c+3>0JJb3y1 zR8{>=5{l@IUSAb!$T`=Ilx<>fw#Gj9%pOgtlVYXO(UYdwr9J79Ii&tBo**f7*|Qv% z;{JWhlk-pYGLzqC{S1tx+Vk`|Go>r+{F&1x*JVZ-C4Fj$uQx0mZ@qaKO+AkMsXxmv zlR0LWHtMJ=mnFE_&n}jCJXaYblQe1}9F5eOQJJ1cS46372W}~KObl^M0RCT*52kIvtXR1tv7E-20VwZGoaMoyDmnzQ474YmIOv~U<;llb)0c)#g;$Mt_h?Be;OYr0+ zOb)dF0LaoZ-^}HVi&NPYbt&(@%%zib*3ZQpt0!hYdt2Dc0VD(rso^ta^6vC{JGxhpl=mfoi;n_i!x4r;cf$+J$!HFfqPQ<8h7 z3wP$ql8*Z{{F#)SPrLOJB3InTcAttmZ=0!<(snc> z43{-Cn?5&EUSW~AJ6%z#oN~g~Ug)UtGsc@nDV=(#)TQKcy{yL7aF`f#Q`?{yYW{AK z52wrk^Gm5Qb^st!=m-D%?>`G0_uNHZ)sOX&`fe_tFayzx z%FMKpEAxOGlx>atOzMy2Ucb-)K)Cc?jNc#S05r>g_iN;8zmL!W3QuqKcan(...) + ok 3 - output file exists + 1..3 +ok 3 - decoder +1..3 +;31;25;22#11;2;31;25;19#12;2;28;28;19#13;2;44;38;31#14;2;31;30;27#15;2;47;38;31#16;2;28;28;22#17;2;25;25;20#18;2;47;38;35#19;2;41;38;31#20;2;44;42;36#21;2;47;49;28#22;2;35;25;22#23;2;49;47;38#24;2;41;35;31#25;2;42;41;28#26;2;38;27;17#27;2;41;31;28#28;2;44;35;28#29;2;31;22;19#30;2;38;28;25#31;2;41;31;25#32;2;35;28;25#33;2;38;31;28#34;2;38;35;28#35;2;35;33;30#36;2;38;35;22#37;2;44;44;41#38;2;53;53;53#39;2;63;66;63#40;2;74;74;69#41;2;78;82;78#42;2;82;82;85#43;2;93;93;91#44;2;97;97;94#45;2;93;96;96#46;2;89;89;89#47;2;85;85;88#48;2;78;77;77#49;2;63;63;60#50;2;61;58;56#51;2;56;55;49#52;2;56;55;55#53;2;75;75;75#54;2;71;66;63#55;2;58;60;55#56;2;50;50;50#57;2;33;31;17#58;2;50;49;45#59;2;69;69;69#60;2;94;94;97#61;2;91;94;97#62;2;69;72;66#63;2;49;49;44#64;2;22;20;17#65;2;88;91;94#66;2;89;85;74#67;2;88;91;97#68;2;91;89;97#69;2;66;69;66#70;2;39;38;35#71;2;83;88;89#72;2;72;75;75#73;2;63;63;63#74;2;47;47;47#75;2;85;88;91#76;2;28;22;16#77;2;72;72;72#78;2;88;88;94#79;2;35;31;22#80;2;78;82;82#81;2;66;66;66#82;2;25;19;16#83;2;24;25;25#84;2;85;85;91#85;2;82;82;88#86;2;35;41;35#87;2;82;85;88#88;2;80;83;86#89;2;85;88;94#90;2;20;25;20#91;2;52;55;50#92;2;64;64;55#93;2;78;82;85#94;2;82;85;91#95;2;78;78;85#96;2;16;19;16#97;2;17;19;17#98;2;75;78;82#99;2;75;75;82#100;2;72;75;78#101;2;72;72;78#102;2;69;72;72#103;2;69;72;75#104;2;19;19;13#105;2;19;16;9#106;2;24;14;8#107;2;66;69;72#108;2;66;71;75#109;2;22;19;13#110;2;19;19;9#111;2;69;67;75#112;2;66;66;72#113;2;69;72;78#114;2;66;69;69#115;2;69;69;72#116;2;53;56;60#117;2;78;78;88#118;2;66;66;69#119;2;63;66;69#120;2;75;78;78#121;2;63;66;66#122;2;72;72;75#123;2;78;78;82#124;2;31;28;14#125;2;60;63;63#126;2;60;63;66#127;2;56;60;63#128;2;56;56;60#129;2;53;53;56#130;2;50;53;56#131;2;75;78;85#132;2;60;60;63#133;2;75;75;78#134;2;72;75;82#135;2;61;64;69#136;2;47;49;53#137;2;19;16;13#138;2;25;19;13#139;2;75;78;75#140;2;56;60;60#141;2;58;60;66#142;2;50;53;53#143;2;63;63;66#144;2;47;47;50#145;2;44;47;47#146;2;75;75;85#147;2;72;69;78#148;2;60;63;60#149;2;53;56;56#150;2;17;14;13#151;2;69;67;69#152;2;47;50;50#153;2;13;9;0#154;2;83;60;44#155;2;67;55;44#156;2;66;50;30#157;2;39;36;20#158;2;89;72;49#159;2;78;63;22#160;2;85;71;35#161;2;69;56;19#162;2;60;53;22#163;2;60;52;11#164;2;44;42;19#165;2;50;50;53#166;2;25;17;20#167;2;31;22;22#168;2;25;25;11#169;2;28;27;8#170;2;24;25;16#171;2;25;17;5#172;2;25;13;6#173;2;42;33;17#174;2;82;56;30#175;2;80;60;9#176;2;56;42;19#177;2;56;49;38#178;2;44;41;8#179;2;17;22;6#180;2;35;30;8#181;2;28;19;13#182;2;22;16;14#183;2;11;16;8#184;2;16;16;6#185;2;86;61;20#186;2;39;25;3#187;2;33;16;5#188;2;35;20;9#189;2;44;28;25#190;2;88;58;8#191;2;17;17;3#192;2;16;13;3#193;2;16;13;9#194;2;25;13;0#195;2;44;33;6#196;2;16;16;9#197;2;78;50;20#198;2;19;13;6#199;2;77;50;11#200;2;71;52;8#201;2;30;17;3#202;2;13;9;3#203;2;3;3;2#204;2;9;6;2#205;2;35;17;5#206;2;67;44;17#207;2;31;25;8#208;2;16;19;6#209;2;19;6;3#210;2;78;45;5#211;2;78;52;6#212;2;61;42;6#213;2;5;5;14#214;2;19;16;17#215;2;13;13;3#216;2;49;31;13#217;2;8;11;2#218;2;11;6;8#219;2;66;33;3#220;2;25;6;2#221;2;33;8;3#222;2;71;44;8#223;2;53;31;9#224;2;58;31;6#225;2;50;56;56#226;2;14;13;14#227;2;53;24;6#228;2;49;28;2#229;2;55;22;2#230;2;49;22;3#231;2;47;17;2#232;2;42;20;0#233;2;16;6;3#234;2;39;14;3#235;2;39;19;8#236;2;49;20;3#237;2;11;9;9#238;2;41;14;0#239;2;13;13;9#240;2;9;9;3#241;2;11;13;14#242;2;13;9;6#243;2;42;25;5#244;2;8;11;6#245;2;16;19;9#246;2;13;13;6#247;2;45;20;3#248;2;35;16;3#249;2;44;17;0#250;2;69;72;69#251;2;69;75;78#252;2;9;9;6#253;2;78;85;85#1_O_W?WcGcWCYcQcAc?O_?OC???O?g?IScE{A}A|A^_NOfGRDHVHeHRCBGBC@!4?BCJ?BC@A#5!6?_#4???_?_?o?o?o?o?o?oKocWcW_}_}guxukNNNDNNDNNDFfBBP`@f!6v!11FBBP?C!8@!11?BB!5?@BB@#6!34?_?o?_O_?o?sgsgSgug}h}i|y~}~}~}~}!4~^n^b^J~B~@J?V?@?@A@#8?__GocWcY_wcYsIsGmWeOmGvGuHuKzCyDKa?i?a?cC?GCOGS?kQGSIOKaCYCQcgC#6!29?@?@?@?@O@Q`HQdIT@Ul@~DzVj~j~V!14~}!7~}z}z}!12~|z|~}~}n}~}|y}}[B_?O_?O#4!20?BFLFXFJ\v^~~t~~t~~t~z~v\z|v|~V~~V~~V~tkS[SKSSGOgW_wgO{~vV~nz}juzmzuzmjV~Tj~|zVlzTlJPhntZntz[tzlv|j|vlv~^v~^v~z^z~z~z^~^~V~nz~$#0^n^F~FZFZFjDJDJT@RdJRDR@JRdJPBD@JPBD@@A@?@?@#3!6?_?o?OgOcWewuxm{zs~{z}|!6~^~~~N~NvJ~B~JvJnJvNrNZfZf^@^@VHEHR#5oO_Oo?oO_WgOkomYkW!6G!11w{{m~z!8}!11~{{!5~}{{}!34~^~N~^n^~N~JVJVjVHV@U@TAD?@?@?@?@#7!4?_O_[_s?{?}s~g~}~}|}~^^vNZfZd^FZDJDJV@F@NPFGVHEHBCJDIR@^@VHVJRnVjNfJnRLvJtNrLZDZLZVZn^~F~VjVnRnVn^vn^~n~^!8~}~}~}~}n}l]ulYti}hQ}?yCgS?S?g#5!14?@!7?@C@C@!12?ACA?@?@O@?@AD@@BSJTATj?jTjTnZvJ~n~^!8~{wqwewsaG_#11??I??I??I?C?GaCAGA?g??g??G#5??@a@_`ahAdADADAD#11???g?OC?SGCOCGCOCG?iS?ACgQCgQCgCOIcOICaGCQGASAGQG?_G?_G?C_C?C?C_???g?OC$#2???_?_?o?_O_OgOgYkISkig}skIsE{oiOg?w?{?{_]omWvkyugUXEkjSfWbWFHEP#12!18?O?OGC?K?CGCOCG#10!17?_Oi?oI_OaOGOK?C#3Q#13!154?_?o?_O_W_?o?_?o?o?o?o_[_SgSgOgO_O_O_O?_?_?_?O!4_??_O_?w?gSgOkOgO_GO_?O?_#9!91?_gSilISnSiSiOcGs?O?_#10!43?_?IQHaJQHAOIOaWAOi??G!24?A?_AQ#3!6?@A#5!25?_$#3!520?d?D?D?D?B!6?@?@?@?@?@O_#5!11?OC-#2s~s~s~t}|zu|v|z~z~z~z}zv~]~n~U~nU~F~VnZm^vMrNRDRCIOBC@A?@A?@#12!7?_O??_?O_??C?GA#5!18?__?oO_o_OoGoKvxmzs~y\vy^t~m^j!10~}~~}!4~^~n^vZVlZf\bNPnRnRnRnVhVJVjVjTnVxVkVzNrNrNrNrnVz^vJ~B~B~B^bZBZd]B[BUhFGQL_HAHACABABAA#7!8?_?_W_SgSiSgvWv}t~{~|}!6~nVNfZB\ASJ??A?@#15!11?o?_#7!9?A?@A??@!9?@??@A??@A?CHAHA?FOBS@U?CJ?jAJQdJsBkZd]`^lv\z^!13~}~}|zulQlQlOjCqHqLOiC?cO!7?_O#5!34?@A?DGODgAGS`IsJ{B{Js^lvz!9~|!4~n{{AOeGQcQKOdOCG_OGC!9?g?bB_B_B@A@#11!9?A???cHCODGAG`?GAOC_GQdGCPAG@QCI_CGCOA?@??T?G@??A???@??CP?H_SG?c?Q?@$#1I?H?H?I@ACHAGAC?C?C?C@CG?@???@??@!6?@??@!6?@#5!18?_OC?aG?P_GC`C_#12!22?O?O#10!5?GA??A??A#4!18?@??@#9!4?_?O_GcgQcWa[omOkOkOkOgUgsgSgSiOgEgRgCoKoKoKoKOgC_Gs?{?{?{_[c{#6cY`{b{hUwvlq^u|u|z|{|{||!8~^~^f^jVjTjVGfG@I?B?A@#8!6?OgO?CSalJ_VlPmOMPeGTAHQDA@?@?@I@IPEHeH?CG??A??D?D?D?DGQdI_H_JOcZ?QcOCX?C#6!40?@?@ACHQlQlQnSzLuLqnTz~Zn!7~^n!34~}|vGqDgQ`SBGC#4!20?A!4?OBB|nXvlZlrnYnzv^mvz~tZ~|v}z~T~[{[{[{{{u|~u|n~~|~|~~~Zuznyv|v[~u|nz^vlYvhAs@Slzt^zvzn|~m~~i~v}^n|~n~]n~zm~u^jv~Z~l~}~$#0@?A?A#3!20?_?O?g?Og?w?gOcO_GoKokiKzsn{z]|^m|N}VjVl^nVNJfZFHFHAJ?BA`CBCHAGA@A?A@A?A@?@A?@A@?@!5?@#14!7?_??_??O_O#13!140?_W_g?O_SgQkPmpmXvi|uly|}N}^}t}tmxuXu|zu|~|}~y~y~y~yvkYt]s^smXczcXexewj{j}h~zs~S|slYsJ{RcY`]_QGaC_#9!82?GqDiQD[bgUpJsB{BsJ_QGC#11!31?@???Ic?AG@C#10?A???B?B?A?GA?HAO??A#3!13?A?@#10!8?QG?cA#5!10?O!6?_O??O?_O$#10!46?O!6?_?_O?o?gSgQ_OgOCG_GS_U_CRGOG#3!440?@#5!34?cHQg$#16!47?_#4!23?O???KO_oCOZ{zu|v|}|~|}|~|}~}\^}LmNMNnNvNq?CPCH?D?GD?I?@?C-#3osgQSwQWESRoQDQQcATaORcbSBSB_R?VcZcv[rczQtJpWeOlRkRKbLQdID?@I@?A`I@IP???@#9!28?_O_?O?OgOcO_#6?G_?COCG??CA?iC#9o_WcycZsjSjsjSzSzSi\yD}JuLuF|Juj@MPlPidLpIuOdIpEhIrEhUPvCjSfKrElQDM@IJ@NCRKJ@ECL#7!21?_?O_SgUgTiSzkV{j}l~~}!6~^n~F~JVlRIDITA@?@#15!6?_G?Gs?kQcY_VCRCJOFoFGeGQcO_Wc?SA??o_O?o_O#8!9?@???@?@!8?O?O?O_O_#19!18?_O?_O!4?oO_?O#9!64?zCrSjcWfGUpUgvGv?SaGPG#4!13?T??~~TMDJE|yVn\j^vl]nznVzlZulZulZulZuj\uj\uZt^n~^~^~^~^}^~]~^|v}~t~z~}z^xsYpj~Yn~v]nz^u~Ynl~u\vz|m~\vz^u~\~zu~^~V|Z~~$#2NJVLjFLfXbKJDy@lBXaLJcJOJoJgVGvGBCB?BCJ?@??CA?@A#5??_??_??o??o?o?o?sAPgS?ACHasYpmo|!5{}{~~z~~z~|b[ju[Je^SjkfQlZlV}dZuXeztztyTyTrJ^dZDZcJSjSJSjCjCJTADI@CHAH?A?@?C@?ACP?Q?D?HQCGPAT?HQ@I?JSBGRCHQDiPaDOc?BGB?CG@A?@?@!4?@A#8!38?_O?W?cGAC`Q_?GCQcITaH?A?@#18!7?_?g?k_cG_G_O?_??_?_?O_gw!4?_??_#7!28?@A?I?AChAk@lAlJuLzEZl^Fn~Nn!4~NnN^ne\zUlYtilYdzeHsHUgDiPCaOH_S??_?O?G_#5!34?PA?S`MhVGvG~j\vmv!13~i~~??ipysxADgOaS_GQ`OCOgCQcHQcHQcHQcHSaGSaGcG_O?_?_?_?_?_?_?_!10?_CIdIS?cO?G_OC_H?dO???aGCAP?aGC_??_!4?_?_$#16???_??_?_G?C_?g?O_?O_?O?_??O?_G??_!7?GC???C??A!8?AG??I#12?C!5?A!33?_#14!7?G?QCHaH?ACI@gD?GC?A#6!14?_?_?o?o?o?w?sGSyomOiCY_MoHeGpEgS_KoCgcGo?gO_Go?gO_[ocYowcosypyo~}~}!4~}|!11~^~n^jVhViTjCRgBS@Q??@#13!9?_?O_OgSgTitylYti\u~|^u~vJ~RlZD^?z?ZOfWFWfXVlZN^FZnJTF~N^n^N^N!9~}~~~}~}!8~n~n~m\nT~|zU|R}Q|QsHqCxcQ_W??O#6!7?O_?XaChQdITQdYCXuJuhVyTmz\nu^j~~^~n~v^!29~CzKjSIdWbG#11!64?@??@?A!10?@??@??AG@?I?C?@C?A!5?@???@!7?Q?H!10?H?A?CH???GAc$#10!10?_?G???G?G?CG?G?G_CGC?_W?OG_GO?k?oIcPiOkPKr[QlIDyLEdITL??C?CA@C!4?@!479?@?C$#17!14?C??C!5?C?C!8?G!4?C?A??@G#4!9?O??o?OC_?Y@wcAh{xyu\JcMPNA!5B@B??C??C?A[bSHbSH?JCRGDA?A?@-#3~Oq@ugRokRg?vgQgRsApQcX_Z_X_Qs@titjSjDa@a?`?@?@?JQDI@?@?AC?@A!4?@#9!11?_?O?_?OgCgQgSgSgSgSiSgVg]isJ{RkYlyT}sj[yUxuGokOi}Wv]|^}^~N}\~]|^~N~ExEhUHATAT?TASAS`SHATASBSjCjSjCjSjCjU`MPm@mPm@mP#5A???@#7!12?_!8?_O??O?OKoDyCxExe|i\v}t~|~}!9~^vnPKaLOBGQ??@#15!7?OgCgTa[`]?n?PAD?ADA?oC?S?C?H?O`CO_CAgACOC@G?O@??C!19?C#8?dG`I_ITi#7???i?IOAS?tItItItlAQx\Kmzx|GidOIut~z}tmxfzexehV`]hUwDiWa\?i?PGCa@OCO#9!28?~?~?iU?lJoESqeOjS`KPI_H#4!13?H?~~T!4?~~~`^uXf}hVylVylZulZulZulZulZulZuZe|jUzuLyVyVi\uj]j|^uz|m^zmvz\}nvz]nv|zn|vZn}v^l~uv|mzv]zn|vZ}nz\}vz^l~Z~~$#10?i?sGQgCQgOeGOcPkAxGcXcQcXcYcHqGSISjSYL]PMYjUxIz_C_@sAY?H?CG?DA@#4!32?@?A#6!22?A!6?_?_?_?o?_?_?_?o?wExUhu|i|i~i|j|j]ju|i|i{jSzSjSzSjSzSh]pmP}PmP}Pm|~~~}!12~^!8~^n~~n~nrNyDzExEXATaG@I?A?@#8!9?_GOe@OA_C_D?Qc?C@A??@#18!8?_?OgCgy|[wx^Nz^j~Z]u~M]zN^z\V|Znz]U~m]oqhsAxCq@GC@gAPGA!5?G#19!26?AOlCAaPCCAvOIdPG#5!67?T_HQ_CXaLOnSj]rmt^u!13~u~??i!4~???]_HeW@UgDQgDQcHQcHQcHQcHQcHQcHcXAShCHqDgDgTaHS`SA_HCAP_CPGCa@OGC`OGACOAGcO@G_???GAPCG`COAGc@OCa@GC_Q#11?c$#16?DGA@C?H?C@G?BGA?GCAGA?L?E?DGAKA@!8?@?C??C#5?ShYsIx?|siyU|q|Yv}T}}u~z~~~|~^~m~^~nVzVlVjVjVjVjSjTgV`TJsBkRdQDi@JSbDhEHvLQnT@fG@A?@???@A?@A!4?@!21?@#13!89?GqLoNwVg~lY~z}|~~}nVzVi\b]@~?ViT?A@?C!7?`??@#21!11?_#13`?@?NLQJ|EzL}vz}V|mv|!5~r~Yv]t^tiT~~~T~tn|j~ItItItIOl?A_P??A#6??DOIc@I?C@IPEWCXEXUg]`UhFyTf\a~T~mvz\}nzn!28~?~?~?Hu?SJ_H?H#11!111?Q?H$#2??DG?@C?@?CP??@C???C??A???A?@#4!8?_O_KoCOGEOC!5?CcA?P@_?G?CG?i@@H?C???A???@#14!42?@#20!167?_A?_??_!6?_??_??_??_!6?_$#17!7?A??A??C???@??@#12!23?_?_#14!16?_#21!235?_-#3yDiOMOlQcRkPmObChUGQlOLQKOHA?AS?P?DGDGCG??A!5?A#9!9?_?_?_?o?kOiSiSiTiti|j|j[ZuLynYTi|YsnWviLuLrJuHv@~@lJTiVgViTiTjTmRlUhVkRiDYbEHAJTaDIPADGA?A_O??CG?CO?cO?C?_CO?CO?OG?O?G?O?G?O@GAHAGAD?D#7_GCOGC_S?s?s?s?cWasGqGsGqLSiLyTmXvi\u~|zu|y~~}~}!4~^~^nnZdZcHaGQDOD#15!11?OkPM?NOBGCI@!8?A@???@??@!6?@?A@?A@@??P??PI_COG_O#13?bNY~Vj~ny^uz|n}j~~lZ~~ze!4~y~yvm|j~iTmTzT?i?T?G?A#6!4?Ag???@?@??DG@QdIcJOfGVgTipEhU|Yd]b\uZl~v\nvz~V!20~?~?~?TgDQ?C#4!23?S@?S??~~jvNxvI|Ze|jUlzUlzUlzUlZulZulZulZulZulZulZulZuZe|jVkZvi~V|u|}~m^~U|}~\lvz~U|nuzlZulZtmtN}i^uxnyt~V|nuz\~mvz|n~~$#10DIDm@nALBkBE@NSJU`ELAfQdBjCTjDiFCB_?A?B?AC?C@E#6!35?_??_???_??_??_?O_GoGsGs?{?{QsiTgVgTiTiSiOkQgUgQkOyc[xu|si\ytm|yv|~|NnvRrVzjnZJfRr^ZjnZjn~fv^nvv^nvv^nuv|u|v|y~y^vznvz^j~J~J~J~Zf\JvLvJvLqjTqDiPeGTaH?ACHAD??@?@#8!4?_?_OOcYCRCPD?gA?Q?A?@??@#18!6?_O_Gsapcw^}vnn|~v[}n|vm~z}l~~l|v}|t}|tumvmin~mt^jnvNn^[od?gS?OD_HCAO@S#8??Qc??CX#7!4?D?DGPAS?TiPiCGiTTiifrp||~CTR~~~}~}~~yv}lYtZsnWvgViTMxUhAdY`[aHcQ?GaOGC?g#9!20?~?~?TiEWhcZ_]`UkPaLOd?QGCA#11!77?P??HA@?A!18?@$#5?_O!5?O???O??_???_!4?O??_?O?O???E?DGCLACAC?Da?Q_ggw{{~u\~Z}^~N~RnTjTjTiTITASASBcHQDOdITADJOFGDQ@AC?@AGA?A!13?@??@??@?D?@#19!16?O?GcG_CO?cOGcG_CO?cO??G?_?G?_?G?_?G#13!68?_GqKqlQlyl~|~}~~}~~~nRmPnOfGTIPE?@??O!8?O!7?A!7?GO?P#19!53?aT?i?TOKKAA?zgC#5!68?i?PaCZ_^`]hRm\qnY~lvz|!8~j}~j~~??SGoEGtAcXAShQChQChQChQcHQcHQcHQcHQcHQcHQcHQcHcXASgRcGT?gAHA@??_?_???_QGC?hAOHCQcHQcIPIo?T_HEODI?gAOHCa?PGCAO$#12?O??_???G!5?GO??_???_?_?_GOg?gA?A??A?@!4?A#5!106?G!8?G#21!122?_??O?A?G`?OAG!4?Q??Q?G??G??G??G?C$#16???@#4O?O_??Og?_???GO?OG?G?CQ?C???g{Wpwooqoxxxwxy\|l^VVFBB?HA?C@#20!223?G!12?C!8?A??A!6?O!4?O??O?_$#16!18?@!11?@-#4O?PAGqSApG_ADgS_@??GJ!4?_AO??AGn~~}~~^N^KFBbB?G??G!6?@#6!13?_O?_W_Cy@QGdAGtAhSiT_ItK}hUxulyd~kZu|}~\NelV|]ned~~EvmlvT^nmz^Znzmh^evZp|KyViVlSe\rFYfTjTnTjRmRlTiUjSkXeYn\tM{TmYjqMt[C^mQlQlQlRmOnQlQLQeGRcAHA?A@A?@A!4?@A#13!13?Ok?gSgSgSgti\y|}hVzmznzv~~~^tf\js@?A@#20?_?GA_C_C?O!9?@!18?C???_G@c?@?_?O??G#8!13?A???@A#7!8?@?@ChAGAtAY@laUZHl|RZW||RrnbVJb^BjBbf@JePzuLyc\sJSjQdI_ShU_SIP_COAhOCg#9!18?~?~?Zc?ZcgN_~?|A{@}@{?Qk@W@G?G#4!4?@?C@G?BbALZulZulZulZulZulZulZlrm\rmTzUlzUlzA@BA@BA@B}tZe|J|Rmt[vj^vYf|J}RntmZtnYvj\vZe\ze\ju\e[tYvjuNzUzVlZvi^bLRiRHv^$#3i@G@aDGTA??@ADGPcHODOdG@?CGAGQCO#11???@#9!20?hAgRCrCz?~?~OnYTjlYfIz?}hfYxvI|UjTiZtIr@UhEHQDY?RcHA@?A_HQgA`?@I??PG@Q?I_?PC?cOC@Q?PG??AA@!4?A@!15?A?@?A?A?@??A??A?@??@??@??@#8!47?A?@A?B?B?B??A@A@SgCPCOCG#18???_?W_SI{}|}^^Vvx^z\z~nunz~^z~\~u}l~u|n|~u~z]~|v~\~z|n}^v{Yz{}U^Nf~E?PegcQ@OD?@#19!16?_??_??_O?G@cAOH_cQAGcfAAkCOK_SG_S?[?WcOGC#5!51?cHQcHU_^?~A|B}@}B~lR}f}v~v!4~}~z}v~{[|qcHQcHQcHQcHQcHQcHQcQKPaKPiChQChQC|}{|}{|}{@IcXAsAkPIbGS_GcWAs@kOIPcIOdGSaGcXaCXaSHaXbIdGSHoChCgQcGT_[qkTGuG_$#10DOeG?Ga?GCIS_?ACGACa?AOEgBO`C_HA#19!78?_O!5?OGO??g?O?G_?O??_???OC_G?cI?@??D_A@?A??D?A?A?A??@?A?@?C@A?@??A?@A?@??@?I@A?@#15!76?I?A?@A@??_?g?C!7?O!8?@???A!16?@??A@???G_?W???G#6!50?G?OG_S?gS_[?YcPiCHqDZaJsjSlYt^jUh^jtm^zn|UnzV!18~?~?~?Ql?Q@O#11!90?@#10!46?C$#5?i?_T?@gCaP_GQ`GQshOcWdgTWcKqLocO!5?_o_rw{[{~v~~v!5~U{VkzKzC~?~?nOdICQD?T?D?CO?C!7?C!20?O!5?O!23?C#7?oCgOGOgW_Kw_WgSgOgSkOkOgSgOgOcWcO_Go?gOcSKo?_w_OkQlQlQkPnOlQlqlXvkZ|u|~|}|~}|!4~}|!13~lR}TjSjSjSIT_C??A#21!27?A???H?C?_C?a?G?Q?H?OA?H?C`?AG?a??AO#13!5?CA@@?_??p~eXVZl}ny~}~~|~~~}|!8~]~}ZU|VlItcYOL_CQ??c#11!216?_$#12?C?S!5?PCGO??A??A???AOA?@?@??@#5!140?@!7?@!7?A-hQCOIO`QcGqCxCOdZeWvGvi\a\itYlYtOwk}v~n|!5~v^jvZvlRmPmPnPmPeXAl?dI?AC@?@#19!18?G??O??_???O?G?cAPCgAS?IOCO?gS`IsApCgQcHSaGT_DWaChSaHO!19?@???@#13!59?_OGOgCOoSiPiTiTiTi~y|u~|!4~|~}~~~^nZdYlUHF?@???C@@#21_???O!4?C@?A?GA_G@?AG@c#15!5?OOG!5?_?Gc!5?CG?CG??G??O#19!23?I??aGC@_?C@_QGDO?iAPH__O?Nd?IdSHcQ@kRCiPC_O#9!46?~?~?Zc?zChIShRItITITaKpCRk?T_P?O?G#4!8?O??C_p~mP~UhvmXvYf{jV{juZu\zUlJELJM???O??T?_NNzsnTyvLyvI|Ze\ze|Zt}tz|u\julZulZtm\rmTzlUzlUzUlZulZlr]tjSJoiSHun$QcxjskYcZuLxEylY?ODGaG?AS?OAcOc?nFR@G?OA#9!5?G_SGcGQkPmPmOmPmXe|QNY`TkXa]_^_NOjCZdITaDIPEHQ@Oi?HQ?@o@?@Q?G?c?PC_?O?A?@Q@G??GCA@!4?@?A?@!5?@#7??CiTj}jU|A|iTzuhU|q~syS~SwU|qnYt]tI|iTyTi\mZuLydZu\qnYti~ytMzv}l^}!19~^nvnVznNjTmTiTiTiT?DAH?A#8!4?A?@#18???_OcWdQhuw~]~~Pym}^n|vl~i^~j]NT~v\^vM~|V}Z~ululjfR}h^r^E\QH~m^|nyvvzvzZVEeABP?Oc#7!22?A?CHaGAL?qIdTTkeU^Nn~OYytOjcQHsQ?gPCiXfLzsj]hvH}hUhUGvGqDwDoGaPCI`SA?gA_C?GC#5!13?cHQCOAS`AK`ITiTi\rMzkR~i^m~n~v!8~n~~j^M?Pm?hUGPeGdWBSgBSHcHaChQsxqsp~~~n~~i~^ooCJOiDGqDGtAcXaCXAcI@ICAHaSHQcHQcIPaKPiCQhCQhChQcHQcQK`ISjsNPHcHO$#10CGAC@ACG?@?A?@A?cHa?T?T_HaDG@A@I#6!33?o?SiPa[`]_^onSzcYti\ytmxul}fT~el~]N}~mlvvZXkiR\jntlzmlUb]sBxKyVlZui\ti]yf\zUi\ujTiS@ShA|ATiCHUhAL?JCj?jEhALOdI`ItATiDiTaPcHqDYcHaLOdIT?DIpCG@Q_@#15!56?A!9?I#23!13?_?_!5?_!9?O?G??C?G_O_c#21??O#13!9?C_pXh[k~nZ!18~t~~\tzyU\r{QlDoIi?PG_?O??_#6?D?I?QHcI@kRCiPEGqCJS`UGu@UhUhvGvLyFyNv\mzt]j|~V|^z~vz!9~?~?~?Ql?jS`IS_S?_?_#3!26?O#22!101?C?A$#3?@!5?@#5!100?A!13?@#20!149?_??c@O??OAGA?T_?O?OG??_??O??_???HQHAC?c@Q_C?HA@Q?@_AO@?G??C_?G?C_A#11!258?a#10O$#12!5?@#15!284?_-#5iT?TIPcQcHQlQlQ?~@}DyLqnO~Y|^l~y~~y~~}~~^~n^vlZvItITiDIPATAOD?A?A#7!14?_???_O?gOcGS?OcGq_g#19CODGQ_HOCgAWaSHcPKPaKOjSIpEPiTAcHeOTAYDqDoJOm@O#13!69?_OGCaGCQGCQgA|?}PiSjszl]zulZulz!12~nZtJuLRKB#20!4?Ga?GAODOc?A_RG@I?@G?C?A@?_???O?CA?H?P_H?GCA?Q?C?CAO?GAO@c?H?C??_G?C_OA#19!23?c@GaOCA_OC@C?I_CBOK_QHCQ?g@bOsRIodKAp#9!48?dIPeHuIYcHrCiTGqTdIjShEOi@}@M_O?Og?_?_#4!6?A!19?FDAFDAFD??OC?OD?OD?Q?CO?~}Tze\julZulZtmZEDJVynVzluLzUlZulYvmXvmXvmXvmXvluLzUlZulQHqLQ_ny$Ti~itmZlZulQlQl~?S@QC_H?i?dA?A?D??D??@#9??_?O_GQcGtItiTytm|i\niVxnOnOfGVGbCHQdGA?@_@???@!4?@!5?DOh?O@?A?H?C#7!17?G??_W?OG?g?_G?GC_?Omlz}|~|~T}T}z}|!6~tn\zV}T~tn\z~}|~|~|~|~|z}|z~~}|z}!4~^!4~^!6~^nvz\vzlvzlV|A~@mTjSJCQ`CHQcHQC#18!12?OcIsHqkr{!4~v\^b|nynZ~t^Kdkdh{fljFly_TXqYN]q|ne|kXsncIlrH^j}z|nzv|n}Y^uuzz^VFvqQJHp?C@#7!22?GAoCHaGQ@T?Z_KbRLdQhlVV}KlJGtDIQpM}~~~}|z}lZu|zmXeXuH}hUh}?y@}?yDWaGcQHOdO#5!14?@?PaCGPAcH?Y`SjUxnT}@}p^n~nV~^~^!6~|!19~wy|wy|wy~~nz~ny~ny~l~zn~?@iCXaSHQcHQcIPcxysgDOgCQHqChQcHQdGPeGPeGPeGPeGQHqChQcHQluLOdIOD$#10!17?i?g@QCOD#14???_O#6!28?_?OgCOlOnWvgv[zulYv|~]^}~^n}VnZvi~nZvLYFQniul\uezR|f\juZmrm\rnSjtMxeTi\BuHfiTdYDyFoNPm@QC@A?A?i@i@C@A!6?IOaCg@i?IOaC?@A?A?A?A?AC@AC??@AC@!4?_!4?_#15!64?_S!8?_?Q?SA??O_O?UGAC@_?@??O?ACA?Q`OGC_?@!8?@_?H?C_GO#6!56?A?c?IO`K?@???@AC@QcHACPeXeHu@UhU@~D}@~Dyf\vZlunYn!8~YtmXuHsdISGrCgRCi?S#10!128?_GT$#21!280?G!7?O!27?O!4?C#13!12?_GHLcsM~z}!19~Z}vTlJxULrkyitCZoK_QGcQ?g??O#11!204?A$#23!283?Q?OA??Q?W?CHAcHc?`G?O?A?A?O@O?C_-#5{k{k{k{s~zl}Z|v\~~|~~|~~|!9~nVj\e\jQlRm?I?CG@A#19!14?_?GS??G_CO?aT#7?iSHcYCiCy@{RsiTypiXeXuh}lzu{sm{Z_G?S?_?G?gOOi_OGO`GS__Og?QHcAC`IOOiOsGOtkaTga[Sa!45~^nvP\nhdU}RJkUVgIdOn?^dYdIDOdIPAC@A#8cG`I#18!6?o?GsAsGdys~]~~V~\tm|Z~U~n}zNVIfJmh@csPPlWlZK|v]Qv[IIty\wl\kYNxyh\zv^}vMnz}fz~fyz\\vXZ~G?_yNA@OG!5?G#7!15?@I!4?@AC@cIDoEIjTCqHlSURjNffuyxsq!12~}|~|ZulYtiTytiTydWfGqDgQHeOISpCo#9!17?@!8?@??@#22!6?G??cA??O#4!14?OE?gA?gAOC!17?DO?d?Q?@@@?@@?@N^ItnWwOnvZluZlugQdYdYdJoEWaTIS`]_?iTrEGrHU`]`UWBOGpm\i}$BRBRBRBJ?CQ@cAGa??A??A??A#14!9?OGCA@#6!8?oIsA{a\qlqlYtm|z~Yv\~fbznuVRj~XG}TjuZdzTzD}BkJTiDITeXeHU@QCHBIPBcITeHuDZcjU@iCPNOfGUbKRM@UHsA[`YC@m@CJ?fGAPGAT?bG#13!45?_OGa?OAG_?cO@g?ToIdO~_YdYtynYtm|z}|Zv]t!6~N~vJ|JvYDJ?@#21!4?_?O?C?H?O@C??@!36?G_@G#13_!13?c?ez^D_x{nv!5~v!15~}t~~~zm|ymPsiLoS?iXCq?h_CO?G#6??@CA@!12?@A?AcHQdITiDITiDYfWvLyVluXntjMzN!17~}~~mXvGrMw~?}?vGQcH??cIP?O??_#3!12?@#22!57?@!7?C!9?t!7?_???G#26!5?PAC$#9!35?_O_WaSlQkP~tNpB{@\aLQLQdIPAC?dGA?O?CO@GgC?C_@#19!16?C!11?@???TaXaHYcRS@mDPM_fGU`GRK`UhcAX`YCpm@Sj?vGAPKaTGbGT!48?Ka?SQG@GcQ@gADOI#20!37?_??g?AG@A_?_!4?OGC?C?A?@??A!6?G_C??O??@_@O_OCOA@O_C!4?P?C@OC?OD?a??c??OC??OCA#19!28?CO?@OI@OAH`S?aHCQAHgCoOWHCAHK#5!64?PeGvKpE?~?~GvlZuv~ZPk~nn~^!12~mx~V|~V|nz!17~yn~Y~l~}}}~}}~}o_tIOfFnOGcQHcQHUlYdYdYoJxf\itj]`^ITiCXvGS@]`U@f[jTI???@$!69?G!8?A#24!134?@#15!53?A#23!9?_?oGO@SiOJcGQdQcR??@g?bCPICA?A?@_?C?A#25!22?@#11!230?C#10!13?G_?C!5?_?_$#15!278?_?O_O?SI?Ic?A??_A??@G?`c???E?AA@_?CCA!6?O??G??G?C?aGA#11!251?aG??G???CaC?_P-#5~~~}~~}!15~^~n~N~vJnj]tMzDYdYCXaHC@#7!9?_O?Og?sGQk?wCyCwcYoWskYskynynynyry|~}|~~}~|~}|~}!8~|agTQkaXTRKtRGicT}{|\[Nfvu~~mfrYMFbzz~vrz{keut||kv~V~n~^n~~n~^n~~n^~^~n~^~n~^n~~n~v\rf\z~Tnv\uj\uLrKuGza[bHUhAGQ`ChAHQ?@?AC#8!6?a??@#18O?o?ShCRkr{~}m~|^|j~|zn\vyl|ny~mz}lxXbQ[LI{l}|ftJIyzk]vYvrn|fk\l|Z~m\[h{v~z^z~U~L|m}v\t^mVr@@@_?EA?APG!4?@?@?C#19!17?OC`?C?A_DOI_Ca@OAtOGK?gCEA`_??C#6!13?CG??@aKPA?cHQcHqDjTItJuHuHulZ}V!17~ZulYtn[zExExEgTiCWaHQH?cPAOA#14?A#4!12?Sk???k#22!16?_?_?_?_???c?c?CG#10!17?A#22!5?@?_!8?A?O???@@?O#26!8?A$#4???@??@#9!15?_?O?o?GsOS`IPCYDYDZELQRGUH?@?@?@?@???@!5?@!5?@#19!40?\AgdPKagcRGcVPIg@AAA`oOGH??POGD_wWCC?GGCBPPGIAAP!52?@??@!5?@#25!35?O#20?A_AO??COaGDQ??@!4?A?_???O!5?G!5?O_GC?CO?G@_O???@_@?@???_C?h?Q?@??AG?O?C?A?@?_C@#7!31?CGOdGAgDOJwCidGIdrr^Rxx[]Nvzz!13~zv~~}\rm|~ZulZuLySitIsHuHuHQc@g#5!17?cHQdIObCxExExViTxfLsluvZm|n|~|~~^~^~^~^~~^jRj^nRV!15~^~]~^~^~||X|XlXdzjvkqmXui\qmXui|iTyTjUzUHUHvGvITiThEhCzEwEgDiShSJs@gP_$#6!34?_?__?___Ocguhu~}~}~}~]n~nU~JvlR}FyDzEYdJfIRdJQDODODODGDA?@A??@?A?@A?@!8?A?TAGAPCAG_AG_CPA?@??A!10?@!9?A?@???A#8!57?_??_?_#21!39?C?A!7?OC?PC?O!8?O!15?A!5?c?O??O?G?C#13!15?G{{}]~Xx}|mv!4~}~}~z!17~nzYvjYt\QidSBXSIt?IC?_CA?`??GC#22!78?A?OA??G!9?_?_?_?_??_??S_O?g#4!17?@!5?!5AQaQCSGRLPeHTaLPeHTATgDiShCgUHuGVGtiDiShExChEwFiPISbSHuEGVl~$#19!67?@??@??C?@???@!7?C#13!43?_??G!5?GC_O?C!4?C???G!5?G?g?O?_O??O?_O??O_?_?O?_?O?_O??O?GaKWaC?iOGaHSaHqKrHuC\a[UhU\uL]zU|ul~}~|z!6~\~~}n~N~jUzkRKB?@@#23!13?A!7?ACShA_PA?@AOIs@C?B??_G???OA?A!4?A?A#24!84?O#11!168?_#10???_???O!4?A?O!4?C_AG???OC$#15!277?@?CAGC`Ac@A!5?s@C?@?@?G???OA?A!4?aCA!8?_AO@G_A_@g?A#11!243?O!6?O??@??_AG@_GQ-#5~tJ}Tj]dZ}TzmtZ|nVj\jUj[b]`]pExEpCZ_JSaT?O?O#7!6?_?Ga[AlA\aLyTj[jsZ}T}zn^~]~~}!33~mMM~}mevp|srT[QqX|[]n~vrrXx\{UuRz~hlsunSqZh{mRxWm~nV|m^jv]j|nV|U~^unnZv~Ti\vlYtmrmT~n^qlRkZdYdZsJ{ALiDiTIDQGpI_ACOd?T#15!13?O??O?_?O?O???_??G?_??G!8?_!7?A@?A?A!4?Q??A?A@A@@??GGC!6?GDA?@?G??O?OA???G!4?A#19!38?OA_CQ?_G?c@?I?CIHCCA?L@GCFB#6!24?@I?OcHqChUgQdITiTiTiTi^t~v!8~n~n~n~n~ZulZulZvkRkRkRkRgQDY?D?WaG_#14?_#22???CH?AS_Di?iO_NOJOI?o?o!5?o?o???I?I?ACG@iSgDA!4CA?OOGCCA?OOGCCA??__O??@???A??C??_@!4?C?@???A??CA$#9?Is@iS`Yc@iCPIcAOGCASHCBK@M@MHEHA__OO`O_O_O_Oo?o#19!64?PpO?@POGEAHKA`lCCAB`??GGKCEAA@HGC?CQAH?AHCCA@GCE@#8!41?_?_?_??@sQCYCa@WdQCODW_?O?_?o?o?o?O?O_?@#18?GcBOHqCxas~~^~vt^Zn~q^un|uj^I^yn~Y~l~{un{v[zm~xcY|xm[ukYuzUtQztn~tzvRw|}}vvivf~n|FJP_f~r~|`_O?CaOGCA@G?D??@??_?_#7!17?O?h?QC`I?ID?iPSqJxlQq]bXW{^n~n~~^~~~^!13~}t~nZuLzUhVlYtiTiTiTiT_I?G#5!8?O?O?O?O?cHQcHQcGRkRkRkRkVlWcVi^f\v^~^~~~zu~|j^yT~TlZoNsdd^N~N~n~n^N~N~n~d~d~lzf]TjVi|hZypkZedrjWxVmDrYpkZuHNitj[qlOl?Z_zCISiDyPiOmOLsHSjGl?ISA$#6!17?_O_?_O_O_O_?o?oKZCNcILInNnNnN~N~~^~v\b|Q|a\qDiSbSJc@i@CO_?`??@!35?`???@?G?A?GA?H#20!129?GA_C??D?HOAGS_T??O!6?G!4?C??A@_??P_GOCGC`A`!4?IC?CA?@?G?@?G!5?A!6?A#9!148?_?_O_#4!19?AC?_?IO_!4?O?O_!4?O?O?O?O?O_???O?Q_@GPcH?CO`Cg@_C`GPcHU?DISADAL?n?ICRCi@ICI@M?fAHcBS`OmP`kT~$#13!118?G!5?_???a?_?O??C?a?_@g?c??Q?H?OhC_Q@OcA`O?OgAP_SG`SAOgAh?_HOOcG?iTaGQdIPKPi?O_LQkRCYDYCJsAH_P_PGsaGdIdYdZnI~I~N~N~N~n~n^~}nvZknULjELJ#21!8?O??_???@!4?D??d?Q???O?G_?O!17?AO!4?_!6?C#25!5?GC?@??C#22!151?A@G#11!59?A???G??A???G??A!4?O!6?A?Oc??_P??O?C?@??_A!6?_$#23!271?_!8?@??@?@?@?CGDAC?@?@_??G?C!6?G#13!7?OG!4?ookUW?G??[^n~z\nvz|}v~y~~}~~^~^!16~nl^QllZUtZsytTi`CoAOl?_Sa_?_O?O??_???_#10!139?A!6?A!11?_GO_O??P?G??S_@_O_OGO?Og?Q?PCIPi$#13!305?G-#5~A\aLQdIPiDqDwBsAdGRcHQDODQcIPaCjT??A?CHO?O_#7!5?`GCaGTa?hU?zUhvlY|vlZ~~vnv~u~u!30~^~n!4~v\nz]v|nvzz\n~znv|nzUlZulZul~u^z\ujSjSze\juHu\ivYlvYlvYluZlZu|Vm^nq|VlylR}d]tYvlYvi|A|aLqDYdRkJyszkRIcH_GOID?Qc@S#15!12?CHcAOG?O_O??GAOcPI_?G_!7?@??OC#20!15?G???_?G???GO!6?A#15!5?_G@CO?dI`?G?@_OG?DAo?G?A#7!25?O_CGQ???g@QcH?sOCPi@UgRkRkYtj]dYdYntvz|]nv|^u~~z!13~}|~|zulZtiVkZtI~?|AsAH?G#5!16?cHQcHQcHQk@}@}DY|j}tZ]lzTM~ZN~~~j^juLzdZM|ULxJyPvl?~TiU|vl?lZci~aRqnUprl?~QU|rh{h[YVepjzEHjPe\_^a[aXcXeHwSBwDqMGel_EhUlQHeXaTgPC?A@?G@$#9?|a\qLIteTiDyFsB!10?@!6?A?@#8!73?_?O#13!4?GaOC`GAOGC?aO?COGAOChQcHQcHQ?H_CaHSjSjCXaSHuHaTGdQGdQGdQHcQcHAgP?OLA??@A?@??A@!4?DA@?@O@G_OgA_C@?A?sJcZCJs_ZcJsJuhVlyd^u\vl~zuIxNa\aD#20!12?A?G?C!4?CO?A#13!17?G#15??A@G@?O?O#13?G!4?C??B!9?G[SNA@___o{M~V^|V~^}^}!19~n^zvl~~^QmlZuJJdYeTihVkRkRdIS`YdYdOI?CA`OGA_H??C#6!13?@A?ACHQcITgRcIt?~A|J|u~v!16~ZulZulZulR}@}@ydAS@Ic@QCiP?cO#4!9?O_??@_A_@aGQ!4?hAGQ!4?T?T_HO`AGQ???hAGO@S_CGPAOCOC?G@?C??AHA@COA@gCAG@OA?QH?Q??dO?CG_CAqHgScASIv$#6!5?_O?G?OG??GG|YvkZulynykZtm\zSg~}|~zun~n^!5~]vz\vi\~Uh~ChUGQdAGQc??GOG?H?H#19!47?C#8!53?_???gQCOk?Y`GcGQdGO?{A[aKqDICPS@ICPk@OQCrc@YcHOI_HUgQDY_HaGQ#18???PC_TaLIn~~v|nZmt^~v\~v~z~}t}znnxnz~~v}z^}v~~l~}vzv}^{uvy~dnnzu~~~|y~~{~^v}zn~YtQbbo{]NVNI@@?_??G??@?@#19!26?_DO???s?I`G?S!16?G#22!85?_???_??_???S_SHqCICpAgQCSCK??~?iT!4?~QcZ??GGC?GGC?~?l??CCAAA@_GGC??_?C??A??@?C?A??CA!5?`P??O#26!9?A?G$#20!249?O#21!18?@G!5?OC??G@C_@G??Q?@?C?@!4?C?A??C@!4?@#20!12?C#25!7?O#8!5?_?_?_?_#11!186?C???C!8?A??@_??C??_OS??A??@?C?A??CA@wCAG`O??UH???GcOASG???qDgItIp$#13!269?A#23!25?@#10!256?HA?aW_X_[_O_W_Ho???@oC?CG??_ChQ?AH_@APk@COAP?_CG-#5S@QCHQcHQDODQCPe?CHAC@CHQdI?HA?ACG@A#7!10?_??OiDgQdYdYdYtJ{jUlY|V!43~\vmZ|n^~nZ}Vl~U~~v~}Z|nu\jtmZtmZsnTyVmxVlYvi\juZ{z]tnZnvLyvLyvLzu\zu\zu\ju|nz]tj]jsZvkZuj[vlYehUhSjcZScZAkRGcRGb?IODODODO_!5?O#15O@C?A?APG?aG?T?`CO_??I_CPG?C?OCaWaS?O_O?O_!4?_!13?_G??G_?I?OAcG@g?dA`?@C_A?OG??_I@O?c#8!5?QCOdGPGPGPGP#7!5?O?OdGPAS@S`CHQcHQcHaHsBGjT?~?zUlZulZulZtmZun|V~\~~~vn!9~u~un~~~i~i~iTmTzUhUhUoDyChAHD#5!16?cHQcHQcJShA|ItiTzA\Ge^Hc}Lmurzn~lZulZulQnydtn|bRqnYvmLbcWMJmjmBaxPIXR?}d]FLzmraXGi}IpGCKbOhSRcjCQhUgR_IpB}?[BsJTS`iSAPMpAx?_O?I?dRGc$#9jShQcHQccIjgcJiH#8!96?aGO_?O_?O_?_O?_!51?CGaCHaSHAOC`IS`SJcGRcHSbGQ`WE`QHSJ_JPcXAcRGcPKOd?iAgAgALOaSgDi??OcGO_#18A??CO@_FMjBA~~t^zmuzzunx\f[j~f[nvmN~z~]^n|~}n~\~m~v~~^v~~R^ut~n|Zu}V~Y|]xoo[W^NV^C?_?C#19!43?OCAG_S?i#6!35?H?HO???T?T?TiPiChUhUhNyDzU|uy!16~ZulZulZsjU|AtITiCxAtG_QH?Q@GC#4!14?IOAS_HOD?PaCPcOC@S@cPAgCAg?@Y@Ga?PCOa?S?TAPGaCbOHCP?hCO@?GT?GC?A`GA?i@S?@G??G?CODI?_OAKbGZ?Tn$#6?iChQcHQHoCQHoCO~zu|z}zulYt~u|~|zv}|!10~^~~nTyVlYdYdYdIsBShQdAg#13!45?@CA!4?C@GA?H??G?@cAOHaSIPcIPcJOiDgPEgQdGTaSHcBC`IOcOGqDGqDGqCHa?@!24?C@OGCa?OC_I?cPGcRGeOnOnOlQlQlQn\jVyDn}jZtn\kv~Xf}IwOOg[#21!18?@??@??C?@??A?@??A?@#13!23?CMIBd!4_z^T}j~Z!5~lznYvmvmvmvm!5~n~nYvm|j}j]zulZulZuLqHsV?iT?~ChQcHQcHQcIPcHOAg?a???GO#22!71?C_AP?cQ@_O@GCO?QcHQcHQlODY???GGC!4?OOIA@_O??WGCC?_C~??__O??GGCv@@?GCaPOGCA_G?O#10?AgU?AcAw?W?S@s???@iSaPE_ALQ_PCIO?O?Ci?O$#20!257?C!7?@C?H?A??@??G??G?O???_?O???O?_?O?G!6?c?H!5?@!8?@#11!189?C!6?G?@_O??O?C?A_C!5?O!4?C!5?CaP?GCA_GASAhC?@_GP??@cA_G??i?S?@K_?\?_?DMPdG_CR_Ti$#25!258?@#13!18?A#25!41?A#10!194?_G!14?P!8?C??@!4?_#26!16?C??C#22??@!6?I#26??_!5?AG?_-#6om|{}{|}|}|}|}|}!8~z~z~z~z!11~|~u|ZmtnTyVlyTmPnOdY`ICPA?A#8!11?O??O??O???_QGCQG!16?OCQ?L_JShATgATgA_O??_!7?_!14?O!28?@A@?QGDa?HaODAOHeOdIOiCRGCRgCQdOGj?Hs?TgAgAGacICOdG_DQcOdW`Y`IOh?O_#25!13?G!9?_#13!35?_???__owM}Jtw~Nvz~|~|~i~h~j^zvm\zV{V{VkZsJ~j^yvm|j^}n]zUlZe\rlSzd\qMXsIt[c^c\aSIPCA@?aPAK`GA?A!5?A#6!4?CG???A?A_???T?T?TiSATgVgVkPmP~iV}!17~n}l~m|m~iTmPmPiTIPeHAS@a@?O@#4!13?S_L?T?cAo?HCGA?A_@G?aGQ??hOCGPA@S?@?GA?K`Q?D_AC@C?QHCOA?C?POG_[?OCW@Ca@O?gAH?C?A@__P?@oD@GaCPmP$#9A@AA@@A?A@A@A@A@#5!8?C?C?C?C#7!11?A?HAcPIOiDgQDiPmOnYd]tzm|~l!11~n~~n~~n~~~^lvzlv!16~nzl~q^sjU|iV|iV|Vj^tZf|Uj\uj\uj\u~luz\}vLzuLzUlzlRn\qn\qnYlr]tjU~lv}Zlv~}|}~lvy\~u\ny|nuXnYtnSzktzkTylQlbSjsI|iToDOdO@O`EGQCG?HA#15!8?C@G?PK?O@G_G?C?S@AG`C?hAsBGRGaDOLaSGdQChC?QC?T?AOC?T?Cg@?g?PcIOI?HC?C?o?SA??OGC?A?A?@?A#7!9?A?A?A?A_?S_DGPAS_@O`ChQcXaKOiCWaKpcItGaZ_Za\jtmz|}~\m|r]v|~|!5~|!4~zv~~~|~|^~~~i~i~iTj|iVgVgRmPm?Tg@#5!17?O@Q?PAP?TiPmPmTidkXSsji\[}NkzmZulR}TjUxVkj[QV_kItBXSgU`^hUYDePqKVlEljcMLajZujUhZ_M`NoKPb[_YDcPId\a\aCB?B_B_?cGWCjAT?sAhQlSM@M?M?I_C?G??G$LO?@?A?@#27!60?O#13!59?GC_ICWAhSaHSAHSaH?QHCa@GqCHaChQCQkOaLOaLOdQK`ISh?QG@cQG!22?@??A??A@?GAS?SA@A?ALQlQLYdYhQdZqlQlYf]d]tnUzmU~krulye\So_??o_#20!5?_A!4?C?G_??_??_??_??_??_??`??_!4?@??_??@???G??@#8!12?S?S?S_CGPaCg@g@gPcHS#19!19?A@?A?@?A@?A@#22!97?OA?aH?S?a@_QCPcHQk@iShEgR?B?_IAP?GCaA@???@?_OGC@_?O??R?_O!6?CBO???B???A@??A#26!6?G_C???G@??@!12?O?_O!4?O$#18!250?@?A?HACPAbNZ~jE\v]z~U\H{VkvXyfQ\jVYlZUz^lz^i~\nz]i~ZV}~V}mZTNt]uJ^BE@?_GF?_#11!182?_G?P??Ca?@?W???_OGC@_?O??O?_O??C???C?O??oA?_GAHC_QGcOAG??@?O_\_ACOaCo?X?kAhOC?A@??C?J_SbGbIP$#25!312?_?O??@#10!194?G???O_C_SGCA@???GA?A!4?K?_GS`O_??K?GOKO_O_G?_@G_PaKaSJ?AKPaIP?ICcAP?SAhOgOM_Z?COIODOc?e$#3!590?_-#6~~v|z!39~^|vZ}tj]tj]d^_^_ITgT?T?O_#8!19?AHC??A!23?aP_K@IcPIC`ICQHCaHc?GaO?CO?_?GAO??_?O@cOGA!24?`???@GAC?HC_QG@C?QGCA?CPGA?aO@CQ@OgPaSHaKOcRCaODyA_]?Si?TCxEpcISgTiShQcOCg?_?_#18S?G??@BEDBA@@ADJ\ANADBIDBALBEBMDAFIBEDANAFHFDA@??_?OGA_?_?O??A#7!21?O?OCOd?IOAs@ShAcGtAkPmA[`ITgTATgVkZkZc~gvwt^y~l~vY~v|~}!6~^~n~~n~n~N~~~Zv]tjUn^i^i^itInYdYdIdYdGTaGaG??_#5!13?dIT_TItOdYcZCjTiJuqZ]}~v!4~u|zulYdZmxflQt]tIdQzaLBohEpIUGf_XSGuKPkOSGon]lbItA{@mIDI@MPC?I@_PGD?@OA`??OC@ADGCIH?GC@AS@CQH?EOH?A?@_O$??GAC#7!39?_AGc@IS`IS`Y_^_^tiVi|i^nYn~~v~~n!12~|uz~~l~v!21~\m^r}tZmtz]tzluz\uZ~v\m~zl~Z}v\j^uZ|n}Znv|mztzU|iv|]vz|n]znv|^u~Z|]~~~}v|z~uz^lv}z~lvz|~zmv|~\n}zl}nVm\ju\rmZkzSLy?l[@uhCwaG??G?O_#15!7?@?AOCAPAGCA_?G`A?O_G_QCAL?DAcDacDAc@C`AD_DC@AD?D?E?aP_GCQ?CAo@SAO#8G!4?CG@IO?O_DGPASg@iOIOaCi@i?IOd#6!53?_?O??O?O?o???cG`IShO_T_T_TItOdYdYtYdYvi\v\v~~^!13~Yti^itInYdZcZCiT_HC_@#4!13?O_???O_I_I`?c?W?cBOGC`GA?R_HC?RC?i@CA?@?S?G@A?P?_CO_?I`?S?C?AgAC?GChA?_G_AP_CC@Q?g?Ag?C`G?a@?GS?A?D?QH$#27!64?A?_?DO??G??O#28!17?O?G#13!43?@??A?C@?_C_HCA!6?PCIChATGA`GCAO`COGA_H?cA!41?@???Ha?DOB_HAPFGrExEZdJViTjUlZmzTnZ|Mhvr|^}sWwwl]u\go__oowWoOWwoOwwOowWoowwwoowooWg[uzL~jtL]j\nf~~|~zv}tn~n^yvm|jV}Tntn\jTmPnOnOn|J}jU|ZvI|RmP|b]tiVi|iVgRcRcZ?VGFI_D?Q?Gd?GA?@#22!77?_O??S?HC_@?G!4?HACHQdICPEWAL?@?OOG?C_OGC!4?`OGCAa@?_A@?a@???G#26!7?O?_??_???A!4?C??C!11?A??g??_$#25!270?C!7?O?G???G???G???G!8?G!5?A#10!200?CA@?@A???@AS?C!4?OG?G?C?OGO_Q?`As?[?SIpI@cOCOALAp?TGhSAXA_HS@Q_GCApAgS@iS@_AW?c?WdA?HChOi?c$#20!296?G!7?G?C?@#11!200?G?C?OGCAoG?`OGCA_@?_AP?i@C!4?S?G@a?`??COI@YdgOgEwAoAhOaSLqIsGTaPoGs@AS@GQLoEpJSeWtiUhUiTlQ-#6!41~nz]v|j~uzmTzmPmTiTiTiCj?hAGQ???OcGqCO??O_#8!38?C@OC_Q@G_DOA`GC?Q@GCaP?A?@??AG@a??@#13!5?@??C??@???@??C??@???@#8!12?@!8?C!4?@??C?@?@?A?C?A@?CA?@I?QDGQC`Y?CY?lQMqOlAkQdISHuGtIPi_Ip?PCOCOCOcG_?_?_?_?cG!4?Oc?_?_?_?_!8?_?_?_?_?_?_?_?_?S?S?S?S?diCQDgDQdODoD_HAgQcG`IOA#6!53?cHQ??dGPASj??QcGPeGtASiT?TiTiTjSntYtJsnTyn~|}!14~ZulZc~?~?~?}@IsASH_CQ#4!13?Qc???IOACG?QC@cQ_L?aH?A?@GAOb??@?A??@S@SGC?Oa??GCQDG@aOD_?@_O?CAP?G?Ca??GACa?OCH_?Xa?D?c?Q_G?QC???@$#7!41?OC`GAS?HCPiCPmPiTiTiTzSnU|Vl~Z}fZuLzn~~n^~^!36~z}nz^l}v^yn|]vz~l}vz\m~|~}~~|v}\~~}!5~}~~z~~}~~~}~~z~~}~~~}!12~}!8~z!4~}~~z~}~}~|~z~|}~z|~}t~lyulzYd}zc~OkpChAO@cGO_!4?_#15!7?A?@??A@?CPGAOD?H?A`ICa??S@C?S?GAPGCa?GaOHCA?GC?T?GC?QG@#7!9?O?O_?O?_GAgAGQcODG@QCOd?TiSzcXeGtASiT?TiTydYtiTyt]zl~uz}|~}v!17~Zul~~Yvm|jS~~lZvmXvI|jTi~iTiTiSjOIdIsJOiDO?A@#5!14?cHQcZ?~?~?~@mtBxhuUZhl~~iVi~iVmTzUlZSzUtn\Hc}LJkA_ZQSGSa[BkRCICXfGVgEXeH?A`OHCHSaP_G_O?K??I?S?D?PG?cAO@G?C?O?G??_?SA?CO?Q?H?C?@$#27!64?O??_??c@G?@!8?_#13!147?@??C?@?@?A@?HEOlQHQdJuHvITmT^tM~mxnynzlYvZmV|Ny^uZt]tz\nZj]z]j]v\mvz\~v\nUz\~Uz^i^uZ~Lv]~j~j~j~j~ITjLyFyLQlQLqLQlQdYdYdI|iTjCZeXvI|jTi~iTiDYdITiDI`CQ?HC@A?@G#22!88?O?GCA?H_CQ??TgT?TgPiCh??jCh??_aQ@__QOHC?a@??@!4?@!6?@#26!4?G?A!6?A??A_??_!17?@??@!4?G_$#18!291?@?@!14?@!4?@#11!192?O@??O?HC?_H?aH?_O?H?Oa?O_@O_O?u_Og?iSaHcG`W?KODY@]_^_|ITeY`LiTmXaKyCycJsA@COJilHudYdYdyTmtY~tM$#10!517?S?S_[AcOcGCWeGSgEGaG@E@u@?HSAPCAdQ@i?S`I?IA__G@SaO?PaT_@PCJOAHsAHcO?Q?G@QcG@iPIc?Ip$#26!524?_-#6kzul!4~}~}~}~}!30~}z|}~t~]z|~iTylQ|itIOtIxAX_IsAgQcGOdIc!4?T!16?`!4?O?s#8!24?A!95?C@?CA@?ACxFy?EwFgAtIt?ZCjIsI?vGVGrKrKpMoItIoIoAcGt?TgPIOiOIOiOIS_S?S_Cg?Y_Y?Y_Y?Y_Y_ISg@yTiXATAPc#6!72?O?OcGPiCOcPcHuGRk@iTiTiSjOeXfWvgVwfXuhuxU|yvy|v!8~i^yV}Ti\jsnOnOnONQL@BOCgOAO#4!10?O_G`I?AS@CHOCHA`C@AC?Q?I@?O_SA?D_C?GAXCI@QC@AO?H?cOC@AO?`GQ@_?O@?O!11?hAC?`O?GAS?G?S??@??C?@aG@QC@AB$#5RCHQ!4?@?@?@?@#7!30?@CA@?I?`CA?TiDQlATItnAtE|A^tJtVlZvnWTZ|~u~i!16~]!4~n~J!24~|!95~z}~z|}~|zEwD}xFwAtItIoCw?t?Tg?O_#15!15?A!11?A!5?A@??A!6?@#7!15?_G_GQgQcHQgAgQcWbSiXa\aXa\_\a\itYluz]tzmztZmr}tZmtzu!25~n~nZvmTznZmZuHvkR}TiTiTjSnXeWfGVgFWeHUHEhADGDA#27G#5!8?T_Dg@iTaSJONOmOnoLay{niRf|Mn!4~lZuLzd]t]tn|JMjugZeTShIx?zCitSiD?BgTIPI`S?_?O_?gO?Ca?Q???_?C?C!9?@!14?GA?@!10?A#3???OB?@`Ahs$#27!66?G???c???G!5?A_?A?H#13!158?@???TG???N_BS?J_VGfGvKrKrMpNtItNtN|XvI~iVmtnTntlTntj^h}j^xV~d^d~c^d~d^d^tjV}DiTe\a\eHVlZulV|VlZf[jTe\a\e\a^a\aTIdQHC`ICPCIcPK@IcPICH#22!91?_?@???_OC??PCG?`O!4?QcHqCI@A!4?__O?F!4?A?C???@#26!4?G!8?@C?@C?@!7?A$#10!498?O!6?_?g?Oo?x?gC?_SITG@gOAOI`SAhCIdAG`HCc?I?JSGbGQ@_CY@iCgASaSHQcIPiCQCOhQCHaS_HaT_I@UgCO`IS??cG?G$#11!501?O!4?O?I?C?AC@O?I@_A_SA_K`SAg?Q_OGOe[aXQlPloItGvGuLyD}DyVli\julZtmTzlQlQlQc\a\a\a^`}hUzlYtiLsYcYsSG-#6Vn^j]r]tn|n\v\vl!4~j^zV|V|V|~|~n^!5~n!9~}!5~}~~|~~u~|yT}ju\ytmXukPiTiPaCGO_?`CGO_!4?S?S?S_CgA`A_?_?a?a!46?_?_?_?_?O_O?_C?C_?_?_?_?_?O?S?TiO?O?O?O_!5?O?S_?_?_?_?_?_!5?o?o?O???_#8!8?A@A?C@QHCAGTArCxItGTaKbGTa\cZcXQdQdISpEHqTiTIpU`mPmdYdiCzCheXcjSjcZcjSjcRwBcRsRgDSjOdASG_#19!5?Q#6!40?_?_?_?_?S_S?S_S?S_S?S_S_LoDiT_TITaKPmTiTiTcXe\i|A{@}@}tI|Rm\rm|u~~n!4~z!8~T~Tj\jUhUjUHQdIPcGCBOI@S#4!8?OcG@I_IOcGDOHCP?D?AC_AGHcGP??@c?AG@C_SI?AD?Q@Ac?@O_C@G?S!24?GCOd?A?@?@?@!12?A@#3?A?@a@$#5gO_S`K`IOAOaGaGQ!4?S_CgAgAgA?A?O_!5?O#7!9?@!5?@??A??H?ADi@CGaDIPeHQkTiTmTzVi^nYzVnZ~v^~j~j~j^zV|]|^~^~\~\!46~^~^~^~^~n^n~^z~z^~^~^~^~^~nvj|iTnzn^j~f^~~^~~n^j^~^~^~^~^~^!5~N~N~n~~~^!8~|}|~z}luz|vi{KxEtItiXqWsiW_Y_WaKOkOc?GOcG???_CG?O??O?O?O?O?O??O??O??O??Og?gOg?GQ_IOcYShaShqDwdguHuhUhvI|zu\j}l^|^u|nzv}z~}~|}~~~|}~~~|}^~^~^~^~j^j~j^j~j^j~j^j^qNyTi^iti\rmPiTiTiZeXaTA|B}@}@ItAkPaKPAH??O#5!4?C!8?i?iSaShUhOhudYPmIvrwld{ij~~~j~j^iXu]DNphWciJAbIvGpKpGS`Q?BCiBGAHOcOI@??_G_G?cO?G?A@??A?@!32?A$#27!67?O@!6?@A!4?G?_D?OC?_?C?G_!92?G?A???C?_C?G???_???_#13!46?@?A???A?C@CB?DA@CBC`I@IPjEhQDiTiTI`]@mPIdITjCjUHeZCjSJcZCjSJCFSJCJcDY`CJ?hATJULyFYDHuHUhUGtACHaS@Q_A_HAOCG@C?@?A@???A@???A@#22!89?C??G?c?P?GCAOA@S???S?S_DA@__OCCABO?cO???A#26??A??C?O!11?A??@??@??@$#11!492?O??A@O?cOG??AC_?O`O?H?i@WcGqdQI`SgpYcGqKOkOe[`]`]`\a\zUlZtmZ|vm~T~i~Ti~iVylZeXfWfWvktkZsnTzmZuZulZuj\ivxn]Xe$#10!502?cGoGPIDGE_Qc?ScQPCG@cOI@CDOQD_I@IPaK?Y_SaGaChQcIPcAGP?i?T?iT?TgDQcPaGAWdGQGQcIOiCPcHcHQcHS_SGCO_CW-#6GfKbM@JU`YdZdNyN~N~nT~Tntnlzn~n~HVlJ~JUh^vnV~VnV~n~n~n^~v!11~}~~~mz\mzTmZsZcZcIcGRcIcHQCOdG@I?IOASi?ICI_IcG@ACG??O?O?O?O_!8?i?i?I_IOI?I?I?I?i?I?I?i?iCiOiSgTqgPeGtIgAgaGagAgUhUhQtQoLa\A\a\qCoDoDy@eWAWaWAWa[`MOl?lOlQkXiSgSiTgDiOaS#8!12?@?CAG@CHADADAPeHU`[aTIdGVChDYaKhBQkBgWdAiHSM@iEXCePIeHSEPiQHSdITgDiQKBgTGcQ@i#19!5?CE??G#6!20?G???O?O_???_?g?iOiCiOiCgTiCZcXa\_LQl?|A{A|A|ItItJshQtYdytJulQ|QdyTityT}XvuZjvp~zxvz~z~z~z!4~n~n^tnTyTnONiDY`IChA?C@???@C??A#4!5?QcHAcO@OCAP?A@CO_GH??G?@G?G?h?CO_P?C??GC_A?gCA??@I??@!27?@!8?O_?O??_#3o?o?o?o?o?Oo?OsG$#5vGrKpmSh]dYcYoDo?o?Oi?iOIOQCO?O?ugQs?shU_GOg?gOg?O?O?O_?G#27!11?@???@?a!7?O??_?A?G!5?G!19?_!62?G@?C?@!4?@?G??O?_!5?A?G???G?_?H?_?@?C?`?AO#13!46?A@!4?@?GA?C@ASGD??DA?HCA@?S@GA@GC@GA@GC@C?B?D?B?D?@CA?@???CHSLqCQ`?GF?CbS?COG???@C?C#9!78?G?C?K?CCGC?C?C?C#5!4?O?O_IOiDiOn_Twd]srQ||z{u~|uyj~h\un\jlZedRbyLysImX_YdATaSJcRKaPCQ?Q?HACI`Ga@?G?C@??GAC?C#29!58?g$#9?O?O?O_#7!65?OC?PCiPcJcJcZTZtkRtZulzfYv}t~tn|jT~tzt^tZv}\zv~~n~n~n~n^!8~T~T~t^tnt~t~t~t~T~t~t~T~TzTnTjViLVmXvItV|VTu\R|UhUhUkIdNqLa\a\aLzLyFyD}Pf\fSf\f[bYpMQ|AnQlReTjVjTiVyTn\j!12~}~z|v}zu|y|y|mXuh[a\itYugrSy`[pAsgR{QdYsPsipiSpcyPisPsipiShugYoiSyOlqwTiuZl}PujqLzhW~vo~z[j~znv~~~}z~z!5~v~~~n~n^~~~^~V~TnTzTnTzViTzcZe\a^qlQ~A|B|A|AtItIsJUlIdYDIsHQlAlYDiTIDi@eG@cOGA??A#22!23?O?A??@GC?A?AH?AG@S?SaHOaS??OOGGCA?@?@?C#26??G!9?_???_!8?_$#11!491?G?C??@?_?CA@??aOH_OGaPKAHQLHESgtQcXUWFSjSzKuhQtiti\j]tj\vlulZu~lzV~i~TynyVylzU|zT~j}T~j^un\j^D~J}F|J~D~mN~FJt$#10!495?_?GCO_W_IT?CaSBcOCaPcC_Q_HA?GRC_BOhOA?p@Sg?PISaS`ISaGQHQcH?QCg?T?iDODgDQCgACi?S@i?C?H?aS?I?C@GAC?I?@!4?A-#5~|i~Y|j}Ti\u`YtYDYtiTGsjchuleteEXQlyPMxIPmPMtGugTiDoDyCxa\?Y_ISg?GO#30???_#7???A???G?BCHATgDoLqExAtKRlQf\juLqLVi^dyDYvhUlZvj^rujvYvxvlV|VlvlZeXf]tjUhV|V\R|V|B{D^tJTiTaXATALA|AtIdRCJ?DIODQCHQdI`CQ@?~@}@eHAHUHe@IdYdITiDiTIdHEgVGfGaL_DIPCJ?jCRHbCRC~TmT~SntI^hvn~~nn^n~n^n^}~~~}~|!6~}~~~|}~y~|~|]v|mz[nyvz~v!4~}~}~z}|~z}~z~|~}~~i|~v~|~}z|~}z~~}~~z~}!10~n^zVlZ~nZuH^rmTnTzD}@~@}@~@}@~@}@eXAcHuHeXaDi@IPIDGbSHADOAGC@?AdOA@G??ItAGaOCA@#5!13?Oc!4?hAgA\aTIOnYtjuLzUn|n}!7~ulZvmXf[lZEhToDDkEd?U`YmPEpGOcQHOCO??_CQ?O@G?g?_C#26_?A#3!12?g?g?g?GO!24?TgT?TgPiChUGQdY_ItA|OfY|$#9?AT?dA#6S@iTaHU`IdYdITiTJSJUHQHIXpEhQDiPEpMPmPItHViTiNyDzE\a^d^tjV~vn^~~^~~~|~|~uz{Zu|iVyLqKxA|GrkQdWaSHqLqgS_QCYdGShQcGO_CGS?CGCGQgAgQGQcXeW`IShUgAgAgAgA{@Y_IOiTi\e|i|q|A|ItYkzs~ytnylzulYt]zl}~?}@}Xe|UhuH}tYdYtiTyTitYewVgvWe\q^ytmzs~Szku[zkz?i?i?iOAS_CGO???O?O?O?O_#8@???@?A!6?@???A@?D?A?A`GAPCbODGC?G!4?@?@?C@A?C@?C?A?@??TA?G???@#6!23?O_CgQc?OcHu_KPiOiCy@}?}@}?}@}?}@}Xe|ZuHuXe\yT}tmtyv[ju|yn|vz}~|Yn|}v~~tI|v\nz|}!13~nZ!4~U|V|a\itnOdISHqChOAO@#22!7?HQcGPeWb?__S?AG_QPOG#26!7?A!5?_?C@G#29!78?aG$#22!12?GC??_!4?a??O???O??G_C??C_?C_??_?A!4?O!7?_!8?_#27!8?A?@C?_!5?A?@?C?A???G!8?@?G@_??A!4?C?G@?G`?A!20?_C!4?A_??c!39?O?_??O!13?O@!4?P!19?P??@?G`?Q!4?O?_???_#13!66?A??CA?@C??@??C?@#4!144?QCHAgCQG@gApGC@?_GC@AH?c?I@iS@?Hc?cAOA@I?HO?_D$#11!490?O?AG_Q??GE`WC@?oG?hAlOE@IO_?QcHlIseTUSZQLoLqnYvi\ulZlZU~T~Q~tni~T~j~U~l~Y~t~i~T~~T~i~TiRi}iTiTzUhvlYd^tI|ALOdA$#10!493?@!7?A_OM@AsCO?AhOc@IUh?QAO@H?g@_CaLQGOdGTaHQcQc@?A?D?A?T?i?S?h?Q?d?I?T?i??i?T?i?C?@?AC-#5!11~Vmvm^j|l}mzl\|z|l]}UrZxl}mzl|neU~l|neuj\t]~mVvlttzhcyCPAOhQCG_#30?_#27!5?A???C!5?C?O??@?A?G!5?O!5?G?@?S!4?G?C?OC!22?A??A!5?G!35?@???A??G??A!5?A?@!8?G!21?C???G!7?@??A!10?C#6!43?_?_?_?_!15?_?_?_?_?_???OdW@qCgOGQcY`M`GQdYtJ{jSzkR{jS~lynyvY|mz~|~}|z}|~|~lvz}Z{~|v~z}|~t!4~|~~|~~}z!22~n^}~ZvJuH}@~?}@s?iPIC_CO??A#22!7?HQcZ?u???OOG??PCOGC#26!4?A??A??Q?C!5?O!6?O??C#3!16?S?S???@???T?T?TiPCPCPChA!5?dGPeWbKpEgU_SHQgQcGtAsJcXvG$#22!11?gPGP_S?Q?PCOa?C?Q_@GGcCQ?PCOAOOh?OAOOHS_I`?P_GOAG?CQ@?g?C??_#7!12?@?A??I@QHAlRk?HCPeHUhEHaTIcRCzC~@jUlReTiZejSjSJcHU?I`UHQdITaLqLqNoLqLOfGTaCRcRK@i@Q@GCA?AGC?D?HC??c?GCA??C?A?C??C??@??@??@??AO??G??A?@AC@ACAC@!5?@A?AHA?AHCA@?i@QdATiDYdYcYfGRmTjTnYvItIzn^znznznzv^~^~^~^!25~^~^~^~^!15~^~^~^~^~^~~~nYf}LzVnvlZd]p]vlYdIsBSjCRkBSj?QDODGdAPC?A?@AC@A?A?QGC@cB?AG?C@A?I!4?A??A??@C#5!22?O_@?cGsHu@}?~@}J~Tmtz^zn~~|!7~ulZc~Hi^yFetjeGjaPGfWf?OG`?OH??_PGcRGAHe?AO@?C#29!20?_??@?A???g??iS??g??g?O!6?_G#10!8?@A?D??@A#29!4?OA$#6!17?A?@??A?A?A?@?@C?A?@??A??H??A??H??A!4?G?AGACQHCzE|jUlZv^~^!5~|~~}z|~~t}hulQkQ~szeXuhUxe\itZkrCy?iShQkPiPcHOjSjsZuh~t]hulYti\qLqLoLqLonWvi\rkZkr}T}l}vz|~|vz~y~uz~~Z~vz|~~z~|~z}~z~|}~v}~|}~~|n||u~~|~}|z}tz|z}!5~}|~|u|~|uz|}zT}lQ|iTydYdYdWtkPiSiOdGtIpCO_COCOCOCG_?_?_?_#4!199?T_Dg@AOGaODaO??OHcASGe?cPICA???c??OG?cAO`GT#10!39?cHOAc$#4!30?_#31!179?A#11!279?G??OC?GCaO??sG`GOHc?g@IcRGc@EOlPlIKbIpA|jU~lYvi\ju~lzVj}HnyumXu~iVi~?@mzEzmRUlZun|ZYVeXf[rMxVh]hugVlYtI|JsJcGv$#10!492?C@!4?@GfGA@SAd?QHEO_PGcRGoHAcAO`GSAgASh?QdGTaSH?QCg?@AODGOcH-#5^VNZvL]W^W^]nEV]?^?^_^A|B^aTKrLQkZcJKJCjSzTMXmXuB~dZtiD|lZvnT}}rWLdw[h{?{?yCgS_S_S?S_#7!4?@??A?A?@???A@?A@?C@C?@GACR?J_RGE@QHA@A?@A?A@?A??HC?Q@GCA@?A??A@?C@A?@?A?C@#5!19?O?O?O?O?O?OCOcOk?kOcOCOcOcGSgC_GO_GOg?gOg?g?g?g?gO?O?O?O?O???O_#7A??@?@?A@A@A@A@A@QBG`QHEhQNsNsNsNsLzD~D^lzMrnR~Rnrn^j~jVjZfZnZnZnZvLzd^tjVyTnTjTnt~JvJVlZd^t^tnTzFyLzE|A|B}@}?~@ITbJQDRK`ISa?`GCASC_HC??@#9??kOk?kOKOcSgCgSGS_S?S_S_CgSgCgSgCK{k[[[sK[CKCKCKC{K{SkoS!9?CKC[?KcKOK?KgCKC#32???C???C?CKKCSK{#11!9?A???A@??@_?Q@G?ShACaCiPChCPI_J_]_[b[`[cYcZlvYnylZulYvlZb}HVyamTrmO~QlYsJgZeXdZmPnQ~PnYdZATBTIdRCjOJCBOHBaHA?A@$#4___??_`b_B_@?`_@[_{?[_[?{?[gQKQl?CGcOCgS_?gOCOcG??OcGO?A#6!5?@?CbOIDBU@zB}DzVi^j^j~j^!4~}~}|~|~}~}~|}~|}~z}z~}v{zk~s^kvx}lu|}|~}|~|}~|~~uz~l}vz|}~|}~|}~z}|~}~|~z}!19~n~n~n~n~n~nznZnR~RnZnznZnZvjVz^vn^vnV~VnV~V~V~V~Vn~n~n~n~n~~~n^|~~}~{~|}|}|}|}|{l{t]luxUkoJoJoJoJqCy?Y_QC`KOk?kOKO_S?SgScWcOcOcOcGqCY_ISgDiOiSiOI?sGsgQcY_I_IOiCwDqCxA|A{@}@~?}ti[slykr]tj\~]vz|jz^uz~~}~~RnR~RnrnZhVzVjvj^j~j]j^zVjVzVjVzrBBbbbBrbzrzrzrzBpBHBLj|vn~^m|~|bPbbRA@_`A@?B?@A@qC?ICCgOG?o?G#4?AKCKCKCYKISHCI?KStKKSLKS[gUk_SiOgPCpC?I_I_I_S@SaG@Q_#3!13?S?S_CGPaKOl?lOdIsPcX_YcPkOk?kOdYc|i{itYkzSnsz{nu{\u|yl}~$#10?GOCGO???_?_OG!8?_??_??_?_?O_#11O?_O!5?_#30!33?@#27!13?@!6?@!13?@!35?@!101?A!10?A??A!5?@!12?_???O#7!105?A!10?@#31!13?O???G#5!10?A?A?A?AGO?_PA?AWaW?kPIRMp]rSzQx}LzzDrrRfRbBrBb@qxrwrxdrtHczs\?IAaOb?q@_@?@AH?DAGAGaPCOD#26?@???A?@#29!21?@!4?A??A?@?A??A!31?DO$#3???_?A#22?C?C???OG?b?B?B?@A??@A@???B?BOB_R?JCA@a@A@{?I?ADy?QcGOi?@GCaOA_?AC?@#31!361?_O!16?_O???_???_!5?_#10!23?@_??GOAG_?a@A?OH?P?CaOAGcPCO@SBGaG@QcHCQGdODQcHQdGQcG@aG@S?G?@!7?C??C???A?@?A$#11!15?_???_#22!448?OGG?G_O?G_O?@A?B?A???_Q???q`??@#26!4?A???O-#4VNs?O_@ObLPK_]_YDS?z?}@Qk@yClRGS?@G?@c??Q?g?HC_J?`A?PC@iO_GAC??O#6!4?GC@aHCHaLA|AtIvItjUl~n~n~n~n~n~n!4~v~v~v~v!20~v!12~v~~~n~n~N~N~n~n^rnZvnzmXv^v^vnVnZnJ}JuLqNyTiNyDyF{JtITiTiDiRM`^@}DYfGVgRcREPjEpFgVGVGVpE|A~ITi^a^jUh^i\vN~N~n~n^~n~n!4~|vz|}~~~}^}n}v}~u\zt]jszSzsjUxvg^uXu|qkP}tylux]titiTjSjsZc~I|Rkq\ulYvyluxuxUx}tyv{zu|u|yt}tz}v|^z}~\z~|!5~|!11~TiT~DyD}DzLyFyLYfItItJdITZD]djli[{x\^[~K]NENEFEFfX|[\BNDHB?@!4?ENFEFAFFHBIDJCIL?G#31@#37_#20_#12O#4A?O!6?_!7?O?o?_GOG!7?_A_@yEtTjmTxCpHk_N_Y_T_T_T_I?O_?O#3!9?xASG@qCwBkPeGtAt?YcQgISiShEgQLOd}~Z}n|^ze\jv}\v}Znt~~|~~$goA[`]OcO_?_#22??@C#26!6?O??A!8?_!10?_#22@?@!6?@MGBoA\_DgC?O?GC?aH??_??O?C#5!49?G!12?G???O?O?o?o?O?O_KOcGOCPeG_G_GOgOcOs@sHqLoDiToDyDwBsItiTiTyTkp]_}@YdWvgRKZkxmCpMwV?v_vgKXA|?diT_\_ShU_TaGo?o?O?O_?O?O#7!4?AGCA@???@_@O@G@?HaCI`SJCjCJShEGV_HeHALRm@IDQHE`ITITiSjSJcZ?tAkRLaHQdGDQHEHEhE@IDGBCHAHADI@IC@GA_C@?aC?A!5?A#9!11?iTi?yDy@yCqDwDqdGTItIsITICY`ISAT!9?o?oW?w_GCA?AG?IUCNEMDNC??O!4?O!8?IC!4G?O??!5O??__???_#11???_??_o?iDA?qLCwOQCX?ICPiC@IcQH_^_^_^_^_^_^dYvLulZulZulZCtjUsLyB{RmXvI|IudZcTtaTjUxVlqnY@?c@OA_CXaSG@aG@cOI#29??A$#5??@BM@M?C??B?@?@?A@C?@?C@??@??d?@U?T?RGD_C@RCQIcM]HvKrmS`VsLxa^iVz~nvry\Squ\Q|AlIpGtIShQ?O?O?O?O?O?O!4?G?G?G?G#22!98?_!4?C_!4?OG???g?G??A_???O#5!164?O_!4?O!4_?O?O!4?__!5?G!8?@?C!6?@A?AH?GGGLGGCKDWCID?DBEFFF\MN^!5N^YY\NxxNnxHWWuG@wTapaLaZCGc?_G!4?A?CA?Q#29!41?G??G??G$#10??G_??_JGQkO^_Y_AhA?B?g@QC@Q??A`I_QaS?bODOCCq?O?o?SGaGO#7!361?`!6?`!8?O!4?O?O?G#4O!5?O#30??@!9?@#2OO#3!5O#33_#10?_?_!4?_#6??D?_?C#26!12?G!5?@!9?O$#11!10?A???C?w?{?{?Eg?wCgQkOIsGDGiGSiGjQg?HCO??_#33!365?ABEA?B?A@?@?@?@??_!4?O#16_!6?OO#43___??_?___#46_#47_#41_#16O#40__#49_#50_#51_#2!7?_?__#32!4?A?A!5?A#10!8?P???@EG@?A_O???i?O@CO?D?I?I?I?T_IDGaHQcHQcHQcAG?`I?@C!8?@??@A?@$#31!421?_??_?o?_W?G?A?A#3_!6?OOO#41_#35G!6?O#22?A??A???A!7?@!8?D???CAO?EEDF@FEF?WCK#30?O$#4!423?O#36!5?_?O#32???_#2?_#10_#14?_O!7?O!6?OOO?O!9?_?_!7?_#3??O$#24!441?_#37_#19G#39_#34G!7?O#48!7?_#1!13?_$#38!443?_#40?_#31?@#44???_??_$#42!447?_#33???OO$#45!452?_-#3~|~~|}|y~sz{QkqKoCg?GO_?g?g?g?GO#5!4?@???A??C??CB?@A@QGAEGraWMZe\huhUjVn^zvm^~{uZh_qkZu_vGtQdWdAdWDGtAoCOdGt?TgT?TgT?TgPi?gOcWaWqCOCOCOCOCOCOCOCOCOcHShU_}@}@{@iSPEWdY`YcQgQcZcYD]xe\yd]huXe|ivy\}v{~y|}|v}z|}vz}]zb[tZzVt{ri}j|{ZzQ~]kfYzktqx{zYlhudYtYDwCyDy@kOdY@KpAS?Sg?gO?O_??_GO#7???@!6?@???@??A!4?C@A!4?@??@!5?C?I?CA?@???A@??H?D!4?@#5!14?_?_?_?_!21?O_CGO?_CgQGT_?S_?S_GO_HAD??OAAo?@DTT@@C!4?@#37C#60O!5?o??WWGKG??CC??GA!7?_??O!6?CEAE?C??CCC?S??GggWGG_?_oo?__??_#6@#20O#66_#11@!4?@A@CCK`Y?dIOI@IcXeGvGeXCzCzCzCzC~TmtZulZTulQlZQuhVyTmTzTmXviTmXvI|jTmTyV?Q?cPGCAhSa@GOA`GC?QHC$#4?A??A@?D?A???A?@?@A??@A@A?A@??AC@?D???@?g@??@Q_OGCg??d?o?CPaOCHaCGO_#6!9?@?CQHCRcHVGvIlYfYlYfYvI|NznYvI~iVi~iVi~iVmT~VnZf\fLznznznznznznznznznZujUh^@}@}B}TjmXfYd]dZlVlZcZdY`EXaDY`UHeXATGDa@GB?DA@AG@CA@GC@?CGAGC?GA@C@??A@C?D?@Q?D?BGDA@C@QCHQdIdYDzDyD}RnYd]rM|j~jV~Vn~n^nN^fNnN~Mn^nN~Nm^~~}~~|^~~~Z}|!4~}~~}~~^~~z~t~z|~}~~~|}~~u~y!4~}!14~^~^~^~^!21~n^zvHeXATGDaHU`ITaHUdIodOlQDX?KHAI?A??A@#35A??A??@#36@#20?A#61O??O??!4_Woo_OsOoUY}cue[e?iMy}wqsWowowwG[?__gGGI?O??_???O#58?C???G#10C??A??@??@??CAG?I?dO?@cO?@A?P??P?aCX?rChCQ?iPIcHQc??OG?_C@$!6?A??HCBkPKQC??HaCOC?h?SAh??aGaHUgACPCi?i?HCq?TiDOk?u!5?O?O#9!16?C#22!79?_!13?_!32?`?S`A_C_GAGS@S?A_Cg?_@W_COAGCA?c?Q?G???_A!9?_#9!13?Oo?O_Oo?oO_Oo?oO#5_!6?_???_!12?_#9!71?eXExAdqGUhITiHU`ITEWiQliC[BEC?GGCE@C?BB?@@??B#58?A#55A#10@#48A#33@#24@#37@#52@#40@#42@#43@@#67??_?_?_#68_!6?_?_#67!5?_#43!4?@@@#41@!7?A#62A#1@!6?A???C???G?OO?_G_#26!12?_#3!26?_HADACh?UgDiPiCiPeGTiPeGtASiPiDg~l~Zmvz|Uj\}vn|]vz~luz~~$#11!12?@?@_JyTuTiLyTUTiTUtj[vWugV{zCyTzSlQ_DY?OgA@H?GC?_#4!347?__?OOO!6?C?C?A#12A???@@#59?A#53!40?@#54@#55@#56@#37@!5?A#3@??A??A!4?AI?G?CCGA?_$#26!47?G?_?C??O#22?@?GD@_??A@EHSgO_CGP_?AH_CQH???G!7?O??_#19!311?@??G?A?A#16G#41O!8?C#34!50?@#14@#0@@!6?A???C#57@#35G#14C#43?_#69?_#23_#22A#0?_$#13!411?_#51_#40_#66_#44!5_!4owgWWW[!4KCEUQEEEA!4B@B@D@B@@B@DD@D@B@B@@D@B!6AEAE!7CGgGGGOOOo_?_#31!6?C$#3!416?G!4?C!4?AA???@#46!47?A#51??A!5?C!7?O$#52!416?O#54O#10G#7A@#49G#48G#46G!4?C!5?A#2!48?@#20A#5@???@@A?A?@?D?KA_@?G?O`Pa?cQ?_I@COA$#24!419?G#63G#14??C!9?@#24!51?A!4?C#17C#39G#65?O#47O$#43!419?O#51!5?C#45!5_?o___??OW_GG[K?KKG??WGW?WY?O??CKGAG?GC?s_wWWO_ooo?O_OoSO???_#48G#64???G$#39!426?C#4!59?@!4?@@?@?C?BA?@E?U\iWaPS@GITcOIdWcXeGvGeX?aCG?Q?h!8?I??_O??G$#9!486?A?@???A!5?C?GGOO$#42!486?C#12@!6?A???O??O$#40!487?C#46??G-#3~nVv^NvV~^^~^^~NlvlFZflVQnD~UN|nolololodycxaSg_g?@O_#5!4?@?CA@CbIQC{HViFqgzeJVm\j~~}l~~ulytmXvkzuJ|uwi{r[rkR{b]pnWfXuhUwqlQ|a\itYdzSzdYtjSzcZsjSz[j{vWn{yTmxulyTm|ZuzkZsju\j}|fz~|~}z|~~|}~~}~|!12~^n^~~~^~^~^~^!19~^m^!5~{}~~}!4~|~zm|YTqlitZW`Mpm_nOMtYcZcXaKoDW`Y_ISgSgSgSgS_S?S_S?S_S?S_S_CgOg?gOGO?O?O?O?O?O?O?O?O?_CHsH_Q?cOCOCgOcGOC_S_COcOc?S?c?S_S?S_GOg?g?O?OeAIO@@D??A@G@C?AA#38C#4?@#61?G??__G?wAsl???A!4?a_aaA???A@qrrzu~V}LEZFMOFiDAeDID]dYLuJ]tErVvARFJrQReBFReEaUeAeUaQEAEAMEMojUUWs?g?Oo_O__???_#11@???@??@D@AFN?siOGs?wOooOooOoGqHeXEXEYDS@gATI!5?_!10?_PC_GAOH?cAOHCA#76??S??C?G$#2?O_G?O?g??_??_?_O??O_?O?G?O??_#11??CQCQCQCI?PAShASD??cHUg?vGpIpKoGoDwA?_?G#6!11?@Q??HQDIPeGRCHsAHFTBKbKRkB[`MOfWeHUhFLQlA\aTIdYCjCYdISjCZcJSjCbSBGfOBDiPEHQDiPAcHCRcJSHaS@AGC?A?@CA??A@??@?A#4!12?_O_???_?_?_?_!19?_O_#6!5?@!8?A?CPAdIDQDIcB]`MPNOnPIdZcZe\rNyf]d^tjVjVjVjVj^j~j^j~j^j~j^j^zVnV~Vnvn~n~n~n~n~n~n~n~nQ[B_I?UGdQCRCiPEHQDiPIDQCRcIPIcRRJBBJbZVNV^V^l~nH\dFAAADH@CAA?B@?@#24?A#16?@#45__???@A???_okK[MrrPVPXpvRRp}HGGCH#67?_@?@??@!9?@?@!9?@??C?@?@??C??C??C??C!4?C!4?O??C#72?@#60OGG??_#10@!6?KHG??ySoC@g?hI@CqIiCdMII@NIHrLUXExExDy@iS`It??wCw?G@U`IT_S_G$#29??G?_?G??_??_??O?GOg?W?gCOg?gO?O#4!11?@??A?D?A?@Cj?UIpGQJODgA@c?T_DO?O_#22!97?O!61?@!6?A@??@!10?_G?O??c?O??O??_#9!64?lBwU@uHdYHjgjPEhQdiPM`YhjGJPm`ZGk?KgcGC?_?_?_!6?G?_GA??ADC@??@?@#41??A#33@#70@#56@#71?@#78!31?_?_?O?oO?O?OO?_?_??_!8?G!7?G!8?OG!9?__??_?_#24@??A#16A!9?O??_#14?_#6??O#29!27?C@G??C?@?@?AG!5?@?A$#1!5?_#10!10?A?A?C?A?@?A?@?A?J?J?J?JODICGATHQy}HUgRSG_C?C_?C!4?OG#79!300?_#31O?O??_#33!5?A!5?__?OO#35_!7?C#68!41?QwCW_NGDiLHiDi?YCqHS`IxKgGsKoOKkcWSg_GwGgGwGgGCgSgG_Wo#44??@@BAAEA?CC?G?O#4BAB???A??C???G??Q@SJD?TAG??cG?_???_$#1!24?_#22!40?@?A??OGFCHSgPaS#19!304?O!8?C???A#3C#60___oOw?O?G?_O!6?O__OKCCGCCKGkkC?CCC???G#65!4?_?_??O_O?_O!12?G_?_??G?gO?O?O?O?O??_OgOoO_?G???_HG#73@#43O_?WCOG?_oO?_#80_#49_#9C#17O$#14!385?_O?OO?GOGG#43_??O!8?A#45!71?!17@FCGG??S?CC??G?O?O??_#38O#74??_#29A$#4!388?CC??A#52_#16O#70O#44___OOWGkCsK[U]UmD|JQ^NBPB`?GG?G!5?G#74!71?@#75A#46G!4?G#53G#5@??AA@?L@IGAcO?C??_!6?@!4?C$#7!388?GG??C#41?_#55?O!7?A#59!101?A#2@@?AAC!5?O!8?_$#10!390?_??O???G#37G#54G!9?@#64!96?@#56A#77?C#14@@#1?C#3CC@C?G!4?OO!7?@?@A@C@E?DAC???_?_?_?iOAS_?z~EzE^tuh]ti^i^t^mz^v|nu~Z|nuz|~~j~~z~v~$#2!391?_!9?AA#58!107?C#35C???G?O??_$#17!396?G#48O!4?C#68!108?_#50?G#20G#22A??C!4?AG$#1!399?C!4?@#48!110?O#76???A$#46!400?G!5?A-#1xacpSw`aP_T_Pg`a_`S@?_PGO_I??O?_?COI?cOA??O???_#10?FADiCPD?G`?Q!4?Q@I@aTGDA??_#6!13?@??A@?A?D!6?@A?@A?TA?J?DOGA@GAPAGDAODQC`I?@AGAS?HC?A?A?HCA?@??A@?A?A???@C?DA??A#4!17?_OgCgSgCWaTIsYcJsJkCZCjSJcZSJcjSj[BcjKBkRKjcSeOf?vcsGSgCgSGS#6!11?A??C?A?@?@??AHSASHQDiPIDQHePIDqDyDY`UHeHUjEhUJeXEhVHeXEhQLa[B{B{B{BsJuJuZuJuLA@!5?P??A@??A?@?A??A@?H?CA_@?C@?C??C???@?D?A#42O#56G#60_??_???o?AA@?@!6?@!7?A?@#78G!6?_#75!10?_??_O___o_osoWWuM[USYGOSSOQOSOOWWWSOY{wswaoq_i_eaaUaqqoisogOO_G!8?A!7?A#43?@!4?B?CGCKO?Wo??_?_#16???O#76!5?C#1_#22O#29??O!20?@#76!23?A$#2EWPIhAYSgVgTiCYSYSGqkQcQcPOhU_QHO_?_!4?_#11!10?TAk?ntIVkZviTgS_SG_?_OGC??_#4!82?O#22O#10!39?_?O??O?_!6?_!6?O?O?O???O?_#22@GG?G@!9?S!7?X?SGAHGS?A?@?@C!18?C_???G_O???S??_#9!32?pMoNoNPiEx?UgBxEgUhUhTgU_FyHUgu@WO?AWQLAL?VAE@EB#80G#45__O?__GpW{{wy[^}}\OO?BIAEFFDDA?@?@@@!5B@?@?@@#78??W?G_WIG@C@?DE@?O?G??OC@@C!4?@@?@!6?@?A?Q!14?_?OOS^SMYE!5?@A??@!8?G??_O_?_?_#82C??G$#3?DICADCHEGAICRCHCI`KRKAdJCdQhNcUjYdSzIls^ilu~Z^vgTy?xAwO?O_#5!5?@IPiDIDIdQrJyKZUv!8~}~~|}~|~y!6~}|~}|~i|~s~ynv|}v|m|vy|nylz]t~}|v|j~uz~|~|~uz|~}~~|}~|~|nn~}z~y|~~|!17~^nVzVjVzf\itJCZcJsAxCjSJCJcJcZSjCBkZCRkRKrCRJWfO~?YJvjVzVjvjj!7~e~jt|urj||!4}z|uj|julyTmtyluXmtyHYDydUHeXuh?xUHsXexUguXexUlq\b{B{B{B{JsHsHcHsHqKoNoNomCxE|gV{CxUhShUgUhUw@sHUHy?AG@C@QD?I??@?@#43??G?C#61O!4?_??DCa_?@_ni}{TwWgwwg{e}^M]MKCC[cIFADIC@D@LDHDD??@?B??C@#85!11?_?_#61??@!30?A?@OD@@AGBACD@ba@@A`@QAOCa_G#10@!4?A@A?A?@!9?DAA_FOj?RCqSiDA{@}?}@uHsGsIShSd$#29!16?@?A??@G??I?C??H?C@I@CPAH?TAH?c?GOg#4!4?A?ACG@cGTiC_C?O?aOGd?ODOCg#22!121?@!4?@A!4?_O#14!154?_!5?_???g?W???@??@?@#53?@#65!15?_?_O!9?__O_???_O_o_yOAoQ?AOOEWMGG@AG@B?J@EBIAIDLAJKECCAJD@EJATHLHTTHXThHHLIDBITMhMd@__@_?w?_?wGoGGG???KeC[koWO#14@?@@@!6?O?_???_$#26!70?O#22???GC?B_@G#11!128?O?_O???O???O_???_??_??G#31!136?A?@!5?A#83_#2?O???CC?A#81?A#43!24?O?O#68?_o_OO?W_WoWkWCYCIcA?E??FGA??A!5?@?C@G?G@GAHCA?AAHC?A@?CGC?C?IOCG?SC?DOGDA@E@Ag?I_?wE|SkDa?A?C!6?_#41?@#49@#47A??C??G??O#11@?@AB@FBFBNB@A@C@_@C@c@C@?Q@A!6?C!5?A?GOcGQgDgQcGQcGTaG$#4!368?CGOC?G#19?G!9?@#59C#67!35?G???C??A#84!16?__?!11_?_?!7_#60!34?@#67O?OGsSO{}{QWg#60@!7?O#0A!7?O$#79!369?@A?B#16_#10?O!6?G#17??A#44!131?@??A!4?G???OO?_#37O$#7!369?_?G#33_#20??_#70_!9?@#45!135?C???G#4?B?A@A@AC?M???C_?U?W@C?C!4?G$#36!369?C#34_#24_!5?O?G?C!5?A#70!134?@#46O_?_???_#1C#54O$#3!371?O#35!4?OC!6?A#37C#53!137?A#38A??C!7?_$#49!379?_#46_!8?A#24!135?A!5?G$#44!381?__oOOWGk[]EMD@AA?@?@?A?C@??D@???A?@#2!110?A!5?G?G?G__!5?G?_??O$#38!381?O!8?@#69!135?C#6?C!6?G$#0!381?G!6?@#3!140?C!4?C???OsGWOO?gCoIGi?}Gy@iTg{@}@~@}HqJuJtjSjQnZvlVyVlZvlZvi\v~|!6~$#5!529?@??CC??S?GGO_?g???G???O$#40!529?G!4?_$#51!530?G-#2_pQpSr_psq_xcQpwL@T?E\QLWHMCNGE@sGqSGC`Q_@_O_OC_?O_???_#4!7?A?HOa?HOcQwOgsoopgdWRKo!4O_O_O_O_!8?oo#6!7?@!6?@!16?@#4!6?ooOoOoOoOoOoOoOoOoOg_gcgsgSgsWsgSgSgSgSgUgRSidItQLqtItqTigUpUGsIPDiA@LAI?lACAT?LA{PmQpSgpShuOdySpI`MPItB{?{?kOKOaOaS_#6!12?A?@?A??A?@?a??A@OAK`QG?@GD?AH?C@GA@GC@GA@GC@GAPCi@Ci@SaLAdIDQdIDG!10?_???_?O!5?_???CE@A#33@#47G!5?@#69?@#61g__CSWMMdeNgOyT^FJ!4B@@@?@?@FABBAD@B??ACAC?A?@#85!7?_#88?_O_ooowoow?KGCIO!4?AC?C?O!4?q_oowwGsGoGOO?O__?_???___??O#85???_#78CAD?A?C?A!4?!4GKGKKkYSOGA`_?___??`?`?O_?_???_#91C#3CE?AAI@LDIlZ]JcXEHEHUhEhuhUlQlQlZE\jULzLrm|r}tz|!8~$#1VMDMBKVMJLNEJLMFa]i~x_cqfa@xorw}AtG_boWcS{QeXAoG???O#5!15?C?A@?DADAHFIDYFkQNNnNn^n^n^n^!8~NN!7~}!6~}!16~}!6~NNnNnNnNnNnNnNnNnNnV^VZVJVjVJfJVjVjVjVJVhVkJTITADALADIDI?D?I?@A@?A?D?A_DOAGRG?hAO@A?HCA@CAE@MAC@MpMpItAsB~B~RnrnSfSjTZ|z}z}z}zu|N|~}~|n^|~}~\^~x{mlrUkvv}fqzlsuzyv|}vz}v|}vz}v\mzT}zT}j\q|YtylYtYvlYvi\juXmJDmTiLze|zUlJEC^E@GCD#38G#83C#35@#10@#45G??O_wOWQOG@!5?FF@A#75??oo_??__o_o_!7o_o?___!4owGkwsW[??ECDEEF!4B@#85?oOoGSM]IF]Li~yvNudBd!6?_#94!10?O?O??O??O_??O#89???KI?C#68!5?AAAB?AEBE?AAD?B@C?CS#67??G??G#43?A??AGG?GC?G#5@!8?O!8?__#29??_#4!18?O$#0G?g?g?G???O?O_??O_!7?O_#29!5?@??@??A?GA?H??GACi@GCoGOGo?O_??_#22!19?@#10!98?_!4?_?O_?_O?GO?G?T??C?Q@Ci?OGs?@ODO?gPAA_?AG?CG?AG@??@G?a?CO?c#22??G!8?HGH?IcAC@C@C@CHAo!5?O_!5?_?CA@O?G@?G?OGCOAH?C#14!13?_#9!17?_?QdGTaSHePsY@iTACHACHQSWj?HI@A?A#39?C#86A#43CC#80A#59A#46??@#67??_!4?GG!4?G!16?CC?IKKC#84!8?oO??__owWwWgGGCKCCIB@BDB@@@DG@?@?@G_HYkYD^NLDCEIUMUMMMmMKMKGGW?OWGW_O_OG!4_GOGO!7?_!13?G#89???GG#45???@!5?C???O?_#11C#37O#48_#56_#17O#96_#14??_#76?_!5?O$#3!21?AH??C?A?C@?GAD?CB?HB?L?ElBTzC]`yLShuHugTq?S_??O__#11!121?G?_??_??_?Qh?h_GoCoDoIo[_i?t?cgSOl?_P_AhSAgOG_O@G!6?G#14!102?O#4??O#31!4?_#3?_?O#34_#24O!5?A#42??A#37@??@#68!5?__?O??_O_?_?GCKCCCMIADIEMGC?GC?A?RD?H?AD?DA@?@???@#87!4?O?G??GCCM?A#95??_?__?_#94!7?O#65?G???A??@#85!12?_#65??A!8?R@?J@NBN@FDCC?EO??O@OO_g?UXQB`[\ApQUO[}?S_S_O_??__#10A@C@E?IDQC@CJ?HEHEHEHEHUhQlQlQ_o_O_o?o$#76!26?O!8?IOGC#10!10?@?A@?@!7?o?C@D?C?A@?dA@AGCQ???_???_#22!104?G#26!12?C???G!16?C#19!133?@#16??_!4?C#65!15?o?O?O?GC??_??O?_OO?O?P??G??G???_YPOH?ILACABA@@A?@@A?@#93!8?_?o_?_OO_OO#75!11?A?B@?!8@B@BFFFNLFFENNNLVGOOSo_o_{!4wsoCoo_o_???k__GWAAATCc?d??i#46GC?G#0@??A!6?O??_#11!4?OAO_O?_O?O!8?CHACHACAK@AK@ICA$!51?C?AAE@EHFILLJQmWjQLWkAGOGC!4?_???_#2!278?_!5?A#78!14?_?O!5?_O??GwW?CKICG??@G???O?G?KACH!5?CGEALE?A?@#87!34?O?_?___o?OO_O_O_???_??_?_#67!12?@???@???A@#44!18?@?AAC?GG??O?_#60_#83O#33?_#1!8?_$#14!364?O#0O!6?@#43!38?@#68!78?@???A#61!13?@?@?@?@??@?B???C??@??A@?I??C?O???O?o??O#77O$#81!365?_#44_?oow{oiKkIEEFHHBE@@A@#47!148?@#54@#70@#16@???@#66G#4@@?@CGAO???_O?c?O!4?O$!366?G??@#68!169?O_?O#92??G#8G$#70!366?O#60_!5?Oo?S???CA#42!157?A#55A#1@??A??GG$#41!367?O!6?@#35!166?A#2@???C$#1!367?G#59!174?C$#90!542?A-#2TjSATISlJcXASbMpA?_??A!7?A??nTiTeUKTmIxIyTTulI[PWDI_T_G?O#10?@?@#11I@Q?ATgD_Z?Bs@egUgQCOGCQgOgAo#26?O#11!8?_?_!38?_O?_O?_O?_O?_O?_?_?O_GOG_OG_W_W_Y_SgOmOkOiShUwVGQHQGR?ePk@eOl?`MZUlYvI|ItYlYsJ[bS`KAT_LOEPISBS`KOkOKoKOhGOgQG_?OcO?G#22!11?IDA??DAs@AC@C?DA_#6!31?@?@A?@?@!4?@?A#9?C@AG@C?HaC@?BCA?@OGGDAB?@#61O???__og`OOIGDcMDCCKCE?A@A@???@#88?_!8?CwSG??WoooWOGK?CCEEAMGAAAEBAB?!6@?@?@!17?A?@!6?@???@@??@@BBBJbvFVSU||eCESS\GKHWC[s[Acc_o#78!12?C@?A@@@H@D?AEMD_QHSPGAR_A?@?OCWO???_#5@?A?AA???CC?G#11??CGOGoGO_OGO_O??g?O#29?O$#0iOiTiShQcXa\a[`IsGTaOcGOdIShQCGO!6?_#3??@??@?A@ACBGDAdQiTuhE|it}tyl}|iOiS_Sg?GO#5@??D?dQGCB?D?JCB?C?S?C?A??CPBR@HBBbBBbBBbBBbBBbRCCUCESEC_AG?C??I??@?A@??H?A@??H?BB?CA@??@??A!4?D?HA?@?@A?C@?@#3??oCoCoCgOiOiOiOiS_?_?_?_?_?_?_?_?WaWaWaWaG_G_G_GO#5?A@?Q@AGA@AD?RCj?RCRCJsBlRLRnRnVta\bNqLJe\z}z^iT^!7~^~^~^~^~!8N!8~}z}|~}~}!4~}~|~z}|v}z~u\z}~{z|~?C@C?C???@#60o_[IBKFG#78__O_OGo_O??jHA?E?A??@?G???A@#85!10?_???_?O?GG?G?K?SCCK?CC?@IACAA?B?B?@@@A?@?AOIHYJTB@B@BCGK@A@BA@A@A?B@AASkOCG?g?@?A?G???G_P?OAo??__#65!18?@?A?!4ADTGOA\dqjEQhc??_O??O?_ooO?__#4@?@?AAA@P??CGO?C!4?G?_?G$#1?C@g?`A?OAC_H?OCHtI\nXvnYtjUlxvnOiTiXhRiPsEtCigG?p_caoOG#4!10?C?@??FOJCjSJuHEhU_ZGcr@OlQdCrk~z~j~z~|^~Zm{k}u{{[{{[{{[{{[{{[kzzhzxjxz^|v~z~~t~^m~\m~^e~\m~^e~[{^zl]vnu^nt^f^bYdQ`Si@iOl@iS?EgFhEhFgVHCBSHDATI@?GO@G??DG?O?I?@CHEPdGFOfXeTb[bKrKOm@KoFOcGQlCJOFGbKbSB{AKqKOkOg?W_[oGo?W_???_Og!8?_?_?_?_?!8o#14!9?C#0!30?_!9?@#37@#46@#65!7?_?_O?O_Q@?_HC?C?A@???G?@??@#93!14?__OoOG_WOO?WGOGgG{cS[I[CMCIcQeiU@b?uOJsQDSISE[_[AT@IDeccEDMSMsMk{gOkoSGOGGG???!4_?_o__?_#68!30?G??G!5?`C??oSg!4_#60C?G??O#10@?A???K???pQ@A@A@ACBC@E@E?DiS?SgG$#76!17?A!30?O#29??A?G?D?I@UhASI#10!16?O?@G_A@?gCA?W?G!80?C??CGBCOC@AO?Ag@!17?Oc@AC?TAOACAC@Sa!15?A?`A@_A@_CQd??_OCg?G_O_G?O_?_#4!84?I@?AAGC#7@#45_?CC_?G?OOMKCCAA@#67?@#75_oOOogGg{{}}WUFNMl}qpo@!6?!8@#99??_?_?_??_?_!6?_???O?O_?O!17?_???_O?WO_#84!14?___??@GG?A?CBE@JBIAKIIVN^n^Kk[k[{{wWOO#61!21?DC?AIGA??G?_???o#11@#2CKC@?oG$#5!218?@?@#6!131?CAA#47_!5?C#54A#68!10?OG??IIHA??C@?@?@#85??_#87???_!8?_ooG#95!7?_?_O??_?__O?OOo?W__O_WOGSGKWCgSKuHlc@c_??gw_[_WAQsGGO?gGOgOGoO#94!9?A???O@O@?A#67!48?O#46@???C??GA!6?_#35G#3@@?D??MDytititJsjUhUhViTjVjFvn!8~$#34!352?O#14_?O???C?A#84!22?OoO!4?E`OoOO?KMN}zFJFNvEMMMEMEAFBB!4@B!4@?@?A#100!31?_#87!23?@?A?Q?I@?A??C!4?OOOG?_O_oO_O_#43!29?A??AGA???GWG#70C!6?_#16G??_$#10!353?GC#31@#44__OoWgGYATSB?E@B@B?@#98!43?O!6?_!9?!4_!5?gOG!6?__!6?_??O?G??O_?_#75!18?@!9?!5@!5?!7BFfjm}|{}{s{wy_p`oAGC?gCOGIGHCS#45?@C?C!6?O_#50??_#64O#29A$#2!354?O?G#3@?A#1A#44!187?@@??A?CC??O???_$#38!354?_#55?O?G#50?C#47!190?@!4?C?G!4?_$#43!357?O_G#50!192?@#20@!6?G$#0!554?@@??A!8?_$#40!554?A#58A!6?O$#1!556?@???C??GO??A$#14!556?A!6?O?G$#54!557?C#53?G?O$#96!557?A#97?C-#0~\SuzxKmzgnx{}Jc~|zmz]tz|ju|iTzcZtiTiOcGP_@_@???_#29!5?@??D??H?Q@?G?O#4???@!4?AGAc@??AC@SAIPEGASASBGUGViUlRmRlZdYVlZlvLzLzVj^jvJ~J~TnZVjTnZe\bMPeLQnTYF|A~DYDZEXFYDZDu@^?nQLALQLRc?A?GAC??A?@!5?A!7?@A??@A#10!11?@??@#4?@??@A??@A??DA?AD?CA??AC?A?HA@QCJDaHE?VGDiPMShS_Mh?n|Qh]i~nY|M~]y^}hEpM@uHm@YdWTItWnu|mz{nuz~z|v|z~s[k{u[{[!8oCYW!8?A#45__?O?CWCH@CAA?B@#80_?_?o_O?W?_#95!8?_?O??G???GGOG???O?G!6?CCE@?@@!4?A!9?C@??A???@?@???@?C@AC@?@@?@A@???@?@@!8?c@PCHQo?G?g?GC?CCA?M?T`CQEA@AC?C??_#88FFCCCKAKG[GW?OO?o_oC#75@@@BBBF]N\xooOW`GOX_O_?_#61??O@?DJRVI{ico_G?OO?_???_#59?_#10??GO?G@_i?A@CC??CAG$#1?_@?C?P??@?A@?S@?A?OC`IC?SGADiCJcITgPeHQmPmQkRcj^~lztmYqOYD_OG_O#76?_g?_#10!12?QD?_I?@c?@S_G@G??@??@#5!27?A#3??_??O!4?O_GO_?_?_?_?g?g?g?g?g?g?g?gOcOcOcOcGO?O?O?O?s?s?dGPa[ti~y|u|Ytmxu|i|}t}}y|}m}]}}]i}uxmty|ulyTisYdwTy?gOg?gOg?O_?_???_#26???@??C#5?@A@CPAT?A???@??DA@?@D?@EPM`UHEPmDYFiTIFOHAPCBOHC?CAGAC?JbRBHbBb!8NxdFgL?I@@???@@@#1@#61GGCQ?G?KCCCA@?@@#78?@A?A#93GGGwO???_oOOG?W?C?CDEK?KOGGG??GKCKEBB@A@?A?@A???A@A?@!5?A@?@??ACA?BD?A@??@?@!20?A?ICjULJ\?GCSC?MAIPF@fIEAL@\A\J]Zz}WWowoo_o_O_?_?___#78!11?@?AAFFf?Q`@?B@CA??c_??_!5?O?C?_#37@!8?O?_#83?o#17?G#5?GG??_#29?A$#2?AG??A??CQ!5?I#76??C@!4?A?@?O#2??O???ACHQd?MOLQkZS??QCIPcLi_gQC`?I_#11??@?DAGCA`KPcPGUlQlZSj[Pmwa\a{bKR_V_ChAKPKQCYDgQcQGqCqCgS_SGs?s?gOcGSi?cXa[`MPaLOIdWA\?QdQcPeOdQcQHU_V?HaXaHaGRe|JulZezGvI|QfkT`IT?DAHAcGPEG?TA@I@@DA@P@?@@_T?HEOGDAGODiOHdWAi@|ReTzUlRUhUkZSiXUgvgSiPgPiS_Y_O_O?hS_S?O_?_?_?_?OG??_!6?_???_#3!32?A??D_I??A@#60_??O?g!4?CE?@?B#85_O#88?_!9?oCC{WUIMAC?CC?AAA?@BABA?CE?EABB@#77!7?_?_G?O!8?_??_#100!14?_?Oo_oeoYCW[Wy{_gSAg??c?O#85!7?CA@C???A??@!13?@?C@F?G?G?OGO_?o?o#65!17?CGGGfKSieOkJpNvJMUkGS??C??WG??_g_??O#96C#86G#4C?A?@???`?A?_C??O_$#82??aH?CaP?COCA@_O#3!40?D?QLaULc^VVm^y|uz|]rkRkRg?gO?_?_!8?ocG_GO?O_?_?_?_#10!65?H?c@?_HC@G?AGOAG#76!25?_#10!23?CH??@?C_CG@?_OC?PG?aOCA_??I@?CI??CA@!5?O!6?_?OG?o?O_???_#22!36?_O#14?OS?G??GA#38C#75O!7?_Oo!4?KG?IMDE?BBB@?@@@#99???__O??G_GO??OO?O??OO??W?GG???E??FA@A?A@A@???H@AA?A@?CNCBG^CIEKAY@?IKGGC?H??D??[?gSQzZGcJ\IOiO_??_o_OgogOWoKg_W_Gg_g_s?o?_#87!5?BBA@C@AACAKJCGEKAg_gGO_#68!11?AC?GAOKOGO@gQO_g_o#43A@@AKCI?KwG?O??_#11!11?@?@$#5!91?@?@#6!245?AQD@?C?@#44_OGgCUQBH??B?@#87??_?O?o?OgO?sC?AA?a???K?FAAB?@!7?AA?B@#48O#102!14?_?__??__#88!54?EBAAA@@@#84!23?@A@AD@BDBCJVHRLR]Uuk[{w_o_#67!9?C!8?@A?CG#46@@?A?@!5?O#1A!6?A???A?S???O?A$#10!341?_?O??AC#59G#43?C!5?A#84??_?oW?W?SK!4?_!5?A??@@@B?@@?@?@???@?!4@??@#103!15?_#72???OG!4?O!5?O?O??_?_??o?O#84!34?@?@#80!26?G#45!50?C??AAC!4?_#53??O#76!14?G$#2!342?_C!4?CA#24A#40A#68_?_??O??G#47!10?_C#85?OC?g?CgS??G?G?C?C?A??C?CC??C?C??A@#87!75?@#44!80?@???C!4?__#97G$#9!343?A???@#56!4?@#65_?_??O??G?KCAAAD???@!4?@#98!8?__OOW__o__?G??O?G?O?OO_GOC?E??C?D@D???@G@AI@KDK?IBOgWC?WOWPGCKICQEOJC?EBADABUAhDCcRZc_Pc???_???O???O__?_OO??OP?O?G_?_!4?_#60!57?OOO#16@!4?A!4?GG?G?O$#33!343?G?AC#46O#41!5?@#67??O?G!5?A@#42!5?G#100!16?__?O!4?!4_???_!7?GGGK!4?C?CCCSEMCC!4?CC#54!131?@!6?G$#17!343?_#16OCG#78!9?__#46!13?@#101!28?__??_?__O__oooOwWsWGWWwgAOooOgoWowog_?_o?_?__??__!5?_o___#41!109?A#0@@???C???O??_$#70!344?_#0O#37O#72!55?_??_???OG#50!158?A#33A#3@?@BB@DFCFFFCA@D^Weoh^~z|v~~~$#35!345?G#42!224?C#2A!4?KG?O??o?S?O??G$#69!345?_#55!225?C#14C???AO?_!4?_$#47!572?G?O$#5!572?@-#0~}~~~{}~~x||!4~vu^~}~fv}~z}~|y~tszmhupG^cZsPIdy?@A#29!9?AO?D_A??O??CO?C??O?g??G?G#10??C???@???A!80?@?A???@A?@#29!4?G?C??A#11!34?A???@??A?CB?B?B?B?BA@AB?@B@IAQHtBaHRAdAXAiP_EHCjOHeGaLaSi@]_]_]`Yd{`]_{dYc?_?_?_??A`?A@?A?q?__?o_???GC?GC?A@#44OGGSCAB@@#84??_COOAIE@A@A@#100?G#95?KW[O???G??A@???A?@#102?C?OO?S??G?__q?@??AK???_?C?A?C?C??bodW`@dS`?DWCGSGO?GG[Soo?oo_Wwgw_wWOqOk{cc_!4?_#100?@?H@F!7?A?A?GSGb?@GWCKKGKGA#48???A!5?C?O#85!8?A?@A??@A@??OCG?O_Og?_#75?@@@BBAFFNNLX[XOke|wsow?_#44!5?@!9?@A?AA??!4C?!4G?!4O#17C#60_$#82?@???A@??CAA!4?GG!4?OG!9?I??O?GC_???G_O??_#3!11?@??QGPCJDMRJfZj]lnS^}c^c}{ykq{qkqkOno^_~Ono]sisYcwDwcWcwCwcXcxCxShqKolQkpItgsHqkQhUweWugUwSj{j{jsZkzkzsZkuxUhu\u|i|{l{|k|u{[m{\m|e\RjVXExVhVj\b^`^bMPvI\b]hTNSjLlVlZF|jV|Lz^vM~n\~Zkn{^kn{^[|}{{|}{{t{huGsGsGsGs?s?cGO_O?_?O?O?O?O_#10?P?O@OC?AG?TAO_GQ?SA?SA?HO?G?_OCGC?CCG#31??O#1O!6?G#60__?_!4?AA@#87??_!4?GK#99O??O??g?c??OO?C[CGG?CC#103??CC?CC?O?[G?CC?GA?@@[A!8?AAA@edOFQfUmQb[lwcWcGA?WOS_g?GoG?WcCS?GC_CGEQAW?Oo_O_O#53?C#99!4?@A@?B@?C@CB@?SKFCF@B@@ABCDAJQHPIhgS`GAOAOG_g_O_G_#123?O#88!4?BBAGCSKK???A#65!6?@!4?ACB?KAP?C?G?c[O_Ko_g?O_?@#43???A#47??@???A#2@!9?C!4?G$#1!5?@???A!7?@??@?G?@?C@?A@?A@?@A?A`?Q?BcPA?mYtjRhRgOmXa[_YaKtCQ_w?gcO?C??O?_#76?O_O!99?_O?_O?O_GSGcXEGUGSA[?]?[`I?dAG@QA_BCQAGAcWASgAoC_Go?O_?_#29O???O??_#10???@?A??A?@!4?@??@?@??@#26!18?@#5???@???@??A@#3?g?g?g?gO??S_SG_!5?_?O_gG__G#104__#23_#43_??_??I#65S??W?CCG?C??@???@#48G?_#80?B@B@AA!6?@#100!6?!7@C@#107WGO?CYAI#119?_??GWG?O_#107??CIWYK?G???GG!5?O?O_#114!14?CC?C??G!7?_#98@???@?I?AHeASAE@A@GUH@OgG_CG?AC?BG@?DCEDQBAGSkkwcOOO?G???C#87!7?@BBBA@MESS[s{w{wo___#46??A#78?EBPGABJEBY?mOo?GOg_G_#40!8?@???A#65_??O#3A!4@B@@@BF$#104!18?_#2!11?C?G?COCHCQ?HcGACGDOCGSkUkRnPe\`MdW??g?C?o??G_O_#4??A!9?@?C?G@??D?I?A?I@A@I@QDA@RCB?RCB?RCB?BCHADAHAC@GR?ADQ@CHA@AHA@AH?@?@?@?@?@?A?@?A?C@A#1!20?_?_?_?_?_?_?_?_?OcGO_S_CgOgO_O_O?_!15?O?_?O??_#4!10?C?AGSAcGQGeHSIVhUjSNuHvLqLjD]`M_N_M_Y@U_I@GCRD^B\VJTnsMjTiVLzDZVRZFJZB@FHBEBF??A#61O??OGG?CCAAB?@@#98__???G_gOOO?_A?GOAAWc?c_??A?@#114?_?___??_!6?_???G?_?S?C[s#112??O#101!10?AAA@@ABDIDABABHBD@FABB@BRB!6@BRLJFJEJvaUq?gS_GcgOW_WOc_aA?Oo?_oOoooOog_??_#41?C???@??C?c!5?O#80!12?G?O?OG?_#68!20?@??B?LBKACOCOOO_???g?W_W?OG?_O_?_#109A#43Ow?__?OO$#76!48?@!6?C!8?@?Ah?A@#11!5?@A?@?@B?B@B@RKBGRDQlOI_T?lOD_HS@cHAwEGbWFgBWeGAwEgQCpIOcPIsACJsG@kQ_DWd?TgDaSASASIcQCQCHcQHChQG_HATAAQ@ARAG@B?BA@A@A#124!129?_#22G!5?C#9_?O_#19?O#105O#33O#0G???@#75_?!5_???IKC?A#77__#117!8?G#87?@@@#42@#69!16?_#115o??O??__?_???_??_?g?GW!5?G??GO!6?_?_??__#107!16?g?_#72!7?C?C?GgCsOgSOW?k_WcgO??_???O??_!5?SSgoGo?O_O_#84!24?@A@@BHBIAE?CKWWOoo!4_#61!6?C@?@A?BTAFJENm^~~{S|c[_ygOWWgC_Oo!5?__$#5!323?G??CC?EOACPGG@?@?@#68_#78?_O!4?O#85?_?_O??@E?AFC!4?C!8?A?A#118!12?O#111??CCG?C#113C#118??_G!7?_w_#122!11?O#72?A!8?@!4?A?@#108!7?A#115C#93!20?@#95??@!9?A???A?@#77?_#93!8?C?A?@A@IBHDZd\fIxL}}|]s{koo__?_?_#45!34?@!5?@A?A!8?G#67O#115C#116C#37C!4?G#35G$#76!332?O#79???C#6A#55G#20C??@#59@#67?G?WWG?B#88_O???K!4?@??A??@!4?@???@@@#108!14?G?O#112CWO_O#121OOO#40C#69?w#100!20?A#77@??DAD???ECICGC??A???A!6?GACW?W?GO#93!22?A#95!15?@?A?@?@?EACA??S?a@??_G#60!55?CCC#75_#49A#63A#0@??A!6?C$#12!337?C#110C#7@#45O???CC?A@@#68!4?@#93OO?GCC?AF_???KCE??A@E?A??@#72!22?C??@#114!24?_???_#120!68?G#56!76?@#24@#64@#104?@#105@#20A#1@@??AA#41G#4A?A$#41!337?O#106?A#10A#71G#89???O!4?OK#101!4?_??_!7?___?__?O_W?wg{YyyIAMEIABEBBB@@???@?F@BBA@B@?@#9!176?A#88C#78??_?_#62G#10A$#47!340?C#92A#72!16?OO?O!9?O?_?O?O?C#34!213?C#96?C#50G$#77!370?_!6?G?O?_??Og?G!4?_!8?@?AC??A??@?@?@#104!181?C$#41!370?G-#0~B\jTJ\b^jVj^jVZ?Yd@IRDT`T`DZrBvTTlZ|{]}~~~{{~~}nco}gOk_SoS_S_O_#76@??A?C?`???@GC???DGQ?@Q_@AGSc?CO?O?O?O?OCg?g?O?O_?_?_?_?_??_??_?O?_?_??_?_?_?_?O_O?O_O?O_??_??_?_Gc?Gc?g?GC?SGAGaGAGaG`AcH_EP?@C`GCBS?T@cAT@cA`IC?_QC@C@?aH?i?@G?Ha?SA`GA?Dg@Q@Q?T?CO`?SGA?I`GAH?_C?O_?_#4!6?@??A??C@?I@??C@?DG?C?I?C?G?SaC@CAH?DAD?DACHCOG?A@i_???G??BA@#133_O#95O!6?OO!5?G!4?G?O?CW#107?_???_??_O#115?_?_#114?O??G!4?KC??AA?@??@@@!4?C?@!9?A???C??C#81!5?O#128??_??O_#127O#114??A@?A@??_???cGSHC?_XK?KO?Kb??_??_W?_O???_?O#98??_?_?A#100?@??@??@?AG!5?A#98?@???@?BCGE_B_eXESs@g`a?OC_???a?O#85!4?AC@C@OA?W_OOO_O#75!4?@@BEFDMMNMN[y{wsoagooo_OO__O_?AQ??gCCAaG_GkC$#104?{ASISA[?SgS_SgCZcYSTgY_]_]ocGsG_GO_#1?@!5?@!5?JC@UaRMhJ`]`YdI{~\tlyTItyiqPgiI{qsgOcGSgS_GOgO_?_?_?_?_O!47?O_?O?O?O?O?O?O?O_O_O_OcOS_SoCoCwAsIoiSyo]ti{i|isY|i{Yt[ti|Zkzsz{v\q~?~QtmsXuhsYcxuwQ{_[_Y_Y_IShAs?s?S?S_CGO_#10!29?@???@?@?@#1!14?O?_???_!7?GG???@#87_???O?O!5?E!7?B#101_C??@!5?G?A?DCAQ@?@B?DD@B??@!9?_#111_!4?_#107_!5?O??C!5?C@@??AA?@#112!14?_?O?O#107!5?OG???@?@!5?A!4?_#72?@?B?@?@@A`@a@a?T?c@??@?AHC@??QU@DG?LISJ[`SgQsG#93???HAKQCXiDITh\pHvJ~V~^lwww}cs__O__#78!10?@?A@!4?B?A?GCSB??BQ`ATGaCg__PAObX?CAA@?IC$#137??_!5?_#82!7?C@?I?C_I?I?I?CG?IaACAA@@???AB??@OOJ?@C?O#3!13?@G?A@CGAPCPBGBDnYdJUhVbJViN~N~N}N~NjV~U~n|n]~Z}\~]~Z}|^}~\}n~]~\}~^}\~]~\~m^n~n\n}nN^}L~m^n^fZnvJ~F^fZnJfXfHVhFXFYDXATHCjCJ?AP?@A?I@??A@GA?PAC@?I?AG?C?T?kAPACHAHCRCHADALaLdIdZdIUhB|JtIvhUzVj]n^}\~~}~k~y|}|u{z{ytylux}tyukqmOmq[a[a[a[qkq|yTy|iszCZKRmTITOHq?OTEC@A@#75G?S?O!8?@@@#98O!4?GCBBCKE?IBHF@?@O?O!5?A#125_!5?_!4?CEEACAAAG#127G???C?Q#103?OGGK!8?AAA??@!9?@???@?A?@?`!5@?ADA?OGOKP@Ki??U@KCOWg??gOO??O!10?O_?_?_???_??___#48?@!4?A#95!11?G?DG??CAICGC?G?_O#88@EB?JG[CMKG_O_ooC??_#65???G?@?@??D?FAJHSEMGKIkGQCWQWGaxDW_wWoSoQoo$#106!4?_?_!8?_???_#109!18?_#2!14?H?@ACI@IDITA?aGQ?aOGC?Cc?P_#11!14?@!5?@!6?@??A?@?C@A?@?C@A?@?A@??@?A@??@A?@?A?@!4?A?@???@A?@!101?@??@A??@?R?CA@?HB?AD?CQHA?I?@RGPdPGbSbG@XaHPCA?g?AOH?A?Ac@GC?COGKF#57A@#44_??GCCAA#68GCC?@A?@#94G#139_#72_?_??_!5?BA@@@!4?@?G!7?@AAA#52?_#81?O#49_#135_o__???_??o#130O?O?G???C??_#102?A!9?@@@!17?@!9?@!4?@?@???@LNHK??K??W???_?O!15?_??_#115??_#53???A#99!6?@@LGVXexaHqDQ?Oa`IO_?O?_?_#80???A!5?A#84B?@A?BCJCJReM[wW!6o_#68?@?@???H@C@C@?CHA?CDG?A??C@CHA?@A$#96!5?_!10?_???_#29!50?C??P??A?C#5!232?_!5?O!4?o#0?_#2O???A?@#84_??GO?GGK?CG#99O???OO?C?GO??G??G#112?_#118_O???_??_O!5?G?GCC!4?G?G??H??C?D?@@@!5?@??BFJHKG!7?@?A??AB??D!5C_A?OkWs__ogWc_c?_c_?O?O?_#101A?B?F?BCJCidIEXE\lI}J]iNIU\CRM^TCHSIUHQsIs_Y_O#41!11?C!4?A?C#87!13?@@?@ADNKJCJokWO_?_#61!20?A@?@D@?CC??A@?@!4?@$#76!313?_??O_??G??@#12?G#40_???C?A#34@#78o_??E!4?A#131??OG#77_#103_?_??_!5?ooOOGKC?JKHMNEK???CCABA#107A#102@@#40@#112OOG??G!4?_??a??OG!9?A!8?GC#77!38?A@B?E?CKQCICGCWCW?O_?O_S_Sg?O?O?IH?GO?S_?_#123!19?O#84!71?C??G$#10!314?@!9?_#55??O#60O!7?@A#41?__?A@!4?AEB#134O#100oG??__?O#119!4?O!6?_?_???GG?OO??W?YG?OOICSD?@BA!4?@???A??CC!8?CCE???@AA??EC!5?_!4C#108!27?O#114!22?_?_??_#43!98?@$#124!320?BEDA#42!4?_?O#70A#47GGCC??_A@A???AA@#122!7?_#126???_#77!4?C?IAO@CO???C!4?@??@#141!4?___!4?_#136O#116?WOGCGae???O#125_G???_O!6?__oOOo_O$#138!321?_#58!6?G#80_!4?G?__???_!9?C!7?E?CE#120?A#108?__#102!5?G#121O?W!5?GGCK?A@!5?GDA??A!4?!4@G??Og?O??WWOWGGEAMCCKCKGGGwgwWWGWGG$#105!328?C#46O!6?A#85GGCC?K??G???G#132!24?_??O#126!13?OO???_G??OQ?G?CQ??G__O??_!5?O!4?G??G??_O?O$#24!329?C#123?_#49??@#43B?@@??@#88OO?C!7?@#73!21?O??OO???O??C??@C!4?A???C#132?_!8?OG?_??O!5_?O??_G???O?_$#65!329?G#93!11?O??O?CC[?G??AOG?OOGC#140!14?_??__?_#129!19?GC??_?_#73!5?O??_??G!4?G!5?__O$#48!342?_#120_#53??_#42A@@CB#128!25?_!24?_??A?O_O$#115!406?C??DB!4?A?DCC?A?@?@?@@@??B?AA@?AA@AaQAAIE?QDAAQaAIQOCo?_OO?_??__-#0T?@AP@?E@AOHACO@??@DI@IoC@?@A@QDA@?cJASJSIuHvLrfGBELf^unVmU~ny^}_?c?G?OG?O?_!5?AS_Sg?g!8?_?_?_?_O?_!22?_!47?O?O?O?O?S?S_SgOGqGQgQGqCXaKAgAKA_!4?O?O!8?GOiOIoIS_O?Sg@AC#3?@C?A@A?D?@CPCbCOAHC@a\ADQM`NtJtNtJtNtJvl^l~l^l^~~n^~n^~nnN~n^~~E^jTmVjvoI?IO?A?@#40O?OG?kcooo_?O??OOO#154?O!5?O#151G???G#51o?OOO?_!5?_!7?O?G!5?K?G??C?C#36_#57!4_#21OO_OooO#121@@??A#116@?AUYKKIKKKA?Q??oOgGOOOGW#126@?AC@?C?CA?K?G?GC??O?oOG???O?C?C?GC#103?`??A@??_A!4?`A?A?AERAD?ICSGbOkIHk?WCI??G_#98???@?@A?@RCTAAWpMgVC_G?s_WWGCO???c_#85???@A@ACB?KOgOg?O#75!8?@@@H\{l|Z~n~m[mk}]|{ygcP??@ADADD$#104A@A!6?@??O???RHKIdetBBAfAH]DA|MlIc\ISJsHsGoGOcgO_#1??@??@???D?@NBHFRNfRnLZNv\zu~wgJHAuRF}VunRxT]^]^]^]NbXL}|y]\\]}\^x[]~oz{ncjwNKzWlaTwz\SuxzT[vtwNduxzw|}mdvx{~|{mf|ryUmvUnuVmbmJvJjfj@lbHI@ErKAcAKaCWaCPhDdPH\^n~NfnF~n^n|~}~VaCL_EP_JF{aA[gpz}z}tmwvW~szkrKyJlcry\Alyk`]oAsIoIsIoIsGQ_Q?Q_Q_!8?O?O#11!5?@?CA@!4?O#12_#1?C??@C?@@#41A@!4?C??GGG@@???@@#48@@?G#108A#103A#111CCC#59AA?AAEKC#49O!4?G!9?A!8?C#126@??@@#58C???C?CC!5?G#145o??_#136?_!5?_#52G??O???O#73?AB?@?A#127??W?O!6?_!4?_#112??C???_!4?OG?_!4?G#101!4?B?@?@?@??@??@!7?A??A??A?ACa_F_DITkRc^[?_[cO?s?_?o?_??_#95DA?A??O!4?Y?COcW_O_?O_#87?@@?AAKNCY}WScW#78!12?@@@B??A@CRGepwwTw[WW$#137_AGPa??@EOHOGO`qC??O?G?C?CG_???O#150?_#82A@??@??@!5?G?O_O!6?@!6?KQGcOGCOAcO?_#76?@?DBSaTHCw@gHOkCi@_@_@_@_[Cq???`_a_@__Ca`?GC?OOOCOo?cOOg?C?aH?C?a?GA_OG?CCA?POGCA??APO?GChPGhOHgPKPcGcSGSiQGU`UHC@THT@THBCHACQGAcA!11?A?@??LPATHCJSgBHTaTIC??@GODGa?I?AGO@cOQGC?_O?@O??G!20?O_?O_??O_?O_??w_OgOgSGJ_XPaIH?A#48C???C??MEAOO#87A#50_#155?_??__?oOOo??O?OO?O#21__#81C??!4G#128O!4?C!6?@A?@!7?A!5?AA???A?A!6?@GHCAACAA@?ACCHI?@?!5_WO#118!6?@@@!5?B!6@!4B@@?@@@_aQOUoO!4SWO[SGMCC?A#107_#59_C???O?GO?_?C#72!7?A?@?BKW?aX?aGa??S???O?O??g#88!19?@?BBEEMD{_ow_??_#65!15?A??@@?A@CRGIDA??@?A$#105G!8?C!10?O??GwO??_?G#109!12?A?AC?RCHAW_GOgOg?O?_?O??O?_?_?_#2??GACG#3!14?A!10?A?@AD?A?@?A?A@??F?B?JCB?BCBALAF?aH?E?i@GADOI@E?B?@?I?A@?A@?GAC@#138!22?_??_??_??_?O_!6?_O?oGOg?O_O!7?_??_#4!81?C@ECGC?A#46O?C!7?G?GCCC#147G!4?G???!4C#73GG#163_#40?GKC#20__#102A#107@?@@#91_???O#38GCG?C@???C?AAJA!5?CC!8?C???CC?GO!6?O??o!4_#132??AA@?@A???c_K?WKWsAOOAS?W?__!5?G!4?A#114??@?`??A`?a!5?G??Wqo[K?_O?C_g_?G?@??@G?O#108??O#53!5?A#100??c]??GgG_!5?_#41??A!9?G#84!15?@?@B?BD@fJZf}}}uaBQAc?O?O_OO?_#46!6?CACGA?A$#96?gSgCItGOgCaC`ICgcQ_?O???gOGS_?g??O?O?_?_#138!24?o?_#109!135?O?O_O!16?_#138!88?C?_#5@@!4?A#10A#0@#54G?O!4?_?OO???O!4?G???G???K??GG!6?G#119G#121C?@#37O!4?O???gO???_!8?CC!8?OO_#129?C?C???OO!4?W#121!9?A?B?B@BAFBBA?K?MSIU?[[KwKksWoOK}ici[SGKK?KK!4G!4_#107!17?@???O#99!15?@??@A@HFE@FGI[SOG[cccacas_?Og#68!51?_??__$#106?S_CGcIOg?aC`ACG?Q_!8?S??_??O?O?_?_#51!277?_#66_og_OK???G?G?G#84@@?B?A#93AAA#159_??_#101A!5?A@??@#99@#50OOo_#55OO?OOG!4?G??A?CA?@?C@A#23!4G!4?G?GW!4G#86O#125AA?@?A???@?@?@A@@@BEDFCD!5CccW?og_o_Go_???__#114A#107!8?_!7?@#102!7?_A!9?_OWGKYZDP@fSKOPS?P`HOW?O#48!16?G#93???@BB?@B@BRHJ\JV@NRnZe\m\yk[ogO_O#61!39?_$#150!5?O?_!5?G#153!303?O#9OG?@#92__OoO!6?_?_??_??O!5?O#134?A@#23??_#62???G#133?A#118E??ABA@#142C!4?@#20_?O?O???OO!4?OGG???G#140A#73A!6?@@?A#140KO!8?CCGGO?g?oGGGO??G#119!9?!5@??!5A?CCCA?@OOAA#77!9?@?@?@??@?@@?@?@???A!4?A??ACA?D_LaSiO_?_$#6!318?C#105C?A#43G?C?B#47@???DE?A#67?C#99!4GAAAE#120@#115A!7?@???@?@E?C#103?@#63_!9?G??_O??_!9?C!6?Gg_O#142?O??_?O?__OO#73!25?A#128?__#73!11?G#115_!6?O?A`@?a@???I??c?_G!5?___!7?__?_$#44!321?G???A#42?A@?@#85A??@!5?C#77?GG?G?@!5?DA#122??@#56???_???_OGAI#52OP!6?A?@#19_?O!6?G#103@!5?@#49A?A#149C#152G?G?_#127@?@???@#119!60?CCAAQO??K$#155!324?_#80!4?@!9?@@#146??C#72??@?@@?@#58!10?_!4?__O__???G??k[#13_#91??G#25ooo?O??OO?_?_#55??CC???C#165!5?__??_$#68!336?A#117CCC?CC#160_#161??___#162__#69!11?C?C#73?A#116A@?@#145?A#50G?C!6?C#148C#121A???A#118A?A#100@#107@??@?@#51_#91_#132??A#141!7?@$#158!337?_#139@#156!10?O#100A#112!11?A@#125??C#140??@??GCD?@!6?@#141@A#56C!8?C!9?_$#74!369?_CA_#70?o#24_#35O#125@#143!8?@#164_!5?_#81??A$#144!370?AC?A#86??_#132!10?A#157?OO#34G$#135!387?@#112??@???@@???@$#69!390?A-#96A?A?@A?@?C???A?GACG?ACI?A?C?AG@C@A@GFgDOEO?O???gS_W_G_?O#109???A?CA?A?`a?IC?Y?W?Oc?OiOgS?Og?_?_???_O_#2!22?A??C??C#76!35?G!4?A?HC?A@A??@C!7?A???A!5?A?C?G!12?A!5?A#2!5?A?A?BB@B_?_??G??POPOOO?OoOoWwwWwGCKK?C?B?AAAa#29A??A@@?BB@@#2A@H#106O?OOO!8?C#171CCC#82A#14@#28C#83@#16@?@@?@#3@#5A#26A#171@#154A!6?!4@!9?@#161??__!8?AG?OA?E@A@???_#164@@?A??C??CCCBB_K?C??A?H`?I??_???AA??S_G#92CC??G#20@!6?O#116A!5?@A??@??oR_OOYOYHCKCCGDWKcs?O?GG#112??O!4?A!6?C#132?@#107!6?G!7?A?@?@#101!7?C??C?A?@???@?@???@?AL@J?BYsLQlOlQKxCgcG_CgGO?_?O#41@??@?A@C?ACQ?gA_C#88@???IH]k???G#75?@?B?@!4E??abFN^^}}x}{w{{w{xk$#137|w{{}!4{yqZ}|poSWoxoopWpYwwOosyccA??QG_gc?_OGg#150!5?_#82!10?OgUGSgOhO`O_Gg?@#76!13?A???CA?A?HC?BGQ@QCOK?cOK?c?_I_W?G_W?O???O???O???O#2!25?@#138!9?_OGCOAG??_OC?OGDA?_@???A?C???OGAcB?C?OGE?GG?_OG?C?CGC?KGG!4?ADBG?I??G?E?E?A?@?@`_!6?G!5?CC?A!5?O!8?A#158!5_o???_oo!5O??W?wOWWWKFEFBCEAA???@!7?@??GG#92OG?G?G?G?O?G!6?G#21?B?CC@CSGWG???CG#178@_wo}LDQ?C???CP?G!7?_#179o_#91GS?S??G#145@???GoCKWwwwWO#52?@???A_!4?OG?G??G#125?@??@d?CCGC#118?oo@WWXlLKKCOo]UEz|\rQpzgyTkmSCgW[GGECA#77???C??C?EA@@@?@?@?@??@AESIScIOgO_?_O#48?@??A?@?@???C_?C?GO?_??_#95I?P#123?O#80?@Ao@!7?O#78!19?@?A?!4ABAAB$#106?A?@??@???C???A?HACAHACAC@AC@AG@A@?DGD_EOAO!4?S_W_GO?O#138!20?A!6?A?_A???O?OO!5?_?_#109!77?_?g?s_]?iOjkQogTYSkr[pkPyTidOtGWsjOjTohV_VGN`U???SO[OC!9?A??G#167?_#170!13?O???O!4?O??OW?W?WG?KG???CC#154_#160_!8?_!6?_?Oo?o?!4_owww{wwksMZrizryzzq]}~NSvnUZvUc[cOaG_?O?kocCwGo#157A???@@CC?@#57A#163??GOEJ?A#195_!6?_#157?O??GG#177??A#162???G#23?@??G@??__#136ACKG!4?C?GO#128!5?@?@ACAB@@BBAB?GI}?C#121A_qojLJMfdeAAARPBB#103!9?CA@A?@??OA_Cq@wDeOAoaHYCgOiGeYSAABASX??g_SG??_#99!9?A?@???ACA??Q?sACh?IP?_#87!7?@?@??@BNZev^}}[s{o_???O#65!7?@C@@D@@C@CO$#150?D@A?@AA@@HC@?KA?@ACCH?CGC@ACD!4?O#1!41?CA?C?C@IDHUbMbM@CHUJ?@SHE?rK_D?K_JAbQJAbQJYLPFbfvBFfnn^nnn^nnn^nnn^n~n^n~n^n~n^n~n^~Vf^n~NWeQqLOkSl]IaRiDsB]?L?hC@?GDA?G@?@?BG@iDA@GAcI?_?aGU_SGE_UG_!7?ULLF@@AC?@??BBJ@BHJ@DAC?EIQqkZ~{C!4?c!5?A_?O??CSC???I??A??@@???AA!8?A#109A?@#76@#177A#172@#173@#40!4?@#185?OG?CKCCC#174@??@#155???O!4?_???_#175???@#163?@#176!5?@??A??C!9?CAA!5?@#186C#179A?@?GG#79_#28__#15_?_#37!8?A?!4AMG_o?___#73A#140?@!4?@@_P?JCL@C?AA?C?CQQ??GW#73`#126@???AC!8?A#115_???g??A??I??C?AO?i?CA@C?Ao@`P@P__??_O?GC#107?O?O?_?_#72???@?@?ADANQLaEwEWdYgSakYSg?Go?_#85!15?Q?PA?O?cG?_$#0!8?A!6?@??@!8?@??A!9?@?ADI@A?@AC@ATaCjDjTNRlE@@A@FDANCNFTBX}jTjS`Yc@[PKPmHuHcZ{JsXuGr[qlqLolOlOlOlOdOcW?W?W_W?O_O?O_O?O_O?O_O?O_O?O_O?O_O?O_?gO_O?ocXcHqlQhQ`SHCPAH?@`ODAO?dAOgD_QGaCOaC?OGe?P?@OHC?@??@_P??`?c_a___o@A??C!6?@!4?G!7?O#3???A???B#17___!4?__#181A#3cC???OA?GB?GC???AA?C@AA#154G#124?C#79C#166A#157C#51C#170@??@#175!15?o!4?G#162!11?_??gO?O_G_???_@KB_FOCwW?w_O_Oo?wooS@@?@??_o?G?A?AA#57?G??G??O???_#86???@?C?OO#144@??O!5?_#149!7?A#130!5?_#132!7?@@?AB?Q@JC#119??_???Oop__GK?@@!4?`??C#102!5?@!8?GKGGKA?HPGCeO?gg{k{GeKoO?__#98?@!6?@?AP@O?QBS@`HRNcIJSiS[ogPOg_D?G#84!11?@???@_JAHXxx~n\[wo__$#193!11?_!4?_#104!17?C???A@?@@?@eTBIDBUDILjSySgogOhSgSGO_O_?_?_#168!16?_!119?C!11?GGO?G#76!5?A?IC!5?G???G???C?C@C?O@@@!4?!4C#64?_#12O??_!9?G#156_#155_!6?O#66?!4OGGggg!4G?KCKCCCA?@??A#159!4?_!4?CCCK_???B??@C?@BB@FDET}h]OAWO!4?_#124?@???AAA#169!8?_OC??b?hO?KCCC?CKG?O#63!7?CP??C#132??A?AA#129???A!4?AGGGC?___?OogoO_#127!5?_O?C#107!4?O#114!7?G??_gOCA_KCC?P?gP?hOE`?q@w@GOA_A?O@o???O??AC???A?O#100!19?C#93!9?@??@?A@EK@DMQlVy{Mk}cs_?o$#105!15?C?_!5?`?_??g???WWgqo?OG?GkIcO#166!178?@??@#29!7?O#166??O?!6_O_?_?_??_#109!9?_O??O#90??_??O#171??___?_#26_!7?O!5?G#21G#105!6?A#185__?_#190!18?O#155!30?A??G??_!4?_#7@#180!9?OGGA?O??@C!8?G#35!10?C#74@?G!4?C#38???@@??a?CCC__???O??O?_#108!59?C#59???_$#110!224?OO#171G#168!13?ECCACCC?C?C?A?AA?@_??_???GWGGGW?KCC?OC!7?BB@?A@@#167C!9?@A#92?CC#0A??A#156!49?C???O?G_???_?G!10?G#21C?C??@RBO_Qq_CDJPVitisw_w#142?AC@!5?C?Cem}[K!9?_!5?_$#82!225?A!4?A??oOgoogw#171?G?C#166!21?@#10@!4?A!6?AA@?A??G??!4C?C??@???@#183!4?A#184A#54C#40C#177!54?BG!5?GW!12?O#155?C#192O#51A!4?!5@BA?A#152!9?@!4?O?C$#167!225?@@#179!40?O???G??G?G#0?C#109C!4?S#181???O!5?G#174__#173!68?A?A#12A#36@#191!16?O#25!5?O?O#127!19?@#126B#125@@@A$#167!267?@@@B@#22@??@#16???G???A#28_#166???!4G#182GG!7?A#25!64?A!5?@#194!13?_#168!7?C$#194!280?_#76O?@!8?@#2AAA?@@@#79!68?@$#173!283?_#169!4?@@#189?O#15O#29??C$#188!289?O#187!5?G-#137~B}@~A|JtkRlYfYuHbI?`APCAOdADI@IdIRHjTKSoQqoSsSsAO?O??Oa???Q??O#109??@A??C!7?ATA\v}lytmTyTmp^qlQ{jSlQlOgoLsGuGS__O?o?gS_OgCo?gC_?gC_OcGC_OCgC??gCO_SGcOCGoG_GO?G_?CGqCHQcQ?qDgS_Rox{{~o{YuzTr~r~|~~|~~~}~|~~|~~}j\jvlzju\QiuH}IA?C?c???AA?@!7?G???G!4?C??G#26O???G!5?C!5?A#156?A!6?@#197_!8?_???oO?_C??CK?!5C?CID??A???A#163!11?OgwwoMoSafcxaKiUkWGg{w_O?{S{{G{wgo___?_O??_GA?_O#180E@??g?WF#36?C#203{Ku}{{wO#0O#25g!7?H_@??Ak#24@#116C?Qi_O{Wmal\MDB!7?_?OOGMA@#140@#132??@Q`???g?__G?O?G?_g#73!12?_#103G!9?@O?P_PG?e?bO_POO_FQ@EXSiC`AQgRCkW@KAGcO?GS_O_?_#99!7?@EGfSA`k?CcAH?O#80O!4?AC?W?Og!4?_#84??`B_bCrdUxJrZVm\kprpppooo$#193?{@}?|AsIPkQdWdGaWsLYCkY`LY_YoKs???c??_#96?A?@?@A@A@GBK`YC?gPC@QG_??_O?O#1!15?@??A!10?A??AG??Q?AGD_J?aHI`UGAHSaGOChAGVGBgRCJ?jOFgBGV_JOjCRcRCJtATaRAHcRCHQcGRCaHOEGB_@!7?G!30?A?C@A??Dc?_?A?QOOO?@@??@!7?@G?GH?CDD??@BA@@@B@#176C!5?A!6?@#174??!5_q__?Oww??_!5?A?OwGOW?g?_?@#175SGO?OCGKAmNmIeKSKCC?K??A#162@???@?@??@?A@?HgcA`?@_@CQIXEGY\MNFB!7?A@#169?@#124_#157W_#138G#3A#213oG!4?_#33G#21P!7?CA?B~[#86OA#145@@#136@?@#142?!4@???_owwkCANBJB#125_?_OGMGAp_gGGG??GG?OW?G!4?G??GG!8?__#126_#107??@??G@#102!7?@?CCEBA@B@?HKXEJDZY\lVKh?__oooWgwc?C#53???@#100!7?_#48!4?CO@gAO#41?C?cA?O#88A??IEEJ?OgZO???GG?GGgKO?C??_#65!7?C???C$#96!9?A#150!5?@#196SC?_?p??S_?K?D_?Gs?O?I?_#106???@?@A@?@GBGdG?PcH?H_?G_OGOG_#76!30?@#138??DA??@??A?SGC?C???C???C??OC??OC??_OC???Oc???C!5?_!5?G_CO?_!6?H???@?C?A?@?A@!4?C#104!27?_!6?G#171W?K???C???A!4?A#169C!6?C#205_#106OO!6?G???C!4?A!5?@@@#194@#188?@#173@#159!11?A#156_#206???_!7?C#159_??a?oO_QPO??aA?POPXPo@sWoGBABAB@@!8?@@ABC??CF@@A@?@?AD@A@OC?@#178_GCCtNNNw]lO???_@#173B#28@#5@#7@@#13@#20@AC#218_#164Eeuo???@?XG[#34?@#4@#58C#52O#128Sk??_?_OW???A#52?@#130C?iH_WCKA#126_?__OowKO??q`a?QOH!5?o?O#107!35?C???Ag?O!5?C_???O#77BCA@CDAC?@gPkOgSgS_S?_#93!11?A@?TGd~l||xo`@_DE??_#75!11?@!5?@ABMKMIMJJJ$#105!18?@QCGA`GA?P_?Q@Q@kAS_RJLlKMiGgG{es_Q?`???__#182!5?C#82?A?@AHQDIPID?P#76!44?A#168!51?GC?A??C?@??G??G#138!27?@???@_?o?GCO!7?@@!4?G!4?AE?AA?A?@?G!6?A#2@?!4@#210!24?OGOOGO#66?@#161G??G?K?SG?A!8?_!6?__!4?_A@??@??B??ACC??EQ?W?GAAUA??CCWE@A#164_OoWRG_O_?_OmB???]#215O#202?A#204??A#1A#177@A#57??O?AC???O??_#16??A#63_#55G#165A?@?@!11?O?C?C#127?_??O?O?CC?A!4?G#73?_??_??O#59!45?C!10?_?O#72!6?A@AA?@AAA?@AhA]hUHeWbgA#95!7?@G#85???AC@W_Sg?T_?gO?C?G#78!19?CC$#104!52?C?ASCI?CCULaVIcdfQ\ulytitg?g_#110!144?G???GG?K??GA???G#2??@??O#172_!4?O!9?CC???A#171?A!6?@#199!20?O_kC__g!5?AA??ICGU#211GWG#212!18?_O?G???O_?__#160@A@??A!6?@#155!4?@#21_!5?_#176?O#195??@???S#191k#153A#217??_#193!6?C#23@F!8?A!4?_#91?W#125_#126_#129?C[CAA!4?_OGCBBOoO_OOLND@@#121_???K@UDUTVDFCD_?_oK[?oSSC?gg_??Oo???O!4_!6?C#101!26?A?BCA@A@@EO@GALTGTi\A{@S?_O#87!22?A@ACNVN~rUsVSR?IgAsKCgO_O$#0!55?@A?QG_@ATG?@G?G_!4?C?OiCAG@QCIPgDiPM_LQlBShQkOfQL_Js@qHSJDqDY@b\aBXFhRQLr?rKBGrON?jORkR?ZcJ?rGJgRCA\aLcTQJgRChQdGhSCiPa[?IC@A?HAc@CaG?C?A??A???@?A??A??@SaSGQCSH?lOGs@sOBBAB@b@`@@O!5?@@@?@H@GP?@?HG??AAA#66O?O!4?G!4?C#211!28?_#200GOO!9?CG??CCCIEAC!8?O?C?OKGKWQE[oCGO?OO#192!33?O#194@#214!10?G#163??@#157GGo?@A?Cq#144!5?A#130G#140?O?G?C?CQA@#149!13?A#128?C?A@A!9?O!9?G#98!63?A!4?A???@?AGO@?GPKQVxH{qiA??A$#150!55?G#168!170?O?G??C?AGAGA?C?AA?IEA???E?CA?A?@#82C#182C#185__?!4_OoOo?WwGWGoSsgSOSS[]C?A?EFDENKAAA!5?B@?B?@@?_??_@``?@!7?A#201!54?A#207C#178!13?G#36@#179@?A#192Go#76_#180?C#38!9?AA!5?_OGCA??@#112!15?C!9?@_!6?_?O!8?O$#64!226?@!9?OO#170G#182!5?_#82O#209_!9?G#155O???G!5?C#29??A#190O_?o_oGgGSGKGG??G!8?ACG!5?B?A@#173!93?CG#124o?C#118!50?AAECEAA?BABbaABQZvDBFEBB@BMUStoOck?_I?Eu?PG?G?GK$#179!227?O?C???KCCCKEGAKCEC?CAC#76@???@!6?@??A#205C#10??@#212!32?O#156??A#191!98?@?UG#114!53?A??@@!4?@??@??AC?H?GA?@GGGDgO?h?OG@?OaO@OG__KO!5?O!9?W?G$#82!228?_?_#208G#166!4_??_?Oo_oO#198_#29?O#3?G#216_#162_#174_#160_??!4_??_?OOO_?gGg???CCC???!5A??FLD@?AH??@@!7?o?_@!4?_`@???___???O@@@B?@?@#169!67?A@#138_#119!54?@?C?ACC???sCCCGwgG?SCCSO?!4A?AC?Cc??G$#106!228?O#97!6?O_?OO#180!9?_#194?O#181?O#158__??O?O?OOGG?GG?C?CCC?!5A?!6@O!7?@??!4@#168!100?G#116!55?G!7?G$#83!237?_?__?O#124!11?O#104G#10C#17C#198??C!7?A#171!134?C#115!56?@@???@???@O!8?OGG??@??CI@QI@AoG@G?g?cE?O?_a___?_$#156!256?O#177???G#3AA$#154!262?GG!4?CC!4?AA!5?@!6?GOWG!8?AA-#193Ono^onO~_^o^onoN~p}P~P|rkR|r{zcy_spSOg___WS__?Q_A?G#96???A??A@A@I?E@A?@?T_A???_G_#109??IELIcJDJBLbNBMBlFNLFLYfYLJELyDzCytwsyTyulyt]tI|U{ytwpubRr^NFNJN^DACJCIP}_oIC@AKAFMKMNFNnNnM[mikUBHJFLHFBJFCLJBLDnNN^NNNnn!7N?B@JAHBABAH!4A?C???A#160_OGG?GGGC??CC!5?A??@@@#210!4_?_?_?Oo?O?G!5?C??_!4?G!4?CC!6?O?!4O???GG#206?O_!6?O?_#174?A?@#156!10?O??O?__#212???@??GI@AB@LG#162?@AA?G??BA#180_??GCS#36???_#180!8?_??@??G#21?o!9?OgOO!7?on`B#55o#125B?_@?_#142!6?@@@???@#121?_?_?OG`?_GO?aCaIaBAPAEH@OEDABbJbAAE?FjAFvJ\N\GPROP_o__oOo?_oooO!7?OOo_O_!5?OO#102??ABA?CEDE|@Eb]k??o#72???C`?g@NHcUXaWc?_#41?@_C@aG#88!7?B@?@!5?GENFYEyB?NE|?W?e?C??ooo$#137nON_NOn?^_N_NONo#196?M?m?mAKAkAKBCIDPI?I`QSIOA_QHS_GS??G?_#106!4?A@A_I@A?@C`GQ@?C_G_O#168!36?A#138@!9?_#168??@??A???C#1??O??O??I@?CA@G?DGCBC?BK#90OOO?O??O#179???_???_OooOOO#182?_???_#82???O#179?___??O?O#191O#1_#168?O#2_#166_?OO?OOO#1_#22_#23_#155_#40_#158_???o!4_oO???G!4?CC???!4A?@@#211?__!5?O?O???G#222?O?G???G??CCOO!5?C???A#212???_#229_#228_#230_#224__#223_!6?O#229_#212???_??_#163?_???O_??_OgQHUZUEFBB@@?P??CPB@P?@??AFF]TGT@?@!5?@?@#191!16?@G!4?O#57_#192_#105???_!7?C#57_?_c#36??G#91oL#38_#116EEWG\}M^iMSkw{YM^C?A#135_?_!5?_?O#132??Gd@OTCK@aWG`a?KK_O@O?DGC?O?___?_#119AGKCE??O!4?O?G???oxhhIH!6?_gOOO#107!4?DC@?@HAH?C_O_O#101GALqDdYQu@}OcQg_#48C?@?O#93??@qOTAtnV~n^nwkvepqOqooo_!4?_g_#84@A?AC@K`IjBMB$#105!18?@!5?P!7?C@I?IC@CHCHC?AHA_iDoAZDhIhKGK@S_gsoW]_Go?W?O#1!43?@!7?_#110???C??G#170!4?G?C#64??oO#138!7?A???G#2O#64O#214_?_#97O?OO#110!10?C?GACGS?GA?CGAG?OO?O?_O???O???O#104mGM?C???C??G!4@#2AA?A@@???@#166@?@#221A#26A#189A???@@#156@@#219!10?_?_?__?___oo?_??ggGGCKKKCCC?C??@#227!10?__???O#224!6?__#162!19?Go__SG_a#223??A#195?C??Sg_?_#164???sIsXm_?DA`__?_inUPfVBJ^XU?RsG??@o#168C!8?O!5?G??@#86C??OQC#152A#149S#130G!8?@A?AA@@?A@#119!4?__OwWO#127!4?O??K?_??O!4?O??OG!4?O?O#143!9?@#115??G?@?A?CAHC?HC@A?Q@U@?@?CA?R_@aAD?i?_SH_OO??OG#77??@AL?LaY`CGS?_O#99@?E@AW_HA_?H#95C?tIOg?O_O!6?_#94!20?O#75??@$#137!30?P?I?C`C@IPE`AHUhCTHTqF|CwUtSosOS?GS?I!5?G#82??@?A?@!6?O!5?O!5?_?O!4?_#104!26?G#166!12?_#82!13?_#166?_#168@!8?@??@?C!9?@#208!10?O!4?O??OO#214_!6?O#226O#106???OG???@#105C#82@@??@@#182@!4?@?@?@#154A!4?@#199!16?OGGCCK?ME?CAA?A??OO??A??__?o!8?OO!6?_??GO#155!19?_#176KKKA@ELD#161!14?@#21??a??@!6?@!5?g?O#76!7?_#203O???BMX^^~}PN#4@#164FJJC???oO@#63???G#225?G#140oO!4?@?@?_O??_O#126?__OW[]LDMFCElf[zC?C??A?G?Ad??D_???cC??_?@?GS?O?P???_#114??@I?D?ICA?F?AC??C??GDIA@G@C??@KAgC_O?cO??_??O#59!4?_#100!6?@#53A#98??AG@?WdA^E|]U?iG#85!8?CQGOIGDGHAH?G_G?KC?G?G?GO_O$#104!60?_?@??HCa?ADCebZEVLnmtxqdYsgO{_[okO{Oo_Oo_???_Oo#170!58?G!4?_!5?_#97!4?_??O?_O??O#196!6?_#193!11?_??_???O!6?G#184G#208G#192C?C#138AA#190_?oOoo_g_!4w!5{}}]]]^^]^N^M]NGEED?A??@!7?_?__?Gg!5G!10?CC#160A!6?@@?!5@?B?@@#178!12?A!4?IyK{qc}gS]oOw_g?_ACOCKALMEJIED?@!4?C?EhNkJu??EN#25G#177O_!8?O#51_#28_#157G!5?AB#127!5?@?AC#125!13?OO?CB@AA??B@AG@?@?W_gGPOCC?WOGOOCC?_`w?OGG!4?_?___#103!5?A?C??CA?C??C??C??G?GA?A!4?@?B@???A??gOAi@K@AtOA?W??G#123!15?G#80!14?GC?G!4?Oo?o???O_?O?O$#150!62?_#0O!7?GP?C???OO???O@?Ac?Q???`?AGOAGAdWdQCHqDyCzDIDIDiDGQDI`ITAHADI@EHSgK__oo_o_?Kzoxse@YDpwyt_@G@A`__!4?@A@DA@GAC??A_GCOWAos_a!9?_?__???@??C@eKLGLEDCCCE?@A#15G#156?G#185_Oo?_??WOW??CC!4?A!4?@??@???@@?F@@AB@BB?!4@!7?__?O?OO??KCCCEBCBFABDEEE?A@A??!4A?@#21!16?O?SG?_#157!19?WoWo???_???GCW?G?__#106!5?E#202_!7?_#23???_#13C#178?C#176C#124_!5?O#129!7?G!6?C?@AC?C???A@#112!4?O#128!9?O!4?__!4?G!5?GG#116G#112A!6?A?A?G???@!4?_#107??G!13?CC#112_#59!14?A#87!49?DADED???D@DOR?O?fdbGRIdSK?K$#104!166?_?oOO?OOOG???__?O!9?O???_#82!12?C??G#66!7?___?!4O#209?C#194CC??A#220AA#150?@#206?A#174A#29@#224!26?OOo!5OG#174!4@??@!6?@ABBA@#231!4?_#200G!6?GW??OGWGw__?_oSe?kO?C#177!6?G#164A?OO?_#169!21?OO??G#194!15?G#124@#204_??C#213@E???@M#18?G#79???O#192_?C#3A#25@?K?C#128!4?@crA@o_OoG!4?__#127GKKB#73!21?_A??_!4?O@O#118???c_!5?ECCAIWF]CLGJp@?@GaxI?U?o_ea?@GT[?NmK_gSOWGgOG_$#214!184?_#166_#198!24?_!6?OO#188?O#173O#177O!5?G#155?G#181A#172AA#212C#10@#159C#209???@#212!28?_!5?_#211?__?O?GG!4?CCC?OO?O!5?G???GG??O?O#161G???S?O?GOG!4?_?_hHO#57!33?O?OOO?i??s_???O#208???O#171C#169O#215?A#96G#36!8?A#173???B#138C@#137G#5C#7G#12G#126!98?O$#83!210?O#218_#196!9?G#191G!4?C#201!4?C#195C#162?C#197!34?K??AA?@@!4?@???AA?AbA@??@??B??@#222OO???WW_!4?_#207!70?A#217??@#162_#155!8?_#169!4?B#153_@#14G#20A$#12!226?G#228!45?_#206!4?A?!6A!4?@#221!12?!4_#171!97?O#106G#191O$#200!279?O!7?_#109!116?A#202A$#175!280?_??OO?_???OK?G?!4GKG???@@@E!4C?G!4?KGOGEIHV@EH#215!75?O$#156!283?@?@@@$#159!285?O?O!6?G??C!9?@@A?AFCCC?E?CEE?@!4?_??_-#193~}x~}~~}|~x^~m|!4~|~~}!4~\}z|~Sjx{B|gCTu[yhdu|?O!4?G?CgC#104!4?@!8?DBA@kyP@I_WMBBbZ]}\NzM]|V^x}T~i|~j]xukWgwWGwgW_WgwgOo?__!8?oO_O_Oo!9?_GG!8?O!6?C?GgOw#182A?A?AA?A!8?A??A#54G??_??_#160?GG??!5C?O?GAK?C?@?A??@#224!7?__o_o?O!4?WO?S?G???CE?CAA?A!4?@@H@??CCSOO#199_A??_?_!8?O?O!6?W?Gg_!4?GA#161AOP@@?P?A??B??@#51O!9?O#21_???`Cag_OO#57?_!5?_C?IA?C@CEEAECDNDIW@BI\oos@?W#192@@#195?K#162@#155@A#124G??G!9?C#20_?AA#39GE#116w??OopIOHAG@?@#132SaAGC#119?OghPAO#125!4?_?o?O_?@OG?cSa`bOIi_IO@_?AO??M_E`AfAM?G`po#119???A?@?OC__Dff|WGH!4?CDC?GEEC!5?GKC#103?_?@?C@iOCO?ScaH__gCG#108O#99!7?HCKE@A?Y@cieHqComGs?gO__O!7?O#80CCC@GRG#85O?AG?C$#137?@A?@??@A?A??@A#105!12?A#137!6?A???@i??@?AG@?hATiDQdrGBqPj`GI`??O???_?O???C???I_?G#196?O#109?@??OCP??G?A!8?A?@ADFFvFVf^eUFVnE}^V^~n~V|mzMcZcIcGg?A?AGJFLLVbHHGGGPH?HH@F?C@@BFEEFC??C?GKGIAKC!5?@@?@#1@#31C!4?A#218@@#159GG#174_!4?O?W!5?CC??A#219!5_ooowOW?WG_gGgK?CES?AAIFJA?FBD@B@BAB??G!4?OO???O?O!4?!6O!5?GG!6?C!4?@A#159?G!5?AA!4@#92??O???O!5?C!4?_#164G?G??C_g_O?_???@@@??@@!4?@!5?@@!4?ECA?kAEGGOOC___?___?AO?GC#63?O?_#51O#92G?@#140@@!4?O!5?@#112!9?O#118_O#127!9?_O!4?G???A?A?OA#115?_!6?@#127?E?E??@???G#73C#112!4?@?CO@A?@!5?@!5?O!9?C#107!11?O?I?Dg?G#77@??XEoShOo?O#48!5?@?CG_#93@CGSHOLON@FHBDJFRNIVfJ~D~MzjZyuce_oooww{}$#196??C!7?C!8?A??@!4?_@CA?jSCB{AUPiHaDSQG?Ak?Cqc??O??_#96???C!4?H?AOAGC?A??i!6?G#82???A!4?A!4?i?CA?S??GOC#106??_#168!5?@!4?@#171!19?ICGCAC?A!8?MEECAC?A?A!8?C??C???C#154_!7?_g___??!5O??GGWWOCGCCCA?@??@@@#175!11?A!4?@???@@#197_?__OoOO??O?_GoGWg#206GO!4?C#231?GGG!5?C???A?GG?CC?C???A???A?AA@#212C?__A?@@?!5_#176_??_C??A?@#160_A??_GOGO??_#163?@#178@?BC?W?O@@B@?A#35_!4?__#86@???___?_!8?_#177?@!5?A??CA?@!6?_#179??@#91OgSA#125OE?DEDACaCSPSS]I?@BB#107!5?_#132!10?A??I@D?@???@??O??S@GG!4?@@!4?@E?AGHOg#143??_#118?_gw[[qOW??ECJ@DfBQrjaxXXhXXHxvQZMMe[Ig#102???JiFJQ[UU??G#98@??A??A?e?R?PiTNcwP?Oe?i?Oo?oO_OG__G?O?g!4?_#88C??ONNKFFBB@$#239!11?_?O#105!33?AS@iPGHQKbSHMS]voY~~nuu|Lg_pkP?K?sOE_og#179!58?C?CG!8?oo_o_#96_?_?O#214_?O_#64_#96!5?GG#237_#242_#106C?A!4?O!4?CC??AAA#104@#2@#220A#150@@#177?A#226@@#201@#185!4_!8?GG?CCAAB@#222!8?CCC?C?_cA???OO???GH???!4C???GOOSCO#185??A!4?A`?_@?@??__?_?_?O_O_O_?_#211??WgGOOO#174?CAK?I?GO??G#177!5?g!7?@A#176!7?BG#180AC?KM?S?KC#4_#1?O???G#157@?@??@!9?HG??@!6?_???_???_??G??b#38!4?_O#49_#121?G!7?___?_?SgOgtGVCI@lWiPICPEGFCNCCEABA@???@??p??QP@GGG@!8?C?ACJQlk^yNE@BA!4?aoooGWWGGGCC??AEEAEE#101!16?@??HEOAaCkHYchIO_?_??_#41??A#95A!4?@???AGACGC???O#123_#87!8?@?@??@$#106!64?C!4?H?AOCGA??aS@?@OC?C_??_??_??_#166!47?_!4?_#191!8?O#97???_?__O_?OOoOOG!5?O#191_?OC?A?A?@#48O#66O?O??GGG??C!5?A?A?A?!5@#211??_?o?GWGKG!4?CC??!5A?A???@!9?GG!9?_a___`@`_#221G?G??!4CAE?AB!9?!5@#200???CCC?___#155G?K!7?g???_COc?A?C?AEA??_#186???@AFB??A#36_!7?A#179A!4?OO!5?_#178?@A??HCOCGC?A?O#156?C#173G!9?A#69!6?C#55G#73?A!6?_!7?C#128!19?oO?_OW??SOKcCK???C??AACoG_GdO[Oh`O#114!13?G!6?CA??_??O??_?O__O??`?pPG_SQi?D_#72!8?@@?ABCdJStHUgQ_O?O#123???@#41!8?C!5?T_GC?Q?`?O#42???G$#0!75?O?@???D?@?S?C_@?_??`??_C@??P???`C@A`Q!8?@???G@?G_?O?gAPC@JCJTJFV!5POOoQ_CEEFFF??@?O??WIGIK_?`?@?GG!7?@@!6?@#198???A#233A#181?A#180!6?@#164@#156@#92@#197_??O??GG??K#212!16?GC_C!4?AA??@G#174??!4_O_?o#229@?@!4?G?G??CCCO?!4O!5?G?GG?!5C?C!4?AA#228?A@@#160?G???C??A#195!28?@??@A??A#173A?A?@#97_!4?O#90o?GOO?O_#180A!4?B?A?_?OS?KGG??G???S#25O!6?OC?@#148_#130??__#129_#126!8?_?_GOcOIf?ACKAfTmtZmHvGH?I@!9?@??AA?A#130_#112@#126!11?AC?AcDQO#115!8?G?AC?A?ca??_??P??_???_???_??PA`@CT_O?O_??_#120!16?G$#110!145?GA?C?G???Oo!5?OO#138ACA?@!9?C!5?C#153O#174_#158?!6_o?!5OwkGkccssOQ?AGJEAAG?FABAA??@#229!13?O?O?O???GGK?C#200!4?G!6?CC??CE???@#238???G?G?!7G#161@#224@!4?GG!4?C??C???@A???@#154?CAC!8?O#25!26?_!9?C!6?@#168AA?A??Kg?_#171!14?OO??W??A#204A#152!8?@#132??S#128AHAK`LQHEII?@@#116!21?__O_?g[?K_O??C@GGcC?sq?OWOWG__OO#69!18?@#126???O$#214!145?_?_#97_?_#106!11?G#82??GGC?C!9?A!4?@?@!6?AA???@??@#190!12?_?_?OOO!6?C?E!4FBBB!5@?@@@#199__?_!7?O!8?sC#210A??O#190A?A???@`@?@??_#234?C!4?AE!4A?AAA#227C#190OO???O#158!5?G?A#163O@!6?@@?@#124!24?O!4?GC?C???A#170O!9?OO_#28!15?@#15@#23@???@!6?CGC#127!5?W?G#140!39?G#73!4?@?C???O#140C$#64!146?_#90!21?_!7?!4O#192_!4?OO#208A??C@#188G#28G#209CCC#199!18?_?O!8?C#228!16?O?W?G???C??C#175!5?G!7?_??A?A?_ABA!4?@???_#220?A??!9@#235??A#206!12?O?O??SOC#169!29?KGK!4?C#16_??O?G??_#21???_!9?OA???@@A?DAACEEAB!5?OGGB@#129!54?G#119_!4?@$#168!168?@!4?@#226??_#166!7@?@#196?G#11O!8?C#210!19?!4_Oo?wo?OOOWGGG?GCK#200!5?A?A#210???@@@???@#159!5?OG!4?_#228??G#227?G#236!6?CCC#206??A#159@??_!4?_??_?_?_#156!18?CGGGOW??WCCG?@?b@OG#79!16?_#207O?G#196??_??O#17?O#14_#83_#169!7?C?CS!7?oaa__?OO!7?G!4?A#142!62?_$#181!177?A#1??G!4?G#168??CC#155O!9?C!5?AA#185!44?_?__O??O#161!4?_O#212AA???@@#197!7?_AAA??_@!6?O??O!5?G_!7?CO#162!6?C?eaCiEegREZkZ[[badLx\V]Q[SOG#12!7?_!8?G?GKG?G?WC#36A!7?G!9?@#191??O!5?_?@$#241!177?_#193???O!6?G#15O!9?C!4?A#223!80?A#235???CC#222O!6?G?G!4?CC?D??__#168!43?O?OO#21@#110O??C#194!32?O#51@#153GG?C$#105!182?O!9?@#177?G#232!95?@#160_#200O#174??_#175???O?O_??O?O?GG?O#138!44?O?G#109?GGG#207!33?G#216C#57?_??C??@A$#207!182?_#243_#156_#179!4?AAE#227!99?G#210!7?G?G!6?_#23!53?A#64_#192!36?C??A$#237!189?GG#150G#240!170?O#168!38?_@oWK_$#110!189?@#202!211?C?@$#79!401?@O-#193VFdBFTBlAO@L?P@WVfdVFdfRNfrmFTFrkJC^cj[JuVVvFzFqGPcY?hO?PADitIPg@?C!8?_#0??A#104?@?CA@GI?dXEAiDPIARHIeBJAhXHdvffU^bfl{zskv{}t}|u|Vm|JsySkDvJHQIAB!7?C?@#160_???_!6?O??GG???CCCA?IAB@?@@@#161?_O?O???C?O???G?C??C#227???G#190?@???O?O?O?O??G#159?_?_?_??O!7?_#190ACA?C!4?A?AA@???A!8?D@BB@?@??@!8?@#228O??O?O!7?!4O#206G?G!5?G!4C#195?__#156_!5?@!7?@#226!6_#12?C?CC?C??AAA#245C??C#97CA?C???G!6?G#104G!5?C?W#110O#34_#169?@_?@@!4?AA#36?C!4?G#92_?O?A?A#142CCC#119_?_O_???C!4?@!4?@#128???___???AGeIBIHH?M_EKRDP@CAOY?WG!6?CCWIOIPioSACA#118!5?@!5?O??WSA?OP@??AHBNH`@P`@OGGYuQTsM\II?aO#102!4?GWPXnvDt?wO#72CCB@CAAtLUPYPi\gydwoGoGO?OG_OGO_O?_#93A?DkO[TY]|rn^|~j^vm$#196g?W_W_GOChEoBkAD_GOGoGOG_OG?OgOGRcZ_JSBsHggGwCwLtiZduSjlisgO?_cAWaOaGCO_C_#106!7?@??A@?I?AOD?iCP?cO@GS?CA?QG?OG_?G#82???C??GA?G?A?A??AO?C_#105?_?OQG?G_???G#2O??@#153O!7?CCC!9?@#208??@#174O#197___O?_?_!5?GGOO?O!4?ACACC?DdA_@?@!6?!5G?_?_OcW_k_iA_A_??Q`o?O?O?__O?oO_??P@_A!8?G!7?A?AA?A?Q!4?AAA!9?@?@#189_!4?_#235_#186?__#228O!4?G??C#79?_#162A?@!4?@?@??@??@?@#96G??GG??K???C???A@BA!5?GG???C#90IAEB?A?ADC#157?@@???A?C??C???AA???A#16@#132_!5?G???IGg_O?OO??O?WGGCoYCG?GEC??@?__??o?O!4?GG??@??@#129_MYEG?O??@_#132!4?H?O?g?E_Op#112??@?GCa!4?@??G??CO#114???EA??A?BO@?@_A@o_TsICiT?ahC@?C#101!4?_BkQzCsJoSGq@mCgS_O?O#120!6?G#41!5?@???A?D?QG@i?`AG#85?_??O_G@$#237?g?W_GO?WEwA{AkA?OG_GOG?O???g?g??O_?O?_#137!9?AC??HACQCGO!4?CAG@ODhASG?W?P_?a_?GC?OO??_G??O!7?_??O_#1!36?OO!6?C!4?@#158__?oOooOWGGG??CCC?AA?A!4?@!9?BA@@??@?@#219??_!4?OO??KCKK??ACCCBBABABBBA@?@@@#200?G?G!6?G??W?GGCGC?GGGWG?C??O??OO???CC??C??CC?CGGG?G???AA???A#178_#195_#243___!8?_#230!6?O#164?OO?OAC?m?BCA?AC#51@!7?@#57A???@!5?`!5?O??O??_?_!4?O??o?O?@?ASSAaA_?QGSSOO!4?B#49???_#39OA?@@!4?_#112!6?H?@!7?@#116???O?owSSOCCDAEL?A@ACGAcqs_cuAQP@pRmlzbcDcdcCC#73@?@??O#143!5?O#119?@HHTb`gkNfemxHduwo_GKGSgc_?_GCGG#107??_?OGCa???O?_???O?O#98!5?A?CHA?g?`A??A@?DJbFPF`N`FhVcQMUXdWQ?D_?D#88!10?O$#239?OAC?AcA`!5?O_G?A??A?c?GCP?A?C#105!25?@ADITIPcTiLqQlJr^f^m^|\]}rw{cctOC_w??_cW?Co??og?C_!7?O#196!27?_G#166_?O!8?ECCEC#173G#96@@@#174_#185_ooOoWwWWWwkWOWG[GYK?L@LLDDC#206_???OGCCG?AA?A#210!6?a`_AHH@@#206?C#175o_G?WCG!4?OG?cSSI@WGC?O?J?@?P!4?A??A?!4AE?A?C?ADABBA?A#199??A?A#159?A!4?@@#163O??_#199???@#26???_#155?O?O#216?!5O_O_O?O??OGG#26__#7?_??OO#193_!6?__w!4?__o#106_#105__#14A!5?G!5?G!4?@!6?O???O#164??A!6?_?_#20???__???C#63?A#118?_??O!7?AEAC?A??!4@#140!7?o!7?OSO?@??@!6?C!4?_cGc@A?O??@#127!4?A?a#115!13?GOA?OO??O?O??C!4?CGSG@Q???_A@???dO@?iTCA_E?O#77???ACAh?wGoH_!5?C#99@ACCGA?CGaGQ?QGA?IC``CW?g@_A$#96!83?@?A@?I?@?T?I?`G_?PG??C?COG?O?_#182!31?Oo!8?G!4?G#170?AA#180??C#2?@#190_?_?___??!4CAUCQMAM!4A#156_#154@!5A??@@#230O#185!10?O#211?!4_o_o??SC#185?G?CKOKCCE?A?`???@A!6?A??A!6?@?@@@??C!8?!5@H@@?B!5?@@#223_??OO!7?G??GG??G??WGC??GA#21???A?BC@@???AB?B!5A@@@#16C!4?A?A??G???O??O!9?G???G_#21!6?O?A!5?_??O???@#69??O#81?W#73ggG?O???O#126!8?OG?C?C!4?AIC@?@#52??O#129O#130!5?@#127?_?a??@?G#121@#126@#38_!5?O#121!12?O@g`LiE}Zm~uqCaKCA?_???Ea!4?OOo_???CcC?G#48!39?@???CO?C_C_COC_?G?G??_$#0!96?C?AC??CO?A?A???G?OGOA?HA???A??G?gO?cA?H?Q??c@@??@!6?AFCD!9?A@??@#82@#106@#173A#205!4?@#180@#176@#199?__!4?o??o!5?G?C!7?A?A`BaaqP?BP?O!5?S?WC?O?O?A?oW@@bSGCBWlBF?@Q@?@@OA?AO!7?EGI?K#206GG!5?C??OC??O#210?C?!4C?A???E#15!6?_#156o?o#15!11?_!5?OOS??GG#13?O#35OSCKG#0?G#90C#218O?O?O??O#25?@#104COB?CC#83A?@CDH@HAA#170G?OG??W?G@A?GG???G?[CC!4?GG?CG#114!7?O!4?_#127C!4?O!4?_??_!5?C#49!6?_#142!21?CC#126!17?G?PGQDG?c#69!8?@??G!4?G#103!4?CAA?A?A?@?@???A?@?@?GTGQ`EGa?GiIL?@#93!17?A#95!13?@!4?A??A??_??CO?A?C$#109!103?@!5?G?@?C?A@?AP?@@?@?@??@??H@ARGGc?csDCGG?AAI!6?@!6?A#196?A#194??AA!4?@#175!8?_?o?O_??OGK#174O!4?A?A?@@@#212!18?@?@#211!10?OG??C!6?CECCC???!4C?CKGGKGH!5?A#156G!4?!4_??__#189?__#173_#219!4?G?GCGGKCKCE?E?A#178!11?AC?DC#177?@?GW???GG!4?@#91?@#182?_#2G#170C!5?C!4?A#138_??_#36?_?__!9?_!4?_#25!8?_!6?_!5?@#38!4?CA#121_X??O?CeDHhZEL]ME]AEAB?@JDDB?B?@!4?__?O$#191!144?CC?CG#194_OO#138G#156_???O!4?G!9?A!6?@#200!10?_???GCKGC!7?_#161!37?_??_#222O!7?G!5?_OOO?Oo!7?CC!7?CCCGCG??G!4C??!5A@B@@@??@A@#173!7?___OW!4?A?E#70??CGG#83O?G#150O#82??o#239G!5?G#153O#76_?_#90H@@?CCG#79_#12?O!4?O?O?O??@?@!7?g!8?CG???C?@#103!4?O#74A#112_#128@!4?@#73!11?O$#179!144?A?C#64@!8?A!9?@#207???A#212!20?_!7?O???Gg!5?O#206!35?_?_#174??__?_?@@?_@??@!6?__???G!4?G!6?_BA@#175!4?!5@?@?@#18!4?_#163!14?G#25???G#6??_???O#37?G#14?O?CC#198!4?__#164@#168A@!8?__?_!7?__?__!7?A@G!5?G?AG?IBAEGCC?A#145!7?A#116C@AD@$#97!145?@@?@@???A!5?AB???@#223!29?_#224_!5?__??WWOG?G!5?CCCAAA!8?@?@#210!14?G??G??GCG!4?C?O?C#224_#161???_?O!8?CO?OW#178???O#212O?WG?WOGOg?C!5?C?ACDFA@ABbBBBFGB?A#2!6?___#25!4?A#166?OO#157!4?A#86AA???@!9?G?AEAE@DVCDA@!8?O!4?O?O?O_??_O#192@#91O???g???D#152!4?A#125SGG?OO??___?__?__owM_OO??G?GaG`G???A_KwOgOcQGHA?G?@!7?GAOIOIPAgl?SE$#110!145?AA#29O#168C#106?G!8?@#164?G#229!34?_???O?O?O!6?G#159!44?OO???@#219?__?_#154!5?O?_?WOO?O#176??__!6?!4_??_!6?OW???G???G?GGCCG???@?@?C!7?A#204!11?O?O??O#246G#196O?W#109O#3O#35W?G?B!4?C#37???A#208?C#179`@KacCG?_aG{CC@?G??G??@!4?A#130!10?A@#141A$#209!146?__!8?GG!9?A#66!28?@@?@#228_O!5?G!5?G#154!42?__#158_#212??O!5?_#54!4?__#66O#50_#177__#155_O#224!16?O!5?G!5?K?A?C!8?D#57!9?O#28C?C#203!14?G#183C#169@#110??GG#124?_#34??O#4??O#145??C!4?A?@#245?C!5?C#215!8?@@#191!4@???@@#126!12?G$#171!146?G??S?G?G???@!6?C#236!32?_#222OG??G??_??CCCS??A?GA???@?C!7?AA???@#206!24?_#159!10?C#158O?O??G???G#211!13?AA#189!33?G#244!17?C#241G#20???@#9!12?O#20OO#124??_#55!18?_!9?_?OgGK$#220!148?_#96?B#216_#174_#192O!9?C??A!4?@?@#231!24?__#160!77?G?G?G!7?@#25!78?_#51!31?_OO?CC??@$#207!150?_#150???A#154_!4?_??_!4?CC#23!230?O?G???@$#201!154?O#198G??G$#243!155?O#176O!9?CC$#214!157?A#155O!4?G!9?A$#179!158?@-#196ASASA_GQKO?C?CHSaSJCgU`SICaTIPgEhCPCi@hQ@GPiT_TItI`ZeZa[c[A?AOTipQWZ_lYShYSiSiOaSKQKOcG_?@?a?o???__???KcWOGC!8?CSK??O#214?C??CC#160_!4?OO?GGG?G???A??GABCE?B?@#222_???OO!6?g__!4?C?O??AG!4?@@!4?aAA??!6_oo???O?G!4?C#154?G??CK!4?C?CC??E?C!7?A#161@#227!6?G#230!5?_?_!5?___?_!9?OO???OG??G?C?CC!8?C#206A#234_!5?G#194_?O_oooOo?_o_!5?!5O??G?GG!8?A?AA???A??G??GGG!5?G#168@@??@@?@?BF@?A@?A@A??A?AA!5?CGG#90A??G#38@??CC?GG??_#132C?IA?AA??C#38_!4?GGg?o?O?G?_#127!4?C!5?@?AA!5?C#140@??`G?g@?OO?I#127C?C?E?G_?WG#73_?G??_#143!4?A??A#119!4?A?A@@A@??S???GK?AYAC#102??C??AA{goAOUaVSC!7?_#98!4?C???C?G!8?C??GC?@?A??I@WJ[WUGlB@#41@#85@G@G?C$#193g?g?GS??_Cg?gO_?H?_Q@?GB_PG?_E@OQIIPCQSCmbETiNiTAtMcXc\bZb|~{laDKcCcS?_?C_!4?CG#208?_#104!7?A@?A?_CAA?@??A@??OQP?A@@BPHB_@AAHGA@?A@@B?@@BB@@???A#4A#20A#50A#190_#188@#173@#155?@#159?A??G??O!5?G#219?O___??G?OOO??CGGGAA??C??@??A!5?@!8?O!6?__!4?O!4?Oo_?OO?OO?OGOO?OG??G??C?!4C??CGCC???C?S??O#223OC!8?GG!4?C?C?_O!4?G??GC?C!4?A#178A#201?_O??_#188?CC?C??A!9?G?GG???CC???G!5?G@G#162__!4?_?_!5?___?!5_??___#171O!4?G???_?_#157C?CCA??@C??O#63@#91@#55@!8?AA#69@#73A#126??C?G#52!4?_???_?O?C?G?G!4?@#132!4?CC?A?AG?C#38!4?_?A!7?A#121!6?@!5?@@D@BBmFLj^XntZ~h~z^l|t[{QwWEqaeAEAAE#107???@#101!9?KCGG?GGHITUhVGIDZChZ_\aXiPuLsZ[nO}KWSOsWk[?S_?_A_?_#93?G_OC[}}rypyx|{$#237TiSJsHSkRgShSHUhSjShUhUgTITiTgUhC`?i@gA@O?g??O?_G?O#105!9?@A??A@B?B?@AA@A@@@ITHQLonZv]y[gO[@VR`@@ao~pWAdA?KCCK??KCO?o?O?O#191O#186_#173_!7?G#199_?!6_!4O_O___!4?GGCGO!6?AAA?A??_?_@BOooOPWHw?wKsgcOo_{sWSDWCGB?h`?GQTKLC?AEPA@!5?@@@??@!7?@#212??GC?C#155!11?@@#154@@!4?A?AAA@#231_#232_!8?__?_?_!4?OWO???OO?OGWGCoO_#189@#187?oGGKW!5?G!4?O#171O!7?G!6?C@A@?A!9?AA?G!4?!5G#106C?C#76C#204GGG#4C#13C#207O!7?G#138A#57H??G?GOOWQKWOs?_O_#140@!5?A?C?E!7?O_!4?_??CA??A?C?C???PA!5?W#73???G#142_?__???g?OA?O#126!10?@???@??AA_?@gOC__OGC?C??_#118??A@?CCeGHHWlHd@X|dwIeOA@#77!6?GC?G??QSI`QgP?O_AO_A?Oa?A?aIc??c?_!7?o#131!12?__#88??CCEDAAB$#239?@@?@AB@?BBABA?A!9?_#246!7?OC!4?g#239?C#137!20?GO?G_?GQChOChSiS`?a@_B???@D_UH`MG_WGWGG??A???`_?_!4?o!9?G??GG#185_?_??_?OO??G?G?G???O#200?_??_#206_!5?C!4?G!7?C#230G!5?CC#212???C#211!5?G???A?IGEBFC@??GDD!4AB#224!5_ooo__GWggGwggwgOgGWG?OG?!6G?GKK?C??KSSOW?S[CCGG#58?A#216W?o?__!8?A?_!7?A??AA!7?D!7?A?@#209CG?K??EC?AC#164_???_#176_!4?O!4?_???_?O_?O!5?O?O!4?O!6?O#173O#9?C#3C?!4C!4?A#35A#12?A!5?A?B?CSG?_#136AC#52C???C#121@@??BD@G#129!10?__OO{?O??OO?___!9?O?_GG_Gg?o_O??COO#132!8?WQPA?eoKG_?O?O?C#115!12?A?@?@??@?_?O_??COPAg?Cl??@?@??@#72???@?GC?EDACXECWaLCPK?O@?`OJ@QbjiBaRaCg^US?B?Ba?A$#246???_??_!6?_#192!20?_?O!4?O#106!49?C???G?OAOD???@???A@OaCGA??A?@?A@?Q@?A??AG#154O!6?C!5?C???C!4?@?@?A?AA@@#185@?C!6?@!6?@@!7?G#212!8?@#185!5?AA?A!4?O!7?@@?@?A#222?O#229?_!5?_?_?_?_O_O_O_OoOOoOw_WgOgggC_G#155???@?B@?@@BC!9?@?@??@@#229?C#238O??O!8?O#15?@#173A??@?A@#220_Co#198C??A???C?@#182C#214A??A#30C#196A#105A#109A#138AA?@#26G!8?@!4?A#212O#79@#57@?A?@B@AA?AACAC#203G#36?@#194?O#191GG!4?O?_#164??C?H??@#14?A!4?A??G#116@??B!6?o?oo_OGOoOWy[Y[?CA?CM?K`l\UCXryhhx_osocGG?OI?ROFFKfjAmhJJ^?O?o#118!9?C#112C??A??A??_?O?C?Q?G_?g??OC#114??OO?_???@_GdOGQ?P??A?@_#53!11?G!4?@!4?_@???A#99???@??D?@??@@?@?SCS?D`TAWA$#184!11?O!25?C#150!58?C??C#96A!4?A_??A@O!6?ACCCE??A??A#174_!9?G??G???KCKG??ECC#224??___!8?O?OO!4?C!6?A!5?@A@#197!14?A`?__o?GGG?E?AAAB?@???@??@?!5@?@??@?@?A!5?@!9?AA#227!4?O?GG???_?O??G?C?C?CC#235?_!5?!6_?O??G?GGC?C#195??@@#172GKG?OGOGG!9?G!6?C#180G?G???G??G!8?A???A!4?A!6?O!5?_??C???K#25?@??@@#86??@#180??_#124G#109C#37A??G?OO#125@@?K?OGi?CBCcBM?E???@?@!6?A!5?C??AE?BGB?ODVCDC?C?G!7?C_C@dIE`leS}??!4O!21?_#103!5?O!7?G@uhOkBU@oa@S_b___???_o??_#53!24?G??_?_?_$#182!97?CC#0!5?_?@!5?AO_AgG??@??HGC@???@AA!4?@#156C!8?@#161!4?_#54!6?A#228__??_O?O???GGG???G!6?C!5?@#174!17?_!4?OOOW?CC??GAA?!5AC?EAAA?!4A?AA!6@???@!5?!4@?A#243???_??__!7?GOGOGG?CO???O!5?G???O??CC??C!6?@A!9?_#195_???_??OOO__??_OO!4?O!6?O#201?G#173?@?A#169???@!7?@!8?i@gCSOOoo_kCk__g???_#170[?_#96O#104_#128@?G???WK?O??S_@G@H@DADAB?@B@@BB?A?GICG@QO?DK?C@?Q?BOR??G!4?@?Cc_?piY?w???G#48!92?A??G@G$#110!104?C#208G???G#150??_#97_!6?G???C#156?__#188O#179CCC#207G#153C#162G#109A??@@#158!5CAAA??@@@?AAAB!4@#229__??O??O!4?G?G?CC???CAAA?AA!4?@@@#200!12?G#190?@?@?@@?@#156!4?G#155!6?C#160A!5?A#228_?o?_O_O_O_?__?_?O?O!4?_G??Gg?OOO!6?__OO!4?oOGGK?GCGG?GG?C#221!9?OO_?GG#26?A#3??A#106A!4?A?C??C!7?@#104@#220?CC??C??C?C#157??@?@@B!4?@!8?A?A?A#179!4?B?A@!5?_!4?_!4?@!4?O#58C#110_#127@#74G!4?_#119?@#127???@?H?C?A??@#149???_#130???_#142_o#49??A#121!13?@#130!10?O?O$#191!106?CG??G?G#110!6?O!8?C#189O#177O#197_?_!7?O__G???O?WWWoWSCWSGKGEMIF@?C?CCECB@__?@???@?@!4?CG??O#206!17?_?C???O!5?G!4?@??@!5?C?D@?C?C?C!4?A?AA???AA???!4@?CCC!8?C!7?A??A#176AA???AA??A?A??BAAA@?B?A!4?@#20@#31@#193ACC??A@A!7?@@#187C#216??OO???O#192A?CA?A#28?@#164?_?A??`!5?O!4?O?A?A___#170?@!6?@#21??@#36??A#183!5?A#142???A?AG?G??O?_#52!52?C$#109!109?O???C???@#171?_???_#182??G#198O!8?A#196A??@#210!5?O!12?C#212??OO!5?G!5?O#231!4?C!6?A!4?@@#158!24?GGG?!4C?C#156!7?CCC?C!5?A?!4AB?B?@AAA??A#50!7?A#156??BEIKJDEB?BA@B@???AA??@B!11@#164!5?A?A#29?C#218!5?C#76@@!4?G!4?C#124C#213@#202@#233!7?C??C!5?!5C?C???CC#153!4?G!6?GGG?O!4?O#16??@?@!9?A@#35???C??O??_#56O#144_$#193!109?_#182??O#245!6?G#194_?_???O!8?C!8?@#161!19?CG#190?@@@?A@!5?_!5?O?O?o?OO??C??C?A#227!23?O#222!17?C#177!30?C?C!5?@?@A#231?O#154?@?@#92@#205_#248___!5?O__G?_O?_#177??@#201!11?o__OO!5?O??G??GG???A?I#163_!6?_!6?_?_O?O_?O#161???__#105!7?G#186_#202O#201_?O#193!18?O#165?A#86_#70_#145O_?O$#192!121?_???O!6?C?C#159OO??O#175O!4?_?_#200!19?G!4?_!6?A??G#176!90?G?OOA?GAC#247G!7?_???O!7?C?KCG#181!17?@HGG??G?C!8?A?A@@@#11???@??@#243?G#192!13?CGG!7?G?OOO#130!25?A#129?C#149A$#82!127?G#193??G#155O???G#201C#195C#105A???@#174!24?C?C#210?`!4?O!5?___?_C!4?CKGAGA?O@WOGKSKSA#235!64?O#15!4?@!6?A?A!7?A#227??C#153!25?A#186?_!8?O#209!9?C??C???E!5?C?CCC??CCC#11!5?C$#191!139?A?@?@#211!25?A@!7?A??_#189!97?C#238??_?_#224!10?CC#138!29?@#207_!6?O???C!6?G?@?@??G???G$#175!173?A_?A?@!7?G#109!140?@#204??A#137@#178_???___O?o_?_???oO??Oo?oO??o_O?O?OA???OOO!8?_!9?G!5?O$#159!175?A#242!154?@#216_#241BB@A#21!10?_#186???G??G$#173!346?O#124!4?@??G!6?A!6?@??@@!7?A???C?C?G-#193i?G@_C`OC_?@OcH?i?I?I@CH??Qd?GA?QH`?Do?@UCQgAPSJ`ciQctJWdYnnMlS_\aXEgDi?TgQC?AOCW?G??C??AOA?G__O??__O?OOH???CC#176o??GW??KAE?A@!5?!5_OOO!6G#178C#224C???CA?A?AAB#230?@#210??O?KCGCK?EEKBIDJCKDNFFJFBEBBA@DBDA@#206AC??@??A!4?@#199@#222@#243!6?_#249?O!4?_#223?@#232GWGW???!4GWO??K!5?___A???_?__!6?OSOS!9?G??`?``@?`@!5?C#180!12?G???O!7?O?O@?OGO?A?CCCAA???@#57A#55_?cGO!4_?C?A??E?_?C!8?C???G#62OGg__O_O?OOO?O__?__??__???OoO?OOooo___#145O!6?@@?G?_w??__#130?O???B_?O_?O???O!5?O#128_A??O?_?`?`_qAAA@GGHdOCcOKGSQDACGO@?G??G#126?O_?_?I?COI?AO??G??G?CACC#143G#115!5?O??CA?H?kP@GYdkG?GgO?_#72!13?@A?@?D?A@!9?@?@MS!4?A?EGP#131G?AQ@s??Cc?O?_$#237TiTiThUHqLYsHQChDydIpm@qlQlOlQlQcQKOiDY_H_DOdI_CGP?HA?_A#137!6?HA???O@_?I?C?qCXaHCpcXAwEGgCHcA@O!5?GW!4?@??BAA?A#104?A#197__?wOG_KG!7?CEABAFB?@?@!5?Go?gO?CCG?CE?A?A#211!4?@@CCACBBA!6?@??@#231!4?_?O??O???_??__goo?OWowoSO?G???OWO?CCAAAI???C??CC!6?A?A???A?C?B!6?C?C??O#235?A??AA?AG???A??A!8?@??@!4?A??A#173??G??G!6?C!4?_!8?C??A#54__!7?O!4?_!8?_?C?CoG??_GG__!4O?O?O#53_#133_#77__#177!4?O#69?__#180?@?@??@@@#179@???AA#55O!4?_#241CC??OO#74EIG?OO??_#52?A#149?C#116!8?!4@ESvnnYSmuEtSDUTUVCh[|wEdeQNqRJrb?@OOOP@!4?G#119!8?O!8?`CaQ?__!4?__cc!5?B#107?_???C???A?C#77A??A?I?H?@?F?iCADK?\A{?E_SgTqdEGFGECYOObtnEb\Op#134_C#93?GSHUHUJPBtJ^^$#196?T?SAOGAHQ?G??AS?@Od?Oa?Ql?GQdOl??QCOACQ_H?DG_J_OAPcXASdYdOOpQa\a\ehUYTtiRlHzcLq?CA_h?WOCGSIcCI?OgM^B?@#22_#7_!5?G??C#105?@#156CO??I??@?@_@?G?O??G??OO?_?_?g?GOoGW#222??_OoOoWGK?XSOOS?WAGO#229??_?!7_oO!6oOwgwWGGS?K?C?C?IAK_CI@MGDMEDA?I?!4ADDD@D!8@???@?@?@@?@@?@#187??OOO!5?G!5?G?KG#220??C#186??_??__?!4_?_?oOooOoOOOo!5O_?O??O??_?@#124??o???O#21_!7?C!4?A?@???@@??@?@!6?@??@!5?@??AAA?@E??!4G?GG!4?OOWOGWWIGIC?KGCCCG#12@#90CCC???O!5?O#14O#116?@!5?@#52!10?A#149???O#52!7?G#125???_?_??@?@??@!6?C?SgcIHJ_gUJONBDj`G[SCCC!6?GG#73?G!4?C#114!10?C@KCsK@?eP?Y?o_O?cO?_!5?G?G??O#53!10?A#59!4?_??_#53!5?G#40?O#100!4?O#98gvd_c??_Og?G_$#192??a?G!7?A#184!20?c???G!4?_?OC??C#105!31?BIPESB@FPa?P?YDN?OP?CB#150MMAA?DB!5?@#216?G!4?@#174?___!4?!4GCGC?C@!5?_O!9?CC#229?@#199QOA?JBJH#224???__!4?O?OO?O#236?_#197!7?CCA???AA??@@@#247!13?_???__o???OO?O?O!6?!4O?SKC??CGC??!4CAEC!4?EEE??F!4?@!4?AA#187?ACE?C?A?A!4?@@@#188!10?O!4?G?O@O???G???G#23_???G??G#63G#155?CAE?AA???AA?AA?A??A!5?@@@B???C?C#164A??CC?C!5?GG?HG#139!4?___???___#168?A?@A#14@#16GG#38O!8?@@DE@GGYKCDBkJsgOohOC??G?G???@?@!6?GG!6?O#127!10?G?C?A?GO@OCA?I@??O#112!7?`?`??@??O?_?_@QC?A#103???A@G?OQ_Gad?RCWaTGgOWSAaBg`GOPGGgOG?g?OG?_OgKWgOG_W!4_???GW#99!6?QH?gAGC?O?C$#246!5?A?c??`?_?_?O??OC?OC!8?H!6?C?QG!7?C??G#104!26?_!5?_#0_!7?_!4?_???C?A?G?@@?@#124??A#194?@@#222_?O#199??C???C??B@@?@???A?AB!4?@#195A#161???C#219_?_?__``!5_o_oo?WoGoW?WGCWKGKKKMIKILA??D!5?A!6?@#228!9?A?A!8?GC#248_?_???_?_?_!6?!5O?OO?GGWGO!5?G???G??G!5?C?CD???AA!4?@@?@A?A#187!10?@#176CAC?E??AA?A!5?@?@#15GC#92!4O?OG?_aC?E!7?GWSOOWSOW?EQYOOCs??_?GG!9?O!10?O???O!5?O#36C#25G#69__#96A???O???O#37_??__#129A??A?A??OG??G?JWmmsh@GO??@?@G?GGG??GG???A?OO#132!9?___CA_Ce?OOCCQBIAOAGC?CG#118?AAUqO__!7?@OPC~zwooAB?MO#102!4?@F@?@DLD`tSsUOo??P_O__!4?oW!5?O?_O#95!21?@_AGA?_$#184!10?C!6?C#192!17?i??`G???A???O?G#208!39?@??@???JE#2???_??O#31_?O#15O!5?CC??C#200!7?K#159A#155O?O???_??__oO??_?W?G#163C#212!25?O#222!18?@@?@#236O???_OOGO??o?_!4?_?OWW[CEKC!6?AEE??CA?ANMMMEG!8?A??@!4?@@@#216_?_?o__O?A@AAIAWO!5W@P@???KCGC?KCKCCC??CEECCACAA?AC??A?@?A!5?@!4?A???@#162?@!7?@??@?@!6?@!7?@@@??!4@???G@@@BECCMCMEE!4C?K#57!4?@#86CG!4?@O?_???_#140!4?C?A@@!4?C!9?A?a!4?_O?`G@O?A???S_?C_A?G_HG_??B#73!5?C?_??_?O?C#101!47?AA?A?G?G?E?fCaDAATaSBi@DIDA@A@F?F@IDM@GAO`C_nGFA$#239!11?ACHOA!6?G!4?A!7?@!12?A#96!41?_?O!8?C?@?@#26_??G!7?A??@#210!7?D??A#162O???O!6?G#228C!6?A???@?@@#227!36?!4_G?O?GO?CC?KACC??A!4?@!4?@@!7?AAA?A!9?GG#228??@!6?@???__?_?O??O!5?_?O#205!7?C???O!9?A!5?O!6?O?@#178!5?A?@?@?@??@?@A??@@#73!4?GGG?O?O#59G#148_!6?_!6?_#69?o?O!5?_#178AC?CACC???G?!4@?@?@!6?A#245!4?A#104@#97@???AK#142AAC@?AAGISCC?WwW??BFNFEc_O!7?CG???AAA#121!29?_?_???_@h`hrjtztMtS?@KD^JXZzV}LYJGj#114!49?O??O$#184!96?C#191@#3!4?_#182??C?A#21?O#18?G#161_!9?C?F?Qg#211A@B#177??_!7?_#223???C#212EA!4?@@?AA#174!38?AAA@?@@#247_#238!16?__!5?O??_??_?_!5?_?__!9?O???A??OGII??G???E!6?@#173!9?O#195?O??C?GC?C?G???GCKAGGAGG??G??GG?L@?ECCE?AA??B???@#176!9?@#39_!4?_???_!4?_?_#163!4?@???@A?A?AAACAAECC@!7?A?A?A#164AAA#109!6?A#183A#35@?G!4?G#128!6?@@$#237!96?_#10!8?O#198G!9?@#190!12?A?@#154???c!5?O?OO#224!51?CC?_??IAAE??AB@@A@B?@@?@?@@?@#235_!8?O!9?W??G??G?G??GG#195!4?_#221???G??GG???CCC?CCC?C??CA???A?A?A?A??A?@@@?@?@?@#223?A#26?G!5?CG?GO?GWG?G#58_#50?__!4?C_GOKO??Cc?C?CO?CAC?C!5?C??C#23!6?C#59???_!5?_#169!12?@!4?@@@#83!6?GG@G??G#136B??C#56!4?O??_?_O$#226!105?G#6O#106G??CC??A??@#160!11?O#92!6?_!5?O#228!55?GC?C?C#234!22?___#221?_!4?__?_#249!5?_??OCAA!5?A!4?A??AA???C#223O??o__?OO??G#207!7?_?_?_??_?_?_?_???_??_?o?o_O???_#28??_?_??OO#156???C!9?@#140!4?G#81?G?G#23?@?@#156@#177A?A!7?BA???C??G#161??!4@??A??AA?A#250!5?_?_#239!11?C!4?W$#214!106?C#173___?o???G#161!23?C#200?A??B@@@?@@!6?G!5?@!7?@#230!27?OOG!5?G!7?G__?C#243!8?G?O!4?CGWG!9?!4_?aG?`!4_?_???O?_!8?G?@!6?@???O@!4?GG???GI?AA!7?G??G??C?CC!4?A!6?@#121!14?_#72!28?_#40???O???_#91!11?G??CGGG??O?O??_#70@Ac?_$#164!112?GO#185!27?@!57?@#216!32?O!6?O#234!6?O??C?C?GC???AC#195!12?_???_#194!12?C!4?A!8?@?@?@?@#164!4?C??A#223!5?@?@#177_??O?G!4?C!6?@?A#39!64?_#152O!4?c??C!7?_$#4!112?C#206__oO?w?CsIQOY@SG?CC!7?AC?G??A__?CcTkWGG?AA#230!79?O??@@?@?B??@??A?@???@?@@???!6@#173?@#176@POO??G!7?!6G#248!21?@#36!8?_#79??O??G#49???_??_?OO??GCOOW?W?oCO_GgG?GgcWG?_GG???G#214!40?A#237A#63_#130@$#97!112?@#222!28?C#201!148?C!5?A??_???___??_?_@`@?@___#51!8?_??oO!4?OG!8?A??C!5?A??A?AA??C?A???C!5?G!8?OO!5?O#244!18?C$#195!112?O#189!177?@#18!42?GG$#202!112?A#164!221?CC?A!9?@???@!6?@@-#193C?A?C???A??Q?C?i?CG@O@G@A?D??H?D@c?AWcOcGcHCXCHc?QIAkta@UlId]dI\A|A|AsIPgASJSdWoJA?CAD?CE?DQ?A#24?_#28_OO#173G??C??A#219??O#197??_?A?@???A@H@C#15!4?C!8?A#197!5?@@#236O?__OG??o?OoOoWOwooOS[?C?C!5?C_??CECC?B@!5?E?AA??AA!4?@@?@#248AA???A#235??_?_!4?G#224C!4?A?A?!4A?A#195?C??C?@?@A?A@A??@#171G#192_#232?A?@?@?@?@@??@!9?@#124??__??QOOg_gS_O?WGgOGG??C??A?D?AE?@??@#92OKKEEAVMEFBCJAE??@@@?@!5?_#73?GGG#59??ooCC??_!6?@G?OOGOHDo@??A??A@GWO??OO?_!8?O!7?A#148@#39A#250?@@#73A!5?A!4?G?C!5?_#130G?@??A?@?A???G!6?@#149??@#125!5?o?gO[AboZO}Gj\DHv`[IIQ_``@A#119?GO???OWO!6?GO!4?@CBHDDSCKCCW?__??!5_#112!4?A#102GO?GKG?@aOe]CGYue|_?EEaap_Yc`pJmu}u^EOkCC#98??abD~J[gEWX{xIh{Y|$#237zItkRkJslTYcJp]@[qB{AiTuGtqkRSlQ_ZcPaHAXAPaOaOaXc@S`A?Cg??O??O?_#137!6?@ACH?O?A?D??@@@?GG?AQ???G#32C#2C#15_??G#206?_OWSKYKMMKFKDEDAQWGAKHHA???C!6?A?AAA@???@@@#231?___#227??__?_?_#235_???_#247?_O?O!6?G!9?!4ACC!5?G??BA@!9?_??A?A???@O#229?A?A?C#171???_?_?_?__#223!4?@#172?_?_?_?_#243@???@@@#205??A?EA?A?@@A???A???A#26!6?_?___???_???_#195_#173!4?OOG{[CC_?C?A?@@#51O?OAGHKG?@#140_O#39ACC@??A!6?_?@!4?pLC!5?A?LF?@@?G#102?CGK!7?_??_???A?_?`__A?a_?OO??GG?G?_@g!6?@??_??O#116A!7?OCCOO?O?okWSgGHHw_AQQUkw[!4g``WpD@[E`AC?C!5?A!5?O#121?DKKWSC`BNU|ne`fd@@fbfbebbbae?C?GGH@AGG!4?C#107!4?G!6?O?WAO???O_O?O#59!7?O_GOCG??O?_O?@??OG??_#100!4?q?o`O!5?O$#196?@?@?P?H??@???@!5?C!4?G?Ac?Q?O?HC@?@A???A?A?AHc@S@I@UhQdY`ItA|A|A|JskRsjcjWfIS@AICGC!8?@#7O#11G#156_??o!5?CA?@@??__?O!6?C?E??@?!5A?@@?@?@#247?O?_#231!15?GG?_?kWKW[K][MaMAEG@@@OOO??OO??ECCBB@@?@?@??@?@???@#232@A?A#195_#249@!6?@@#232?G!5?G??GGG!8?C#221!14?_#172?___#171_O!5?CSOOWKOSSOO#76G!5?G?G?G#164!9?O?_og?S__!4?C#55G!4?O?@WWKHO?WIA???@_?_O#119C#125C?AAS??A?A@??@#119A???A!7?C???@#99??@#103__???_?_?_!8?_!6?C!4?__oooO?H?G#132?@!4?O#136@?@#129A??A@BFDCCQ?@CD_aAF?C!5?CCDCSMAE?A#127_???G?A_A@S??WCGA!4?O??_#118WWo__!5?OS?WWOO?[[SGOxWOQQAQPrR?}XPomCYOOOoaa_?_??__#77!4?@?@?B!5?@@?@??@?BCE!5?_@`PO@d#95!5?C!4?A!5?C$#246?S?QgAoA?I_HsI_SaGsAhS_GTAG@G_??C??GCOc?sGCHCGC??G?GO#239?O!25?_GWOG#64O#246@#104A!6?@#26???G??C@A@?@#161!4?A?@A#174OO!8?C?E#154AA@@?@#230?O!5?_?___?OO!15?G!5?A#232_?_#238??OOOW?OOOG??GW?GGG?GGKCC???EEA?EAC!5?@?@@?@#186_???OOO?O???O?OG!5?CC?CKEC?C?ACAAEBAA?BA@A@?B!8?@@!5?@@???@#138?G#29AO#205?@!4?A#171!9?@#157GOWGGOsII??@@@#56?_!7?__#54??@?A!5?A?A???@?OGC?QP?C\?GU?UGO_o_#77?O!4?_?A!8?QO!6?OO?G?G_OW?KCO!7?G??C#59?O#149@!9?A?A???G#165!8?C!4?@???AA#132!12?OO!5?O__o?KADDG?OAA`?C#143!5?A#114??GG!7?GO??__?_!4?_B?AI?OGCJCA?[?QKBCA?A?CaGC!6?@??S_GOCGOcO?G??H?H??CAA#72GOiTOG#99??A@Wc???cO@_$#192?_!4?C?O#239_!6?@#192!7?_??O???_G?Q???G?@?O_?@??Q?_???G#105!26?C??OA???@?@#10c?O?A?@?A#79??@#212_?O??O!8?C?OCQ#229_?__?o_o?_o_?O_W_!5?CQCKGOW{K[KKKMCM!4EJABBB@B!5@?@?@#234GGG?GG??G#221???G!5?C#249CC??CC?C#173O#189_?_?O?G#234!4?@?@@#231H??@#194!9?_??!6_?_?o?oO_o_oWowowwWoGWWGCGG#76OOg#1O#106?GG?O#11!6?G#180!8?__?OO_oogi_?A?AA@#25O??o#15?CA#58C_?_#155?@#38_o!7?C#49CCO???A?@hgK??_C??B@#115??_#118!6?_#250???A!7?CKKCWO??@@HDECHGCG#101??A!4?C?C??G!8?cOA?c#142??@!4?@?@@!7?@@@AAACC?G?HHGPBB?@AAA#126!22?@???BA???E??@!5?Aa#73a#69!12?A#103_??_!5?CC@?@??@CB?CGOCHCD?RHS@IH?GS`HWA]aGPCHAE@GG?S@!5?A?`AA#93!7?C?BC@E@EA?A$#184??G!7?C!6?@!4?A!9?A??_?A???A???_O#96!34?_C???a?`#82O???G?G#29??C#164O#176OGWkCGA?@@??GO??_g!5?A?@@???C!8?@#249!28?___?_?__??G?O!6?O#228!6?O!4?G!4?_!4?@?@#15O#156!7?CC#201_?_?_?_o__?_?o??OOWOWOOOWOOGWGGWKWC?K?KCCCGSCCEAEC!4?ABB`AeAaB?BA@!5?B@A@?@@@B@D!4?@!4?@#169@#23C?o??A#91_?O_#128??_!6?_OoGOOO???O#250!8?G?G#92!12?@#62@_@!9?KK#121CCC#69C???C?G#53C#251??@@@!6?@#119?C???C!5?CARIGCWGCC!4?__#127!14?O#52!6?_#112!33?C!5?GAOHC???C?C?C@???C?A?C???G#101!31?B?C???@!9?A!7?_??GOGTGK#131!4?A@??A!4?@$#239!29?A?G#183!49?O#17_??_!6?G#5_?O??A??@#216??A??@!4?O#155_O#222?ADH?A#227??O?O!9?C???G!4W!28?A?A???__!4?c?cCd`@ROp@@O#243?G?G?gg?_o_?CC!6?CG!6?G!4?!4G??G#247@?@#207!8?G?C??C???C?C#220!8?O#29_???G#188E??C?C??G?C?C_?C?@SO?K??CCC?C???@#26!5?A#21?GG?sI_A??@#50!6?_O!8?A?@O!4?OC???@#114?C?A?O!4?O???E!4?AAA?A???AAOGO!6?OOAOGGG?OO??_OQQgOC]GGKK?eGO?c??c!5?_#38A@HKK?IAA!9?D???A??!4O??@?A#115!25?G!9?GG?O??G?G???@G!7?_??c@??I?Q@CAHK@XD`?a`O@cqGC??___!5?G!16?G#134!13?_?_$#14!83?__?O??G!7?A?@#188CAA#224??!5_oO???G???DC_??OGOXGWGG?CC?KG?CCE?EIACIBEACA?!4A?A#243!12?O??O??C?A#224?_!7?__@#176???___??O!5?!4GOGKWC???OAACC#228?ECMAKECAC?DCECA!4BAA@A@B@?@?@#192!14?G#181OO?C?Gg?_??G_GGKOCKAKCAE?A?C#57!14?_#177!6?G#152_#63?OO#52!7?_?O_O_?___?_#62A!4?@@!5?G?GK#103!10?G#101C!7?`!4?_#122_#72!5?A?A@?DFCEEHAAEBA?@AA!8?O#128!5?A?AA??OG?O???_???_?OOO?@?o___?C!9?wK@PM``KHCl?bC?AA?O__o_#102!32?_!9?@$#192!87?_?C??A#177!6?_#155_#243!4?@#154!6?_#223?G?G?_??O??A?G!4?CC!9?C#228!34?@?@#223__?_?_?_!7?_??O_O??O?GG!7?C?G#205!4?_?o???O??OO?O??O!4?G?GG??G???C#26!18?_?A#207_O_?_C?`!4?B?O?@@A@??ODY@AAM?EADAB??@??@#148!19?H?@!7?@???A_oAA#40!20?__o_KWQOWC??QA?AGHGAC??G!4?__?_#69?__??C???DAA#107??_#145!5?@@#152@#140?A???G???O?oG?Cg?_!6?C!8?GOcG??A$#35!87?O#0O__C@PA?@@#181?C#228!19?__?_?_??_???_O?O__O_O_?_?CGG#230!35?AAB??@?CA!10?G!5?O#221??AAA??@#227!5?G!8?@???@#231???@#5!32?_#195@@#127!62?G#132GCG??GG!4?G#115!24?G#72?W#100!4?@#111@@???_#120!5?@?@#111??_#122?_#99C#139@@@?@#121???@??@A#100?_#125!9?A?OWGCCO???_!9?O$#202!87?@#1G!7?G#162!31?@#155?A???@@#177@#216!48?C!6?_?_O?O?O__O?WO??_O_KC__oSWUmWOIA#207?_?_!9?O#11!34?G#180A@#121!64?A?C???A!7?O!4?B??OO@??D!6?C#107!9?@#115!10?_#108!5?A#98C#115!8?G!5?O???G?cW?c!5?_$#33!90?G??C_#219!36?O!4G?CC???A!6?@DB@B!11@?@#234!38?A#177!4?O#230!15?G?@@?@D@C?@??C#124!32?C#81!66?CKG?CG!7?A!8?A#119!32?O#118!15?O!7?@@???_??_?__$#6!91?G??C!5?@#54!31?@#227!77?@#138!61?_#140!68?AO???OOC#125!61?@#121!14?OG_!6?_$#3!91?_???A?C?A#69!242?C?C??@!4?__??__Og?__gkGqeP?ABA@C?A#81!51?C#127OG$#106!92?O#52!336?A-#237~Tj{Je\iSNsnYntZexQntYfxVkWbC|B~?TgBk@QDiDYDITIC_?C?ACA???C@A@#241@!7?_?C??GG??CAA#173O#176O?O?WGGCE!4?@A?C#230???G???G!8?_?@?Oc@@o?H@d?GoOOxdgH_AECA?@?APbaCC!6?A_!5?O[GIGAK?G?AI?@AK?C!6?A?@#220??_!5?O#171O#195?@#181??O#201?W??_a_ORDU^EbBRo@xghwogOO_WGwoOWCG?O_??OO?G??KCK?CCEGC?E??DC#195c??G!9?GO??C?O!4?@C@??GG??EW_CghgpSxq@C#21_?B#58@w?G!4?WOG#132?A_oOS_wECA?O@S@GO!4?C#50??G#39E??AC#54?O#115?_???G?G??C??GKY?S!8?@@?O?g?L@A@_`aHG?AwgcOiG?AO??WcCE@@?A!8?@!4?_c?g#125B@EC@?GGOS@CK?OOO?`?oOAaA`i@PP_GX_`oOR_AC???@!5?@??AC??o!4?@#119?_?@@?_G???_OWG?cKKGgkKCECM[Wo_Ooo!4?E??@@#102!5?__``aajk}Z]^^NNNLFDFFFn~FCAbE#98O???@?@???@A?C@IAD$#192?g??C??C??A?d?A?O?@O?@O?G!4?A??O_?G@!8?G?_!4?CgOGOCG_G?O!4?C#90o?O#226?OOO??G!6?@#227_??O?_??GC?CSOoW?w_C?CCKEEE?G!4@SBAGaCGg?_G??G?_??C?KKGG?IyWGIW@?G@WHGGG?GG??CCA!5?B@B@@!7?B@C#173?O#194?__?__?O_o?o_?_???_o_wwGGGggwH_XW[gLeEDEDNVNLNFFEFFEBFKKLJKEDE!5BABAB?ABB@@BAB@#173EM??!4CG??CE?C?ALCAE?AE!4?B@?A???AEC@?@???AQ#25@O#23A?@#56_GGOW@??SC??A???@#125AoO?O?Go!7?CUGUUK#114!4?Wg?O_OogGQC!4?W`cG??AA?@O?@_S??AA!4?@?EHCEQXC?tXCa?_?WhX?E@?A#122??C???C#114???A???G#128??A?@???R??C?A???A@?A@AOP`OPO__?P!4?@?@#143?O???G??C_??_#112?@!4?A??CG_?@_G_@!4?S?CA!8?_G#103!12?O@?_???ICPgS@QAOTSB#77??_???OO?WgOgg???B??X??O_O?_$#184?A?@!6?G???G!6?C?A!8?D?@!6?g?O!9?ACACG?C#240?_#150?@!5?@@?a@#14C???A??@#26??G??C#181A#224_OoGOWOO!4?QAB??AA!5?C_cCS?CGAKICE_E?G???CCG???O!6?O???G?G!6?C?C?A??A#235??_??_?_??GO???G??g?G??G!9?G!7?C??@#207S?C#187??_???_!9?__#186??_#248??_???o?Ooo__O#232_?_o_??_??_G_?O_?O!5?__??_#31ACA?A@#36@#57??@#180!7?C???B??@AG?AAA?A?gG?O#51_G?E?O@G@#140A??@#49@A?_#118G#121G!5?CCAAAMAAAcyo_`?__@@WG???@@AA#125B@#103??AG?Oc??O!6?O??O???C!9?AH?@?I@?C_@??c?O?GgE@CDE@DCF`??IOaCWO#127???@???A!6?G!5?_?_???A?A??P__P?@_?OC!5?@?@BBAA#118??@@???CC??CCC?C?Kcwo_@G_p_ZQOeC@@@pPpbFNHLHJhvaf_MCGQ@o?CEG?KGG#72!7?__??_#103?O?OO??G??O#100?@!4?@ABN^Y??@$#246??SA_XaOJo@O?O?cHAk?I_GC_QdGo?{?IGAs?yCw?O_go__O!4?@?@d?A_OoO_???C?A!7?@@#11_!4?G??C#230_#22?@#229??__?_!9?C!7?_G?O???dO?_@O?G?_ODi??Q@_!9?_?O#238???AA!4?@`!4?_??OO?O???O#188_???O!5?_???O???O!7?YUUOGGA!6?C#248???_#171C?CA#220??A!9?@!5?@A?C@#172@#171??CCC???C#220@?@@#248?C?E#243G?_??OOo??_OO_???_OwGo_G?W_GWGW@CEG@GED_!4?A#164???o@A#63G_BG@#52??__?__?O?@#81G?C!4?C!4?@??_!4?A?`@?OIAECD@?A???AA#102?oqaA@BIBC[??`eIggINIE@#119_GCA@A?uoo!4?_O#118!10?E!5?@!6?!4@A?c?wW!4?_#140?@A?@?@?@#73!5?G_?G!8?A?A#141!4?A#112O#116!4?@#73!8?_O!8?A#143!7?C#115?_??@??AO@?_??a??_?Oa??S?G?W?@q?o@Ia@?K?CC!4?C!14?oG#118G#72???m?D?C?G???GtIyCtgZ$#193!4?O??@_!8?C!8?ASH!4?A??O?gAO?CA@?@A[kWgwOgOa_@?DEEEB@@BC?C`???A#166OSOGG?CCCAA@#206!4?C???AGGG@c???A?@@@?@H@#176C#228!10?@???D@?CAA??C!4?G!7?@??@?@#206CC#176C?C?A#229?@???CA@!6?@A#205_!8?c??_GKCC?C#173GG!9?@#172!18?A???A#235!7?O#192?A?A?A?A@!5?@#207?G#235!5?O#216!4?Og??GWGOG?GwO_GG?O?GCGEK?ACAC?OCK@?GO?OC?G?CO#57@#207K#13_#18C#37O?_#55CEeACC@DA#142?C?@B@@?@@#119AA!5?SOCG@!8?c`W?CCC???C?@#77?@?@!6?q{WW?AEC#69?_OG?C_CQO!4?o#102@CA@C?AXK~^BBA_oOGC!4?AA??IA?CSW#132@@B?C??COS?k?GO_QIg_O?O!5?C?KIICAAGOG?gI??c!4?G??S?C?C?WG??`?@?AA!4?AA#103!9?@?@?Q?A#107!16?O?GC?_!9?O#119!17?oO$#196!25?@!8?C?AC@?DA@?CASG???E!4?G@OI?GGWC#97_!4?GO??G!8?@#189?G??C?A??@#236_!9?W!7?aA?QG_a_???O??!4OC??H!4?@@@bc@?`_???_oO_o?OO?O???@?@@D@@??C!7?A?A#26__???O???O!7?CG??GGCD#205?EEU@VB?A!7?W?OO!5?O_O?GG`Go!5?GGgOgW??OG?W?S???gCO?A#176O!8?C#28A??C!4?A#186!8?G_?_O#223_#212_#178??O?OK?CHE#124??K#177?C#91C?O@#50?CA?AA#116???I!7?@#140_?__!8?G#59!10?OwgO_?OogHCO_?_?GrbL?C@_?O_??@A!9?C!6?A_#101!10?oG?___gWwGc?s?G#121@?AOC_wo_g?c?g?gOcCCKkKK?CCC?GC?CCI!4C?M?CX??hS_c?g?gOGo??AbNKYYyuXXw]o^OPENZIFBC]?__!6?G#101!26?@!4?_?_?O__O_?g!6?@?_mPnYmy[so_ctIoCpGQc$#239!28?A???_?O!12?@BBB@?@??@?A!4?_??OG??A?@#237A?@#182?_!8?@#18!5?A?@#155@#231_?_!4?O_wG!7?QGAIGG?@O!5?AAa!5?AAA???@??CD?CCQAa??o__x???@_OC?A?CC??C??C#201_#194_#223@??@??!4@!6?@@#172?_??_?___#243!34?_#187??_#186!7?O??W_oO_w?oWg?OgG??__#124@!8?@#228?_?_??Oo_Oo_o_oO_O_O?O!5?_#38!9?OA_O@?_!5?C#127?_#73?CWWKGGGHOC@`@`B?M!4?@?O??!4A!5?@#107???C??C#40!5?@#101??C!4?@#121?oOoWWKKK#72!22?o_?GO#77?_?O?{?g#119??A?C#116???AA@@?A@AA@??A@AA@A@@?O??_#114!53?@?Q?A!7?E?ECAGTG?pICcICPGOBQ?O?G??@?@!5?A?A???O???cK$#242!49?O_O#105!5?O!7?AA#245O#137@#252A#35??G??C?A??@#223__?_?O?_SGG?C?CG?E?cHDC@?@??GGGC!6?O!4?A?E!9?OOO?OO?O?A???G??!4C!4?AAC?A#228!7?A?A?@A!6?!5A@A?@!5?@#209!44?@#26!24?G?@?EAABA?@?G?@?E???!4@?@A@A!7?@@#128!20?C?__P?C?QA__?_@_#49?C?_!6?O?OGG#118!9?@#101!7?@#72!12?C#118!8?@_??O?@#107!21?@A?A?@#108?AO#112!11?G#126OC!4?o???_???O?K?GGC!9?IC?C?_hJUjUYuQ[?kPNwyCC?p?`!6?A???@#102!13?OO$#96!64?_!4?c?A?_@???C#167O!8?@#156!4?AAA?@@#174@#197!4?A!5?@#234O?O#243!17?A@#247!6?__??c!7?@!4?@???OGW#248?_??_#224!12?@@#216_C??S!7?@!4?B@!6?A??@#181!58?@#180?D#11?@@?@@#5?@@#227O#157?A??A#144!39?G?G?G#69!10?A!4?G?WO?@@!4?__@?`!4?CLC?C#99!53?WWO#100GO#73!16?G#49A#129!8?@#69!71?G$#183!64?OG???G#64???C#2_#82__!8?C#228_!5?O??G!4?A#219!4?@??A#235?_#216!31?O#249?C??C!7?AA!6?GG!5?O#247!10?A!5?C#232?C??EBA??A#188!73?A#230??O???O!9?_#145!38?O?G#115!17?K$#153!64?GC#83__?O?G?G??E??A??@#234!14?_#243?A#232!6?o?_o?_#243!45?A?A??_O?G!4?G_G_GGOO?[_[OOS?G_GW@A?O?AA@ACABD?@A@?@#189!66?G?C#223??_$#244!65?O??G??C??A#214O??G?CCAAA@#249!21?o#238O?O?O#232!44?@???o!4?_O_?_?OOSc?CK#189??_#187?G#248G!5?CC!4?C#231!79?_#79A!7?@$#208!66?G#104!11?@#1@#216_??_O?G#221!74?@#180!23?O!5?O!5?G???C?G?DA$#30!79?_#207O#29GG!4?A?A@@@#186!98?G!4?G?C$#235!81?O#201!112?GG#221O?O$#192!195?_-#237~Dq}hUKrC~iTnqlyKzlUxNuj\alYftYmOLQKQ`oAS_sI?Q`???C?A?ED?a@_#226OOO?GG???@#243OOG?GEA?AC!6?A#212!4?GG#223???GCGGW!6?C!5?A??AAA#189O?_!4?_?_#243???CGA?K@IGO?K?GIGELWI??EG[CGA??CC?G?DC!4?C!5?GG???G#235O#172!8?@!5?@!7?@#188_!8?_!7?_???_!5?_!6?_??_!8?OO#26O!4?_?__!7?_?_???OGO?OOO?OOO?OOO!9?OO!6?O#25O#7_#34_#20_OOG???__#55@!9?_#132@#130??G#125?@!4?@??BAA??CG?SSC_?oO_#115@?A?ICCGAABA?@?@?@oYwASAGCGCGCaAP!7?@D?CC_??CB@@@?O?O!8?OO?GGgCcQDC?ALOAA#112@!4?G#125?AAAEDD?KAALGASP[OVB?`Dc?oG_?O?O?_o??oG__goOOCcCC??OgC#73??@#112??OC_?O?gOO!4?O#132?@#73?@#107!13?O#103GI_POPQ_AXPKhLO??@AG?A?C#100!11?_??O??_$#246?OK@AGrCX?T?OHACR?AgA_GOATQ_?Gd@jqdplIFLHB@PF?IAKC!7?@#214G??_?O?CKMEE#82CA@#247OOO!4?C??CC#223P#243!12?_???O!5?A???C!4?G??C#15?_#249???C#231CA!4?A??@??A!4?A??@?B!4@!4?@#232@J@JA@??@?@#173GG#180?C?_#247_#221@!5?@#187!12?OC?C???C?E?CA???BA@?@IAB?@B@BBPO??@@@#186!6?@_?O??G?A?GG??@??C@A?@!4?@#228A@DA@E@BB@?@@?@?@!5?@A?A?@B@?@?@!6?A#28_?_#21??C#36O#15EA#58@??_PO?O!4?g#116C??AEQ@#129!4?GC#55??O#49?@??CA?G?G?GAO#118??C#114??@@@?AB@@??@@!6?@@?B??AA@??KGKSLpRPOPWqxrHLphGwOsg@CGG#107!6?ooCIyaC#114QOG`I?LOAGOG#119?CC#73A??G!6?A??G!5?A???_!7?O#141C#143??A?C!7?@#118!18?@@?@@??p?FAaayy_LTT}{WYW]WHple_`H!4CHC#101!4?_?Sc[O?s_XoIkOmS_[hShkIID?I\?nOnPeJuJ?VgVitIt$#192?a??S???a??a??O??C??C?@?_??DOA?OC?GA???O??AC?@!4?A#83_??OOGGCC?AAA?@#188?OO?G?CCA??@#180@#236_G?SGG??AEBA!8?@??CSOO??GG!5?D!6?AAA?AAGABFACC!8?@@???A#228??C#180G!7?C#248A?@!4?@??@?B???C??___???_?o_o_?OG!5?GG??G!4?CY?GKIMWS[[]!5[IGX^YMC\]NlW[}?EIFFF@?@C!7?CC?AA!4?O??O#188??OW?G?OG??W??G#25_#15_!9?__O?o#20_#63_#51_#163@#178ACO@CA#9???O#63_??A#52C??GA?C???GGCOO_cCAA?CG???GC?G???O#121AAA!4?A?KI[K[O___cW?OWIMIoAA!9?B#77!7?C!4A!7?o!4?__??_?_@?@!8?@#121!9?@?WW{[TcGPGp?o_qoo_?_`G?A?G?SOQQHE@EIICHE?K_D?CD??HGGOPaRSHCBpMon}lzY}m}UMMKCGXHH?@?AAA?A?CC#102!9?___?Oo__`OOKHBAD@HK#59A#103!13?@#95O#99_#53??C!7?_??@?C$#193?G???@?G!7?@!9?G#239??G#193!8?CG?_??__g??AB@A@A@?_?_?@?__#171_!8?A#186C#230G??G???A??G??@!6?_???_!4?GGG??A??@D??@!7?C?@??@G?@?@NAM@?@??C?@B!5?C?@@#238A#195!7?A#171?_!4?_#187??C@!6?O#232!16?O_!5?G?O?C!4?O#221?@???A?A#205???ca?_?a__?QbA?UoCG??_??A@CA?A???@??@@!4?O??OO#124??O#79_#180G??O!8?GO??G?GG??C???KK?O???O@#19!4?GG#56__?KBAGC_C_?Oo?C??G_oo??__!6?_#81?@!7?E?G!8?OGCo?_?o?I#102!4?@??@@!7?A??G!7?A?A?@??G?IAFBNT[C}_IE@C?@@C#126!15?a_PO_OG_?O???OO??_`?g?G??G?AOEG@@BC@ABAACB!4ABPG?OkA_?WC`MO?A!9?G#107!6?C#77!20?_!7?__W_GS?PcJdAC?GC???O@@!7?LOmHC@CI??_??C$#239??@??_#184!5?G?C??_?O@?O?C!13?O??A!6?@#244o!6?_??A#137?_#14???@#106OO#205__O_#235GOG!7?CG#224__?oOOWW__GWWC???A??G#249?`b@_#247?!4G??K??C??C??M??CCC!5?O?O@CAA???C!6?GEA@FCE#207!6?G???O!29?@#186__O??O??_!4?_#232!13?C!4?A!4?@??@??G?A@?@EBDADF@A?@??A@@??G?@G#195!4?C#31_?_#13?__?_#232CBC@CC??A#173OOO!5?O??O!5?_?AB#13?@#91CC#38C??G@???_?C??o_G??GCGYQAO_cswOOOo?__#69???!5@BCA??COG!4?KAS@C?OH_E[GWuwSySyPP_@???_!4?C?_O?C?CA#118A???O!9?__??O?g?KOxoc_dLs}bb@@#132AA`G`?WIG?G???XGA?h?cUIi@LC@W@_cg_GG_K?aOWCKC?ABiH?hER_IO??@??C#114?@??@!4?C??C?Q_g!8?OAOHECOGHI?AHCCOC??A!4?A$#239!39?_!6?C!4?K?C_AE??B#209!4?O#201__#182?G?A#138?A?@#231?oOoG!5?CCC??@!8B?_?_bbA?QO?O#235?OOwWoCO?_COSG_???G?!4_O???__k_I!7?G!7?G!5?D!5?O#243!31?!5_!8?_?___?__#173!19?O??O??OOoO_!8?_??_?!4_??_#76??O#28_?_??_?_#124O#207G#21_#23_?_?__?_#195AA@?DE???CGEEA?@@#51???_#74OO@!7?K#125@#141?A#142GG?GQO??__O!5?__??_#119@?@?@???KA!4?A?G?C??K?C_??@kCC?_?c??_?_@?_!6?___??G!8?A#101???C?_@?@?@!6?@#127!18?CCC?A?D?C?A@C???C?O!4?_?_?_?O!7?OG???__#119!21?_?A@O??O!6?@@e`b_deC!4?A#107!11?@#72???_!5?OPjPbXbUjEOCOID@aXOa??OoGOtgUGPIpI$#196!41?S??G?O???G?C???@#241OOOGGKKEAA@@#181G?C???@#228GKC?`b?@@_?__?_O?Oc?ow?O??G#238???O_@o_o#221_#205_#228C#26_?o?_OO??_!5?_!8?O#232A!4?C#194!8?__?_!11?__??OGKU?@@AQE?A?@BJ@JBFA@A?!4AEB?C@AA@?@B?@?@A???@#26!22?__#189O??O???_#194??_!7?O?O#189_!4?_#227!4?C#186!5?CG?KAGAGKK?MCC@!7?KG#23_!5?G??CA@#144HGA?O?_??OO_#73???@#116!13?C!8?_#112!10?_?O!9?C#54!5?_#59@??@!4?CAgqM_?@K!5?AGQ??g?S?H#111!9?G??C#128!28?@@D?E??C#116!16?O??O?G#73???O??C#115!22?@?Q__?C??G??G??@??@A?GA?POCAA?HC?AI!4A!4?A$#202!41?G#240G?O??_???OGG#150G?O#232!12?_?__#249___?_?O?O#232!19?_!7?@@@#224???A??@??@?@#205!12?___!4?__!7?O!5?OO?W?OO??AAUA!4?O?gSSCHG_GWOC!5?___G??_??WGOW?O?O?wsoO#176!29?O??O!4?!4G??GG#29_#223C?CA?@???A@!7?@???A@??A#177?_?_??_!9?__#157??_??_OGG#24??A#37?O_CCcGWW#132!21?@?C!6?GA???O__O!6?_#103!27?CK?C?A???C?A?C??S?__OIAy?]C@I@@Sa?AR?_AAHOA_#112!19?_#116?A!5?@#128!12?O??O!8?_#69!21?_#103?_??C??C?O?_#98!30?_!9?A!4?AOc_Is?A$#153!45?C#105?C#242@??@?@#150!16?@@#109?@#216??CA?A#229A?_O!5?C??SC!7?S??C!9?@#216???!5GgOOOW!7O_???CGO@O!5?CC?A???G!6?CCAA#26??G??G#220!30?@#192@#238???G!7?C!9?CA??C?G??O?C#243!8?G!6?C!5?C!4?KCCAIC??M?GOAIA?G@A?A?@C?@B@D??A?C?C#124GG!6?O#164GGA?C@#142!4?A#128!4?@??@A?DB@?C?@???@@@\?@A?C!5?O??_?_?_#59!5?@@?A#102?@#40!27?G???G#121??O#112!77?@?@?@#135??@$#137!47?O#217?OO#96?O!8?@@@#207!12?@#173??@#238O#227G@AQAHHG_CC?_?C??SEDJB??CCGCCEEA?A??@?AAA??@@G@@_?GG@G???C??@!9?A#235!59?C???_!5?_??_?_!4?o!8?@!7?G!4?O!4?O!4?G??G?O#205!13?G#235C#216!12?C???A?AA???G??CC#140!12?ABAA!8?A@DC??MAIA?G?GGW?O__?O$#204!47?G#183?_#64_??O#188!64?_#206@#176@?@!4?_#188!9?O!6?O?O?O?O???O?OOG!4?G?GOw{!5?_!5?H#187!65?CCC__!6?_!6?O#249G#230?C??C!4?A#28!20?O#164O#207GG!6?O#212??@#145!14?O#49?@??B#73!19?@@EACCGA?KW???O?__!4?O??_???o$#208!49?G#16??_#97_?G?C?GEC!4?@#234!51?C#173!23?O#186?C??W???O?O!6?O#216!86?G!8?GW??KGC??A!7?CC?@CCCEC?@#188!12?G#201G#223A!4?@?@#54!47?@?@$#201!145?!9_??_?!4_o__o!4?DErgRAHQaaOC@UdfMwC]C[wKU\fx|GSPCAA?DGCJ_???C???@!8?@!4?O?@???_?GG@#171!4?_#207_!5?_#201?A??A??O#195A#21!34?_O$#195!145?O#238!102?A#195??G#220!4?_???O#247?G!6?G?G!7?A?A#176!17?A?@@?A?@@G??G$#181!258?_#221O?O#13!37?_$#171!259?_-#237lRKalQLAlQH`Q@e?n?cXONG`JcNGMTJm@?HADIDN@AE@b_@???IGK?@#198KC?A@@@#243O??GO?GKCA??@G#212???G#156G#176C#235O?G??G!6?A#187O#248!7?_?S[QA?B@#181!4_C!5?_c_?Ag!4?G!5?O!5?O!4?OOO?O#191???_???O!8?_?O_?_???_?_?_?_?_?_O#31A#172??GG??GC??CKA?CKCCE?CACAC?A?A??A??@?@??@#138CK#11CG#4G!4?!5_!7?_#24??O???_#55C???CCK#15?@@??@#21@#74!9?G?G#56??K!5?G?G?G!4?C??C!8?_??@??hG!6?_?@@BB??@AA@BCA?AFD@C?E#140?@??QZC_#49O_@__?_#143G#118?O?_!4?_??C_OE!8?@#72_#102G#115!5?@?C??@!5?C??G?GAGc_?OGoOA@_O_?@?AC?H??G!4?G?GA#126??K?E?@CoH`Aq?Sp?oC?C?CC??C#140!4?@?@??O_CP?`_KCG#73?A#121??G?@?E?O?HgIdJPvW^lz[jXRzXY}Ueu}SKG??OO@!5?O#107??G#102O?_?cCkidcS?B?CAc!6?AA#98?_?OAESDO@KACG#100!6?@$#246QkR\AlQ\AlQIdQHvON@cboVY?XOQpiOOENEKI#252O??GC?A?@!7?C#171O?GGC#205K??A???D#229O!7?C???O@A??A?B?A#236??C?CCA?EC#235!6?___G??A??@#218G#193G#166C#82CCG#106G!8?_#194?__aEEAABB@B?_!7?C?!4@?_!9?@???@???@H?G?!8G?C??C?CCCGEEI?CC???G?A?CI??GDADBBD???AA@A?B!6@?@#157A?A#23GGGEG?C?CAC??C!9?_??A?G??X?P@P?@@`@?_!9?_???_?A#55?OOooq`aoqKAO?_??@_#74!5?O@??A!4?Aa_CCMKGG!6?@?_#52A?A#116?CG#73???OOO???_??DDBD?A@#59?O!5?___oo_KEO[qtmc!7?R_G??_A???O???_!5?O#112@?CA#121O_!6?B!8?KNBNHJcGHo?!4@E@C?C?C!7?C#129!8?@#127!5?O!4?OACa??C_#73!4?O?_!5?A#118?CCC!6?@AQS[|d_yuRZPp@OEAGC???OO#101?G?gSGXgHYULY[o@G\SBmLlHgGH_@gP_JOGPaSiTiTiPkA$#240??_#202?O???O#252?COGC?G?OI?C??C#204_!9?__#242O#96_#241O?_?_oOYWWCM?A#194_!6?AA#106?@@#249OO#223?_?O!9?@C???C#238?_?c??gG?gg?OGW_KcCjBA?@#188GKC@???O!4?_??ACG?GN?O???WOO??GGOKG??G?GIG??KC?AMEGCCIIBH?CGINIG!6?A!4?C!4?@?C???AA??@!7?@#192???G???G??G?OG?a?A?_?OA_#105OO#0O?_#9O?OO!9?A_#76@#31??@#63GG??O?O?_!4?_?CCC!5?A???O?@??_!4?_!4?OOa!4?E!7?@?A@A??C!6?O?@?Aa_c!4?G???SOO_g_Oo_#91?_#128@@@?QTMBE?C#119?BO??G!4?O?A@GE??HPEHDIFA?@!7?@O?OA???O??C??CogCG#103?EL?BB??O!5?K?O_GM#77_#73!6?O???_??_OA!6?G#112?C#128???A?A_@GPAHAWCoWGoCI?K?CYBa_MP@#126!4?A?@???D`GsI?c_?C?Sa??_??_O#115@?@??B?A?C?G?CGIC`?AAW@WB???A@#53!5?@#72@??_Goo_g?O_?o??_GOPIECeEeCa?GCG?kAp$#218!6?_!7?O#192??_O?G!4?A?C??C@G??@?@#196I?A@#166??G#14C#203__#202_O#153_#183@#105O#207_!4?G!4?A#227?_??__?O??OA?QP???GG?C???@@@!7?A#249!6?@#205G__?_#29KL?C@RO?_CO???C???G#221?A!8?A?@#124?G#243G#106O?_??_??OO???O?_?o?cCOQ!6?O!8?O!6?GG???G???G!4?G?G?G!4?G?C?C??C?!6CK?G#207?G#79C?G#21C??G#18G??A??SAP!7?P#50CEAA?AA#56???GKC#13@#18G??`!8?_#91!4?G?C?C#20???@!4?B?A#92@@?A?A!4?C?G#148_#144C!4?G!5?@!6?A?@??A?ACG??G#55!4?AO___#132???G?HU?_!4?I?_#54G!5?_??CH?AD?@??@!5?O??O#77GG!6?@@!6?A@_#107??GLG???@?I@#101O#81!15?O#132o_SI@CEQO?}A?o@pH?_G?C??C??A?AA!11?O???k_HGCPWLhcQSA?CGA?A!4?G#119?CD@@H???___??B?@!5?a!5?G#77!5?G?GS_PO?gQd?@?@?@S@A!6?_?_PoHpGXHSaPaTAPK$#244!7?_??_#193C?G!5?A!4?S??@!6?OO_C??C?@#2???A#150@???CA??@#137@@#247?_#232___?A?ADEBB@#234_!7?o__Oo_O?OW??QW??G_?_??OG???D#187SC_#26GA??@___!4?POOOQOO??OOO#192__?_??_?_??_#172!6?!4_?o#192O#105_??_?_?___O!5?_o_?oOoO_?_OO??!4O!8?_??_!4?OO#193??_?o?o?_?OGO?OO?_#181!5?A!9?@@#188@#37S?CGGGCG??WO??_??_!6?_W_O?O_?__?_O?go!6?_?___#25@?@#86?A#155@??@#91GGGD#50A!5?G#70A?ACACD@KCG?OW?WGOO?O#20??_#58???OOO#129!5?G#149_#125??@I`[_FA_!7?K?A#114GG!11?GOAOEBLIPQm}igCs~c^fyjYcbJ??O?[G??C_o!5?ADOggOe`O_??O?_#125!6?O??oA?KkC?_GIIAqHB@IQ?IOA_cYCc_EICI?KGCO@Bpc}BTqSxgaAUQ#112!6?@?O?@!4?A??G?G?g#114@A?AGC?GccAE?@Gt?gAOA?A@???@#100!10?G???G!4?B#99QEEAC$#240!13?_#202!8?_#239???__#240??_#105?_#198O#0!4?_#83_O?GGC??A@@#246O#191_#218@#172O???C???A#228?G_!5?_?CAC?K!4?@BB?B?@#248???O#194!18?O#220?OO#172OO!9?__!4?_#248@#207?G??GGGO?C???A?I@!7?C??CAI?@!7?@A??G#173CC?!4CAA???A???AAB?@?@#26???@?@#180@#171AA??C???CAA!6?@!6?C??AA!8?@#51C!8?A?EA?A??C@??AAAC??AO!6?_???A?QQ@AD`GDZFLUIEKCWs`??A??@?G?OA??C?G#20AC??@??A#152???_#142!4?@?@???@?GH?ACBAO#121!11?G?HGF^Fb?O?GDC???GH@EI?E#40!4?_G__???G#121!4?_!6?O??OOA#73C#101?A@??A#118???EMNJKK?_BBEP?CFNBBR@@OO#127!11?G!5?G?oWoOGq__oO#143!39?_??_??_#103!7?@???G!4?g?cGO?dPDe@g@SQPAa_EAc??_?BEEC?A#53???O??_#48?O$#153!32?O#202_#214!5?O???C??C#240?O#217_#192?O#96?A#193A???@#186?GGK_C@?A@#230?GkIKI?ACEEA???@!7?D@??@?A#22!14?ACAA?B#76oOO?GK#187A??a_?@!6?@#209?_?_#198??_#187!11?G?G#186A#193_!9?_??_#201@BA??!4@??@???CG@???G??A???A?A???A@@B@?@@@?@!5?@?@??@!8?@?@@@#24?O#5_!7?_#16??_#2_#34??_#91G?G!4?O#20?__?_#38!16?G?G!7?GCG?_G?GOOC?o???C???HOooo___!7?@!7?@@???A?KH^[sKK#81!9?S??_?A?_A?@!6?O#118!19?A#102!5?@!7?AO?OAdGC?_#119??Oo?O??C??O?Wo{kc]elbo#116!21?@_@?H?H@_H?TH`PoarQ@_GC?G$#226!41?_O!4?CG?C??G#242CAA#216_o?OO!4?_#224?O?O?OO?OOGG???C!5?@#249??A#189!22?A!4?@?@@?@#124G#216@#205C???GCH@?H?CCC!6?A?A?A?C?AC!4?G?@#181C??A@?C#205???JA??A!8?@DCG??@!4?A??@!4?A??@!4?@#184???g!5?O?__???_??_#3?O???_#34??O!4?_#74?G??C?G#56??C#155???@?@!27?@#18!6?@#7?@#128??G#149G#142?G#177???@#39??K?O??O#81_#145!6?A?O!6?_C?g_???_C???G#112!20?G#69OG_O?_OSe`O?O__OOW??KO!6?@??@F@??G??C??WC???_!4?O!5?_#73??_!41?C??C!5?A$#97!41?W!6?A?@#244??@#124_#181O#26O#173O?O#201CC?C@A#231!6?@`!4?__?O???GGCGCI!5?CG@?D@BA#209!10?G#198??G#182GG#10A#79?A#11A#173?@#235?@@?P#220!6?_?_!7?_!9?O#198!4?O!8?O_OOO#195C#187G?H!4?@@!7?C#220?C!4?G!4?G#235?@#191!12?GC?G?G?GGG?G#31!4?C?G#177!4CKC?E?A!6?A??A@@@???!4@A?B?A?A?A??@!4?@?@?@#23!25?@???A#121O#86!6?C!4?G?G?O#115!34?CO??O??_WA@Eg#54!31?_#72!4@$#182!54?G#195_#176_#220A#235!5?OGCGG#236!6?_```#189???G#221?_?O?o?_o?__O?o?o?WoGOSG???R?O#30!7?A?A#137G#171!5?C?CC?A!5?O?OGO@OO?o?__Q?O!8?C?C?OA?@!7?O#28C#186?A#235A?C?C#176A!4?A#198!11?G!6?G?G!7?G!4?G??A#28!7?C!4?A!8?@!5?@#38!5?GCGG?K#54!46?CG?O#125!97?C$#206!83?C#247??C???C??A@DA@?CAA#27!18?@#138?C#201!7?AA?CC@?D???C?AEFDDDCDDHJAGI?!5@#109O?OO#26@!4?CC?C#104???O#221?G#109??O?O#207C#193_?_???_?O_?_#208!5?O#220!19?A!7?A#12???O#26AAA#207!4?@#13O???A???O#92!8?A#69!51?G#37@A?C???ADAAG?IU[CCS?CGKO?ooO?__???_$#243!87?A?A!9?@???@#32!16?C#76!44?G??G#180!5?C#243G???A???A!5?@?@??@!7?@?@#188!32?A#1__#15G???A#58??G?G?G!8?GGoCoOOOo_OWO?ACMkmM[]]]CMCCMOqUqq?OQ@S?AO_??C??CCC??@__??@!4?@G?W??`?_$#124!166?A??C#216!16?A???A!5?@?@#7!40?G??O?O!4?@!5?@#49!61?G#140_??O$#11!167?G#189!20?A#196O??__?o_OoOoooOo_O!4o__ooOo?O?o?o_?_O??o?OO_?__#35??O!9?__#19_A??o_O?_#62!57?O$#198!191?_#20!55?O???OOO$#14!247?_#26!4?@?@-#246Tii`SIgTQLqhUWVgFQBVIfQ^@J@E?ABA?@#90A@#96A#194_#207_?o!9?@#180@#221C???CC?CC#224??OO#176?O?OO?O#194_?_#216O!4?GG?G#187O#106OO#172!4O!7?G??G?G!5?ACA#246!5?O!9?O#137_GGgGGG??GG!9?C?C?C?C#208!5?COCG?C?C?GO?OGO#137@#198!5?@!4?@@?C#237?_#184?_O?CGCG??G_!4?AcOGA?AD?A?@A??OMSG?C?OS?OCa@_??Q??OC??_?C!4?_#58G#24_??_!8?AA!4?CA?C#0G!6?O#19G!8?g?GG?__???_#91??AGCOO??@GHA@??LOOOGA@??kBAAC#52GCsK?GG?O!6?G!7?_?_#125?CGBG@?@#81@@!4?A#40?_[CW#77O?G???A???CCMI!4?GG?G!4?GGG?CCKG?IK???@#121!4?_OO#54?O#103!6?@?@@#73?O??cYC[wOA`G_O#141???@#127??aBh?C?A`C@A!4?@??CA#52!9?A#127!6?@!4?H?O??_?_#112!7?AC?C?C??A@???O#115??OCQ?G_@AI@_c`aQAO!8?O?_#108@#72?GOO???AL?@#114?G!4?A??ABAA?A?A#72??@?O`O#100O$#237i@PSI`TALaLQHFgFO@CG@OL_GCC@?@#218?_?OO??G???C#228_!8?O!4?!4O?O`!9?G!4?G#188??O#181OO#198??_#196???___?___#191_!4?_??_?O?O?O???C!6?A?C#109?A??@#172@@@#194???@!6?@#191@???@!5?@??@??@??@??@?@???@??@??@?@A?@?@???@?@A#237!20?G#239??G#105!16?A??GO?@B?CICGQGOAA_oS??_!5?CO???_!5?OoO??_?o?_??__#3?O#51A#58@@#24???_???_#13!4?O#58@?@EK?O!4?_`?G?K?O??_?GAFGB?_`_!5?@?@@??A?A@@??AA#128!4?@?A!5?@!6?@#59???A???G?A?B?@A?@@?@@@B@!8?ACA!5?AC??Wh_#118!5?_CO?OQG?O?ECCC?A#121X[WCO_?N[[O??DIC?q_#128???SgCwO@cTjWRk_DDIHSQJ@AEaGwO__?Hd{AYSK?O_?_#119!20?ABBAAQ[KOC!4?__#102??QWGGGLDLt^H]Inc_??O#59_#98!4?@#53!5?@#102G?A@?KKCC?CKSKWCc$#218?C?A???_!4?_!7?C#196???O???@!5?@???@#232_!4?O???OO!6?@?@?@@#216??@#231??!5G!8?AECCE!5C???A?A#201GG?G??A!5?B#196O???o_g??wwqsoOoW__!4?C?C?OCCScaSkcS_W?WagoGwcsogsiKacmWeWkOCICa?OwsgowSwoSOKwcWsGwNC~PQra\fTJ[uJ|OGBsOlOoItWeWtM`_@qDy@m@@NQSKVmOciSiqkoKsgOK_g!6?_??gWo?o???O??_??OO???OO??_#177@#56@#90_#63A@@@?@??@@A@BFEEIGOO?_?__??_ocaq__??o?G_#142!6?_#128?G_??O__O#49_??o#51C!6?C?G?O#49??B?RQ!8?O#72??_w_???KGC?CCCG???A?GG#121CBB#101?G?G!4?G#72GG!4?Oo#81!9?_#77!10?_#81??G!6?@#125_?ABEcOOgK??XwSiQiCKQI_S_c?C?A@?H@OA!9?_?@?@AQ[cXhOo?_#118!19?CKKLbbhHUAMcOC_#101!7?G???_?_?BCACKTgdYPMTQlQDa_APCOo_Wg?g?_?_@XkxkYln$#244?OC?_S?G_O???_?O?_O?O#193???A???G?C#242O#203@?_OOOGCCA?AA#235GGG??C??CECAJC?AE?C?_`?@@@!6?AA!5?G?G?GGG?G!4?C!4?@#184_!7?_O?O?[?CCGGG_G#220@?@#96??_!4?OG???O???O?O!6?_#184!9?A@???AA??A?CA#246!56?G_#109!6?@#0!4@!9?O???C?CG?O?G#37@@???@???@?B?EB?A@@?BM?MWUKyDAA@A?@CG??GCO?__?_!6?YO!6?o_O#140!10?__!4?OoO?Oo!7?@?@H@?CC?A#63??_#69KLdC??I!4?C@?@!4?@#87O?o__oo?_?o_oO_o___Oo_#119?@???@!6?OCI?di`@BFa!5?x`abB@aAE#126!4?@??@P_KF!4?@?@#140!7?O?_??O???g?GOE?CGD?Q???_?_#121@A??CGDILomtrMB~|jnY~I~nt[{Wp`_#114??A_hSOIDOKQ?C?c@__!5?@??O?_#108!13?O#59!5?@$#240???G@?A!9?gCG_?G_?_?O?A??@#213OGKCK?C#106O!4?C??A#26CEAA???@#247G?AI!7?_!9?CSS#209?_#193_?_?_?_???_#205GGG???A???A!4@#193_?_?_??O_!6?G!4?WsOSooogcoOg??_?GgKcWcGCGE?GGKQI?_?O?aG???_O`?_???@C@i?@g`o?G`ACBOi?ICGSaGaSa@SAdQkA@QdAdGbGdAOMPICO@S?iO?G@_?O?G#1!4?@@@??A#4A#20@AEB@G!7?@!4?@AAA!4?C??ECEE???C??__?WCWSC[[WOGOOo__#55@@@BNCQ!7?ABB!8?GGCG?OGO?S!7G?wwWWwopOaE?O_??_OwSOO#114A?_?_P@A?CBA???@A@?A???CC?AB???FECFDBCC@@AE???ADQGaHD!6?EcoW@ZWrIqEC#132???_G???`?cWJicAQ@WCCA@?@?AG#129!6?O??!4_!8?A#141!7?@#132@A?ACHDYDOM@?GOo#107!21?`?O!10?A?A?A???G$#239!11?C!5?G_?_#202???COAGCC_#241?I??G?E#209O??G#240@@#212!6_?!5_?___#249G!4?GG??CC!4?C#192_???_??_???_!4?OO?O?__O?O?OGO_O#209!10?@!4?@@#104?G#183!11?_!9?_!15?O?O!4?_#104!74?AAG#9?@???G???@B??A???C!7?G#104O_???_#192O#5G!7?_#34!5?__?_??__#51?@?@@EGK?O?GOC!5?G???C#20O#152GA#116!9?O#50?_??_??_?_???__!6?CISg_C#148CAAM?_#62WG#102!5?C!4?A#99?C#93_??_??O#253O??_#84O#47_?O??O!4?_#93???o?_#102!22?O#69!7?@#116!19?O??_OG?FGBIYWOCAKcS|pLpFhTY~CYA{Cg?_#126?CA?A?OA@OIC`K??OO`?p?OG_?_#103!9?@?G@QLHAT@sAOqG_S@SO?GWOa?A?C?_?_??gCCG_Ic@A@?S@QGQCwA?A$#137!25?_?O#0oGWK#83CC#233?__???G#186_!8?O?O#243POO!7?@_@#186?@#221???_?_!4?@??@?O@@?@@!5?@#248?AAA?AB#198_!8?G?D?C@!8?C@??AA!5?@!7?@@@?@??@??@??@#192!12?A!5?@!8?G?C!6?@?_!4?O???G_?G@?@c?G?O?CO?G`??_@i?i@?c?`?AG?k?O_???C??OK#13@#34A@?O???O???@@?AA!4?C??CC#2??G#193O!6?_#38!22?AAK?XCEA??@??DKKF@!4?W[SOOOAAEEEIECCC?C???!4CHIACGo_!4?_#54???A?A??D??@?A#98_?OOWOWWW?G#103?CG!5?G!9?A???C#115@@?A?OGSQEB?@ACG?C_GC_G?G??C!4?@#142!30?_#73!26?A#77!49?_???BDI@ADI`mOg?QkQOBtKoHAO_OhO`@`@A?QCBCA$#204!26?G!5?__!5?G??A??@#238O?G?GG?G!7?GIIK!4C??CFDE@A@?BD?BB?ABAAA??@@??!5@??@#106O?GGGC??AA?BA@AAC?A?A?AIA??ABBA?A?A?A??A?A???@@?@??@??@#246!12?C?C#3!74?@@???C#19@#63C#51KC#2A#237C#137G?_?_!7?_??_O?_???__O???_#49!25?A#56??OD??LA!5?C?tOc@?BBb@@@!4?AA?A?A??A??BA?CG#39!4?O?G!5?O?AkG#73???@#48_!5?G#40!4?A@??G!8?A!4?A?A#102??G?AK_CEDA?@$#1!26?_#2_?O#97???A?A?@#244AAA@#153C#172G#188G???A!4?A#195@!6?_?_#230!9?G?GO??G#236??G??G!4?CC#247!4C#153???_#105_!4?_?_?_GOKGI??m!4?CAC_O?C?C??C?E?A?AGCA?A?!4A??A?!4AC?@B?@??@A@@@??@A?EIUIC?EMAEAAQAGPC!4?`?@!4?@#246!47?GO#52??O#14AOG?@@??C?CC???GG?G!5?G#10?GG#33G#23!38?_#144!17?@#63??!5@!4?@#92!13?GCG#121?@???@Q???A@#53O#80_??_??__?o#250???A#119C!4?A#69?@@???@@??@?@!6?O_ggWDIG@?G??C_$#105!29?_#104!6?@#239??@#217@???@#171C#124C!5?@#234?GG??G???C#227!11?W?G?G#234!10?@BBA?A@#207!8?C#220G!6?@?@#192!4?@!6?CC!6?@??!5@!9?A#55!104?A#49_#54_#35?RAC?A!4?CCC#63@#23@??@?B??@???B??G?CGQ?A?@A?A?AC?G#91!43?C??EE!5?C?O!9?_#58?_#250??O??C???G#101?C?C#54!12?C???@#42?_!7?O#41??_?_$#205!41?O?O?O?O#248?G??G??A!8?!5AaaB??@A@#243O!9?G#194???O!4?OOO?W?W!6?HB@#233!8?@@@#239!18?OGO!6?OO?O?O!4?O?W!4?_OcG?GOGk#70!81?@#56G#96??_#239G#33C?A!7?C#18@!4?@C?@???C??O???C??C#152!55?@@?@#134!28?O#115@!5?A#75!7?O#71?O#73CC#53?G?G#80O?O???o#48?O#98O$#201!42?O#198C#202?A#192A@@#194@#178_!9?_?O#220!12?_?___#188!11?G!4?C?!6CAAEA#150!33?G#140!115?O#202???O#4?AC#3?G?GG#12?G#70!4?A!8?C??O!6?O??O!5?_#88!80?__?_#81!12?C#88!7?O$#220!42?G#223_#246??@#29C???C#216A#163???_#205??@!8?_!4?A#234??C#209!17?O#171!10?C?CC??C#192!154?O#16G??G!5?G#4???G$#223!60?O!4?O?O??O?OO#1!194?O?O!6?G!8?O$#184!268?!4_$#13!268?@#19@A???A$#170!269?O-#246TIsA\bODtCQiaThcoIhoS{qzGw?O?_O?_??O?OGO?O!6?GgOgo__?_o_oo_?O?GGIGG#184???O?OOP?PG??O_?_G_??G???_?Q@GQGA#105!4?_!4?I?@WeWaWeWbWeGP?IEGAGYC]?[A[?OCOUgOCQCOTiWU?[IOK?GOK?OGCOK?[?W?K?O_?O#192_!5?_!4?O!7?_@?G???CP?I?C?H?Q?C?G?O?S?S?S?SGQcA?I`G_?A?@?P#191??@!4?A#246???C!5?A#208!4?C?CA#193?A!6?C??C!4?G?@?A?C#19@!6?@@!5?A?GG!9?G#56?O!6?CE??BADAMAA?C?CO?_?GO#125IOC?C!6?A???@#39@@#69@?@#59?@#40@#77@@@#101@#72@#87!11?L@?@BEBEABB@@FZRLIDIDEBB#48_??miGo#114B@C??CCCO@?y?PP??@@C#73_aQD[vAO@??q?G?_A?AGO?IC#140??AAAEKc?EOg[AO?@@O_CIP`IO???K_#127!5?A???GAS`C@AGG_#143!5?@#112???@?G@?_!5?A#107!5?_#102e???O?_@?@@FJP?GCW@bDEJWww!4?O_@#98?G!6?_?GOC??QA?a?ACI$#237I_A\aOLoIQhOTGCQH_OCg?HCOC_G_??!7G???G!5?G!7?_C??CI?K?A?A#183??C?!5C?CIA#193bBb@BCB@???_?g??_??Q`?_Q_?gWOWGOC?ICWeWeXeWeGQCG?@A!4?@?@_?`GOH_?GOGO@_@?`??`?`OOH?PGDOJ?T?H@GP@DF@F?GQcGQCPCgCBcIPCQ@?YCqCRcZ_AcO`Y_U_L_Z_U`Kb?J_BgB_A?GPcO?U@G?O?C??D!8?BGSKAHC#96G#191!6?O#137???ACA@C@?@A!6?GI?_??GOG#35@!6?@???CG?O#91??_@???A@???AC!5?H?C???G#52?@@B!4?AEGO!9?A@#48C??A#121!5?@?@#95O#85??CGOKKSC#98!10?__ooO_WO#75!8?A@#98?_?_???@#72PTKw!6_#102???H#121!4?GO!4?G?G@?T!4?@@!5?C?_#49!5?O#116???POKGEO_TnbAEAJ?pm]titytPMqgSPgS?_`A???O_?_#126@?A@U?o?CcS_?c??GO#114??G?gg?Hc`Q??GOGcQ?CWC_!4?O#100??Og_#107!4?_#115o#114o#100???G???O!5?O?GGCAK{uKmKGC$#244_CH??G?A?_?D??QHA@A#192!5?C!9?A!5?c???A!8?O?O!5?@@@?_`?`?_pp`o___o_OgGgGo?oG_g???G??CA??@?@#237???C???A#184!16?OGCGO?W?[?[_W_?_!4?C??G???C!6?_!20?_?_???_?_?I?C_G??CG?aCQ_!5?_!4?@_?@CA?B_BGB_B?@?GP_C?U@W_[?KaGOg?s?Og!4?O??G!5?@G@#0!17?A???@#10@#34@!4?@!4?@?@#104?G?O#58@?BWX?AWC?cC_@@AE!5?PAGS?O?C???G??G??_#69_#98_?_O??G???O#47G??CCIAAA#93OSCSiiumqBbr_`d_`???__OO???G?__WW!7?_O?O??_#99O#120C_#40A!4?G#119@?@?C??@?CAg?COGC_Q?Gg#49G_??G#116G#127!7?A!4?O@#129!4?G?__!4?Wkw`SwC#125!5?C???@CBGC_KDYPShSBIcScS_O#73!10?C!6?@#119!11?A#101!7?CG@P_EM??GoCB?BAECGSQ|vJf|mR{NeqaRpo@@@?@@B@$#218?P???C!4?C??a#239???C?A@A#202??_!5?_D!5?CC#191A!6?A#193?!5C???GMGG??AA#239CECCEAMIIIGI?A??C??A?BCABFBFDD@D??G?K?GC?G??GBCG#192!16?C?O!5?_#208!6?A!9?@#105!44?cH!49?@??@??AK_g?@U_?YgGhWdGsn\hz|izur}tr^~n~OOOY[iy_K_??k?SccowG_#17G#37@?ECCA]W_oG?PA?c??AC@IO???Gg?o??O??O?_#140@??C???GA?CD#88__?!5_?O?O_?__SO???OGG^]Y^]^~^QMNCK?G#47@!7?KAD?CA@#101!7?A#102@#59CM?G?G?GGOE??__??_#132???@!9?C?Co?`DHs?ID@?_#38!6?o!7?O#149?G#38!18?_#132???_?A_?@A?GKa_NCi?G?CGA#115?_??C?P?O??_QG?GGc_?@KCQCaO__#108C#72?@??GOO?_!11?sG?Og?OGCC_AG_??@#93???_$#240???_??aG?H??G???COCHA@C???G??O?_?O#217__?_O_O?S__s?C#173@#233A??!4A#201@@#198AA?A!5?_?_!4?@?@!5?O?O?W?!4Oo?oO?@#246_#137!11?_??C?A??C???C???AC!4?@?@!15?G!4?@??_?ACA?AC???A??AC?A#35!81?@#4A#2A#137O??@#96!25?A?@#208???S?C#3??!4A???C#4C#246_#2?O#63@?BC?`CJC?AT??@?C?E!4?S_O_#35?OO#55K@Q?C??S???G!6?@?A???@#253!30?@#48?O#41_?W_!7?_??o?Oo[#77!5?OWOOOWo__oC#81!5?K?_ROL_A#128!5?Q!4?M?O???@_?_DClTgaA@@GDAg!6?B!4?DI@IaPKRgeRHRYCcHAGGSW?O#119!14?@!4?A#103G??`?HCL?eOG@W@qHaWGOAoCG__?A@C@CCWG?x`B!8?@?@@@#99?GC??GOOoo#95O$#193!24?@?O?@?G?C#242CC?C#21@#216@@#178@!8?@#209A!5?A!7?@??@?@#244!4?A?IG?G#196?!4CG?CCGC!5?VgSc?uTg^vVBfcRdpzs`!4@?@?@Pdgr`o`pe`a_Ba@BEBbC@Vbb`baASaGqbSJAlbCrkbqjcpibsav_}iW}g^vLZVlZmZVZkPtiZdYu@qLPgHCZkZd]@^_^_]?^_Y`[gSGs?[GtkRcIDY`GudNaza\qmU~J}lV|oO??k?BodVvUaQaHO_S??S?GG?GG_?O?dccc?S??_O{{O{gWGG?OOO_#86C#90_#51???_!4?G#196???W!5?O#24?g#144@?@?@??G!6?G#116???O#93_?!4_o?O#75G#56@?@#42!34?CC?AaOc?OOg?G?KCEDB#115!6?B?C!4?A?@gI?`D?QI#125!4?_??f]~H?urNP[ioBLsOy^IgOgP?@A?@A@#121!34?@?BPGHoJSzRjYvPy]Shx__A@A!5?@@#77!11?CIa?@OC???A?BCDHAEGcA???A@CA!6?@$#90!24?A#0A@FAA#82A#137A#153AA!4?_C?c!4?C?A??A!4?O!7?OP?O?O@!4?@??@#191??O!10?GO!5?@#198!31?C#191?C!7?CG?G?CG?GC??C?G??CO#237!97?A#39@#56@#109?_#192O#104C#192!25?@#104!5?A#1A?AA!5?C!7?_#23???C#152A#38?O??Ga!6?@?A!4?C??C?I???OO_#148???A@B#80O?OGG??S?GI?OCCCEaA!6?_!7?_?_?O?I?Gc?@GCCCg?___?OOG?GHI#69!8?EAA?AFG??UCISAQg@C#140!9?c#52!22?O!5?C??C#73!29?A??C#118!12?BEA^CsCT]U?Q?OOBFcA?G_#98!7?A$#104!25?@A#196_GG?O#244O_O?O???G??OO?oOo?_#243@#242!4G#194??@@@#196G??G#241!11?C?CC#96!12?A#183A?A#237G#239!162?_#14!36?@@#86??@#20@!6?@@EA?W_!5?@A??K???@G???C!6?G!5?_#81D??@#114???O??G#42??O???KC?IC#253!41?O#121!15?@@#54?@$#105!26?C???C#233?@#209@#171@???A?A#201AA#194A?A?A#202??G#195?@#226C!6?C??C#191_?O?O?O#208!23?C#105G#109!201?A#0!6?O??_#193???_#34!8?_#55O_#244???O!7?_#17_!6?_#74O#50@!5?AIC@AC?FBA#59C#38A@#40?A#84O??___#118!58?A$#204!28?O@@#138!4?A#215_!5?_!6?O?O#186?@@#207@#218??C#244??O_g#241!30?A#16!209?A?C#0!19?g#96_??_#51!6?A?@#14_#64_#83?_#128C@I??A?@#129??G#87??O???G_?O?OO?GWgGGGI$#4!28?C#10C#173!5?@#176@!4?@@?@?@#216???@#150???CC#240??O#241??C#217O#9!242?A#70ABA!9?@!8?@GAG???G!9?__#53!15?C#58??@$#252!35?C#76A#181A#239?G??GG#183G?G_#184!6?O#14!272?G#246_??_??O#49!10?I@??@C?@C??H$#204!43?CC#212@?@#193!279?O#104O???_$#162!43?@#96?G#64!283?O#2O$#74!329?@$#239!329?_-#237i?Q@dOBg@S?I_DOA_S?gCAh?PI_U?GD@cJOaGO_?OGcGeOi?QAcOcHvGaKADOgOgSDYDgDGODgDwCX?W?W?O?S@?O?G?GOg#105??_GO?_G?C_HQ@_HQ!5?@?@?@#183!5?A#105!17?GO_?GOc?GO_CGO@g?S?g?O?g?GOCg?G??A?A@A?A@?@?@A@!7?@!10?G???G?O_?O?g?O#239!17?A?A???A?A?A?A?A!5?@#208!10?CO?cG?C#184???_#192???O#193??A??@?@O#184!8?@!7?G??C??OO#17G#96BA_#16A#23@#97A#208K?O!6?C???C#244_OG#150C?A#98O_G?_#95?g#85?CCWCA???A@?O!4?O#48!6?_?OG?A!5?g?CoSISkySK?]Kc_cs{SK{CwKWSkGCCWdXCqGSG?OG_G#133A#59CABAIQ!4O_#125???B?@GMXK@???@?GANwP[Oz^Ko#129??O?CU_?G??YdNpO??__??_!4?o?O??dW?A#125@?@?@?DKHKuvaahOE_#112??A@?gC??A#103_??_@@_d?LacI?oC@EWJIa?H?AB@CAAOH{LxzS#251GC#99!13?C??ACerQaYA$#246TjcYIdSQihTSIidSJhTPhSUjePGgSqIYPcHP_GO__OWOGg@Gk[GkWS?t[o_YiDAD?gCo?O_?o?O!4?_?_?_!6?_#198!12?A#137!5?A#192??O???G#191?A?A#137!27?C?@???@#208???C!7?A#191!10?@?@???@!4?A#239!4?O??O!8?O#198!5?O#191_!5?G#246!26?A#193!7?@#105??CGOgCgRkAcHQcIPcB@IR@JBtJbJQnoNqLpjDUaUiBAJ_O}DYeg?dcf`Rog[W!4_!4?oWK@{GiW{?KO!4?o#64?G#97S???@#61C#80CO#93S}V~zwC?C@?A!4?OC__APGOAG@C?@A?@DL!4B@@#53??O_?C__S?oOWOG?__!8?o!4?A?B??BA??CW#40?CGO!4?_#119C??G!5?_?A?w?gs#116!7?C??OG@__P`??@a^AC??AJURZAT^@zEZEBcBSZAFPOEZc???GO#73C???GW?C?GC#119???@?_??C?C#107!4?C!7?@?o??_??_!8?GC#112?_#59??@#98?O_cA?DAA@Ac@?@AdCg?GGLH@C$#244?S@cOAg?S?I_DOAh#252C?A??@#196!4?A#239?A#218?_?A#193?AC??C?M??D?D?F!8?@?O_??C?@?_?C??@?P?@@?`@_?_G?_GODA@eBAFBsLoKrKrKpNqLuHuHg?OC_ACQlOI?_?OG_S?gOG_Q?_CP?c@Gb@BB@B?B@@ED@DHE!5?_?G!8?hQHaHOdAHOIcTAsAL_DYDGdGeHcBSA?yDqChCydYCZsIlA[BkBsGaXCQKpCi@k?S?O_#191!13?_A!7?O#137!10?c#208!13?O_?P?CG@!4?A??C#104??@#96?A#193?A!9?O??C?A?@???Q!6?AGD!4?A#63A#56@#88G!5?BbZHEb??OXgghZKDKBC@C#99?@!5?I?S?G?COI?D?A#40???_#93??@??A??A!5?A#80!5?O#101!9?C#77A?HOOc__#118?A?A?A#39??G#54?O#73AO?PIDZD?}e@ODGaAC#128?BA??AA#149GGO_O?_?O#128!4?C#52!4?C??_WC?c??G?A?O!4?G#127???@!4?A#126G?EYG?O#118?@RY}WLiN]CIOGO_?@@ECA!5?D??C#77@??_?`?_!4?GAA?G???G#95!9?A???C?SCG$#218??G??G?C?A_@O?G#202??A?CA!4?C!6?GOcGO_GS@_??O!5?O#196??A?A??@?C!5?@?P?@_?C???CG??CG?cHCDGpCXsLOkIQDaKPCpIOC_GS?cFXdZD{Xk?ET|^|lS^j^VnV^l~^zm~Z}v[uk[ysmW}ugYyqawT{h{T[luV}tmxU|uUcsKskG{SkcYGsGw_FW`AdYaPSIwbKzDWCrCR?A_@C@_AO@c?wASHcYc`KqC{@}HfK@\a\zcXti\sWktYtlCyUkR|HukJtMZwmtGQswIs[SlON_LqKCIGK_@oss^n@wdWPzYYW[kDS__WW??_ogWK_oo@cCa??a?_C?_G?A#59_#69O#99O?_?O_?@#87!5?_owWow__#80??OCRGACJKAEABA@@#41!8?A?@??@?@?G@@?EA?AA@@A@BA@QBBBAA#115!13?@!4?@#121?@@DDCKO^MO?__OAcOG?Ok?Ae#127?g?__#140D}^LKO_??@?D_??C?HgC@i?ACxC`GRG_??_KcGcWG[so__#121!4?@O?`O`vtm}UGD@@A#102!7?B?SW?_?oIW_?oWWoww[}JG[EABAA??@#100_???BA_?A?BEEe`A@TxP!4?@$#240!7?@!8?O?g?Og?SG_T@hDOc#192!4?!4@??@_@?O_!5?_G??AC!4?O?O!4?OC!4?_?C!10?G!8?A#184!14?CA_A?_?OG_A?A?`??_??_#239!26?A?AA?A!6?A#192!8?A??_A@??G@?O???_!7?G`C??G?A!4?_???O?_?O??@C?_@?A?O?Q?a?@??P_?P_?P!5?@?A?@#137!30?O_?G?CG!7?AC#0!6?A@!4?G@GC!5?A??@!7?G#17@#87???_#41_???_AB#84!9?CLDKEDFA#98??__o_opwW{KCmS?qg[CCI?@A?@?@?@B?AA!6?A@A?@?@C??@GA?GO?_W?o?O#103??GCG#69@@A@E?GGOO_!6?_#126??A#132A@@O_??@@#55!7?_A#38@JSC_??IoGc_??[?_W!5?G?G_??_G_#132???!6A@GPCCbW@??G#115!4?_???P??aOH?cO@?SGA??@CCD?ACA?_!7?O#134!4?G#93!17?A??_?_o$#193!19?A#252!16?CC?G!7?O?_#184!11?Og?G??G?G??G?gCW?O?W?O?O?O_!5?_?O@??@?A#239!11?a??O!4?_!4?A#184!34?A??A@?@?@A@?@A@?G?O??O???O?_??CAGaCGQ?CGa@C!4?a@??GDODI?AD?DAGBCHaOA@GQ?H@A?@?W_]_K?CGEGC_JcRG???P!5?A?@O?_#237!42?@??C???O#33C#24@#239C!5?A???@!5?A???@@#149G#72_?W??G#94!12?A?A#120!13?_O?G#80!20?!5@#120!4?__??oGoc?_WC_G!5?_#102!4?@O?__#81??A?BBC??C???C#130!22?CG#52??W#128!19?B!4?@??Av_@?@OoG?C#114!14?_O?o@WcAQGAGA_PGHC_BO??D??C???C??O$#242!36?A??A?C!4?C#239?@?B@A!4?@G?@A@Aa??A?_EGA?A??_?CFBFFJAaIaCQ#246!23?G!46?@#192?@#246!35?O??O#137!56?A#246!54?AA#4A#63@??C#2??A?A#244@#104???@?A??A!5?@#218???C#14C#42G?A#40@#72!30?_O_o??_oOogCg_IO?IQ?_?G?G??GO?wCOCg???G??C`@CbVclFZ@dq__#114?CKKKGgOo__?___#127@#140A#142!25?A???@#55!19?CO#119!54?A#59@#101???Op?_???CCaS@JBkOWD\[XWwXWWWw$#198!37?A!4?A#244!6?@?A@#183!12?A??A#241A?A?A?!5A#86!235?@#51@#58AA#37D#74A#38??@#56@#137!5?OC?kOk!5?C#47!4?O#103C#77??C#49!100?@?C#72!113?@!6?_?SOPk_O__c??_$#233!38?A#209??A?A?A#109!271?CG#217!13?@#1?@??O#96A??Q?AAA??@$#153!41?@#20!276?@A#240!15?@#237A!7?G#65?G$#9!318?C#16!17?@!5?_#70???@$#184!336?W?gC$#35!337?@@@!5?@$#246!337?_?O$#110!337?AS$#192!337?G-#246TiCqHTI`[AiTDaYHdSIlHbUKXreCtiITtIiTSidSYiEOzLdYYuAn|iBhtcWOHqoTC_nOpg?b?D_U?AD?dGuGO??C?P?O?O!4?_??_??_#184??_!4?cGO??O?Sh?O?O?A_?A??A?C@!9?A???_#192!17?O?_???_!16?a?O??A?C???AOC_???OA??GA?Ga?C???A??A?OA?S?@???C?G?I???I??G??AC?_C?_#105@?_GA?QDG@aChQg??@gC?OfGAhQkuPV_Y`QTaSgEhV?TgDQ_RcJOiDQkOcZ`WaOdCWCC`SGoGON_AGDB#83O#93O???@?G?@?@C?GKMF~[w??oOgC]MIM@@???_#80?O#53?O?G?C??C!8?@@@GGG@IEHNLNAASC??A_QICCCAB!6?_#77!10?_`RrECCgc^_[CKWo#115AO#118G#121[YH?@N???@#49??AO#38_??GS?SKE?qqGGR_G??Fm_qNqO?CgTG@gI?Q_?C#128?@A?`VGtBC@#126O??W@CCO_#114??G?oOGH?CPcQHQ_Y??A?_?_?G?_!5?BOA??g#108H_#100A?CBCC?gO!5?o__c{KCDA#93_Wg~jv$#237iCqHSi`[AgT?aW@C?I`?ASG@aCGPI?T_I?T?I@OI`CPhC?Q?d?`OATgUGRcHqLAgQLOICQlOeOJ_\_GaGR?dItIP_CG_@?_C!17?O!6?O#105!28?@C?Od?AGP?i?OACG?@C??@!4?@#237!18?P??@??@C?@??H#246!34?_HO_?_C!4?G#191!6?A?O???_CO???C#208?D?CG#191!7?@?G#208!6?@#137@#191!9?G#137!11?A!7?O!7?@C@#244_?G??@#99O_wooOAGAX#87A!4?@?@@A??@@@?@#40!9?_O_OoG_GO?WOKOcc{{uQVA[tWuoa?hg?O_?C#101?G!7?O?O!6?_!4?_?GO_COgO?W_O?_O_#69@@@F#81@_C#125_oO_PKUBNKeE@#129_O!6?@@CA?O?@GGPKCOKciJSatIEtL?@`_?G#125?AA_FI{bmJ??BC?A#118A?GGOoJNFufbKA??_#102A?GGKWVbE`rZFzf??EkGhA!4?@#98!8?G??_!6?OGQPBB#85??OG$#218?@!6?@??G?C?Q???O#202!13?T?i@SI@COGE?Q?c??O#184!6?G??C?C?_Q??ACOCOa?H_G_?Q?@?DIPA??C?A?C_#239!17?A?@#184!54?O?O?OCO@c?H_AG_S?iCP?H?I?O_?@i??@??IOD??H_?_!4?P?aG_GO_H!5?GcQ@_A?_DOeG@SI`QsHo@Q@GQKPG@CGDO??@?A_!6?_??OgA!5?C?G!5?_??_??g!4?_??_G??GC???G!7?_?O#110_#96O#97??O?G#88_#72_!5?@??S?O?C#88!5?B?oK@F???@#72_??_OO?G_o?KACJBBB?JFE@BBHAA?@?@A?@!6?__TupR_Pqxo{W~n{_xUGicx?u@raNjFEKGg?GO??G_W#102?CGOG#73???oVM?H?B#142!9?_o?Oo?KKookNvMoO#149?OG_?G???GAS??_#73!13?GO?SE??A#112@?@C_C#115G!5?Ga?HcGK@dq@??GGG!5?GKG?ACWc#134???O?OG_!14?_#95o?G?CP?C$#244?O@C??C??D?AG@C_!20?_#192!4?@!7?@!4?S?A?@a!4?H??C?@?G?G???O?G!4?_??g??_!23?@?A!6?_??G??G??G???_?_?O???G??C#239!47?C??C!4?OC_!35?C??CH??@#237G_#137!23?C??G#193!7?@Cg#208!29?@!5?O_K??G#239_???_#0_#150G#64_C?@#41GC???C!5?@?_O?_!4?_?O!4?GAK?`#120!4?GA#102O_?_O#59O_O?g?g?Q!5?_!6?OO??!4G#120!4?AA@!4?@!6?C?G!4?O#53G???O_!6?_#119???AoaDA#132G??E#140g?_g?OH?KMCAFB??K??AC!7?A???ATO@??_P?QLAKPquL|[Go#132??O?cI`?AG#119!5?_DC!4?O#77!20?OOo!5?@?QG!8?A?G?AG?A#99!4?gCS_$#240??G?a?OA_O?_O?_?Y`SAsG`qCGPi?T_I?_!5?_??_??_#252G@?GC#239!7?AC#193??H!4?`!4?@!5?A??CG!5?A?A@SIO@iTYTiTYtITyTiTiTI?k?S?xACaHO?s@Qc?DQ_DOIO?Y??i?OAdGPaGOI?OAG`CO@c?HOaOc?HQCxASHOiCPGaTGaSHqCzCPCjC?GO_IOG_??I?CaCHsBs@s@CX_RKpKPkPcHcGbGeWdQHoFO_@O???OA_???A???HQCOa?O?_?_!5?C!45?@??Xa?G!7?AWAQ?A#203CA#35A#42A?@A#85?C!9?ACIC@I?I#99?O?OeGQc?P#103!4?_#77?G?SK?KC???CG???GC?C!8?@!5?KCCG?G?C#98??@CA?QPACP?S?GO#103!5?@?@CA?C?A???_#128!7?_O?OGSO`?HA?@#56??__!9?_?_#121!31?_Wcwpwl]rVBA!4?O#101!22?_!4?@A?AKcj?OPxU@np~v^|F^\ZBBB#131?_G?E$#193!50?G#196!12?A!4?G?A???S?AD?D?_?Q??C?TgPKg`HITiDiTIdITiDITiTiPdAuHnEhAXeNnJsLZtylTyjsN~D~nT~ntWvi\UjtnI|tUinSZnsjTnYjuLiElJeiDyIvSItTJaLP?iKqCpm`NIoDeXmiPTaWjsA[B[JuXeIkPEPeBKQeXvGvOBGkQLoNOI?fOaDOKBSJsLyvC_iDShfgIVYKzSLRzyyRrVnWfTSlQGa?ZdUli[iVXUg^iVQlVkZSnTYdRnR_[e[bYaDjBQjVFFN_[@C???@#98G_!4?I_?Q`AooP!8?O?__O?OC@JIAUHE@@?@#114???_?_??O?O!4?_#48!9?CCBBA@??@_@?@?_??AIC?@CP?AHaGT#114!7?B?@??@A?@BEKc#116!8?A!7?O@?H???@???@@!4?B??@@?@??_!7?_[AGD?_#127!9?@#107!12?_O!5?CO!6?CGS???c???F#59B#72!5?@!4?Sb_GAhU?C$#239!72?G!5?OO!6?_?GA?A?CAO#246!19?G_!4?C!75?O??O#104!118?C#237!16?S#246@#37G#48O??AC?@!4?_#80!7?sI?C#48!4?_??o??CK`EHE?DA!8?A#114!17?OG#99!17?hC?GAG??C??S#59!6?A?@??@?A#55!12?C???_!4?OA#149??G@?A#103!55?_?G??X_ADPcQDob??PUC?WCW_?@OdOc?Es@??GCA$#90!338?A#101_?gK?C?A__G!35?B#69?_#99@#250_!7?_O_?_??O_#40!39?A??A?@#52!14?_!5?O_?_?G?A?@!8?C!6?@??A!8?OAG?O#118!54?OO$#70!339?C#75C#16@#77OA#100??G?C#130!130?G#136O!7?O#119!78?G$#123!340?O#95!6?G??C?B?g!8?_??C#144!113?_$#80!347?@-#237CP?GTOI?dGaPk?Yd?aOGD?cOGDA?TgAOHCQ`CGPaCGPa?TGaT?IOdIt?tI`IsJcHoHqDGTI`M`EhBoDO@qHqHShUgU_S`OG_???O???_?O?@??@?A_GA_?@_!4?A??AO???Q?CO#239@?O@C#105!13?@??@??cH#192!22?CO?G@O?G_?@?A??_?G?O?_@???@C??D?G???C@???_???@CQG?_?G_D?a???G!4?_C???OAc??S_?G?GO?g#191!11?C??_!4?O!14?O???C?A???C??C!8?A#239!4?O_A?@@#56A#101CSO?O?G??aF@O!4?_!8?_G??a?_O?_G#53@OIGc_#250CIcX#54?eD[SSWCCoQ?@O@?_?_O?O#250A?G#72?@@^^^m^FJFB??CJCBEKE?DBC??BOA@OB@@@!4AD?DA#59???@?CO#121@A??O#52@EG@??A@#144??sO@??@???A#136@#149??O???WOk?D!4?`O?C?A#125!5?_GOkzg\QANEa#126O#112?I?D??A#115O???@?C@?QGG@C?HGI@_x?OC??B@@Eg__kA?@#72_OGCScIP?G???A#95?_?c[QmSoe#131mSyojSq$#246jCPaGDPI?TGAPc?ITGdQgQHdQg\iATxEqhKYreKXreC\iaTKivtnYOInIo]T@sYUDeGiQi_UO?oCWEgEgC?C!4?@!14?O?_?O#184!4?cHQcAhS@???A???_GQ?AGQG?O??A??A_C@gAOC?O!5?G?O??OC@O?@??AOA?OH_AG_AG_A?@A??C??AO?O?G?CA?C??CGOA!4?_?_?AD_??GaSICXc???@?C@A???OHqD@qKbKROhQc@?OIPAH?_@_???O?o?ShCQGcO@aG!7?c?gA_Ga?Ga?GA?C?`??_?O?_?_??Oc?O?gSg_Tc#96??GC#244WCA#102?G?@C!4?_#48???CICC?GOCO???k?C?O?G??C?O__?O#69!6?AE?A???CWGC@BQB?@???__?OO#114??C#77y!8?K]SGOGWO?O@G??ACG_@CG?O?GG??H?H?lQJUI___#69A??_#140@AGO??@#74!4?GGiaEqi]G#130!5?G?C@A#140O_w@M\??@Qw?PsHQPUU?j#132??A?gS?XC_!4?@#114???_o??B?EGCcbQOG?@CoAA?_OG???E?C?O??P#98??_ow!5?ACG??`A?A@#93gO_GO@aDJSjL~$#244O?aD?A_COA?C??@#202!34?G#192???d?O?@?_I?@_?O@?C?@?_C@!6?@_?O_!5?AG???A??A??A??A!14?Q?C?G?D!8?A??g??G!9?@_?G?O!9?AG_C??_C#246!20?C?_?P??@?A!4?GO_?O!5?O??O!7?O!11?CGQc@?O???AG#105!8?@??DAGADICI!4?@A?_HOAlZulJcHQDGTaHQcHQdGdAgQGdOcHQG`IPCHQdG@S??C???_CGC#41_?K#75A@#72_?@?@??Og}h_G?cC___OoO?wOsitPAH__?O[k_S#62!5?cgHwb`___qIG??GAIHJHIHg_#102!6?__??wowo!4_???_?_OO_O!4?_!4?_?W??O_!4?__CO#119@?KGO_#54_#38@FMPaOAr@@!9?__wg_{zelBN?[@?`C?@BG?@C@#55???@#73???CACg?_PA#118??WWGkwk]HRoswo@`R?GH?Ooo!9?A!6?KMI#134!4?GO`A#100?@HE[{]\n@?@#134@$#240?aGO_gC_I_Dg?YcOiTIdQlQGdQ?TgAChCQ`CGPaCGPi?TGaP#184!9?C!6?G?CO@?SG@AGA_@O@O?QGAHUgUg?_?@C?_???O#246!21?_??_???_C_??_??C#239!56?O@!4?_?G_?Ga?_??G_?gO_G_?g?_???O!14?_???G???G_#198!11?A#193!17?O!6?_#208!34?@??G?@gC#0??A#193G?@#121@A#95I?K@?C#53!5?Oow#114!15?_O!4?A!7?@?@#148???G!9?_#49??OO#48!12?@!9?@#114_#108_#98??A!4?@??OA@#100GA#108!4?O#114!9?PIIOoo#49?C#128?O?O_?@#63!4?EO#37GO#152?@?C#129!11?OAA?A?OEK?RGG#121!13?o?GL~tfaaB@B???KG#102??C!4?_aE??CC?MFbSlggwGBMM@@?OC?@#99!13?OWaC?JFHOH?C$#218?GC!4?P??O?A@!9?A??_#193!37?A???_!4?O?O?GAgCG!7?@???A?T?GD?GD?GD?GCA?K?PC@ODOGC@G@O`?OG_DQH?G@?gA@CQ_DQGaTGaPCGTAoAgAsAOChQCgPCR?xEHObSI`SAgDQG`I`U_IdAPI?gO@GAP?aDGASGD?G?@G??@C?H???@ISJcYcGDOEHQDOIOG!5?QG???O@???GPi@?S?_?_#137!57?@#104!8?`#37O#40go#88O#93GCo?O?G!8?@@?@@?@C?@!6?C?@#59C!4?@!4?A?O!4?@?A?@!6?A??@?BGIoA!5?O_#101?C??@I@CQCHQHKacJlysNKWESK]EDDLCIEIOd?G#115??@?K#132@#125@BAK??_#56I[_wKW?_?@@!5?EPCC?A#116!6?_o?MG_??c_AQCMH?A?@#119!13?SOC?@EKA???_#107??C!12?BA???o#59O#77@!4?_$#202!4?A#239!68?G#196??C???A?C@C??@??UHSgpIGDqGdAwDqGtAxNqVGQcHWAaQktQlSViTFGhSddQlExEwhVwLr[AtLizeI|E|FsJlJqEhyFkqKzChSjKaT[b\TqLtYc[`]`YtKdiELqeXGuPGvP?fOlUrKVQLUpGURkVG`@_A@IrGexQkoNonDQCgQC`CpCJCcZm|BcCgUiT]QLvTitJtjUzluXnYCf\QcHQCZQlQtITSlRSlQtIxVKrYLZelR]TizeHYf}AiTRiYVJRp?A#35C#134?_#98_?A?G?_P!4?CB@WOJYKIAIBCJ@?I?K?A#41A@#40???CaXXrsW??O??AAB@@??KK?KCC?ECECDdF|yC_#53!9?@A!4?@#73!33?AKG?__#142?C?KC?eA@!5?`r|WMBBV@#52!8?_OA!4?C??G???_#103!21?_??BGQG?OcAT_E@IXCpGG_OSC?@?O?Q?_?BB??A?CG__$#239!84?_A!4?H?ACA?TqGdAwDAGDAgCo?g!5?C?G?AG??G#237!71?C??C!8?A??A??A??A??A?S!7?_!10?@!5?A#42!85?O#99!4?@?A?PGGO?A@??AAC?A`G`OA?AD?C?A@?A@#39!15?G!4?_o??OoO_??O#103!18?O?_???_O?GO!4?_?!4_Oo__o_Oo?Gs@SI?C_#81?C??O#145!11?CSgKS#55!20?G#128_!4?!4_HSCQCP_@@#101!38?O!4?@!4?WKEB`JOc^Sqpb@$#103!339?G?c#85_#41!8?A!5?CC#77!8?O!4?E?B@?AA#250!14?C#92?__#119!168?o?C$#100!340?a?UAED!21?@#102?GKG!6?CG@#53!15?C???C$#133!370?O-#237\_SI`@CBOM`SIh?SgCOi?SigTAhSBgSBG?T_AH_SAH_SA@gCQ?OK`ITiChS`UgEpCO_HOcGqHqCiSGO@aHqGSGOGPgOaOIO?OiO?A_GO_?HO??AG#192COA_!4?Ag??Q!4?CO?@_??@O?C@?AO?AO!8?Q?H!7?G???_@C?_?@??C?H?C?a??Oa??S!4?Q?gAO?COG_AGC@G?AGCOC?_C??GCQ_CG??@?AO?A???OA?c?A?@?C??_C?g@cHAGACGAO?AO?AG#191?Q?G?A?_?G??O?A!8?A??C!6?_?A!8?C!7?CO?A#137_@#34_#37O#59_O#101_@S???s?iSgQcH?R???QCHCOCGOCOaHOAOICA@G#103O!6?O#69???C!5?AAE?AC?C?E???A@#103!4?@???S?CA??iAHCAaC?E?kQUAqA`g?GgcGcOCKQcOCCGCHC??d@T_C#69C?ECWO__#55@?C?CGG?G?G?G?G??A_#125!7?oo!5?_!6?Bl}WUWNK__H#112??_?OA|QC#115gC?_dGQHS`cO?A@AQROKED_?_?@BS!5?A#121KKA#134??hCIC@Fg?gAw?CI@CA#95?@?D?@!6?@C$#246a\_SAY@c@OI`SAh?QgCOi?SAgTAhSBgSriITkQJhsUJhsURhluaq]t_TZQjMhTPMIlJuDZQDUCx?AcGuGS@e@aC?CADGD?@A?@?`?@A@#105!56?C@A?D??D#246!24?_?S_?C!6?A!4?O!6?a???_S!5?_@G#105!43?c?@GOAC_@iCPcOAcHQDgD?IO?hQcHOAChCgQcHQdGQHOdQcGOg@ECSJ?C#53_#48G#72GA!6?S?jSDBA@?I?DLHABFGFDAF@A?cecrW[EAA?C?A?@#139???A#62???K@L?G?CG??C??C#102oOK???_A?A@?___C??O_pgSoooqQgggKC]UG_OOsOGO?GYjg_?G?OG??GIYqg?_#121@#81B?K?O?_#52?G!9?OAS?GO_??S?C??d??A??@G#55C#127!6?@#132___R[?A#143???CG#119??_yS#114OhCQ@K_JSGF?CA???aO?AL!4?K!4?wbD??C#99!4?@!4?KC[?woOyPh]cWa[YcYLidugQ$#218?A@?C?OG!6?A!6?@#240!15?_C#244!6?G#252???HC#184!11?G?@?O?G?c??HACGO??@aGOGOGOgO_OaOG??OA?C?Og?C_G!5?@??H?c???C@?GCQ`?A?G?C?GC?_O?G!6?T??S?H!4?C_?G_!4?SG??O?SGOaO!6?PG@?G@?Ag?H!4?CHa@?C?`?_?cO_@?@G@QHA@???@AOAs?G?G?OcI?G??P?_G_O?Q?@??C??O`O?`?Ch?Cg@_D??@_OGD?Ac!4?GcQ?gQ?O_O@O?G@Oa@???O?Ga?Ga??`?GA??@A?G?C#193O?@#56C#102AK_#77!9?gWs]kSLY__ooGoo_wg[SnXHP!4?H?D_#250??C_CEKGeWep_O__O?OOO?G!5?OE??G#77_?OaA?@bJD@CA@@BA@@?@@@?@?@?TC@?A?AQ`??AHU_u_V`Ys_#115??A@?G?_#132@#140@AC?GOOOoOO_OO??oGOCg?NohLQEDGVAXIIcr`Xd[O???@#73??_AT#126_DQ???D#107??@!9?G??G??C@#77??@??A??IcO_?_IBOG#125o#73A@#131!5?@!9?_??O?IcW`CP_Q?G$#240??A`G_IOe@SI`S?h?A@??A@#192!27?G???I?_C?O?A_?O???_??G_??O@?@!8?@!7?_C??G#239!97?O?G!6?_!4?G??G!9?CO?C#192!75?C#208!22?@#0?GA#96G#64A#77_#99@!5?A?@?@#103???_?_O_!4?_#48B?A!8?G@??C?A#54!15?@@A?A?A??A??@A#101!21?@??@??O@G??VA@?B@a``?@CPQ`R?A_U#119!7?@ACKOO__#128G???_???O??__?__???o??q_HG??w__TO??_ABkQ@eGFO#121?@ISyl^zfwAL#118?BjEQGc?A?A@#102?oW{hgKCaOo?WIP??A#72@@O!5?OGdQ@CG?G#103???@#93!5?_?`OB?A?ID?DAHUh$#244??G?OC_?G_!4?SA#202C@_C@_?T??OA?O@?CP_IPCOAH_SAH_CQ???@#239!12?_#193AC?A?@!6?AcGO?C??@aC?CA?G@C?@?CAOC@CIOC?aHO_Ag?\AgQGODQcG`YdQG`MOCIOcI`Y_[`CH_CH_IT_IPcHc?cHOI_GQ?cOJSAwBSIOmOJOe?OHOKrCGTgBGTi?L_@CH_@AD?P?w?EODOA@?TA@OhAh?GAPAs?wChCpKRcHcGRGdWcRGqCZ?RCIO?cO_P?_@Cg?D_@aCQ?GCa?hOI!4?aG???_??O?cG!5?_???A!6?G?C#237!11?_O#218C#80O#93C#103OOG#53!13?@A??QCG???G???_!5?CA@?D?BB?@?A@?@#39!8?@@@B?@?@@@#115!29?C?_!5?G???G#59!9?@!5?D?O_#73???BAK?O#142@@???A?AC@B!7?@#103!41?OH?Q`S_?QgF`?O?_G?`?OaP_A???W?C?O#98??_OICyoq??Fa?_???C?A!6?_??_OO$#252!16?@OI@SG??AgC?gCAg?C#193!16?@#239!24?@?@A!7?@a!5?_?K?C?CGOC?CA?C?_#237!89?_?AG_?G?A??_?_?_?G??GA!4?@!4?A#246!97?A#204G#239A#244@#130@#98?G?@??@A??A#40!6?_#99!9?@#102!8?_!7?O_?__#49!14?@?@#72!39?A???@#49!25?A?G??_#74??@#50_??_#116?O!4?P?O?K??H?AQgDCT?ICYEW_#59!36?C?@!4?D!5?C?@?C?@#100!8?wOOPR?EEJ@CGC$#196!76?_???C??@aC??A@GD?CaPi?hO`I_APhQb\UlVxE|AsVHvlQhYdU`GKrKpeZpnQ`]@MbSju\ju^_i^`mQcZuZqJsTVgvZi_B{BkJ`e@L_nO~juLaCiTaUgTA@U_JUPaSOKoRKSBMPBGFOmOa[_C?sQhEw?k@GFpErKbGPePvGeWFQKbLhCykRoJuHELiU\iQTjQ[UWhHuU`DWQDOTjmXDPHuDGViLdIbUdYeLWZUxDlRSlQTdqIYdXvnUwhrgOC@#100!4?Ab}~~GhS#59!28?_??_?G?C!6?WcWA]_[OGW?KGG?O??COGHOG_?OI@@@CG_O?Q??G???G#100!11?A#125!29?K?Oo?_???_??_#149???@@#119!62?GG!6?G!6?AP#251!8?_$#95!334?C#114!36?__OWOc??C??_!9?C!6?C?C??FOISCWL_?GOWOS?k?GS?GKGC?C???O??_!4?GC??C!7?G?G?A??H@]Wo_#38!4?A?EAEEKCK?KCKFLAGAFM?A#101!61?CCW_@aE_?G???GfO!4?E!5?@@$#40!371?O?G_?WhYIXWRo@B@!5?!5_oOgwGg___dBOF_CGSI#56!55?@A?@@@?A?AA?B#129???C!4?@A#118!65?O!6?_$#121!397?A??AA#63!75?@@@#69!78?G!4?_$#77!398?_#53!161?C-#237aG?BgD?aSGA`LOg?RKAPCAXCAP?i?SjgU@Ga?T?i?PG?AHCq?@QChQdWDA_QDWdAGbC`IPAShS`QcZcI?J_HaPeWaHA@AOeOdO?P?G@?C@?`C??@#192!4?OAG_A?C?H??@CO?@??C??_?O@C?H?O?G??C?_C???S???@CO?@?G???H???G_C?H?O@?O?D_?AT?AO_@?AC?IO?I`?A_??_??S??@GCOD???_?OC?A?`?O_?cG?S`G??AO??S@?_A???G@ACA@Oa?_?G!4?O??O??A???O!4?C?G??C???O?G??G?A??_C?c#191?A??A?G???OA#246?_#96_WC#77_oWC_?b???C?QCGTID@?A@L???B!4?DFKJEUAEkguIEEA@@@Aa_oooOWOO!5?GCC@CI?EDA@`???@@@O?`KL?qJJCOKO?G!4?_#115?@`_O_@_@`??_#114!18?C?C???@@?ACKog#125AGCD?@@?A@?DEGQC\CGpSkS?_DKq_IWCysG?eQLzdcDA#126G?L#118?owoq}zdFLCW#102AAKACcwYpG!5?@@@?AB@!7?@G#107?@#99??_O?@???_~LvJaHA?IPIqlRkdOGMdcuQR$#246TaGSBgTGaTGAoDAgCPkAXcAXcAT?i?SBgUtLiiTTiAt\SqXLuudyUkIby\LlifYhu[Y[tklhAAYCH?P_X_UCWCG@?O_Gc???GAC?C??I!5?_!75?_???G???@A!5?_@!4?OC@Q?A?A?A?_!4?_?O?G??`?O??C!8?S??C#105!23?_GA???@A??IO_@S?i?S?H?A?T_A?AGQ@cG@A?A?Ah?SdGPA_I?C?WK??@#98O!6?A#114!9?OgUP_aosICWd??_!4?G!4?G??OOG?C??GAAAaCB?i?Q_??O!4?O_?KKWSI_YiedBA_O?GoC?gO@_?OG??@!4?@!8?A?A#59!17?A@G@??B?W_GO_#140D@!4?@??@?@AC@??A?@??LJA@HO?BG?B@W#73?G???QqGT#112???GA@K@#115C?O?Q?C__OPA#77?C?EP?A@A?CA!4?a??B?B#100___g_?_O???_#131!4?oGSDQ_T?aDG?kRGdO?G@?c$#244G?T_?OAO@?_S?A?T#202gA?_A?cA?_?S?h?S@gAOD?i?D_A_HCa???G@!5?_#184!5?C??@??A?AO`?`QcI???H_?aOEGA@AO?GcO_@!6?c?Q!4?TI_I!4?O?O??C!4?GCO_O?HAC??_??C?C?D_?P?O@I?@?IO_??GC_ACOC_?c?A@??_C??CGA?W???_GCGS?p?P!6?G?GCHS@?H_S???_AXEGE?bGOGCGAH?@A???C?_G?H_??G?GOc?u?w@oGCGTGV?eP?BGCgCI_W_T???_O@_A@?A@?aGDAD?_A?_?GCO@O??_???_CPcaG?@#237G#0_G#73G?@#102W[C?Sw!4?_?_?_O_?[???C?AG~^IOoo__wwOO?TG@??C__!4?G?`__?Og?KOAG_O?GOG??A!7?G??a`@!4?_EFFfvwEYmUIMEJSMUKG|Ldx{i\z@P@?!4c?CC??@@AFUEe{{_O#81@?C???S?KO#54?_#128???DHA?ITMiPG_O?A?BPCRDGseX_ACO#121??o_~o~FDM@#103??Qg?_B?DQ@iGD`IO?wO??MG?@K!6?QSTW?A??A#134?Ia[@zSH?A#93?_GcXaTGo@Q!9?@$#240?PA?SA_CG_DGAgOA#252?_PK_X?_XKi@SA!6?O!7?_???H!9?O#193!4?O#196!9?GC!4?P?C?A?G@?O_G?@eOBADOCXCiTHIPCj\vAg@SPeXvIdm@nOrluXeRgJDIvcSxjSJ\aZ`ZaYDYeLakPsItc@MrKrAXShaHUXA\_]_^?ZdYr?T_DAtGFO_@aAK@iSa\dWv?Rc?O?sGS?IDqL?K?_?P_GQCb?Rc?uG_\bGrGBSb?UHudQdIBW@IDIDQbPaAgtGiPs_RSiOTDV?jJy@lCZGuSlGm?TgxOvLsZTmpRhmHExHYtm@Z?RHdfQDF?@#72CC???G!9?@#59??GC!5?G?Q??O???O!4?A@?PG@Ca??OOGG???CBDBC@A@!7?O!6?cOWIc[B?Q???OBA?G_??AO#107!5?G?GO??O#115!29?@A?C#49@?AI!4?A?AAAGO?W?O???A_??G#55??C#114!25?G?qH_XG@_?PA!4?A!7?@!5?C#121C!4?@#95!15?O?CG_C?C???A!7?G$#218?C_G??G@?AO???D#193!13?@#240!11?OG#244?A#193!5?G#192???@OC??A?O???@?_A??O?C!6?CA???@??_?C???@!5?G?P#239!84?GA_?AO??O?G??C?G??A!9?_???G?Q@??@!9?O??S??S!5?O#191!23?C???@!7?C?A!5?_?O#198!5?_!5?O#192!16?O#239??O#24?OC#16@#101_??`C@@DJ^LJVACA#115??_!4?OOc??_?_#72??@???@@!9?@@#54??C#250???C?C?A#103_?_?O?_???_??@_T!4?O?O?G?COjC@gOOG?DHCPgSP_Sa@gOcAQWE?Ta?wG_h@@A?C@QC`I?g??O#54???@#121@?A?O???Go_?OO_???_#132__!4?@??o???___!5?Do?AHGDA?A#119!11?C#107_O?K#101!4?C`mDluKOqGe_keTIFO`?ACQOACD!5?C#98!17?OIfpQYHGc$#218!41?C#193!33?G!4?_O?OC???@?OcG??G?Ga?a?C_Q?i?OAGsAsJcHc?TGPiOeGQGaHcQcY`GQHACiOaS_M_T_Y`GQHQcJ_IPmOGbCwE`QLq?eXaT?Z_U_IcGfGQ?\?_G@ACGs?g?@CaOCGdGQhEHA`AT_O@aGoAXAGD?`?OGcHAHQ@aGA?vG`KaHaGQLOdWf?s?oGcGCGT?APCI?DgA@cG_G_C?CGAO?`?AO_PGA?C!7?CG?O?OCA???S?cG!4?A?A#97A#53G#41A@#48A#115A??A#40!14?I@#119_#69_#101!5?GBC?@?@?C#69??_??_?O[G!5?A#72!10?C@C@#101!16?C!12?_!10?A!8?CAAQCQG?Y?_!7?_#119!5?A?CG_!6?_?_#116!6?@!5?OC??CGC!4?A@!4?G#72!31?Go??o?O?GGdG!4?A??CH?D@??W?hC$#239!80?C!7?C?CO?G@???Ga?aO?_OCG???G#237!80?cG??@?Q!12?_G??G?A!4?C?C_AOCGCA#125!94?_#56?A#103?_?W?gCyo__O_GoGE@GAODI@?@!7?G?C?A??_??CA#121O!4?CC#77!58?A!4?@???CcKQGQX@zYhzYswSoGgW#69!4?A?O#73?oYiuAK[KKWo__???_???A???o#108!46?@#98_??G?OO??o_?_??CCWqWIc\aE?AQ$#121!330?A#69@#122?O#53!30?@#115!6?_?OG#53?@#118!62?@#128!34?@#132??_#50@???@!7?A#129!6?A#100!52?C#134O!4?O#108?G#118G?G#115?@$#40!372?G??A??A@@@H?GGOg@[PeHrIiPeHaPqCiTI?C!7?C?_#112!142?G$#119!372?_??G?CC???C-#237GaC@IU`SGAc?hAGP?aOD_?D_?T?i?DIi?dOI?DOI?OI`CQH?a?SOdQcBG`ICR??pEO`SgDq@w@iTITITiSg@ATiSgSgUgPAO`O`GdIO?ITG??K`C#239!73?I?O??H!7?OA!4?@??@?a?GAO?a???@!4?P_???A?O?@C?@C?OC!7?@C?@?_???_!4?_??_#198!4?C#105@!8?D??G?ACG?A?D?I??iCO?CO_?GA!4?AC??HACI@MG@??@#72G@#103GmJEAW?O_@JfPF`SE_??O!4?O???A?C??@A???C!7?C!5?AC???C?@?E?A?@?C???@O@O!5?OC???_??@?YCgC?hCQ??T@K?BAG`AI?S@HSAL?DGBGEpGGG?SBShAS`!6?_O_#115@G?AO!6?GC?GSG!7?_?_O??O_O#126?C!6?O!4?@#118_gop\Q@@Q#102??WSg?G]DFFIFC#77@A?@?O_??_??O#108???G#251C#100SWKXEV[}}ko?Q#93_?_gQHuhqt[aWaH_???O#134??c??_O$#246TGaS`GI`SGBSOdAgT?i?Ti?Ti?T?Y_TDYIdtyiDtidSYjcu^TaimYLX{REtxk^VIwnMjRYKmASS_O__?@ADySg?A?B?@C?_?AGCO!6?aS!77?_??A_??O???S@??K?O?OCi?G?O?_?G???_GO?G?C??`C_?C?O_O?O?@??Pc?@C??O!9?_#191!11?G!9?G?A!4?@!10?A!4?@#153!15?A#208_A#35OC#118OC#101C@CG@A@#111??C?G?G#107?G#118!4?AA?O#72!9?O#77???@@@!5?E?BAAB?@@!6?C!4?O!7?G!9?A?G?G@GIC!7?G?G??A#118!7?G#77!11?AACECJ{jUljM~PNYs_O#40_#59O?ETG#119A?O??A?`?@B?ACO_??_?Ko?kSG?O_oo?O!9?_?CME#114_dO?_J?A@?@?@#122?O#100oO_?_o_#114!7?B#107A#98!7?COEPGB@@ADYKJM@!16?DpmJhdP_$#244a?OG!4?A@OGC?_C!6?O#252!19?@!4?_G@#192???_A!4?A??_?@?O?C_@O??@??G@?O!5?@?O??_???C!8?O???G???H!4?@C!5?@??@?G@?A??A!7?A???C?G??A??@?G?C?A?C?A?@?C???G@C??G?C?G@AC???D??@!4?oCP??AG???Ca?GAPC`?G?@?_DO?g?SG?@?G`C??c?OC_I???_??C??C?Q?DgT?DGDOChA?`?O??@Q?@?A?_!21?G!4?C!15?G#56_#115O?OO!6?K?o??_OO??GG@`SP?Ag`_WSaWOE?_???GC?C@??g??GC?C??C#69!18?A!5?H_#72!4?G#69!11?C#101?G?G?C!20?CA?A!4?O?O?mOdGO#114???APisk_#125@Oo#118!4?_!4?_#125?@?A!4@???@???@?BELL@AN@#112_?O?A@!5?@#59!6?C#101!6?W]@@op?GWfOkOc_tPRHjbb?_?_??O#72?@#131??OKV`cGQCGaPc?sQSjS_#100???AG$#240?CHAS`SI?cG`AGPA_O?o?O_?O__O_?_O_O???O_?OI_#193!6?G@!5?C#184G#252???_G#193!9?CA??_??_??ACg???A?@?@CG?GA?C??D_???aP??Q_SrKqGqHqLqSiOcWaSaSgDwDoCxA|AsHsIpIoFoLoHuGqDqPgDwBgTgEwBgTaSaOiPeOjOeOgPOnOGQsGOAsJ?I?Ps?@IoDG?T?c?GAS@aWe?G?TA?@?i?SAOIOJOI@I?PcI@M?jOi`Ao@GA?AGQ?aGA?OCWA@o?G?CG_GC@GOIC`?I?AH?AG?C?@?C?B?C@A??HA?C?GA?C!7?A#49_A#102__OopCCMbFACOM?MBhRVo!7?EB???A?gGLMIABG??C!7?O?GHI???g_?`@?C@?BHCA?O??O?O???@^VUT]c??@AOBO?@`p_caOGCdA?_@??O?`ojifkFhK@`pp_#72!8?_#102?B!4N{_#69?@?W???GNErYsico?O_!5?O?gO_!4?_?_#140A#115!9?O??AG?o?c@?_CA#72!9?KGA?E?AG!6?acQ#99!4?G!7?_O_A?GQ@?@??GAXALjSjIMPOSQMN$#218?P?_!4?`O?A?OC!5?G??G!5?O#184!42?@g?IDACICgO?@ASgCgSGQ?P?O`?@IcA?DG?@?_Q???CAG???GADGC?G?C?C??G@??G?CAG@?HC?@A?@?G?GC?A@?@???@??G??@AC!4?A?A?@!4?H?G??IcIsJ?A??aG`C_BO?P?_???O?eOCOA??a?R?AOCi???I?A@A_???OIOIOa@Io@G_???A???A???GCGA@?c?GcW_HSA`O_Gt?SG_SGaSAh?Ag??DAGO_Q?lQGaSHaHO_AOdC@#237C#96A#40C#114G@???_?o?O?o??_?_?C_MKgg_oCIPC_@`hGC??_?Oo@pAwW?GKO_MG_@OcJOlA[G[GmA{q{Aice_FZCIlAG@k__@?_Od@o@IoCPgOC?QOGCPQ?wPSAW?aW!5?_O?OO?G#81!20?@???E?o!4?@?B!5?O?G#118???_#128!7?@?A?@#69!8?G#103??_?C?K`ABkb_ygGdWb!4?A_O_OFOlJ^IK#95!17?O?C??CGA@C@C$#252!16?IHD?AD?AD?I?D#196!49?O??@!6?@?A??i?b?CWaOPgY?aTGCBKhUjGpDuHuDoGbOnReXbWjTqEwNrEx?tIsApMoLoMqDu@qLoKiUwFwUgVoFwUgXb[jTkPlOmPmT?e?dQc@?@??_K`K?AGQCG?aCGFPKbCH?HA?LOfG?CgC@O?`M_@cG_K?ZcI@c?`CG?S?M?VgVGtGvWDxULrAtkIuQlrQFTqIoEdPUGpbsSjoT`xUSxB|waXuc\huOlpXbsSojT{`OYC#239@#140G#70@#77AA!4?@#69!15?@?NHA!4?[???AOo???GCA??_OooC???C#115!21?___??c@o!4?_!6?_CAg?E?A?@@O??GDCi`eeHC?C??OO#59??_#121!24?C_?HD?OGC??PGKM[wS_O?KABCKMMG?WgO_?o_ow]|M^@#107!4?MMGOqCGOOO#134!9?CCCHCC?G!7?_???_?_???@Ic@C@$#202!17?C?I??I??I?D?I??D?I?D?I?D??COH???S?@!4?_O!5?C#239!23?@!6?CGC?A!4?D_???aO#237!82?AcH!4?_?@C_???O!8?OC???a???GAO?G@!7?_!5?O?O!4?G?C?O#217!66?O#240G#132?_#59!5?O_??G!7?O!9?SG?@?AC`ODAOs_?oG{?@@??_O_aWqaPsIO?@_?o?w???sOG@K?CJTAOEIO???A?AO_IS@G?A!7?__?O#73!41?BEN?_!8?B@AE?G?C?@?AA@@FIEC??_IG#98!30?QGG?B@$#218!322?_#108!8?G!4?G#119!12?E?C@??_G#121!11?A#40??A?C!4?O!6?`AOAPAC@?AH??@O??G#118??_#119!21?A#107???_?G?C!8?AOOO#132!30?G#49_?O#132!11?@GEAAA??@!5?@?GOOCC?E@A$#119!371?@!5?G#49!116?@$#101!373?A?@??@$#53!376?@-#237aGOCgQCKQHCaGeQhCG_SA?HcOA@OC_I?aS?T?I`OH_SAcPKAG@OhCh?I_S@IaH@?i@QdGtAShEW_Y`GCHUGRKOaSbS`WaXaHe@eWaC?AC_IOI@CA!18?C??C??C??C??C!18?G_??_??_??_#184!13?Q?`C?A?gO?A@E_F_AgDOGc?I_??h?O?_O@?AD?_OcG@aKB?_PaWcP_S_EG?aI`A?H?C_?_?A?_OGDOG?Q?_C??OCXEHQC`EGHcIPe?`IS_TI_TGQhCaPCHAhCQHcQHcQHcQHcQH#246_@#56OOA#115C[?}K_OgLdBGhPPGCcbW_bSCAMrGo?[`Qk?IS!4?o?CAG@?a?S_?_!4?_S_#77!4?OOG??O??OG#115PhGGgAO_GGO?LG?G??_OhGOTcaOSAgE???G?aOsOCCC_?qAOQOP?_#77CGK?G@?@?B?F@NYUlsWEr__OC#119@AG??_?I?p?_@!6?__??_O???GEI@H@#112??@#107!5?_!4?@?O?A@#101?!4_WsB@!4?swNI?gA[PKJCISVIZa]dQoA#98??_#99?~nAOCO???gOG??O?H?iS`QPoOG$#246TaGPCgR?cQHCPGCObSJ_HuOALoM`IT_\?jiiTSIeOJh\Iep|VyjUZU~TJisT[umfTukYRIlhAPdNdYuhQ_dc`n?@WAKAC??O?W!6?GOC`CO#239!21?P??P??P??P??@!18?A?GA?GA?GA?GAO#237!9?Ga?G!6?D?@C?A_?O!4?_??@C?GA?G??CG?PcG?_GA??P_?CO_?a???G?D??@C!6?@AOG!8?O??G#239!9?c#193!14?g#192??G??O#208!17?@#97_#20C#121A?a#103bD?A??@?A?@?C??_AG?AS?a?@#69?cEXBOl?wC_oOowK{Ylvun\[gCgWkcks[_?_!6?_!4?_?_?O`???O!5?@G!4?_?_G#102?A@H@H?Pp`?_?OD???OqATKCCCLMKLJbBvu}y}}wcww_???AB@!6?_!8?GC?KCM{kW??GG?C{E!5?__o_?o!4_!5?O__GcI?A??C#113C#100IkUkVfZBA#77O?C?g??_?G???_#134???A?A!4?T#131?OK@G`I_T?cqOdIcqTPi]c??_$#244G?@gA@?_??AP#218!24?a???C#244???P#252???_C!5?_!6?O#193O?G!7?_???C?Q_!5?@??G?C?C??O!4?@_GOA??`?OG`]`]`]`]`]`]`]`YcR_Ga@gA`Ga@gA`Wa\a\a\a\a\a\a\a\aD?HQCHQDGRCGRcGfWfWfWfWvdPKrdLiOiO?AoA_H?BGDOI_CI_?O`?O?_A@_A???@CAC`C`?GPaGCX?TGACP_I_O?I_CpI_G??_`I?tAGrC@A??@?GA??A?d???a#237!35?O#110O#63g#38C@#102O?I@@?@!7?G?B???@#118!8?C?A#59??B??IF@??A!7?B?B??A?@AI?Z@|WKJCFTJhCJE???C???C??C_???aDGC??C!9?G?`?@??A??A#107??A?G@#101!6?C!8?@?A?`#59!4?_??B?@??o!6?KCGE?GO?A!7?A#107?A#121?@!4?@@?@#77!8?_#111!5?_!4?G#98??Og?_G_G#72D!7?@?@DI?@C@?GD#93!8?pepMt^iVJDnYdZCiC@#98?HmIDb{Rg$#240?PcAOCGQHC_Ge?hEWbSJsHeXaLoMpITa\?T?G`SHaSA_?GA#193???C#192?_#202???S@I_@??G#192??@?c?O!4?O!6?AG??S??@!5?C???@?O??@??G???_#239!77?A?@!9?GC??c?I@O?g?O?_S@_O@?A??A!4?G?CAG?@!6?a???G???Q?C??c!5?G!6?C_#217!50?C#83A#73@#69G!4?_W_O#59!9?@??C?G#40!17?@#118??_???O!6?O?O#102!8?__#119_!6?_?O`?P_!5?O???O!4?O!5?_#107??@?A#40?A#69???_??G#118!5?O#108!9?G#40!16?GCGAgO#69C?O_@@PM?pA__?@???C!4?_??@@?C?A#122!22?O??A#95???O?OC#100!13?@???C@?GL|~~^i#95???GA#134!18?DASBg$#218?CA?@?_@?_O??P#184!57?ACG!6?CHO?Q??aC_O_XaHa@a?cG?A?_??A?A#246!80?O?C!7?O@?AG@O??CA???@!4?A?_!4?PCP!8?I?G?PC??O???_!4?O??G?A?_A?c?GA??@#239!50?G#125?_#72_#100G#118?_!5?O?cO?A?OG#54!34?O#40??@!9?@???G??AG#118!5?O??@@O?G??OO!7?_#119!16?_#114!34?@OD?EW?_!8?WAQ_A?B@LRUE?@@So!4OGGCW?CKQG@SbOL?HG#99!13?G#251!17?O?G#100!33?G??CV$#196!72?O?A???@!8?G??A???O?GCXASaKTAKpCOKjD]`]`]`]`]`]`]`]dZkZe\yE|Ye\yE|Ye\a\a\a\a\a\a\a\a\q\udXudWvcXvcXfWfWfWfWfG?KQ?W_SADiWsGXOCO?_A?@O?@SA?ECHACGcGOgEHO?O?O_Y?C??A?C@I_P?G?S@mOdGRGCZ?tIDUOdAXdCXiP]dYepSlr[hQ?ZtKP~]tj^it^ivDUzTmze|UzluZluZluZluZluM?@#144G#101O#132@#107?O!7?O#121!44?W?G#103!10?O??O!10?GA??@?A??A?@G??C?GO?A_UGC??@a???IQ?@G_@@I???aO?OO?@?D?@CI?COChQHcWCYCgQg#73@?DUSK#115?PAAP?P`?@@_QQ_@XG?ggEG@I?A??C?I?GDSIGDA?E??OC$#239!86?G!4?@??C!5?@GP_?@???_?O#192!80?@?D_G??G?CO?_A?DO?HSAGaCHASGO?TGA?aG??OCI?C@??A???_PC??S?AO@GA@CO?D!10?g?A_??_?G?O?Q???G#240!35?A#128??C#119!4?O???_G???_!5?_!6?KRHa?K?O!4?_!5?O?G??_?GO#102!31?CACA#81!67?CAGA?_#77!9?O#103CG?C??A!8?O?W_GOOCOI`SiOmO@uHO~\N^R`@??B!5?_tzVTbmQsqo_gC_O_O_$#114!330?EKEAOGeUGefOWSFWGbX|o!4?_??BCpJDGMEB@@!5?B?BCFA@BA@@^C}AeBCR?icCrCPMEEAE\mAdr`IocfDwvYFERBiPKEgS?_?][U[LIHD`hGTG?__ha_PAo?_!7?O#125!16?B#121G@?qC_#118!13?_?@?O!4?CCCEAAE@B@A!7?E@$#59!330?@A#49!151?G#77!23?_?_$#101!508?_-#246TGaDOi@S_ICPI_DI`k@iSAXDgU`QKbCXaHSqhDyDOdKqFQyH\uQJmx\VTWtmDioInIoYnIdSRLaDIO?_BH?OCWLY@?@?`A`G`Go?pGPC???A@?_?OG!5?O#237!9?CP??P??@??@??@#239!18?AG?aG?aG?Q?CO?C#137???_??_??_???_#184??AP?_HQC@?dGO???h!4?ITAPATg?O???PA?T??E@aS_DO@C@??O_ADGO_?TAS?cA?_???_@OcG?S?GOC_PaU@]@[`^?E_H_R_DGcI?kAoBgR?KaDgR_GoAgOaGoA_C#105hA#218g#64E#114G!8?{XH???CB?_OIdFPpGQJCAV`Go{??@#121EAE?AC_!5?OH_xGS?CGO?@O#102?_aOOOWG^GD!4?C!8?A?@#103@!8?@???Q_?QP?P??OA?_?O???OQQ@QEG@OGI?OCC_G_GOGOkOfOG?I?@A??@#53???WGO#115??A?A!4?@GIG??C?A?@#77OGQDBCA?BCBCHSo?WO???_!6?_#100_?_gw{|MFB#102?D?C!6?A?E@ICG_#77?O#100?O_suU~#99~i?~dgT?OG?aPI?PGDQ_EGaO??_OC$#237Ga?OiCSaITpI_DY_SAOC@gC_Q@GC`OGa?SaHCQ??i?Q@OgDSa?HcPCA?AdIPiTIt?tIdOdY`KqCgTiTIs?zChA_CoKoMOKOEOE?E?A_IpKPcGSHE?a?A_G#239!14?C??CO?CO?CO#237!18?_!11?@!18?@??@!4?DO?G!6?_?DA??PA???A?PA?`I?cHaS_D?_?O???AOd??G??A!7?S?_??dG?C?O??O!6?G?O#208!38?S#237@#70_#72_A#118_kR!6?_S_Cb_oWID?G!6?O!7?_??_I??OC?G??@C?C#114@!5?C??E?OAAIaS?oAGB?IACEA!4@BPB???HDCFBB@OYMr@Rh_GQ?}niwOYVbYAIM?HOKH`w?_?G#72!8?@!10?w?wswso_O__#102??C?WOOo_o@??_OoOGKCA#72?_WGWSg_G_#102??FAFBLntIVoM?J?@#98??O???A#95@#107?_o?_G??GO?O!4?_#72!7?O#134G?@#131??S`?WA_ydaT[CtiCqglZwTKb#134?HA`Oc$#244a?DG?@?G!4?C?_#218!28?G#202!5?Hc??A??_#192A??O?D?O?D??O?G_?G?_??C?Q?@A_!4?A!9?C!8?A!4?_G?A!76?C!4?GQ??@COC??PAT_???g?@ICOdI?_I?cH?S?@O_CO?g?A?DGO?CAG!4?H?O?AgC?I??PA??A??I??G??_???_H?Q?C?O?@O?@?C??C?P???C?@C?@C?@C?H#239???E#83O#56@#115oC@GrGc?AcS??b?S@AcOI?i?@dOQlGU`M?t?AO?O!5?_A@!8?_??@?EOT?L?d?__?gSGEOG?`CAQAAO?SAALA?@?COi?D@KGCCDEK???D?L?gCDDC@KCA@oO?@O#101?C??_?O?AD_A!4?_?Oc#114!9?@?EG??CCG?G?@O?GOGAHA?@#98!4?_??O#53??O#107!11?A@#122?_#72!4?G?C#113!4?C#108??C!8?A?ACGC?S#98!6?g#93??@M?ATIDITi@i?TiDQ?C@A#100???_OK$#240?CO_DOi?T_Ic@Y?TIPmPiTaYDgUhQKrC\aHCQgDyDY`CgD?a#252???O??_G#184!15?A???O?DIO?_Cg???_CoGOKOCOE?E?A?A_IPCO_G?GA?A#239!83?@!7?G???@IO!4?g?SG_G???C!8?O?C!7?G???O!4?Q?_???GCO?A?PA??C???O?C!5?C??_#244!34?O#97G#81C#59HA!5?O#103!4?@#102!11?o#103GC@#54!12?_!5?C#81A__oO?o?BA??_#59C?_A?_??CB?FOB?@@?A#121?o??C?GGG?!4_??OG#102???O???Q?_?A!8?_oo!5_??EkC`rJZZJFF@??@@??FB@#59!11?AA?SC?G??G?W?_#103oOG_GctAID!7?@???j?@?CaOIDgLo~S^E!7?owONwJalUfDeNt|x[Orr]hBSI?A#95!5?O#98!18?_PK~ULAjZ$#218?PGA???@!4?O#193!42?_G!17?@A!9?CO?A@???`A_?`GO?pG@??AG???_HTHPK@tLa\a\a\a\a?G_I?cQGcQGcQGcYdYdYdYdYdYdYdYdY@SaHSaHSAhCOgEOJSb[BSJSb[ATiDY`[AOGQLOA?Gd?aH_Ci?G??GtAC?S`_G???T!7?I?I?I@C@Og??AT_Od?\?u?cJ!4?P!4?_G@Cg@??@_A@?@C?A???@?@?C??C?O??P???C?P??O??O??O?_#104!5?@#125A#102C#107@Q_!6?AJ]#59!14?G#54!29?C#103!8?_#118!10?@???_??_#59!7?GA!8?_!5?_?O??_#119!7?@#59!4?E?A@O?_??C#48!23?_#69@@B@A??CC??A???@#101!4?o_olYcQdjCYsJu?G{_gO??O!5?_W^~FVBB!5?A?@A???@!5?@??@AkjdN@H$#239!74?O!6?C?A!5?A!8?@G?C!12?C???A#246!83?A??A@Q?C!4?GC!4?@???cGO?PAO?H?I?J?iASh!4?a@???_H???CH?@A!6?_!5?C??_??A???O?C?G#133!34?O#112?G?C!7?_#118!84?_?C!4?G?G??G!5?D?G?G@???K#77!5?AC?C_?O_WsiUkQnWgS}dZ}D~FIFJNFCKW_wwo___#107!5?_#108!11?@#122!32?G#115??O#112O???g#115!5?_$#196!78?_@G???O@A@G?C`A?G@GO?`G?COCag@U`UPc?OcRsGa\a\a\a\a\ze^pmZheZheZheZdYdYdYdYdYdYdYdYd[b\Sb\Sb|CzjExjsj[B{jSj[B|iTYd]_kjUc_isgAOeXcQ?TiS_?_?g??A?ADQcG??_IO_G!5?_?OiCDIO_?ALAg?aH?X?UhUPIcIPeG@mpBiTiK@W_U_I_X_^?]_]irYdzQlJ{Eg~aXyEg^eJ|Ej\eJ\UzUh#121!4?O??G?G#112!93?_#107!6?`C#118!55?@!4?D!4?CEBD#114!46?O#118gO?W_G$#119!327?CR?C@!4?WGGE@?_OoCMA?__?_G?@A?dG???O_?@OC?cG!5?_CHAc?_G?G!9?_Og_OX?HCkWCc__{?QSAoG?COg#81!66?@@#121B@??CCEA#77!50?@?A$#69!328?cRj?A!4?O?GC@!5?C!6?U?@IYSh|HD\zMjZpWVMANAEJwOpJYY`H?L?L?@!5?cOC__W?W?_W?C??[??OGog?CA_??C!6?@??DA#119!52?A?AAE??@@-#237}?dOIcT?iC@QC`GAGCAgDO?COAgD?OAG?T_AS?AhCOHcOI@S_Ah?C?_GBc@Y`UGe@gQ?QkQcHOiCH?VgOhO@E@Q?OGoKOD?D?OaSIs?GAG?gQL?QC?A?GA[?GO?_G?O??@??@??@??@??@?AG?C!5?C#137!7?_???_!8?_?OcQG?QcGT_I_TGaGP_?O?G?O?G?O!5?_G?_#246A?@?A???ACGOA??BO`GAd?ACA??A_CP?_OG@??C?c??G!7?A?@?OC??C?@?A!7?A??_G?_???G#237!6?_#105!10?C?O!4?E#153O#83_#69CO!7?@AC?O?G?G?O?_O?@_CO@_GwkrOwNLTIwqMVHF@@P??_cEcyOYLH\DTa_?AKa@C?BCAD?B@???C?`?cW?GCOHC?C@A?@@O!4?G??G!5?OG@??O?G??O#59!11?_#72!6?OOO???cGdkZK~~N{bF?BCIAYRRaO?_O!7?[?I?IDSiOJoNqLOgS?A_???Os!5?Gs?G?C#118_OW__oogC!5?_o?@#111?G#108Ac#100?g{}}~n`j#131?@[Q?@ADA?LAEIHtMU\BI@A#100???_Bq@$#246@Y?dOIgT?yChQCPsBWTAwFwBkPAWbKpEgATgB{SAxeOJdsiJ\sUzjLTu{Jmc]htP]Ulnl@HRun?rSr_CBABaOgChE`E@IOIOID?@?@AdOdA@??_@??GCO!5?G#237!46?@#105!22?C??C??C#192?@!6?A!6?A!5?@!4?EO?C?`G?DO?HS_G???D?@cOG@O?GOc?@cA?C?OcWA_K_WaG_???C@??O???CA???O!4?@O?@OCHC?D?OdG?@??@?_?GO?C#96G#115G_yDAZ_PK{Cpc?W_\?{D{IhSqLomOXc?BKBA?Q??@???A?a#73??C#118!8?O?A#115G?DB?@B?E@A?B?A???@!4?C???_!5?J__?AQO_PSEWAhBTGccHD`?G@X@H@I?`OQA??oO#53!12?_!9?_???B!4?@#101?C@G?WAgQkUiIuKq\b^cZtWiPnSJoLqKSGjS\oKpMGQ`iPfVALaC#119?O#115GcK?E?@???o__G?O?a#101??AtE@@#72@#134?O[?S???OkOgOg?__?_!5?_?gCgVGKGC$#240?`A?@OA?S@yChYcHsBgTAgFwBkTa[bKPVgITgAhSAHeOI@S_#202A@???_?@#192??O@??A?_??O?Q?G??C??C!4?GC!7?_?_!8?G!14?@#184!75?A???A!4?A@?@A??@?@!5?@I@O?A@g?H?i?E?O?G_?A@CPI_OI?A?c?I_B?BO??OGpA@??_K@ODGpC]s|gwUkjms\oh[v?LA{Bs?M_KA_?q?wA??AOgA?GAKBCE#137O#97?O#103O??_C_S#107ko#59!13?C!9?O???o_?sCGOGC#132O#54O??Q???O@?@_?A!4?GO!7?_#118??G#73O#112A#118!8?EA??C?O??KC?C?@_???O?_?@??O??OO?A?QOOA?_#48!31?_?[?jSA_W??_#103!6?!5@#100!6?A@C!8?_#102!4?A#114??A#251???_??G#100o?BBA#114_?OG???A?@?@#102OC!4?C`#99!8?A?j}alnQdQgTaSXcSIOhagTu$#244?COI?@?i!6?A#218!16?_!5?@#252!11?G?COAG??O#184!5?G?@!4?c???OG??GPgO??@A?O?OGOC?D??_OIc!5?GOcAG?QC???G_G?_#237!84?@#239!10?G!7?@C!8?O?GCOG??I???c?I???G!10?_GA???P!6?C@??O??G?A???G?_!9?O#246!14?_?g#241C#101_???W#59??A#102!22?A#121C!7?@A@_!4?_i@jURG???C_O?O!4?OoW_GoOWWGdCSyzyY]ArA_O?`_OG?G#103!4?_??A??D?C?A!6?A??_?C?@GB?`G?AG_??c??AO@ODACA@?G?@#99!6?O!5?G???_#102CCC!4@#53!11?_#103!9?A!4?A@G?@l[SKG!4?owLF??S?HE?BKJK!4B_XQKXIPA#98!5?S!6?G?C?OG?O??_??S?GTzVgVoDy$#218??G?c???@!8?_#193!35?OA!19?@?_??AC???_OGCGA@A?GOa?GH!4?A_OC?@_?G@iDPa?@bCBcBCBCj?gCQgCQgCQgCQG_O`A@aPA`a@aPA@AxU@IOcZ?[bKoKPm?Xc@HQcHQ@GACPACPAcGlIHcPIHcQLQd[_KSaSIpKOkHuSIcYCmPGA_@O?CAO_I??Q?EpI_OG?AAc?J?E??o??OG_A?@CO?B?C?@?A???_???G??O@?D?C@S?C?C_!4?G!5?COC?C?A#208???G#244?B#116A#119G!4?@!4?AO_?D?C?g@SAhCQA@g!5?GC??A???@!4?W?gS??`Y@i@AC??gWSig?@?_Dc?d_A_?CCD``WKX?KSOHc`s@?GL!6G???G?SG?cWKDCK?G???O#77CC?CC!6?A?G?KYfiLJL}hVYeYBCB!9?@@CCG@HUKAgSsGqKa?_Pc!5?_C???b?BShALoE`??A@A#134O_#98@ATG#107???BBBH?Op{oCOKOKK]C`O#93!12?@!5?@A?@?@A?@$#196!76?A!5?cOGC`A`C??@A?GTAC_PItOLA`EGOVc_@OiDSASRKR[r{jSzEzhEzhEzhEzHuVlU\yTMp]TyTMxu|Eh]tlZC|b[rMrmO^cJYcdZcHua\pMgrKtIROdqRk`uQl_kYa[pJSjSKrkRs?_cG@o?CO_S?GO`GaC@S_G_??C?@cPG@O`CO_GdMYdDASkXEO@aGa?AY_@?BAGR??B?BC??yApAGBy`ZQlZUHfA|nYtjExzqlP{rH`B#136?@#118C@??C!4?wGHDAOaO!8?H?E?O???_???G#81!4?_ogKEC??HG??CC??___!7?WOGG??OOGg!8?@?`#112G!6?@#102???AA#59!9?A???A#102?_!9?G?vLDN^}X^v|__!6?C#98!12?gSgoS__???_#108!25?@#112!26?E???A?A???_$#239!77?G???C?G!8?_?_?_!9?O!5?GO_??_??_!7?CO?CO?CO?CO?c?G??_?G_K?G?G_CG!5?A??A!6?@?A#237!43?@O?_@??_?G?E?O?G@?_@?@!4?CA??O??O?@OA?@Ga?H!12?G?O???C@?_#72!38?@#121C#114G??A?BA@?AGcA?bBAA@?AG!4?E@B???@??_??C!19?A???DC?C?A#73!17?@#114!4A??QQoo_ECC`pf_UOa_RXAaA__QcEcadgAGhOrG?aO_!5?A#120!20?O#108!64?G$#77!322?A#112?A@!8?A@#54!19?C#59!27?A!30?A#101!30?C??C!7?@!4?@CGO_?_?Q_@O?O_O$#102!324?O_?G-#237|PwEgTAhS?hAG?i?d?AGD_A@OC?i?DOCA`G?SBOCiP?cGCaHOCO_KQ?iHS_WcHqL?QcPIPiCpAShSGqKrKRcRkQkOcGdGDWdOaWaGcQgAg@?@A?GPaGP?AG!6?Q?@??`??@??@GA???_#137!15?_?IOdGQcHSAO_DgQcHUhShQcZcYdYcZcXeOdY`SHcxAXaSHOaSG`IS?H?Q_#192!4?@??_?PA_A?O?@CH?D??@?PCH_?@!4?A@?I?OAGC_GQH?IOjCQk!5?@O_??G?Q??@!5?@GA??C!5?C!7?D#246?b!4?@#72_O#115R_G_HGOA~tSIhSu\IhcZdQNoNshVOn?_G#59s]N@@@#39??@#73@G?A@!6?_?C@??@?G_?aOOOGGcQOSOaeDIOAc?C?_O?O!5?G???G#114O??O!5?GgGGxZK@cOQHSUhu_@E??_oDGg??g??G#72??O[KZO\Lnz^jJmDVFPNug??_?O!4?@@AAC??IS?H??_O@JS`ITiDoDiDOfGZ_ItA_W@K@#107?_???c!6?GLC!5?B@??BAK#101Kh#251A??A#134??C@RisOhA~aXCbQH`IdYCbsY@ID?CQE$#246Ac@WAgTAhUOcRS@Y?lDqILOm?jS@Y_IpKQcJ_kJPCmXRcXSejxlUolvSqjL`ZUCqzlHmsCPQM|aCJqD!4?G??@?B?R?Qa?AGC?@?O?COCOiO??_???_?O_?OA#239!101?A???@?C?_??@C?G???@aOA!8?A?C??@!5?A!4?G!6?A_?O???G_A!8?@GA!7?GA#237!8?CO#150?_#202OA#83B#114BCP!8?I`SaG??OQ!9?G!7?A!6?A#115!8?@#132!26?C!4?_O#119_!5?P?EAf`_cd`bkctL@fAA`???_??__?_???OO??O#101???C??AO?QObK?pCi_AO?_?C@A??I#41!6?A??A?c#95c#101?@@?BMTA~uJ[VI]sj]tIDYFYTOjGRCNOAHP??AsB?@#108A#115C@??@???S_HDpCAO??B`CGO#100?A\n~Xv^z}kO!5?GCiWks]sW_oG??coOwr?`ib$#240?G?_?A_OAhEXcjSdYAwDoQlOnOjSdYdIpKRsJOciP?eGPaHO#202C??GA?G@C??C#184!9?A!5?O_CGQKBCRcQk?c?cGC?DO`OaW_?h?g???C@O??@OA??A!4?@!100?AG??G?K?IoA_O_YcIOC_?ASgUgS_WcW_D?_@q@A?CaC`COh?ODQcLQK@Y?T@HCPEWfWdWA_TGVoIpIPi@?ODy_\q?QG#105AO?A#24_#86C#77_??A#107GOcJt#118?I_!5?@!5?OA??C?B!4?A?_!4?@_??_O#69!47?O?C?C@??C?@G?o??@CA#103?CPGA!4?@??@C!4?DO_?Cg?DGC?G#53???_CA_#99?C??O?G?O??GA_??cAO?O@OakGG#100???g!5?_!6?O#103?G!8?C!7?w][lrY?A?OOm?A?q?AOK?A???TarS_O?C#99!5?DJiU|?O!8?@BOG?GC???@$#218?A?@!13?O!26?A#252!4?A?@!6?A#196!12?G#193???A?@?@!4?G??@?A?Q??a??@C?P??@?OC?gS_@??C?I_@SaHcQG@gCOIOCIOcIO?_TGPCQgTiGtI_y?{@y@{@i?DQ?G@Q?dGDQ?H?C??A??A??@??@!4?I??AG_A?C?HACAHAOC_HQcHcJOjEwEyDWAk?SH_M`?OAgO?WCi?A_GACgAHS_Gc??`CA??@_?C_!4?@??CQ_!4?A?_?Gc???@?C??_@???A_G@Q`Go?OAG??OGGCK#97O#99O#41G#102GGtSERcG#119??@S?@?aSAH?GD_COJ?gCO@!6?_?_?C?@??AoaUtICA_?CXCiSAG?CiC_SO#81!24?@!9?A?A#102!7?AA@D@A@?Q@EAHMJF?AVRqV@g@@#98!8?O???O??o?g?_?PKrNX`n|bAI[Osq{o_#134???_???_!4?_?_?_?_CO__O_?oG?KpA?@#118_OG?|CuNF@B?QGI`kbKKKY_#102?@#113!5?_G_#131!5?D#98???DaPC@A?@ACGCAdQ@iFGCGPK$#244??E?T?GC#193!42?A?@!6?A#239!21?_!7?G!9?C?@??@??C?gC!8?@C?HC???g?S?OC?OC_??_C?H?A??A?C@!4?C#246!73?O?@C???A???OC???S???@AH!4?_G?C!4?_O?CO`?A??H?O???D?A???G_???A?c??_?@?C?_#208!12?C#218??_#240K#144G#122C#103_??@_#69!7?AG@!4?cQG?H_?Q?_?o^vH`?KQGBoW{sRG_!4?@?@??O!5?P!6?@#112!24?O???C!5?@#59!10?C!11?@??A_??G#77?SAu_nSbbA?@#48!5?C_O?g?cO@CRKO?K#93??KW#77!4?@?@?@??SBGD#98!11?I??C!7?O#114!8?A@?_G???_??O!6?O_#131!30?@#101!6?GO?O$#192!58?O??_H?C?Q?@gC`??H!4?_?O_!5?G!4?G!7?A???@!5?C#237!121?I_???dA??G??@gQ?S_?CO@OA?O_HQC???@!6?_???G???_!6?AG?O!5?G?O#101!23?E?A#59!12?_C#112???_#121!8?E!4?O??OG!4?C_OFHG?sWK@wIaQS@TCTGC?DbAGcjhdWGqtj|Z|z^NN~n~~~mn_x?IAJII?A?A?A#69!19?O#107C#103!54?_#77!19?@!9?A#119!4?wG???_!9?_#72!40?_?C$#196!82?G??@?Q?P??`O?GEG@?EGCQCAiPA?JQm[bKtLSiHsQgvkVQn`MjpmJpMv\IrmQlTiTtIp]D~B}@}B]TtiGvdYcjWfYgVcZqhUhUlXcZcYdYcZeXdYd[bUXExeShqlShfYTalQuHSnSxFwDwDtA{B_R?OCGODA?@_??HS?@?@??A@?A@WEGO?KoLOHOI?ACOnY_H?CbM_\_UCpAWdOeGbWU?S_IdGTES_[fIDN_Dyl?`fZ@#54!33?G!7?_???A??@??S`I?a!4?Cg?I!8?_#118!26?O?O??OK?O??o?OPOC???O?G??G??O???_#100!75?GCEaa?G#102!10?_O#121?O!6?oo$#81!358?oCESM???GCKG!5?O]B_?@?__AiP@jI?CRHCAIDPG!4?A#132!13?G#115O??O??O?G?KOC_CA__OGiCSi?CGGg__OGGG??@#251!72?D???C#112!15?CG@???OCG$#49!359?G#132???A-#237xOCbXcRGePGC`?S?OI`OCgAPGC@gA_I@Ga?TAOAPC_HSA`OI@SA@?Og@SHQlGt_TAh?OaTgF_I?SGPiPmPa?dI?I_I_I?I?G?WDQdYcYcQcIcG_I_S?OaCgTGS_G??IS?AOG?_??_??_??O#105???gOcGO_CGOgC?oC#193!37?c???@_P?`O@GAOChQCQ@GaDGRcHC`IT_OI_KOl?IoMP?S`Q?GcZcGCO?DOH??IT@Qe?Q?e???_?@GcOIOCAHSAGO?G?OGA@O?_!8?@iO?c!7?cv@#59__A_??C#102B#118O_OO_X!4?GAAAC@@?_OG??A?A?O?G??_!6?@!4?O?G#73???G?A@??_`POOWKKeAbtG]KgRbGBP_hSSciEMAG@!7?@@@#114!6?WEdkeO]OGApIcWa`_`OGLKET@A_#101??A@AO@yDqlcGSk?OIC#120!10?CA#101OG#95@?@#100?_o??GE@ecEF@@!5?K???@@HCQYGGC???@#98?CA#118OA??CCBA???@BB???@!4?OBdC#107@#101_Dac!9?O?_#98?@AC#113!8?GOG_G#101{m{SmYkv$#246AhOCaHCRGepISj@idOMgRTgcRgQDWDOu@Si?k`KaXUahSMdsyj[UfdS}jucQRINiwU^nLGRO\tQbdm?C?GOO?OdODODOdODQ`A_G??@?@G@O@A@O?@??G???_@???O_?_??A#137!18?CHO_C?QgCHQgAhQChQlQlqLqkRkRkRkRkRkRkRkRkRkRkRGQc~?MOM`KAKPcHQ?dG?S`GQ_CO#105??O#184?GA?@??g?@?APC?AC?ACJ?QcW_CG???IT?Ac@c?e?qC`Og?@Q?PGACO@cP?O?OGu@SHqGeHWCydApI!4?gdVyc#105B#96?BG#150_#0A#72A@#114@o!7?A_@?NF!9?_!5?CB?A??G#121!10?C?@DDFE`?C?aGOBS?ed_OPW@GAt_QDkSfkm^EJ?POwPlR}n~v~n~}]AAbaB`#102!7?c_cSKK?G?GMFCBQ?@Gg[\]}NG__GG#53???A??G#48A?@??S?AOCHC?H_?@#134!9?o?oGO?G_!5?A@?VDICA?hC@E@BADAWSj#119?G?@G??K!7?A#128_#119!9?o#103?Ai\AkOA#113CY`O??_#99?@A?O#77!15?O?_O_OG$#218CAG?C#240Q__PGEpISiTIdOFgATIcRkQdYdGuHTiPMpKaHSAhOI@#202C?@?OG@#192???H?c?O?@?_?O?C_A?CG!5?C?D#196?d?`?C?`O?A@O_I_?@?_G@O?ADW`[?OISiT_BgLqMhO_USbSyUdxUdxUd{jRkRCBGRAAgBaD_RHAhQ|EgZSdQlQLqLRkRkRkRkRkRkRkRkRkRkRkvHZ?~oN_]QlqeXehUGrliUTgVgJuzMta\isLoFOmoL_iShY_[`O??@A@Q_I_?_?_G?W?H?X??GADgQ@IcdOxCaXCbmDjA?sGe@SHqDqDGtIcSjmY@Y_DWc{O#202?G#14C#48C#119_S??o!8?w???WC?q?ACA@?TG_S_!4?GA?@!6?A@ABCAOOHSAGSWfISGA@?BA??O#132!9?O??O?_GC?_Oc?O#126?G?O#81?@!4?@#103!11?G???S?CO?GAC@Q_OA_???_cOGC#98!6?Q?@OIC@GtCjRCXKcX_WHFC?ypSH~Nv@EHA#103??Og]kY!8?_!4?_?_oOE??WA@!6?AA@#73C??C??g?GA#77!6?O#251O#100?HRmTzd]n~oNgSGsHyT~y|~^~~unv^vB@@B@@@$#244?CbW??GC#252!42?_G?A#184!10?C!4?a?G!4?O?PiPa?_I?I?I_I?I?G?G?ODQcYCAcAcG_??A_C_???GS?O???DI?@G#192!98?C?Q@?AOC???h??H_!5?@I_?CAt???O??H?H?HQCDQC!5?_!5?C@_C@!4?C@??A???G!4?@?Q?G??OA#37???G#77O#115CIJxGwiLKh\C}F?GrcH_HqkyTItIuTjH!6?C?GCO?@g?C?_#81??A???CB`!4?AgGGC_a@gSGA@`Q?G#119!6?BA@@#118!11?_O!5?X[COG!5?B!8?O#101_#77?_!7?OPIT_sDg#99!8?_O_AWC__A_QCR_EoizCMJE???G#101??HoGMU`RC\aOgO_YcO?_?o?gSGc_B?c@#121cGOHh_SCKaaK[?AAONDh~N#102!4?K#108??O?@g#134!5?N?VItIc@i?DA?_??@#72!6?AG?CA$#193!51?_G?A!19?`?A?C???G?O?OCO@OC?dOcA@??G??@??G@O?A?@A`C!5?A?@oA?@G_C@DGQCHQCHQ@CgRkRkRchSBSHQHCAoCD?OD_AG#237!61?@!6?@???A??C?A???Q_CG!4?T??_!11?O??@??@?_??_??A!9?C?G?Q!4?C!9?G?U#128O#133G#81G#69?CA#103@?C!4?A#69??oOC@OD?CO@GCA_@G?O{gKP@sQ}FJD^aU{gw[gw__o?Po!6?C?A#125!4?C!8?O!4?_G#119!15?kSSWsIa`?`OAPA@??@??@#107!9?@#72!9?BA?QLOZdbOncPiBG`?GQ_R?AGC_?OC!8?o?O@O_???`?KB?IT?GEOHC@U?HAH?gO@#107c!6?@#114@!6?@!7?oI@}@$#239!74?G!7?DI!10?_?C#192C!6?O!5?C??G??@OA!4?C!7?_#239!100?A!11?@#246O?cH???@Q`O??_ICG?QcO?CgQG??_Gc?A??AG!8?Ga???O?_@???C!9?AG@#140!4?@#121O#107??CAC@AbE#121!5?_??_G?G#59!11?F@_o?G?ooi_[??O#114!8?_#115!46?_GCG?C?bGAPGH?A_o?`Qa@OO?GC?A??A_@#251!53?_O_?_?_O???_??O#126!8?WO@_AOG?_??_#115?@?@!5?_KOI$#239!109?O?C??I@?@?A??A?@C??@G???@GA?GA?GA?C!111?CI!4?@!6?@???AC!4?G!4?AG?O?c@???GA!8?O@?O@C!9?@#112!8?O!11?O#54!14?O?C?@!7?@A@?A??G?I??GCOdG!5?@#69!34?G???S?A!7?@!5?@???G#98!71?A#127!14?a?A#125O?__?GW??_Sc?_o$#153!312?@#121!41?_C#59!84?A???C!4?_?O_!4?@??C#141!73?C#116eO#132???WOO?O_WGWEO?S$#81!355?AA@#102!183?@#112C!8?A-#237~?~?~?~@|A|@YdY`CAOCH?QGd?OGcAOHc_OH_OH_?GS@_I?S?HCQ`OI?tATIPkAtAG@GuHQhU_UhCYcHOeG@QcXeGeGUGUGQGQCY?ISgOACQ?EoDoC?SGO?AGQ#137!24?O?g?QGqCxAS@I@gh?pOI_AO??GCo?i?@c@OHAPGB?bGf??@?bGBKaCXfWfWfWfWfWfWfWfGQHQcHaT?_S?g???_??_??_#239?@??@!6?_?@?SG?Q???C!4?A_!4?G?GC?@O?GAOC???_G!5?G!4?O??@??@C??iSd??O?@#1A#119_?C!4?C?GE@?@cQ@O?O_PcA_GCOICT?I?c?E!7?@!4?C?@?AGC??CA?@O@C?CDGDYPM_?Ly@?A?_`_!11?pWOw[GKCCcSKU@K@@`w__c?G_??CC???_#107!8?C#101!7?ACPi?ZuHqOgO_G#48C?G?S@C!4?A?OC#100!5?@???@CAA#103?WOq___?U[Qkit}TsismvmC]?@#132_G!4?`@[a?Cr?_???C#115_#114?o?O#103?sg\WtMxyxppNQsycYCi?_???CGO??_?_OcX?tGqLylJEX$#246?~?~?~?}A|A}@YdYxljQUldQYldRXleQXKeoN_uH|biUTtiISqhC]dt^I|gteR\G|v]RHsdUhLhUZ_BcBPdYcH?O?O@_@_@?@?@?`?@A@G`G`G???p?a?A!4?c#105!33?g?s?U?AKAdOHcJsBOJCPUGQIcaS_AsGS?O?Si[?S_O#193!18?PC_G@CO?dI?l?JsJSb[BTITb[aOIOgSBK`I`A@Ad??c!4?c?K?CI?A??O?@?C!4?C#237??H!4?Q!6?C!9?_@!7?A#24_#69@@!9?A?AHCQC!4?@GC_GCogITtIQlWE_@oCIAa`WOIBCADsRHMX?LcmhOgGGWOW???WKo#81?GC_O???_#69!11?_??_O?G?G_O?Q?IA?@???_?G_!7?_#77!15?CAIPmc?o?_#99@DAC_RcOAGaGPMA?pKA?A?@#77???O_?O_W?E??ACOI#134??@!5?@#251?@???@#121?W?CoWD__E???ea?@?_oo?GM@@#108!5?fGoC?CI?_@G#100CACIDJBnNFXvJ^F@ABmZc@#77??C_??COe$#244!12?c??C!4?_#252!5?AC!7?C?C?CA#244???G??@#192!10?A?G?_A???_?AG??Q!4?GOcG???A?@_!5?C??cG?C?_C?OA?CO@I!8?O@??@G#96!33?_??O?G??O???C??G??c??G??G#105!42?@?A#184!11?AO_?gOIC@K@M_?`AGdQK_?C?K?CI?M?IOHPiDIAO@LgPLQk@_YcZ?aShCjCiOcA@^eP!5?A@_#203?_#35W#40C#118A?EFFFBNFG?Q_Q_G?QJLI?OPO?G?@#59!6?_?CI?@_??G?C?_WOO!4?_?O#73!6?@!6?@!4?WDjFEJDrBqM@fIBCB?E@#115???_?O???@?POgAAGH@G_AGg?ACC_AQO???_??_aO#72!9?@?HCLBSiT_Y_?_?_GpMol_KaHA{BwPi?C@CA?@!8?@A?@??@?A!4?@#125??_?A!4?@W[bOX@??WX@DAB#107??_GeI@a#101?A@ADACMOkB@P__Oo[Ooo_??_o[{[???]IvHQDA?H$#202!16?A?Ch?Q?d?QG_AOHcAPGAOH?O?S@gA?T_B?Qh?I?_#252!10?_#202C#184!8?_C!4?A?@OcGEGEGU?QGQ?A?Q?GO!7?_C?CGOG?C?G!5?_#150!34?C???C!4?_!7?O!4?C#192!57?D??@?_??O??SG?QG@ODiOAPAp?P_T_C?C??O?gAO?A???OC@???G!4?O??H?_?G#208!7?s?Q#217O#83C#59Y#39_#115@@!6?@?D??@?`??QcYdIEAAD?_A?dGQ@W@_GQCD?Q`gT?BCaHcQOEG?XO?_O?O??_??_?O#132!7?G???_?_O?@#81!4?@#112!8?G#118a__aCC[!4?@!4?I?A!4?_#53!21?A#98?GA?GR@KRNhUPE_@OLA@oL?CA??A???@#108?_??C!5?g_???G?G???OG?W#119?C!5?A#73G?A?K???o!4?GC#112??O?W@U#113!13?G?P?C???GA?c?GA@?@?A#108_!6?O_$#240!17?O!4?G#244!10?A#240@??A?A!8?gC#193!27?@?A??Oc!6?O@_?_@c@O@Gt?@E_W@G`G???G@?dGhDcGZkRuZcZcZeWfYcZeWfXeXeHilFVhdDHAl@U@U@AH?dOH_JsJ?HCPCHQ@cBOhAPGU?UGvJSAS_S_OO#237!45?A!4?C?G_??@?G?O!9?G#193!23?aO@?A?_?CA??AGS?@#153???G#240?G#96@#81?[#121wOg_gwo_o{g[?GcIhC!6?O_???_?O@!6?G!14?@?@?A?EK@FAAFADE@EBADubWCWOOWK[LPgWs{z{M?mFBfRrjRB@?K!5?CC?!5C#100!31?C#101!15?O???o@wCmS|j]yg\C~@BDLZNT?@kOSA?AGPI@??A@A#128_???A???_???O?G???A@?@#251!20?@#102!24?O_$#239!78?O?G!5?A?@!6?c??_!13?II@?@?c#246!129?Q!4?A??c??A??@G_?G?C???B_A?O_C!5?_??A!4?c@?AO??@C?OC?O!6?wAE?C#112???AGOGO??O!8?C_!6?_??O?G#102!7?C#81!18?A!4?AA#54!6?G#125!11?CA!4?E#81!17?G#114??_O?CROIQP?A@_WgICCCFoaPA`?@?e`???@O#102!42?_gGO??_#100???A@!4?C#102???O#98??@#118M@?`gWC#140!5?GCA??C#126G#118OOoMMd@$#196!84?G???O@_??H???G?c??A?gD?cQ?EO@?q?e?ROa?RcQcHCZcZcXfWdZcXfWeXeXuDQOgCQGqCOAg?G?S_A??AC???Oa?a?_?G??C?C_?`G`?G_?`GBGBLjeWfWfWfWfWfWfWfWehUdYqLiYTiQTsJsJ[b[itI[_LIsFC`W_Q?OSG?O???`IPiPAp?P_P_T_E_Oi?hFs_BgQcRKRcHcZS@CiOhCJQgW_?gViTiYDG@l#126!5?_#73?O#114!19?@@@?A!7?`YOF_Pw[CEB_W_gG??__?o_!5?o___?__O?_#103!40?AO?A?P?O??_AO@?ITG@?_?O@?A?@O?@CCO#107!52?_!6?__???@#115?OCA#142!7?C#49@?G#119?_!4?A$#102!437?@??@`PPXHGG??a[]^YLG]|}}mhw_#112!64?OG#116AE!9?G?A?A$#107!437?O#59?Q!8?DGC!8?@#126!70?O!4?O#52!8?CE$#129!531?C#127??@!4?@-#237~?~?~?~?~?~?vGrM_@cX?C@cAg@SAg@CQ?gGcAH_S@I_S@GdOAHcOGDAoHAPi?HA?`OHU`Y@m?Z?lA|?PACHQDQ?tGtGTgSGSGpE?DAG`?g?_?_?GC?AgS_O#105!5?O#137!15?_?OcHSaShUhE@??CAh?S?a??A?OB_TC?Q_CQ@G?_G@_G?bG?G_??_??@??@A@EHUhUhUhUhUhUhCHQdOIcHQ?hA?i@?GQ_?@??A#192@?_CQ?c???O@S???C@Sa?Q?d?h?Pe?AgOC?O?C@!5?C??_@??_??OC???A??_#208!12?b#240Z#2O#81G!4?C???C#112??_GOG?S_OA@A?G!4?c#114??G?C?@oC??_P?GE`@aTGSCEB_CACAB??A@?@cBXHDpHOo_?!4O?kOGsWguOWoOO__oOG_?_OG__a??_??_OOWWWMGLEcCEwi?DGQgebQXP?DCCCGA#72!7?IDQ`JeWsJ?haKRLgeSrWMhTZah?C#103??_kWsWsjSJg@?@FBBB@??@@A@?G#125?OMgOsqWG__`@??AA#107???_wwWsMS@!5?`#111!6?_#101!5?B?@FG@?GOoGx?@@!5?BGA#107??_#102HA$#246?~?~?~?~?~?~?vKp]mHezYMHtUihTUyhlVTpX{UJisTJisRGlsUHnqYLFukeTxulNIbqhMcu@l?vAW?iEwB_GoHeGA?A?A@a@???_O_CQCBSI@ICB?_???AC@A#105!20?G!9?OgUhQGSAhITCxcDgSGag@kBGhSaRMOQEPKOCrC@ITITiSiSgSgO_#193!12?H_C?h?Q?cIOcGDOjCGQLoLQkQGQ?h?QHQcI_G@U_I_G?Hc?G?AG???G@??@??_?O??Q??@???OA?C@??_G!4?A???GQA#16!8?C#128_??_#73g?O#135??A#118!5?ca?C!4?O@?W?@??G#59!4?O!4?@??OG?C@?_?G?OD@COC?A???@IP_A!8?_#81???@#73B??@#69!6?DG?C@??AG?A?@?G?HCOAC@A?@!6?O?@#102?GOEKOGG?eeqyx`ppxZ~YQO#53!4?G#98??@A?SZ??p?Q?H?C@OA_#77??CO?iCG@A#108A!6?C#112?O!4?O@L?o??QDO@#132_T??CA?C@O?O??@#103!5?CAI_JKzmn{v]h^~Vn|J}j^j}W~}or{zsLAtAV]S}Y|^~sr|zzRqx$#244!12?G#202???@?A?C@?AG@SAg@CA?g?CA@_S@I_S@IcQ?H_Q?D??G?OG!4?_OGC#192?O@G?Q???@!4?GA!5?_?S_?G??c?@CAG@?G!5?O!4?@!7?@?_!9?C#150!17?_O?@!4?GO?G!13?C??C?A@#184!55?Q?@???QGBC???@U`W?HS?d?I?S_GWdCAhQc`AOiDYdCPitMWePCHaGaXeHgSYDIvlP!5?d?K#35??B#49O}#121B?A?ITjPlxNvnR\jQHoi[cCkBdKO!4?o?C#102??C?A_o_?E??_OgOWKWgHgw{[{{}]CGC_O!8?__!9?_??_#103!19?A!5?O??@!4?OaG@?AO?G?GD??G?E?c?dl_@#48!8?@???O#100!7?_!6?@#102!4?OcHcJSbOBOB???C#119_?G???__#128???_O?kG?_S#115???C!5?O?E??C#114@#108?_O?OOB??U_?gOAS@S_S@c??GC???_???g?_@_?_?G???CGC$#252!17?O???_O!8?O??A#193A#240!12?A#252!5?_O!5?C?O?C#239!6?O!6?@??OC!7?_!5?A??G!11?oRGD?@#96!37?C?_?C?_??A?OA?O??Q??Q?G?_?@_G?_#246!55?C???@!7?aG??A@??H?O?SAK??O?C?G@IOgCO_GQ_!5?GAOC@???O?`CO?GQc!5?W]o#83??G#54@#132@C[SWcgOg#115!8?HAGS_?a@_?A?YDASAj_BwgSOIDC`OoCAE?b?_?QoB@?@?@?_??GC?yGu??SG??GGS?CsGCQGAAIACY?IcPKQGDQGO?q?OcGOi@a?a@QoGBhWED?_O`D?O@!6?G#100!17?_#99_CLAK?D?A#115!19?G?CG?kG_OC!6?C__#126?G#116@!5?_#126???O??G#102!7?_?O?_#100!23?A?BADAC?_A?@#77!4?C?C?C?C$#192!18?O???_#193O#192!31?_??@#184??A#193??O?C!7?c?O??Cg?_?_G?G??A???A?a@CgP_OoCRSBTYSB??@o?AGHewVhUhUnWfWfWfWfWb[bsZOJGQaXHA@O_CHA?SAh?T?aCPaCgAGPc@S`CaPGPaGPCOCrCPMtGTaSiCiSGSgO_#237!37?@#239?C??C@??A!7?S!11?AgO!5?@?@???C??c@!5?OC??C???`???G?ATa#97!5?_#69C#125?g??_#119!13?cC??AOA?W?@_O@g?SGCA@_C?I!4?O#101!12?_#107!4?O#119!7?F?B?K@EAGO!6?@CDGADA?IeODVG`SKTDuAJDG?_D??__AoO?@??C?_#101???C!5?A!8?ISjSidYSGdI??Q??__QOhGE`SIc\QmzTzVA@?B#107???COa{A?KG!4?ACL?@O#73!6?GC?W???@A??@#113!34?C??G!4?G?CA$#184!75?G?cAO?@?ODACO?TG@GS?S?OIO!5?_?_?_???GAGS_O?O!5?G#237!128?@O!6?A??_?Od!4?c???A??C???OI!10?@??G??C!4?_G!6?c#119?A#127?O#143@?@?AC?QAO#69!7?@?@H?OCAoIDasBH?AG@QHGC?B??G?G@@?@!8?@!7?C?A?GFGA?G?C_#59!45?OA!5?_??G??O??C#111!45?_#118!4?oO_WMCA?IOYK?FA??A@@@??KC???oO??gHDA@?@$#196!81?C!4?_@A???A@_@G???AGDAG??G?C@gC_S?AGDaGDgUgE@OfWfWfWfWb[b[JCfcRcHCaSgEHQ??h??OA??H??G@?D?AG?G???C??C??_AG?GaO?a?G@?P@A`A@EHUhUhUhUhUhUqUhYEtHuHtEXvOmSrdLqMqlPk`Ky?}H_cW`[b[_G?Ca?a?Y?t?@A@A?O@A?ISHC?i??hI??PAGcXaWeHAOePA`GO??Ad\ti\A`B[#126!5?A@A@!4?C#107!28?A#103!4?OG!6?_?A!6?A???_AO?a?C?_??_???_??_??_???_??_#77!40?C!5?AA!6?DiS`O?C_O???C#121!37?_oo{!5?gC?A@A??BBQIiG\DKcJF?A$#77!365?A#118G??A!23?G?O!6?G??AC?K???@?W!4?_?_?AB???G?o?CK?eD?D??GA_??@!4?@#114!66?A!6?A#112!13?a??_GcOO!6?AC@??G$#121!395?DBE@@??BBA@@@?@!4?@C@?@???C???G?@??@#119!107?C_??Q!4?@$#132!400?A-#237~?~?~?~?~_nOLa\qCGaA@?h?_WC@GaWDOAGgC?PCAg@cQG@c?I@S?`G@SAH?C?`?@Qg@ISJODgFgR_EgTgDgTgFg?cA\a[`GO@O_@[?HCPeOcO?Cg@OC_I_A_@#105???G#137!13?gACHU_DI_??_c?A?Ga`SCaF?iAP?gCP?KE@CCaS@?GC@GC@?O?C?OAO?@?P?PCO?@O@?@UHUhUhUhCxAS`IS`IdGPiChAHAS?hAC#184???c?Q?C???O_PG@A`Q_@cApC?cAC@U?AGDJEDJsC`CEH??IC\AGOdQHOcA\AHQ_HCLA!4?_G#105O???@#49_!4?A#112?_??A_GF!8?@??C??@??_AO#102O!6?O?C?_sQMVHVvbZJN?NMKCJNv|KL^^MEAACFAEBBBAAB??!4@BFV{A??@_BGWqg#118!5?CO?_AMcQ\sYP?o_O_?@_A!4?O__???OO#107???_O_#77??@A?aBGeOkO???_?oO?gCOg??OoG?`AK`S#107??O??sWlUP#121?EAEKMFzUvwO}K?NG???_!4?ABLBDD#103?e?_OK]JmTG`M~MnDbHKpD??cY@TGrPIVjeDzFnNk||NV|RaPDnRNDrVdZ$#246?~?~?~?~?^?nOLaLzt\keRQnD`yuTLayltRPxmiXTUyHduYHtsijVQrihsUZhKUrmdV}t`sm_ToTGVwR?UOR?QOCI?W_OASRCQcGOA_O?G?G@?_?@K!9?_#105!21?O??ITI@GsDqCGAXOGoD?kEPAkAP_WQH?I_VaPIaPiCj?z?hChEwEgEgAhEgEgUg?_#192!36?_?H?A?C?_CG@I?H?I_AG@AG@?CA???O??GA?O?Gd!4?_A?_?A!4?_?C_Q?_???O???_#183A#217?O#37K#121K???_oSzSlUVGD???@?A@AG??@???AOs#114??oSoS?q@Ca??I?@#77?_??G?__S__bXc!4?_?_?OgS@GCGCC?C??_CaKqK!5?O???O#119!14?@H??@??DA?@A!4?@!4?O#101!16?`OKRHdQKdYcXqKItEhiU?}`MpfM|r]`#115!4?G??OgAR!9?AG??D#125_Of_PNTa??dWO#118_GwYHA#102?_O_?O??AO?_?OO??A??Q@!5?C!4?O?O?O???O_??G#115_O?_oICgA$#240!10?O??O#202???A?@?_???C@GAOD?AG!4?CaG@CAG@CAG@S?_??SAH?C?`???G#192???I?@GA??_???_???_C?P?A??G@?_???@c?@CA??A???A??a!4?P?C!5?C#96!23?OA?G?@O?a!4?P??C@??A???AO@??C??C??O?C#246!64?A!5?CO???H?SgC_Y_PgO_G?A@?G@CA??Q_OT?G?S_HO_OCHQ?HAC!5?F?L#218??G#38O#81b!5?G#126C@O#119?_?o???A@??C?A?CA?_[!8?G?G#101!5?C!8?OIOPOAO???_O_?ogSgQ_W?W?k?KsGyKqC_?__?O?O#69!19?H??@!8?@#102?CA?D?G?@?GD??POYn\F{YcWC__#72?A@AYdYELBdIPQD@^?M@EW#102O!4?@gaK`IdA@#118kkxpxpOO!4?@??A#127?a!7?_?_#112A[??dOL#111??_?C#108??BC@?@O?GCB?Gyd??sGaCIdGCPiCgO_Q?A_GAGDC#111I$#244!12?a#252!6?OGC?OI???_!5?CA?P#240!5?O#218???O#252!4?GC!4?_?Q?GCO#239!7?Q#184?GA???CG@gCG@G?_?dAC_G?G!5?G?@_P?OC?GO?@OCO#150!35?@!7?O!4?G!4?_?_?_???G#237!75?@O_O??O?O???@A!4?A?@?S?O!13?@!4?A!8?G??C!6?A#56@#119O#125GrLLA#73@?A#115!9?O`AgQS@yco]??G_JM`FGfLCoOVN?@?G???CC!9?GA@#59A??@#114?@@G??@!7?@!9?c@_RGDEH@YAtTGjfJH[OAcAGciOLIcLeUOKiHCaGACQkDA_HKi@!8?O#98!4?@??@!9?_#100@#103!8?I}VLrU@#111A#112!5?C?A??Ch?Ca??G#128?@G???GP_@W#126C??AA#112!17?C#111?oCA??Y@?A?G!4?G#101!5?@A#114!4?_??_O??o??Oc$#193!20?O?C??A#244!8?_!5?_!5?_?A#192!4?G#193C!4?_?Q?G!12?CG@???A!5?CO!5?CBKICA?Q_OAG@IHDP?OG_Q?O?[QgVGvIxB{b[b[b{bslROo_?XiONtI@IsGqDGAh?H_D?gAPAgAT?GAH?G_U_PIs@iOjCz?nChEoEgEgAhEoEgU_Eg?_!5?I?_AG_AG?Q?CO@CO_T?hQcHs@IPcHQ@SAcGPiPK?A?C?AC?@C?_O?GcP??_G???_?_?Q??OG?C??O???O??H!6?H_Q__!5?O#240C#63A#128?vKA#118!4?_???oI~~~{m[{O_HO!5?@!4?A?A#72!8?G#122!4?G!4?@#108???_#72!12?_O_o_OOwOGS?O???_#107OGAK!6?_?O_#59!27?H?A!6?A#134!17?_#119!35?G??`_???@C@B#73_???XM!4?A#107!4?_???_^F@@O?gSW!4?i?q?GoDG?cI_T?_O_O!12?COI??K??G?G$#192!21?G??O!10?C#193A#196!43?A???A??A?G!4?A??_@OG@C?GC?c?_Q_?_C?HdJkBgVGv?tA{B[b[b[B[JQClJUhE?dO?_S?@???OC??C?IOC?_?O?g?PC_OD?G??_?O?C!4?OAO?H?P?PCO?HO@?HO@UHUhUhUpE\hUThUtGviDyQlUgjUCXqJ}tIZclYjsZdM?cQw?K?y?G?IOPG?_?@G_O?O_?HAWPG_tQ_`AhALAKaLAl?cQCHQ?_OUlTIV?a?he#244_#132!4?_OLA#143?G?H#69!11?D?I?HE@`M@N?@??@!5?G?@#100!32?_#115?@!8?O???@?IKCCA??ECSGIfOG_U@_O??A?Ci?TAOPgI`O?_W_DQK@QgKCA@C??_#143!50?G#126??G???O#116!8?GUG#115!4?O???O?GA?_@A_?_?O$#239!86?_?P@??@???_??A?_?A_!4?AG?EA?J??C!137?C?@??`C?_A??O???C?C?A_??CA_??GD!4?_!9?_?C_O?@?I@G???CH#127!5?O#114!19?_#107_??G!5?C!7?A@!6?A#98!31?_#59!12?G!8?@#132!101?_OOCOE_Oa??C??_$#153!312?o?Q#103!30?O!6?_??G_??_?G_O?_o_Og?O_O?_!5?o??Q!4?@!4?@??G??@?B???GQKG?@_BcQG_o@C??hA_O??S?_???_!6?G?G?CO?sQ?D?H_Q_?@q_C??AWBcXEH?COG#140!57?C@O$#208!313?L?O#59!38?G??O?AH!7?C!4?C#52!160?G-#237~?~?~?~A{agQPGvGQc??h@C?_GS@A_O??HS?aS@HS_CiOD?gCA?HCQ?gDcAW@QG_HcAIpCiTaSJOLQcYDgU_TISIo?hOeO_L?^_V?I?J?T_UgQ?@AcH_I??Q?GA#137!13?AcGCHQ@a?_GA@A?_IA?DOI_cOOR?IA`O?GCaG@T?Y?O?SAG?GCG?c?H?aOAOHOA?Ca??ID??cPC@e@MPmPcHOdItAShAS`SHAOd?Q#184!5?gAOC_G?_?SH_O??A@A`EGCH?@??O?C?D?Wo!5?`a?oIWcI_TQgJScXcRidCY`KO???G?YAk@#203O#63O#48_#115WoG?SAHC?GC!6?`WeIXTpXGmCGUAG?a@?TPGk?aoGG#122??@#101A???[`U@oKagQtaTeHyBCHs?Bg?AHSBmPJsLq@]R?Wg_c_?OO#107!4?@I?A_?A?C!5?GG!5?_!13?O?_???C??_?GCG?K#101@?DG@A`A@CI?B@A@KB?b?BC?@NA@?AC#111???O#118!5?J^fN~{???B#126?S@#127GSh!7?G??@#112IP??@#108!5?@!9?C@CA?CA!4?@!4?@!6?CA???@#114cAPGAOCKQDcaO$#246?~?~?~?|B\BkaRGvlZ|SUyjLTri}SFjxUqj\KiuqJ\xDmyVPj[UqhlUQyHle}dRZqX|SMYPiLhsfqlHdOR`LIo`TCZSeHH@Oa??G_S@S_A?H??c?O!4?P#105!18?O??_?_GOKR?_GSHU@SgQ?dPIDgC_T?KAtAX?U_I_D`I`G`?Q`Q`QHOeOL?l?e?lOHOL_?OiPI?iOGO_#192!34?A!4?A?C_?G!4?O??O?C?h?g???CGCAOC??C??@C??C!4?A?C??_!7?Qd?OA#217?_#83G#59@#119aG#118okapoXuAzV^Fb~}A`X_AGA_?PZt!4?C??AC!5?O#77!4?C???_]@kGqKQcITIPqD?@#99!4?CG_#53??C???G#103!4?CCAAI@HLE`bIO_??CgDq?h?AGCO`A?dAGPABO@AOHAG?G?SIG@GOK@c?e?KRAQ_t?WA?AkOKGy_`KGcGA`s?CSgYSU?WuxCJBSjC??O_O#114??Wo#119?B~??K#125??GujOeW_@BAE@GF_#118oA#102?gSAHOaHO??@?IRCgPAc#112???o?W?SgKOG?gOGSG?gO?O#115?O?O?W?A@H_?CQ?HB$#240!10?O??C#252!4?AG?COAG?@?g?CA`??A#218!5?A!5?A#202O`GCQ?hC?A?@?G_?CA?`#192?_C?OA?G??Q?_C?O??I_!4?OAC???@!13?C?O?C?AG?a?G#96!26?_G??@?G??O?A?G??O?G?a?@O?G!8?C!7?O??G!4?a!6?C#239!48?A?C!6?O??O???g?G???CGC?AC?I!4?C!6?CAGD??`GOdI!8?@#97C#72[#69C#125@@#114OGCA_Gs?g!4?@[A?T_?CAO!4?C??@???ieR{?C?O#100???@#59!7?A#72!6?_???{iQJtSRd[ahWPms?OG[__#102G?COQQQ_I[sl^}pr#118??G?O?hA@KA??O_CG?CGCCgog_AUb?_Ca?CA?O_?G#59!4?O?O#77??ADQlQdCHCBCADKQ?A?aC@BG?D#108???O#121!16?~Zo~j#132u@!9?CD?Q#103?_T?AlubDOac???_CzDiOGpCw@WaS@C_GOhQgOJDHVhPHPnQmYdmPkaO@_G@#107C$#244!10?C@G_#202!5?`???_?C???O!6?@#252!13?@!4?@?O!4?C#193C!5?@#184!10?I?GA_D??G_?H?_??H?S?A?A?H?S?Q???@?A?_#150!38?_!9?_?CA@!7?C?A!8?A#237!70?@Q?DG?@!4?S?D?O_GO???`O?_?PCG???H?C!4?_!8?O!8?@#77A#81@#112C#121EB@!4?@???_#107!4?C???_?C!6?@#59!8?@#107?GC??@??{#98!18?Oc?Ig?Q@SA_!9?_#114C??G#59??H!9?A#102!35?AA@??GCHFIbe|wo???O?QOooWo_??{WGO??_?_GEx?[AOgRKAC#112!9?c#128!6?EX_T?_sg??g#107??CiU_??GGCKOZE~T!5?OIpEIdDIgRAFeEDEb_qu?EI_k?K$#218!12?C#193!6?A???OA!4?G?C#244G??_?@G!5?@?g???_#192!7?O#193!29?@CA!5?O???G`O?S?A?@CGQ_H?UOch@k@S`VgVkP~~~nv~zHPrQoKSLRCrKsHS@sGQ?DOI@aC_T?GAg?S?T_I_D_GdG`SRkQ`SHOeOl?lOe?lOl?KqLoITI?iOIOgO_??I?CO??S@?S@GAOcHQcGRcZ?dQGdQGcPGcHuGdGP?Q??H??C_?H?a!4?D?C?@?O??@I?_A???_??_?O_@??I?C?@I?LjCO!5?A#132??A#107???GC#103A@#119???_W[#103!6?CAG?b???g?qG!8?PB_cIU}?AAGB?gQD@PCG?G?GC#77!16?BaDa@GR_PD?C_#115?C?@A??C?TGDSAhCOgAOdQGDQaSGeOhE?DQP`G_Da?DBOWHGWF@_o#108!19?O#114?G!5?_?O#116!31?DGI[?O_OO#115??G?@???CO_?JcG??g?AChA#118!6?_??O_?O!8?_???_!4?cOCJqH_YOk$#192!28?@#240!4?C??O??C_?AO???C#196!40?A!5?WaC_I_S?K_A_H_CgRcGQcH@IOcRShUgVgRm???OG?CcICHE@a?_GCPA_A??`CGa?C?G@GA_T?@?_?G?C?Q?Q?SAGc@?GAc?H?A?A?@OA?AO@?QD_?_PC@c@E@MPmPujItIhiUhiUheXeGZdkZc~YDtIhVRmTZa?VGvg\gsKoQpaISaCH?Q?Q_A@IoAhEGOC@C@?O@I?T?HA?G?O?P??A?taS`I@_OY#240C#116_#102!26?C!4?wCv!7?AK?BBtg?w@|v!7?@@#134!28?@#114!13?G?O?hCQOdQ`KOdAW`ChO@iO@EODk?SJOPKqG`e?P?oQC@_#72!21?@#53?@#115?_!8?_@C@?A_GaS_#140!15?AAs?G?O#142_#111!6?GO???A!8?O!4?G@???@A???@???C#102!6?CA?@?@$#239!93?CA!5?@?_??G???@?G!6?C#246!143?_A?CiCj?j?Q?ADA`Ap?G?GP??_Q`Y?_AOaH?O??OI?U_!6?_G@_A#121!29?_!6?oc#59!139?G#107?_!4?_?g?AkpLRL_#73!20?@#121@?A??D#118!12?o$#105!312?C??C#244G#119!30?A!4?GMHg?P#126!176?A??K$#153!313?C#112!34?@#69@??O?Q$#191!313?@-#237~?~?~?~?{QdYdYdY`SHSGc?J_AK@aPOGbSHQcHQdGTaSHQdGCPCA?gAOD??QGd?WdItAtIPiSbYDgUk@sATGRK@iOiUHe?e?R_Qc?JSHu?jOdAHAgAC!5?@C?@#137!10?g?O?gC?C_CQG?WCrOIGcQ@PGi_??A@P@cCAOHCc?O??`?GC@??_K_ICH???ICgA??O_?O???c?Q_IPcOcHQlOdIOdY`IcHQcHaPC_I?d?G#105Pa#184?O??ShAc?DA?CHO?GO@_A?G?GCh?DA?G@GAK_GOgPaPA@?As?^?l?QgTqLOIOd?S?C???IGC#204_C#114OH!4?A@?K??F#69!4?O#114!8?@G???Q!4?oOwsA?doE`X?A#101G???oChS?AGskJqKrMPhqUBCB?OGSGcq`i@xCyCyU`UHUGE?A#115?O?G?CK?AJ?AF`qgOEWOOPpGOAGGCoCAOc@OI_GCPGF?cQ@ohDO?IKQsIaWOI?gO?_??[GcA?kEA?CAAD@?OC??I?OGASUCIE@??@#119_}~#121~jhUDo???_!9?CGO#115A???QoXAHFO?`GO!4?P?G#119!6?_Gs?O#115!18?@C?@CG@#119?o$#246?~?~?~?|BlQdYdYd]juavX{SNdq]Kebp[julZulYvi\julYvxmX[UTliyVLcQYnbYOIlGteThKcyR?@qAkGrcQoCLP?sPlXTkZCHQc?a?HOCGOcO#105!22?@AC?@QhQH??dI`H?C`PAGkaCPCJsGcICQhODaOHbCjOKQ`QgUHQ@??_?Ql?_?@OcI@IC@cHQ?H?C???A#192!30?A!5?G?O?_??A_?A?G??_A??A?OA?AO?O@?@C?C??Gc?A!4?g?AG???_?O!6?_#153?@@#240OB#35A#69O#119E?PG??_@?__o{{]Kmb?E_?_?_!6?_??CI??GCAG#103G??\Pc_xPK@?iSD_A#98!7?C?@_W?C@_?_Q?K??CA?@#102???@?__owkLFrqqaq`?oO?W!7?C#119!13?A?OG?A#102!15?@?@C@??ACAR}BAA?G!5?@@???@?@A???CB#114!7?OHC#126!5?AhY?o?OO!9?A#118BC{!6?O_WfWA_!9?Y?HWcX_IWdO_W_IOc?_?IDgSqHgS_PcypUi~N$#239!7?A#244??G#193!8?@!5?O!5?C#202!16?A?A@_A?D???Hc?OC#193!13?@!4?_??_!7?O?G?CH?G!4?O???G?_OS`iTgiSsAhmOnOnOn~}vjETJlQhQHQhdQc??C`OAGCQCP?I_?cA?Q?ODAOHOC_OGQdQGUHSHOPtQsHQlOROlYdITJcZuHZCL?@CAHA!4?G@c??CP?c@GAOcHQcHQGbG?Sh?ShExAtAhEHSGC?GOD_QDG?@Sg???C?c@??c??A???AO!11?A!9?G@O#105?_#17?_#40_#77A#121h?_owO!6?B@_??[?O#103!5?B???C@#69?_???B??G#107!7?@AE#72_!9?OLRKogAH_[aKrkRgVHKQTUAhDyDG[GC?A#114!4?_??G??KO?DG?E@CGoAKbGEo@gOaOMPgDQGd?C@OgAoM@gCDQ?M_T_L?sC?__Q?i?G??_?Gs?O@gE_?COG#121??_OG#111???C#73!15?S??G?_G??_#116?AThAYQ#141O#112CG!6?_??_GFO!7?OaC`C_AQCB?bGAD?T_HODYC_O?@$#192!19?G??A!5?@?G#252!19?_?H?O??gQ?@#184!16?GQ?G?AC??G?a?gAG??_??_???GO?_?`A@???_A?_??_#150!27?A??G??@!6?SAOG?G??_???A?ICA!5?_??A#237!70?@O?@!6?C_?@?DO@G?GaG?GOgPAP!6?G???O??O!7?A@?A#208??O#244?G#49G#101C#112OO???_!7?A?_O#102!13?A@???_!8?__kQ[?MBA??gW#108?@#99!12?oGA?B!5?G#103!8?_?OGCPqGK@DH@Ok?iT_WKPEGcA?e?E_?eCa??@g@S?d@C`Cd?_O@oGCW?I?B_I?WAM@LP@|?@K?cR@jAO@@A?@??aM?@@o[J?D??A???A#132!9?_FC[e?oO!7?@o#107B@j]{kGCKC??_GDIsgWsmKPG?YU@G?C@CADYeGSaIw?x?IAg?O??G?A$#252!21?A@?O??_?GC#193!20?_#192!6?_!6?d?OA?G?AO@?C_?C?P??G@AO?C@??A?A!6?@C?A!6?D?G??A?@?O#96!25?C_???C???GA!4?@??_?A?G?_?O!5?C!4?C#239!73?C?_Q?G???I?CA??A?AO??@?@C!4?Ac?A!4?g?AG???_?O_KokOG_???O#63C#132_#115?A?@!4?G!6?A??U??dHaCSHChHoGE?GC?HpA?D_KA???@#77???wU@B_VGRc?_?@EOCG?@#48???C#100???@!8?@#107!11?C?O?A@??_!8?G?G!7?AO???G!7?OA?G!4?C_O??@?@??_C??C?o!4?S!9?O@ICA@b??OJHHD@#125!13?J@@MILy?gCG?G#119??_#103?S?A?B?_Q!4?QdAD???BCRC@?C@!7?@A@C@ADAD?TAHASBS?O$#202!23?_?G@?O??A#239!47?G@!5?C@#196!11?Qd?a?H?CGOcQKAH?TI?TAIhEOnOnOnO?@GSOg_QC?C_CQG?P?QGAC_O`??_CP?H?Oc?H?G_CA?G@?d?G?`??a?_M?HAc?QDgE?@Oc?oI??c?q_ZsiXcXulQnQsJYdYcZQkRsLIqLPuGvSe\jE|jAOCXAwCxQaehReCGPC_U`OA?OgDo!4?Q?A??GcGsH?H?_?Q?D!4?_D?I?@aHQfS@CIF#96?@#118??kMEDM^qv^WN??@@@?hh^YU\Y_uzU_?O?_??CACpWAPQCA#77!35?_?O???_A_QHD@B#118!10?C!5?A`@@`???@MT@PH@gCAG_A?QqGAOG@GCAA?a`P!6?_?O!8?O!4?gSwW{wiuK_O?oC?_og?_Oog}luy^@#127!8?A?@C!8?G#102!4?`?@CA!8?HQdI$#239!101?O???C?A???@??O??T?G??O#246!137?G?C`Q@O??Og?g?s@c@CQcA??Gc??X?|?v?V?D_D_NON?nIP!4?Cq?G#107!4?@#59!28?C?@#73?@#59!121?C#101!7?@#77@#59???@#112!11?gC!5?_?_?O!8?S#128!8?@AD{AQtcC_#111!5?@#108???@#114!4?C!7?_?_?_?_?AO???g!9?O_??CcBgAiHCI`S$#107!348?GE#121G]A@#140!177?@???@_#111!20?A#108@$#112!350?O@#129!184?@-#237~ONwVg^_~Wf{IlqMohE|IsloOgSylOy?O`QDoDqChQK`IT_TiPiDgFWbGD?I@?CaSHu?uHQLOeXaLoEXaG_HQC@U_ITIPkAtISjQhQgRA@AS_DWAC_S?A_G@C?OC#137!10?i?TGQ_???G??A@_?cSOAGGCGA??PgAPH?cAG@@_GCA`?_Og???gCGQcGQCO??Q?GO??_A?@a?@QcHQcIOdItGaHQcJOiChAS`SASgDO?c@G!6?C#184@!5?A?@???_CQ@OI?@??_A_Qc@KBCRK@JO@?_?IDGDY?OdOcBcJuHO??@skOOA#208?@#203U#35@#40A#73@O?G#118!6?@!9?G_O?o?OGAABJI`?_??G_C???A#77_WG?C?@A@?oMOdKoFXaTG!5?_#53!10?G#77?C?A@AXOJdAkQCASG#114aO?_O??OE?@@A@?_OHgPGEPaH_SBgQI?cOC_Qc??{BoGCAr_KaWAsKdHGcAOdA`GC@?C@??A?A#126??_#103!6?A#73??_#114??D!4?A#126!6?_??gQDoHQ_GS!8?EO#118GYskyT?gDAP?o??G?Ok_qXws{x}l|ULIKV{mWdW_Wi@zcrC?XUmlUhnUDnF#121C$#246?FoF_V?V?bGA@QCPJEwAPJAJdPaCAjDzjEdyNiLzUDr]ta^ITeSYRweSvy\SmjX\jqHlHucqjHeSQIgeSV\ucz{hHPi_eAXG`@?C?C@CgSgB?A?@??@#105!24?DQlQ@QcGSJAH@gDsBOdOlEcAOcASHOdQKQ@qGSIDA@SiTAP_??@?`AcH?cA@ISHSGSGSG!33?A!5?O#239!9?G@!5?AT_GC_?GA?@???Q???O??_?I???O!5?@?G_???gGA@A???OG#217@#37A#59O#125u__O#115!14?A@??A???BCH???`[{BQGdCQJ?A@!6?_#72!7?A@!4?qJuPlRKIxUSJexNRu`hPXckcA?C#102?O?@@h_@CIEC`_O_o{KSCEI#107!9?A!8?_!7?G@!10?OG?@G???DA@#112!9?_!4?G?_DA?OA?O@A??A?@!7?D#125C??oG???C?DJS@A?OK#115??CD??@?iDOOGeG?GecL?S??C#119!4?OAhQDBGAOcY_Y_Oo?OG_??_?O_?O?gOwz$#192?G??G?_??CO?c??_??@?c?O???G@O!4?O???O???G!5?_?G@_C?@G!9?C?Q??H?CO?H_?P?G_??G?A?AC?@G?_ASGOG?gO#239!5?G?_?O!9?@#150!19?_!5?O?A???@?`?_OG?C@!15?CA@#192!62?@?A!4?@!4?G?AG@???C_?S_AGOC@?A??g??O??c?I???O!5?@?GO???_!6?G#240???g#38O#77@#128G#112B!8?A??A?H?g?Q?D?A@!5?S#114??A?WdQQH`SJS?A??O?K?_C#98!11?C?Ga?g@?A`GO??_G?A?A?O?GC#103_?YG@?gS@uPdHBEP@KGAAIHGTAb?AGTGC@?H?C??OCAAOE_AcP?s?o?CCA?@A?@??AO??A!5?A#107!17?@#73!19?@???@O??@_#116__@sXAG@#112??B!6?A#102!7?@??A#112??_AGBC!4?_O_?@?@?BCBC?C??IS_#103?@?@$#193?_#184!5?G!6?G#193?CO!5?C?A???C??C?G#184!6?_???G#202!12?A@??a#184!14?C??@???@???O_?S?PC??AC`A?A?@A!6?A!4?A!5?@#96!22?@_??O?A??C?A??@???G?_A???_?C?@??O!5?C#246!72?_!5?_???A?H?D?GOgPg??Qc?cQHOcPa@a@eHAgA?@??aDBQC??C_?B#52??_#102G#121?KA@JbNtN^K}n[~u{S{gpQc{M[Caogg#102???A??@!4?__GCDA?OQGGwKA@#99!12?O??C#115!29?_OGEAB@@_?oo_LCQDa?pIWCAHO@k?I?G_GCP?e@?E@o?GDaC`GA?O?A@H???CA@?B???@!8?@!4?@?C???C#132!13?AG?CAG?_?A!6?o_#107???@B?A@O?GA@ADB?@A@BKC@???@A!8?A!4?@I?J?@?AHO??O$#239!11?@O?@#252!9?IC@!4?C?G!24?_?OC#239!15?@#193!4?A#239!5?C#193!8?_??C@C?SgTgDoAsGRAiXSDqgZcIpMpMpM~~~i?TGalQlQDQlQcICh?gDOAOA?HA_A?gAcHOdQKODqGSIdI@OiTIPaT_JS`YdZclQdItJShcISheG??DO?DO???H_CO?DOA?S@Ga?HAOdIOIcHsIsGs`[b[cYdWf?T???_CQ@?I?@???@??O_O!4?cA?O@Oc???cGCG!6?CG!5?_#56!5?G#103_#119??@!8?@?@??BB?CAG@??b?PC@?S#107??@??_#101!6?oO?CMB@A@A`KoNY`IOc\i@s@KACQpCGbcXEOcHSUgeHQP_No?dQkQ?I?G!5?_#102!26?CA#119?@#77?A#121!24?_!6?CwoOowWwo{NaosM[Og___os__{?o{_{^yyTdIAcd^QJ!8?Xno_#103I?C???A@cG@Io?Q???@#121!10?_O_$#193!59?_?O#196!38?O??g!4?QGDG`CgTcHqKRcIoMpMpMp???TTiaT?G??Gc?HO??S?A?g?_GOC?OGPC?OA?G?_AG?@_?O?gC??_?GALOaK?G?Q?HOc?_A?R_@AOdZugJtiItIvSUhJsiDxUhiUH|aTiItJsRsJtIvHIa[bYdYdWuA{f[RgK_?T_YCT?G?G!5?_???GAC@?Oa??@a?AGO!4?AScWA@IDtKu#142?C#114C#126??[aSS?IO_O?O_#69!4?@?C?G@??g??S?_S#103??CGC?QG_SHCHap_g_SS?Q@?_?OCgA#107!39?OG!6?O_#119!51?OOo__ckgC?GGCEEB???CG__??OOO??GO?_GBRB#128!12?WOiIC@?A#114!5?O?gS?gc?OCoCOG_OG?A?B?A!9?@??C@C?C??COjC??AGE?hQ$#192!113?G#237!145?OAG@?G!4?OA_OcACAC@k@I?H?C???GCG?O?OCOcASHO???_GO@AG_#132!7?C_Go?_?_#122!37?@#118!56?GK!8?OGcOCa?_CoSagU@dpX@HPGGXGA?GEJx?WPWCtGbAscQslYwWCiK[ZYRQ@NDFB@@CAOWH??@JFMGJNHVKB^F?K#127!14?C!4?_$#183!305?@#38!228?_#129CF$#74!535?O$#142!535?G$#145!535?_-#237^snQ|bLJuLrKXvILvIp^pnWvwfwNyfKrGqHQHQk@iShSHQhU_UHcHEPiS`QgQHC?DaCJ_LQdIpKQ`ShQHC?dQH_ISbSGO_@ASaAH?H?pAp?xA|?TG_I_???G?c?O#137!9?_I?TIPCOG@G?_??@C_CQI@DCCACP?WAAHA?W?D_H?C?cOA?C_X???P!4?O???A?HO??O_A?_A@iChAS`IOdIT_DiOIPcIOdIOdI?iD?I?D!7?D#184!8?@A??C?AC?_?GE@EPAP_PiOk@c?COi?C?GOgWcGCG?OgO?TgC?CgS`GsG#96?O#203G#50o#59A#121o?g_A???GpItaLq~Q~j\~ni^t{On~T~_O_o#103!4?XC@D_AH?Da?SaIoCQ{PZOD?Q_O?_!6?G#53?@!5?C!6?C#103?GA???RGG@CF_Ad@hCGQ@_s?eDWCG?MGCAHCAGCAO@?C?GC?E@C?COAK?CPA@?@#119!5?_oO]IG@@?N#143!5?C???C#73??A??A???A?C!6?A#119!6?A#116???o??OgIOfdC@Bg[MEg#121A@No_#112_#114IHaK?dOIoT@i?O#112?GCA_GaHOk@CHQDI?O!8?C@#107@!5?A$#193_!4?GO_?O?a???_#184!4?A?@#193!6?O#184!8?A!16?@#202@?G?@C??_?O_#184@!7?A_?_!4?_O???C???O?@_C?A??@?O#239!11?C?A?@#105!18?_ACaCPCJcIOJh?cOiOHoI?e@cWcPcB_Y?U_Z?J?LoJ?E_ZcICOdI?iChOc?AhAC@ODG#192!50?CO?H??O?G?A?O?_?c?I!5?G?i???G!4?A?A_?_C?D_?AO!4?CA?@#105?I#240@#52@#114x#132H_?UPGGgdGd??O#143@?G??a!9?i#112?C#114??@@GAtCAg??GoDQO?iD!6?_#72!5?DAN?Oh?ABa_SyDQIhQGFpKHyO??_GC#59??@#102!4?DDYuUqv`{Q?OWW?G?O#119_o_?O??O#107!9?@#119!4?G#121!17?__sQ}{oO~r~l~bLqnJUpKPcWjREGBHAi|LBcG}B?J?D|Gp??OP?@?C#140O??C?Oa#130_#52G#127O#132_KO#118L\^To??_QAdCGiOun|vz\VBTAA!7?@@ADADIQlQhSaXsHUItHVGQ$#192?AO!4?C??G??G?A?@?_G?_G?O?_D???_G?@?G?_??S??H??Q???C??O???O!6?A?G?C?`G??O??H??C?@?G?AOG!5?AO@?G???@?O!6?O@#184?_#150!30?O!8?_??_??A!5?C!15?C#239!72?c?O?_G??@?A@?OC?c!7?G?G!8?A??_??C!5?TaS??C?A@#244?E#55C#115C#73A!4?@!6?G#112???_#118!4?OD?I@lO???P?T?iutGA_?_?oC_gG_#101!5?@?A?CGQGFIT?}hUhTsDZGDOhTUhfWCrcDjyDWpAl?ePuGO?O#107?G???GAD!6?O#112!44?c!7?Q#132??o?OO_GOcY`OKo`GA?T???W!5?Ca!5?@?A??I#38?G???C??O#126?@Q#119?AA?_#103CGaK?D?A!5?A#119??_GS?S@A?O??G?eIdYtiTlQlOiSaHug`Gcgt`x$#246?@?L?SaOGaCPe?dOGoM?COE?FGFO?GrKVDukudP]TjAjucUhLhuZqxmCi]dFkqznI\hSUqhYSErlKJUCuzjYKeVthGbulJuKH@KoEoEGCGE!5?A#96!36?_?Q?@???A?@?G??@??G!7?_!5?O#237!77?A?@??O?G?_C@AP?PiOGOc?COa?G?G?GOcGCG??gO?T_Ta?G?g??G?G?o#116A#125?C^@GcuuRA#115!13?O_!7?AhAAS@GA_XSOOCAY?@^@Oo!4?_#98!9?@!7?_?iC!5?A?O#114!4?@!6?GO!6?@!4?@I@?EO?I?DAGCAGC`OL_E?iC@cPK?CQ?kBSGA?CQcWDGaE??A?@#126!4?_?K???WAL?_HE`I@CC??SC?D?AqKAC?C@CJO?D?O@KA@#142!5?GW???O#73??O#115!6?ASORGg?HAOCH#121!6?_G_kP}JelQdWcW_GO_#114???A?GCA?@#121S?Q?AKE$#184?G??A???@#196!5?O??C#252!45?O#193O!17?O!8?@ACGO?GoCpEWEgCHES?eI_FOSJyTdQIXFiTiTiTn~~Y?ta`cYdaSrKRcJ_IS?dOiOH_HOcPcOcOgQ_Z?U_Z?Z?LoJoE?Z_IcZdYdiTjSlOelQlJSlYTKy???T?G@c?O?AOC?PC?PC?PC?ODOaGTaWaTgF{@u?~?~?~?~PaH??_K?AD?_DGAG!5?C@A?A@??CPa?c?A??O?T?@A!12?_?c#128?G#126???U@G?@?OEOITaK?D?S#119!6?A!5?GAGC#102!6?AIC!7?GDNzk???Aq_#100!30?C#99G#108!8?G#115???G?C?GId?a@AD_OAGSaGCAWc?QG@C?IG_AI@@DO_J?K?A?A_IC??A#125!26?_G?ooG???O?P?G]oOG?AMlMakKQ`@??@!5?@@K__#107!5?@@???O?_C@#126!13?_O?_O$#196???_#239!91?_#196!6?_??A_?hAX_TGcJODgQkPegTiTiTiO??DtIGSI@GPG?aGO?S@??G?C?AOC?I??H?AC@?C_H?C_COa?C?H_C?P?_I?OD?OA?JO?CO_I?_ApCTzUgjUsJYdi\iPnciZcjYcjYdyDWv_\a\iVwB}Hy?~?~?~?mW?~cZQdx_YTo?o?_G?C!4?O?O?@???PA@C@?@A?A???A??@iPA@Y_BS?@#127!10?C#69!18?A!5?C?G#77!8?A@#119???C#77!7?BKCh?LdW_gO?E?UgGOCA???_??O_G?A??DqCApQkOe?bgY_#118!12?_`aD@?P`?pp`AHaKpyProQGopy_i@O_r_|wlWFor\x\NL@?@?AN#112!19?@!8?@?@#129!12?_!4?O!6?_$#246!264?AC???G?G?I?C@e@IPa@CPePePe@?P_PA\A@iGI?G??@A?P??u#101!47?@#127!145?o!5?_?o_?_??O?A#136!9?o_?A$#107!360?G#128!149?_!9?_!6?CS_GAAA{?@@?E$#145!535?@-#237jYsJStgRelOvG~?Ud]h^cZb{BKzNsJYdXcZ?ZcHqHqChQLQcYd?Ag@UGUgDq@GQ@OGaS?IPcHeGrKPiTAg?eOjCOCgODG@UhQcZ_HYdQ?ADQdGrCa?O?h???aG?O#137!9?S`?TIOcI@?G?c@??`O!5?GAGcG@O@OH?@OH?C?H?HAO@OAGO?BO?cO??O?H?cG?_?@?C@OAc?IT_TAShAS`IOdIOdIOdIOdIOaCG@S#184!19?hO?`??_AH_DAhUgEK?C@?qCq?k?V?D?g?G?d?@?B?R?t?B?D??AOBkAO#240?W#0O#125@_?w???@W??A#112!7?iCAG#143???G??QG?CGo#112??G#115CG???@?@??GC_CCaO?o?_#101!5?_T?CZkqDgQ|@SIGtItLqM@fgU`eYkTIEGZegPAo__#107???C@G!4?GC#119O??_???O!7?E!7?_!8?BB??WwCA?A`C?G#126?C??OiS`ACPHa@!4?A?C@A?@#116???_??g}?o?|w?s_wOG?NKK?N@]@!8?G#121Gw_D~Zm[O#103?QCOg#119!4?AF?OD#126!5?_U|MtkU~gcg!4?_O_O$#193S?A_GACGOAG???Tg!8?g!4?_#252!21?G!8?G??C#193C#240???A#192???C?aG?a!4?c?AC??GO??@C???Q_HOdO??@#239!9?C#105!22?@??Oc@Q?GuHCIdQhSaS`O@QcIcAcQkAcQhQcQc?kAk@cBcGcJ?@cHAc?Q?APICgQ_G#192!53?A?C?@C#237@C?A?S`CHAC@?O?q?c?e?T?G???h?D?@?B?p?d?P?C??A???g?_A#81oC#126?ADOkC?Gc?E@_It#118???_?`S!4?_!8?BrCE@y}Ea`^rhH_GD#59???A#77!7?IdYcQLqDlA!8?@?A?@???@B?CHAcXUAt?O?_#118!8?@A@?AOC_[SMCG]C_RMhRvdEFabP|Wy[zXNV{kbUfCrpRpOGG#143!5?D??C#125?OG?OWggc]gKhUkQMpD{AWgB?TLg?D~@YCIBv_@A???_#136?{g@??_C#126??_?W??cO#118AcwcrESh}i~\W^NG#143!8?OA@G#132?O#119@A\qlOMBEHUjUPMNnnNfBBB$#246?C@O_GAcGOFGr?i@W`A_P?[@Sq?o@OcGaZCucZQLcLzUCqlHdQ~TV}ht`VYGevkybTHjttmZqXTCr?T?|VYPl?znaDnyuQ_C?G?Uc??GdW_G!5?GA#96!34?O!5?G??C!5?G???G!7?O!6?@#239!74?i??A#192!11?@?O!5?A?_?g?@?`?G?i?S?c???S?g???_??G#90???_#49K#121ANDAm@O??Rgpi]tI~~TBPAAx~v~^hu|zvN~~s??ww??_#103!5?C@@WAuA_?a?PkPI_Y`???GQ#98???I?c!6?_!4?O???_O#103D???K?FATP`QP?`U_S_?oHK`A??_`?o?AP_!4?O_???G???A#121!10?GKKKIrvr~jz~iTBITj?s@CADA@?@!10?E!4?B!5?@#140_!7?A!5?@!4?O#125RD#132Ey#119??@#115@AD???@Q?@??_#121_?_ZtivWNhA`GQ_?FYTaLQmPkWcgS_K_O?O_Ws{{$#184?_GC??O?@?_!7?O?G??A?@??G!5?_???C?A???_!4?G!9?C#202??@?GaS?G#184!8?G?i!5?O!8?HQg@C???A???A!6?_?OC#150!33?CGCA?@#246!104?O??O??O!5?o?yCjCH?Z?W?I?V?}?U?q?S?g?I?Y?i?AOl?[Bs@?E#96G#140A#132G???@AieRGTGS@#119!5?Gc?gA#132!4?C@A#119!6?Go?EC?W[[_#107???O!5?GDG#72!9?@!5?}`tQItAaKp[WQh]HC?iP_O??@_#102GGHGK]kg{EG!9?@@@#107!5?G!7?OGO#103!17?_#112?C??C?OC#73???g!4?AG!7?A#112!9?@#126!4?C!4?@A#129?o??OoCOG?O???AN@?@_#73C#127A@#112!4?_G!12?_QcITGfO!5?@!7?@!6?G_!6?G$#196?@#192??@!7?C???A?C?A_!4?C?A?@OC??H??_?O???H??Q!7?AG?_@O#239!16?C#193!4?@G!4?@A???_??D???A??CYcWdGQCXGTdiQUdYTCrNcZcZcZc~UAG]I`eHokRu@YcHUG`O@SiS`[@QcIcQcQkQcQhQcQdQcBk@sBkQcJOJeXelQuHQtITiUgZaMgPZ_?GA_H?OAG`CO@CO@CO@CO@cHQ`SIPmONoMPkRcXeHsJsJsJSg@OI_W?aPG_AG?O?g?ACH?C?P?G?A?S?S?A?O???G?I???A???G?O?A??C#73?Oo???O??c#115!10?O??@#114!15?@??@?@?A?CQQIo?l?CO#100!20?@#53??GO!4?C???_O#99???_#114!6?C?A???A???aIsAC`IHC_G?yD@XC?O?KGIHGTKAAd@`CaOg?OK`?B#132!15?Og?e?CADQP?DA??@@???A@F!4?AO!4?C#149!5?_#142?x_C?kAO?W?ABM#114!9?@AHGhAC@S?_#118!26?@A@?@AP_O?O$#239!4?A?@!14?C!7?C?A#202!19?_#239!36?O!4?G#196!8?G`!4?QdGaTAG@?hYdGrK_ZcZcZcZ?hhU`_SGQDAG?k@Q?_A?Ag?@?A?aG@O@G@?@?@?C?H?G?H?OAGO?GO?cOGAO?H?cH?c?P?D?S`TIcTiVg\aUlhUSjIsjIsjIsjIsJShUi`mPnoNpmRkZeXuJsJsJsADSId[BkOM_\??R_@Q?g???H!5?O?A?A?O?C?g!5?g?O?D?D??@Cw@#244@#69?@#119??w#127???@#69!12?GS?C#103!14?A#107@#102!11?A??HHDYT~mRmT#115!39?A??@A?O`^HS@GaOC?IAA?@A__AK`O???O_??C?AC??C_???OG#127!23?_O???OO?GOc?I_@C?O!5?A??I??DCG??@#130A?_!6?O$#239!282?@?_?_?@???G?i?S?C???C?xiO?_???F#121!122?OO!11?_#141!45?G???O#38!29?O?A@??C#165_??O$#128!495?_?_?_?GoCY?W_?S@i???A!7?OA!4?@!9?F$#152!532?FG_?[__$#144!533?E???O$#145!533?o???G-#237lReXfI|Vg~SzkVylUj[ujLvi[a[ax]`]`GqLQcHU_UhCQdIoISbWChU`Y@YcBGAD_H?_GPiSHe?G@?XATIPMOeXAPAPk@kRcPgRkPhQlAl?U_EGUGTaGC@GAc?A#137!10?i?ChQd?@?@O@S@??_cAI?A?a?QGOGD?_?A?H??I?R?QE?D_C??OG?CGO!4?@?CG?cGAc??c?CHQdGcP?Ga?Ch?Q?CO@c?I?S@gA?HOA#192!19?A!5?A!5?c??C_?@C_I?S@G?I_?_G?A???O?G?A?C???Q_@Ci?AG#105?@#204C#14C#59A#128_O!4?O#112!7?D?SJKBO?G?O!4?OID?AO?dO??GA#115??_?CQ?g?S@HTAA@#101_?W??}GoGvYh~^q\u?b|NYH@gxTIC?GEhEW`CPKADYAtOKpOh_WoGoGog?__#107???_??C@??A???@#119A?O!4?C???EA?_G?KaAAAaD??_O#73O???AG#127!7?@?_@CCOBG???C#140!6?oCOGC??AA?@@?@A!4?@!9?C#73g?G??QE?I#118?@NSqhJVJ^g[B?W#126??I_?CpItAK`W?sJadGV?~?~@yDqC#119?R?gOC$#193Q?G?O#184???@?_??_?O#193??@??_!4?@C#184!9?O!5?G#193!7?@#202!10?@?G???@!8?O#193!10?cG!5?GAC??AC!6?P???PaGDqicPWJwTiTiTiTi~j@SrQDWeYcIcYaSjCH?cOl?l?l?dG_ITISlQcHu?m?l?GAWBwB{bUhRcjTiTiUgRu@ZoDYtIXeXq??_QChQ@Si?TGdQHcPI`SHaSHaSGdIpMpMpNoNoNoLa\a\a\`?i?T?G_?cG!5?@G!8?_??S?A@O_G?C?C`O_??Q`??G?O!4?A#217H#16@#69`#49Rc??O#119!11?AS_WACB??O#73?@???A#119!5?CC??GI!6?@#59!6?_#102WS\B^s?@?B#100??C!5?HO???!4C???aA#48!4?A#77!6?@?IOMIOH?GOGoGOG#118!14?Cacskm}}ZwJum}h|vPs}r!5@G?@?GK@@#128!11?@?_?@_GRICTiBOj`SlA@?E_??@@@#142W!5?xwgo@v??O??`GA#121?V?o`GhRDJ]o_!8?o@?N~t^jzMtIcPAD???TIVg~?~?}DyLz~kzUnz~~$#246?GOeGoAgA?BCP?D?hOA@COG@b[aHE@]`]VDolJqh\HUrlWTFthKezQhMcudX{v[IFuZXsmDjqX~vYJe|gteplHe{IsmRYRGQkBcAkALO??Q`GP_@#239!5?O#105!21?GcYcI??iSJCHOcOLOL?d?dAoITGOc?u@s?k?h?wAWBwAC@Q_A?i@iCgQ_@Q?@O?IP?H_#208?_#239!48?@?g?C!7?c!8?G???G?I_??G@!4?O??@!5?@O??C???GG#240o#35w#114[#50G#126@?C??@A@WaBLQgt#118?_R?DA???n}???_!6?I???ct?[~GCRAg?Q_#77!5?__?G@uGcGdQ?_D!5?O!5?A#103!20?CA!5?@??OI@W`HSgSoAgQcIW@OH???@!9?G#121???[s[kWqyALeB[u|??nSiCBBC_O#116???A???cPi@ShOSiOGymoZrrKCAAA??D@!4?A!7?_?@#126gsGQC?C?C#114??GC??_???A#119K}fo???S#132!4?OAC_??SG?_#112!12?C@$#196?c#192@??D??S?G?AG?A?C_G?A?S???O?_???_GA??C?A_???A_G?AO??C?O@G?A???_!6?O?C!7?A?G?AO?@!4?c!6?O!4?h?C???A?_??O#96!32?_?A???_???G??C???A!4?G?@!4?@_#237!78?S???O@AG@A?O?A?S_O@S`A_S@C@?@G_C?E@Q`A?G?I?K?C?E_@#244!6?A#83A#140?C#132AUoMleTIdHS_#114!6?C#115?@!4?@#126?@!10?`#107!6?A???C??C!5?A#108?_#72!10?GaHS?A_DAQ@?gtZTDXUheWiApLyd[Idb?`?O_?_!4?_#112!36?G_OC??_O??AG#73!15?G#129!18?GK?o?_[@IW!5?G!7?O#125oU?BFK_?_o_#115??AHAO??_#125!14?G_WA~J_?O$#239!20?O#252!4?@!36?_O??cA!8?c#184!12?@!4?c@?OG@?O_AC!6?GCG?A?C#150!32?O?@???O???A!15?_#184!85?OH?I@qGYdQ?S_O@?`?_C@C@I@C_K@U`I`A?G@W@K?C@U_@CxDQ#125!5?G???O?G_#132!19?A#114!17?pgCCRgCAgDGC@#98!16?aK??_oGQA??_GO_?O@CPKA_??_#59!5?C#114A??A@?AAA@!9?@D@@@CG??@@?cAo@P?O?GE@@#132!7?CCA!5?gc?bCXOc@YKGAH?C!7?C#38!9?C?_?kC_]s_]??FM_G#74}CAkE?A#127G#132!5?@OG?O_#103?@??CGO#73!15?@$#193!64?O??CA!8?c#239!26?O?G#246!157?t?sHA@W`I@M_I?S@I_Q_S?U@Q_W_K?K`U_S`Q`Y_G?Y?zCqd#121!6?@A?A??C?SgQlQIh??_gws~n??}{nTw~|n~Y`z]vP?~B#103??@gO?BgOAwTaI?C?B??FO#99!14?_!6?_!6?_?O#102!9?CFDDE!4CS]e]uJVJJ[OGWO#125!28?G!7?O??@_?WWCaV[q_JscPi?OgACI@AD?@@#52???OG#130O??_??_#152A!6?w?OGQ?@#112!14?S_?c?V`$#196!105?Q`GEgT_A?T_H?RkBsDiTiTiTiT?SSjGCgAP?@O@cH??OQ?H?AOA?Q?Q?P?_?`?HQ??@O?QCPC?C?C@G_CGPC?S?P?DG?k?Eg@?cAOACLYVHiUd[jPUidYheYItSja[Bs\afWtMpMpMoNoNoNq\a\a\a[iTVijcSAO?C@??G?A?I?S?I?Q?O???O!7?O?C?A_??G!8?s#127!5?_?_#115!104?A??A@@???@!4?_?_E_?caWA?R!4?D?G?@!4?A!8?@#126O?@__?ATBOGOAk?a!5?O#136!29?C@!5?Bk???C$#141!318?G#73G??G_OA#119!105?@#56!94?EO#52?S#144?@#145?@BpK@$#143!319?@#81@-#237TiSjSjuhLuKR}D}jU~DyUwT}H}HQuhZcItAShUHQcJoDYdQcZOiPeWEgRcRcGdIt?s?GBCHQkAhO_SHQlAlOdYcHQkAkPITi@i@iTiDQHsIWCG@_T_?HODGSAGC#137!11?@GQ?_?CI?A???CG@_CGQdI?GC?cE?@GGCA@?C?H?c?OAG@c@??Qc!4?@?cG?_?O?`?C?OCh??_?HAO@??a???@?AC_G?T?I?S?h??@#237!20?g??S_O?_???G??_?GCQ_IP?PaGCP_L_O_!4?@A??O?@ASgDI?A!4?G#204G#14@#73C!9?A@A[?G#119??B!6?A???_TD?oWg_oo?g#114??O?kBGCqHgAQdOA#101??ACBg?[bSHA]lvY~vkT}Y??aUslAPI???cOID_A!7?@!4?@ADAKIKtIPA?A??A#118???@?@?@??@?DqhgV~ZwCdBarrOSS_KL?cc_???C#125_?AAFcoW?_YxMIhYDySHG`a_PID@i?oOo_G??_#52?c#142!5?BB?~AwGE_K#132_!8?@@Bp?aDa#112H_O???Ja???O#126?_SIdY`CxCjCA?A?Ti?tIPIdYdGBCSg#112?C?O$#193i?`?GC!4?_!10?A!4?cH?C#252!35?A??_!7?A#184!8?@?_!4?_?A@?@?@gOA???S?G???_!4?A#105!20?I@O`?hChQ`AOI@_@??Pa@QH?kaCbOk?iPa?Q@G@c?Q?QcH?HODQcGQ?AOI@AC?I?HA??CHA#246!49?O`G@CGA?Gd?v?QLQ`KTCCiKSTqGCOIDITiTiSgDiCiSg@A?_@cHuGu@#217E#16C#125G?o?I?GjHOsCc_O#112!6?C??Ag?O?T???GDA?I?AC#103!4?O_Q?C?@cGQLhOAGpGQI_?gQ_`#72??@??RG@cQ??HAOlePe@YIDsITHAHE@I@A?B@@DI@i@@P@GO#114??C?GCC`???_CPGHa?J?DQ@G?cBA!5?_#132!5?A?W??C??U@H?_?J?iSDCoOSC_??OsO?C__?G???_#38???A@!4?BsHDGk]???C??O#125Om|^???BAC???B@#118??AFJy||SHK_GB#132???O??G`??C!6?SG?C#119!9?@A?J$#246?@A?@???q?Pk@o@?g?OChDA@a@QcHAcZT?|jAgudXSNi_YlHceTmHdpVkIgZVYoInH|t[YudP\UjLjudQWQnI_ZUdQxRMt_S]SiS?DwlsA`CpASI?IC?C_#96!34?A!7?A!4?C#150!9?A?@#239!80?CA!5?T?A??GC!13?A!10?O?@!6?O?O???@#240?p#64G#55_A#132?B@O??CBHYW@a`A#118!8?DB?_?Iyo?_!4?OOW~n~BOC_@?CP#102??_SN|s?_@@A#98!11?A?@kCS_HAO?cPQcPI@oA_gs_oD_`W_SEq?KOCo?_#103A?ccxK_J_[@AUIw?aQWaOI??O!5?A!5?_#73!7?A@!8?O?@#128!5?@?@W?B?B?@B?@?ACSIIDKs_oO??O#56!6?@?xC#74BOAB#128G#116@A#121_^~}_{wmcKwKiTsO_!5?aGokz]jdYdAGA??@!5?@VIpmtYdYv{zjU|zsn~$#196?S?S_??O#184?G???G!4?G???_?O!4?O???G!5?G!9?@!4?G???C#193!7?A??_!5?C!13?@!8?S!8?`?P_CIChUa?qH_dQkVsNcZkjV}}keCnTYhOlSjShQtISgPcGpmPqLOgQObOjOmPiSqLWdkOvGQkZcHQdYdYuHQtITMDi]OjuHaCZuLJ?OiCxATKQdWa[`GQdGQ`SI`Sa\_\a[b[b[b[b[b[b[b[b]_DAG@I?A?G_!4?@A_?@???C!8?ADGPaCG?gC?Cg!5?_!7?_#50O#128@N{_nQS__#126??@AGCOcW_V_W@#115!6?_!4?O???_?_!4?K_RGcQGdGA#77???@ISCs@[Bc\?QGc?G?_#100??@j!5?G#48??G@!6?C!5?O???_#100?C??W?_O#102?_???PROW?}[G?AAO??O#121!4?C!5?OGWCCKGJXbq`WAW{R~HGUsXG??e@I???_!5?_??OGC?_O#116@jCDIOB\?CoY_#130!6?_#136?CBo@O#127??O#119??_#126?@[@?OG?COOG#119?G!4?_OPVF?C@#125!4?SQCrOy\vl~i$#192??G?AO@C??A??A?S@?a???G?C!7?_A??S@??A_?OD??Q?G??OA???P??_?D?O!4?@?GA_??O??G?d??OC??G?C???G?_???A!4?G!8?O??G??H#150!41?@G#184!95?CAO_??_?GUGRG_?I_APIPA@aGCPaDgOa?G@?D??GOADaSGDI?UHu#83???A#54A#38_#127??C???AG#121!4?DQlZc^gZf}|O{n^I??NFAD^DNLBF#107!5?@G?Q!6?_#99!22?OH!6?Gc??_??GSPAXMo]Ke[iWGoo?_#77ACA?DIXA!4?A#119!7?C?C?o!7?wGcD?GBB?C??[A@D#126A_?Q@g?cO?C?S@!8?_??GCO#140!6?@??B??KGK?Is??O_!8?_#73!9?A??A#107!6?C?A??C#73!13?G!8?_$#239!6?GA?@!9?@#202!47?A#196!36?A@??ACIP?PA?HODASQgR_JoRcBSg@@QPhO?cACQ?OACG?c@QCGQC?CG_?P?CO??@OC?HC_AOAG?cH??Qc?I_G@?cH?d?ogP?dO?cXQ_?OsulDyE|GrlYe\`YVdYalSj`]A\a]a\b[b[b[b[b[b[b[b[`^QhO_CJtGAT?`???O@!4?_!4?@!7?C?O_?A?a??O?@_!6?Gu#97?O#121@#52W#116??O#49?d?OC?_#115!109?_C?@??@_T?GC_DGc?GCA_??C@???G???_#127!16?B!4?_A@CA_ADGE?A??ISIcO#129!7?AA@@DGJsIS!9?C#81!10?O#115!8?C?A#127!18?_GO$#239!107?A?_!5?_???_??@?G??G?O#192!134?T?AO??c??CO?G_??_G??aG?O!6?AO?P?@??G?Q?SH_?@#140!5?C#107!121?_???_???c#112!15?O!6?AO??@???G?_!5?G#73!15?CG???O#149!10?@A!4?A_?O#152!5?GC?B#103!19?@$#144!532?_@$#145!533?G-#237DYTitI|Iv[b}Piv|a^tjuHzc~A|UkzcVgU`YdGtIPiSbShEgRKPeWbKpEWbKPMOeHQk@A_BcHu@YcHu@sHeSIOiTaShEgRKaTaWa\a\AXeHqCwAXEGACi@m?IOD?CG_CP?A#137!4?HACO_D???_?ACg?CGQ?G??_@?C@?SgAO??ACO?_?_Q_HQCAC?QC?HO_HOC_?CGP?i?@!4?@OCG@aG!5?@??G??AG@C?H?A?C#237!22?_A??CY?S?aC_?o?S@G@Cg@??O?I?`OG?C_CGOg?PaGa@QgCG_G!6?G__#35G#125G!4?G@ATANTJMUO?G#112?O?_@??_#114?CAM@?_O??_?O_APSOII@dKG@e_I?O?G?_#101??dGA?@SgEJdJUn\j^hQ`LYcO?G#48?I??C???OA?G#93?G?_KOC_?K?KGO#101?@??AAIYcC#115@hA@?_PqSOHCQ`?Z??_!4?_?G??OO#126G!4?_??CGC??OooG?P?__?G??CAC?A?F??@?A??A#127??@!4?C#81?_#38_?PAWvJ[_?GC@#132OCCA!8?AC#126?ACGC@AG!8?_OkbCSIUG@??A!4?@?FGQD?mD[HQ???FOS_$#193y?AS?P?c??O?CO!7?C???G?@??@#184!28?_?O???@!8?A!8?_#193!14?D!9?@A?CP`WhO?OaSD_YR_VGaKxc^nLsoxINYtytItgRU`Z_lQTiTIuhYkhI?Ti[dHiDYDZCl?U_ZgZchQsAlAU_jUXj`Cm?Ts{Nn{[EQpcXCrkP}pysjspvGPcQHsAhSqCzCqLqLqLq\qlqLqLqLqLqL?O?B?@???O!6?a???C?@!4?C?A?@?@A?A?C!6?@?OAO?O#240!5?U#37A#128CrJe~r{ti\??C#73?@IDAC#118??G]E?M^J[pSvVn~oW{nVtMjN?osWADoP#102??ID@?HNuJG??oO#72!6?@??O_UgQ_`OkQd?OtJ?z@m@k#41???C#95KC!6?GOO???C#103@!5?hoUhCgOaCAGA?G!5?G!5?_O#125!6?C?AOC!4?_?GG?CKCJI?_@@?Q_?A?g_O`EQ@@DCy@gGoKH?Q?O!9?_O?MAB#119GCKL]?eQ??G!5?_!5?@IG@GD#132??O`?_?A?__oO???GC_@gO!4?s#112?@O_!4?@$#196?D_?I??O!20?A#239?G#202!35?@??@#184!29?OAO???H??g?OAGA#239!6?_??_#105!17?I?IDGO?@Q_@?cAPICGQ_QA?@?DaGo?i@YCH?C??_O_H?hA_AC?A?HA#184!61?O_??ODY??C_DcAoJS@?@?_@!4?I?@O??E?CHSGAPa?A@QgCG?@?@IdG#244??H#70C#140A??G??AG#49?_OA_#126???yc`II#119?_WB@_o_??GG??ND??GG#103??_T???oAK?Tt?iSPeOHs?Al?m?QgOGO#98!6?@?QCH?kOKcI_GCC?kORfvarAR?bT?RC`?aIgOgcO#77??YO#59??O#107_?@?G@?C???C#121!4?_Oo?OGAemJje{gF??gvBVZ?ZEEBa@__OCGCSK?LG[HFOCG?GK?a_!7?_#52!4?_?C#142?_BQF?A#121_?oWSA@A@BPlR\R~LZPbMtUw_O_?v{vYnRGQ`S`C#127oKO?GAtGS_#73?A!4?G#119!4?C!4?A$#239?_???_#246A??`K@iCGAG_GCGQCH?T?_P?AgRhMcYRIseThKiQXTcqiHdSQIhdSRi`lXucQ}lUsZQHkdZQGmJqXHtfTgLjQXTcr\gLaL_GateOO@Q@c?_O`O?O#96!29?_!8?_!7?A#246!92?OdA_??@?OHOHCJ_iSyqDW{wNttTYedzQXq@E@SgCPSg?@QpE?aTitWtcW#97?O#38_#52Co#50??C#127!4?_?O_#121???@YdtV?`{O#115??@?a!5?A!4?_??_DGA@oAGI?o?geO#77???Qt?N?jCPcQcgOaC#100??CK??A@@#72!23?O?@??A@C?Ksc#118!13?@CIH?ZFU\LH@BR?XOcCPBA??G!5?@#143!7?O#128@?@???@O!6?O???W?GCGUpKPUQ?K??G#129@?G???O?GA#73?G??@!6?C!6?GO#143?_#73!11?C???G#128!8?_#121!4?Di~Pq`Al}j^wnJ\}$#184??G!4?@G!7?C?A!8?G#193!40?O?G#239!35?CG#196?CH_?C?ACi@S@iQDgVGrKrCZ_OqALAdO_?D?OADG?K?U?H?C?P?C@?S`Sg?@QCP?c?_Q?Z_L?D?QC?HS?X_LO?cOUiPTiIBoOBahhEYCrKRm@MCJSBMGteYhuA|SjHzCzLqLqLqLaLQLqLqLqLqLADIdG_CITHAG?H!9?C!8?G!8?CG?G??A?_Cg!4?R??_#55P#56G#116CP#132!7?G?@Gd?O#103!12?G#69!6?@#107!8?A!7?D?A#108!7?O???@#99!15?A?Ar@?Sr?yPA@kOGP?X_nWI~_bAeLtSgOG_#119!15?A@O_!4?AAEMKC??@!5?OG@@#116???_!10?@#73C??A??A?_!7?_OO!6?_#56!6?O!4?DGC@#127O#128?@#115?_??O#114_#112!7?O?AO?G@FOG?d?A#125!5?GI@?pMRNLf|IVaZWs!5?A!7?_$#192???@?C???A???@??P??O@_?Q?_A??CO?C?O@?c?@G?AO@C_AG@COAG`COAG?C?A??G!6?c?O??c@O?C?A?G?AO?C_AG??AO???D?G??aC!6?C?@C?H??G#150!31?_#239!102?G?O???_!4?A!8?A?A!11?_??A!5?C!4?P!5?A?F#144?@#141!11?_?O_#121!22?A#100!77?A#102A?!4@AM??WUMK??@!7?_#132??_#112?o!9?OG@???O??G!4?@_???O#118OO#119!11?O#116?O?G??e?E@A??@@Av?Cb!4?_O!5?@#118wq_?{G?g__?___!5?Nf]O$#252!69?G#192!189?G??_?i??AO?C???CGQ?A?_I?_?G?C_?GO_?`?G?@S_C??@CGAC?A#114!122?@!7?CA@??@geow?CQccW@!6?@!6?@#132_SE?GG??QC`@K?QACCGAAI?G?p`SOGjEgd_E?@@O???_??_#130!7?S?G#136?@#126_?_?_#81!14?C$#48!433?O#69!17?_#73!12?c!8?_?A?_#140!36?A??HKQLGEg!8?K@$#127!475?O??_?C_???O?G??A?__p_#144!31?_??A-#193~?iDGO_G?CH?H?g???@#184??A???A#252!5?G#184!6?O!10?_!24?C!16?A!8?_@!4?C?S?A?@?G??_A??A??C#137!12?@?AOdGA?H?D_AGOC??CO?GCa?@?C@Qc@Q?G??GO?_??O_??AO@i??`?O?`AOD_IO!6?T?A?O?_?D#246!30?GA#237!8?iCGS?Pg@G?_?G?CA?TGC?AO?GQ`GOcGQC?@g?gT?G_AH?C`OlYdID!5?@#96G#38KOC??_#125??A`?OG??{E_?_#119?@@???@FBADW[KKG?GG!5?k{w?G}o#103@A!4?`ISDrcCClGCRCHaDi?G?o_#98?@A@G??ACJ?_CW_LY@[IzfWsjSiwdZ@YUhFq?CA@C@?CO?_??_#115??G??@?aPg_H_???A?G?IC!9?c_?_AO_!5?_??_#128G?GA?CCAE#115??A#116!8?OO???GAG@?D!4?@#98O#115GG???_?oGCBg_?_#112@?O?g?C`?_@?@cO?ICP#125!4?EOOGA}Z@nDrHTidB@\w_??___?O$#237?T@ybM\bmRsjSjUlwVg}VH}oN|rMzcVqHQkAkPK`Y@YcRcXEhQLQcYdGtIPKPeXaLqcRcHeGRk@iT_TaSb[_LqcRcHu@sHQLOe?cHq?tAShSjODRCJcG_Qk?iSgCQ_CO?G?_#105!11?Oc?Q?G?_A?G?@?c@O?SGQ_G??G?D?Ta@AGA@I?AC@G!4?AGAC?G#184!61?TiSgTgPg@g@???AS?a@G!6?A!5?OC?@g?iD??_Q?H?_?cI@I@#208???@#240__#56B?G#128KBBF^|Yoco???_#126EEGo??wk#69???C#115@AC!4?G!5?Dg???HA??GDBA@SC_GWC?_?O#101?@!5?@IDyDEIsgAPNOgo?I?_?G_#93!6?A??@?A?_!4?G?fOLwywo__#103@???GDWBG@__Sg?T_???A`??G?A#132??_?C??@?G?@G!6?K??GC??c?O@G???A_?c???B?EH@?@OC!7?C!6?B@#107??C?A#119???B?CwG_#126A?A???GGO!8?DiX?E`S_#127?cQ?GCaIOICA#121??F[B[ALANvnyt}N$#239?iS?S_?O?GA?A!9?@#193!75?HQ?C!8?G?G_PcRC@Y@@ApHCRidTqMTiTiTkyWLGqlQUhYD{ALyDXadZsITiUgZ_LY?latiTaleXMtILZktKeDQ|ULImSWL_Y@dn~?~~T?ih{BkZV_yy~~nzv~?PkRcZcRkRkRkRkRkRkRl}bsLqLqLqLq?PA@aC?OAOA???@g#202!7?G#193!12?A???A???_!6?O!5?A?P#37_#52nr_[O?_#49?CI@#121???A@?hAI}}FB^{oww__?ooo#107!19?SI??A???GO?_#77A?@?@ACTqCGXo#100??O#99???@??COB?B??cA`CWdJSiTDYC}dhUoLWA_C@A?WG??_#108G#59!4?@A??G?C#118GAI]P_?wscoX\]E!7?CA!4?OA!4@`_!4?_!5?O???__#115!7?_#103_!4?_O?O!4?_?_GGoCGIS_w?O#119!15?B#73_!6?DA??C_#128???GO_?O_D???_#143???G$#196!5?@ACP_?S_S@Q!4?_!8?G?C#239!74?A??A_#196cO?A?G?Oc?gSA?RgDWaKPiTiTiQDdaQD?H??_A@O??_AG???_G@_D?U_@u?WA?GS?PCo?dO_Q?bWOl??o`PAdaYDsIO?~??iiTSBkRCgYDD??OCG?~mRkZcZkRkRkRkRkRkRkQ@SHqLqLqLqL!6?AC???S@g#239!26?O?S?G?CA!5?_???gM#97C#144O#116??R?Gw#132???@?E~~@?X?OD!4?_#118!4?GAB@BFtvt~|YqDRBFot@MoWsg_?O?_#59A???G#108!9?_#72?@A?DITkeonSIspNWfOAcY`#100!18?_!7?O#114@!4?@?ACAE@ERACC?AO???OC???G!8?_#103A#125!8?KCOKSGSGEAJL@@?_???Q?B`CIIEA@A!5?C??A??C#126A??A#132!33?hgA@\@?c?QGC??OwKAFO?o?XQG_$#246!16?FgA@?s?FO?COCPG?udP\Rib]cudXkJaxUCqlHdYRIseriHeSQLHkYQXtcRYSiNi\hKbZQLHkYQHkJucqjXUHUGnI|h?j?KOG_O?RC@?@#239??@??G??A?@#150!14?_??O?@_?Qc?I??@#246!98?@A?ACAsBWBS@g@}?qr|hnvbKSfIRdhjyUUTB?idJ?cRqGC??O_O]~~~?O#142!5?_#140C#127!4?CI@???W#73?O!5?O#114!6?@?A??A?A?AdGQ???E??@E_GTI`IT?_GO?_?O#48!20?@!5?CO@??S#41!17?H?A?C#77@??G?ICC???_#119??@!5?@?G!6?_a??K?C!6?OO??_?A!6?_!9?ACB!8?_!4?O!6?GGKG#126!54?_??GbCBC?t?GODI@o$#192!18?S?G??G_?G`?A_@?GA_?C??@G?A?OC??H??Q??c?@G?CO?H_?Q?@c?AG?_@?O??AO?C_?Q?@c?O??H?C?_???O??AO??`??AC???G??S??G_#96!21?C???C?@??O??A#239!99?_?G!5?C?_AO#196!33?Q@!7?S?A#112!19?@!6?AG?CO?_#102!26?@??JRBAFwkyu[wO#95!43?O???K??_#121!15?OO`cGCA@A@??`PPRGMaf@YKDliXN|{aqOABOBB@?gO?_G?[HGYDlGKW??@??O!5?G???C?ABD?A@@!7?@BARN|V|z]~Vun}WN~tzm~yOcO@GA#73!12?O$#192!265?C?gAS??@GC?AS??S`GOdGQC?@g??S?O?SH?C?QH???C_#143!26?C#72!101?AACC??_#112!16?CGD!7?A_??C???O???A#116!10?O?C#112O???o_??O?O?C??O_#141?O#49G#101__!6?_?_???O$!438?@AA]SQO__o?_#107!10?@O#126?A@!7?Q`??A!4?@!6?A??B??A@??OO?G?O??G?_O#118!7?O?O???G!7?CC?A`@??CBK]WCc$#102!439?@??@@BYECSW[W#73!18?_G!9?CC???OK?OG???_??@???C@??DA!4?A???@!5?G???C??@$#125!472?`OG?O@#127!19?__!9?O_?_CCGCI#128DDEI!7?C$!474?O#116O#140!42?G@?B???B#59OO$#127!475?G#72!42?__#77O??_?_?_?O$#142!520?CC#52A@#114WO???_?O?C?A?`Z?S?_$#102!521?_o!8?_oGWOC$#38!523?A@?@#81A$#129!524?A-#193~?~?Sg?iO@Q??`G?ACG?Q!6?G#196!14?@#193??_#202!15?_??C?A_?GcO??_#184!4?G@#196?S#184!12?C?A!5?@???G?G?a?O???C?C!5?C?O#137!11?@?I?COA_@I??eGDa@?_??O?A?c?OC@A?G@AC@?Q?dG???HQ@C@I?T?G??H#246!45?OC_HQH_?O_?O???C??GcWeXA`cdxQ[gVWgiiwSVzy{xy|xYSdLZRtTk@smsRcl?iTgX^~~r}#244?F#14A#128_S!4?FFFB@?nXSIU@c#132R?VGDQKa[O_?_O_#118?@GC?B@??B@???@BE@@FEYL\]og?}z_O??_#101!7?A@?A@]`ZsIsHU@qK?e?G_!5?O?_?_#93!8?_QGVDnJ\inmCKGGOg_#100G??OOO#114?@?C???@?@_BGOG??GAC?OG?AA?EB!6?C#93__?_?_O?__GoW_GcGOGQGC_C?_#72@??@E?OcG?CGG?K#121!8?AAABHYYzWopqbff{y^umzFhUyHa?@?TG#128??@_GQcZ?OdOCO#126@CR?WA[`IoD_$#237?T?iATjSjSlxnYt^OjcYDzeXvkYbtLr[QhCxAXaTI`QcYCYcItAXa\_LQcZc@?gQGSGAs@GdO?@_MPIpEwB?TaSjOLQcY`MpIT_TaSJOlA[?XAk@uGuHuHcOi?QgCAOc?P_CG_C_#105!7?@??C??S?@!4?QGCa?dGP?HA_G?d?CO?g#192!78?_?OG@C!4?_GQ??C`AO_DOC?@g?C@AC@AC`IO_CGA?OC@?G_A!5?_#64!7?C#49U_#38?QO_?_??C#125@?A@CHUHgw_oo__O_#112??A!4?Q??G?C#73?@#143_#132??g#114???@???@CA?@CQg?CICS??gGU#77!4?@?ADI@[_?SG_#98?_K?a@Go?WPcnO@lAt\_\btePiSDD??_!8?BAC?KCOW?G_#121!4?OQQOAA?C?CA?@!6?@G!5?@C?A@@GE?G?@A?D@??@???@#118?@#101?@!4?@?A@A@ZCWoCw?sKOKGs?O#112!7?A???a?A???G@??HO#143??AG#125??GaQ`_CiviDrKRcZdQlOM{o?Gf|a$#239?i?Tg!4?A?A??A_C!8?@C!4?@#252!29?G!11?GC#193!31?@Ac???GA???AGbDO`CaXdIPiEI`VPYHnl[m_tqn{ZstiLOugDqHCqHfWtIXEhZ_|QuWdwUmGlOAuvlE`kqy_TAjbuXEwVy~~^v~nv~^v^v}]nv~z\mvz]~?nOnOnOnOnOnOnOntZehZUce\id]TiLU?Q???GaOA@#239!11?C#184!13?A?_?GA_G?@?GO???AC???C#70???@#125H#116Ad?@A??_W_cOCGP?GO#73C???G#115!11?C#119BBB?A@??A@!5?EMGG?O__#103@CA???j?Z?A`G|?Oq_i`GC#72?ACJ`BUh]@q\GvASDi??C?O#95!13?`?YOo_???AAC??O?___#107BA?CCU#118?A?DCO[?w??C?AA??AGB?@?G!4?@CGKGE!4?C#100?GG???C???AA?C?A@A???@?O!7?C#118@?@?@?@@C?CsT{CoccC???C[G#73!14?G??A#116!8?c#121!6?BGc??@]tNy^~$#196!4?@AS@Cg?COC??@O@_#193!54?G#239!31?_??@AG!9?C?@!7?O#96!13?@?G?@A!5?_??O#237!95?_??G_Q@???cGQGAC`AGaDO@A@g?C@AC?AC`IO_CGa?Y?@?GOAT?ACA???G@KGO#52?@Y`eKWOW?W#127!7?A#121?A?BADQCANZd^b^jgsws{g]m[c]B~U{woOoo_#107!10?G?D@???G#100!17?@?O!7?g#85!19?CASOOw?_O_#77?@#102?@@?CCOQGG???_?_??@?_!4?P!5?CO?CIA#81?A#98_#95__??!4O???G???[CGckAgCG#134???A!5?C_#114?@!8?@AG?GG?_#126???@??@!6?AC_??CoC`CO@OCIA#127O?GSIC`G??IGAh_#73???A$#192!16?_!5?@_GA_??_??G?_?G?@?@??O?A?G_AO?H?C??Q?@!5?G!9?C??@?OA!4?a?G??Q?G`?O???OA?G?c!4?@C?c@SH_??O@G!7?O#150!19?O?@?OGCQHC#239!95?G?_Q@!5?O#193!30?@??OAC??g@gP#150!8?G#132?G#142?GGO_#140G??AY?_a___#126??DGC?G@H@_CW?K?S!5?O_O?W_S?g#112??G_???_#102!10?C!4?AFNL[S[oo_#99!13?DBACZ?BmA\IA^a[IXmTjYgUg!4?@?@@??CGCOOG?__#115A@_?Qhd??C?G?aG?OOP?GGD?Q??F??@CGOC?A#73@?AA#112@ADD??BA?@@??@#131??__GO_??_#103!4?A@A`A??AAaA?KAgo?G#73!5?@!9?@$#184!16?G!4?C!6?A!4?A!5?_C!4?GC!6?_!5?G#196!50?O???Ga?O@??iCQH?A?e?H`UGiDuOQaPTIG???A??_G?QGC?@??GA?cAoC?U?G@aGB?PdQItHGQoKQHCTigSSHeoFgD??_G?OG?_G_G@`OG?CaPGC`?~OnOnOnOnOnOnOnOIcHQC_HOATI@iDQ@l@CGC?CH???@!30?A???@?AC!8?@#56!5?C#55?@???c#115!45?@?A?I@T@?T?b_WSU`?__#48!21?G_??O#88!26?o?_#103!5?A?@@a?``C?_?@?@?O_PLC?\?T?SGOo_G?C?qG?O?O???IG!4?CC???A???@#77!12?@A?Q?oAo_OsGo_O#132!11?@?@!7?@?GO?@eSL_SG`T??O!8?A@AGcP$#246!18?QDg?WE?O@SGQKadSZEte[Io]kJdP`RTGleSAZqlHcQ}VVlrbt\JuRInvQZpmsEgDg~i\HSfqlHdUOIdg^iLhseQXAtAs?O@@!4?QG!4?O_G@GC#184!126?A?_Q`Q@?C?CGQ?G?D??A@OCA#239!25?O???_!4?qo_#59!68?A!4?O#72!53?@#87O#101@BBABECK?GGG!6?_!4?@??__?__?_?_!7?_!4?O!4?G#119!4?@?A?@#99O?_?OOSgGGoO#119!8?@!9?@BB@?@WC???CIK??OO$!461?!4G?S??A??G!4?A???@?@!4?@@A#126??GG!4?AAA??A#98?OO??C?A@A@VSMK}kw_G?CG#115?@?@?@???CACo?G?_!5?C?G$#132!463?A!4?C??A#107???A!7?_WOw??O?O!9?C!4?A#102!22?A!5?A$#112!466?A#77!4?_?C_??_?c#108C#112G??__#125!7?@CD#88_??O$#111!483?O#85!10?_???__OOoG_?_???O$#116!494?@#111?C-#193~?~?Ti?GP?DA!4?S?SAS`GO???_A??@!10?A#184!8?@#202!12?`?I_S?G!4?_#184!17?A#193??CO_?g???G!7?C?DO`W??G?UPGRkACBPKHQCjYDuhUvvnZf^Y}lzt]}ltIlS[kqY_DmTZcFLY?i@TBgEOHj~Bjj~~zn^zx|Z{|]~m~^BhYb~}NZ^L]VZ^`iZjRjRjShUhulYTMtYLuLYtEbCAt@AQ@AAH_F?L??CG??C!10?O??O#202???A?A?A@?A??_#184!10?GA#196??@?A#153?G#239!4?B{#150A#140@??_!8?A@?A?@A#127?@?A@?A?GC_??_#73A#143???OG???G!6?G?C???S?_#118@??@G??E@Kq?hC?G#102???AI\u~|ko#53!5?@#98!5?@A@?HA?GQ_WDKPROMiTOfEc?W`?OA#85???B?EA@??BCBGC?g!4?_OgWWWwo?woSwWwWks[u[s[snXk{U|XgSbATiAcB@?A?@@?@#98?Gg[oGw}{jq~{DNUjQ@CG?C??O#115?@@GMO@??G#121Ad^{s\|tO]jTlV}JsD?B#125odrZHd[A^_I@PCiChEYdQlTdONrOs?@OK$#237?T?i?TiTmTytm\zViTHsB[AflQ|JSxNwEOlOLaHcJS`WaKhS`ShEgQKPeCIcHEGQK`?J_SAGQC@?bCjSgOLaTgTAsBsHeOdW`ADISBkRc@iTaTi@y@iCADYcRk?iC?@gO_IOcGOC?G#208!6?C#137???@!6?AP?_A@C@IO@_?GO_?T?i?S@gAS??S!8?A??A#237!35?_??_??_??G?G???K_S_S?O_Q_Q?O`Oa?s@YcAgTGcGDGCGCWCOCgCOcGCA?@???Q_IOACHa?_V?A@!5?hO@#193@#38E!4?@B#129??_O#132?CC!6?I@?ADCA?HUx?Z_Xa_?__[__PacY`S_#73?O_G#112???AS?G?O?K?_#103A???J?SI_TKoAH?AOG_#100!10?A???_csO?A??_g_#93@!6?@?AANcCxJRClPk}nzkw[qX{So___WK?___??[CIGC#103!4?@?@@@#100@#93@?C??_A_@`SlgTkR{[{{Ra{huPdS`Dd?@?CC#100???_#102??_!9?CC#108?_#118AYnDP\G???AA#73?I_!8?gOC?G#127_QG`[_J??A?@?O@?GCAGGdOK#126B?aa?P$#239?i?Ti!4?G??@??_?_!4?O#192??G??G??C??OC?@_?C@O?G_C?O?C_?G?C?A??C??G!7?A!5?@C_?G?@?S??AO@C??O?WdGSACPc???AO???@g?A??CH_A??@_?O?G?_??@#105!14?ACG@??G?AH?O?_???AC@?A#239!69?o!4?O!10?G?G???@#240!52?AS#56G#128CJ^[c!5?ApwIK|[{iCws{_o{_O#126@C[CTeXS??]@]OMKXC[iC\_YcY_#119??ABEKFB?GO_#107?C??_!6?_#101???BCHUkB|QdjStKoKa\QH?cGO_W#48O#95!6?A!4?@C_JWAogwOgO?OCO?_@_!4?O#103?@#108??C??C#84?_#41A#95C!6?AA#84??AA???A!4?A#95!5?@??_@@kSAAGa#134!7?A???AA?@#77!6?B?@aCW__#119?G?Oqa_O?AB#132!4?@!6?@?RCGICCcQA`#128?StQkaOZEWdAhO_O?_?_#121AHSlA$#196!6?Ta?a?GOaCG@A?G??C#252!50?`?G!21?GO_#184!6?@???@!5?C!4?OGC!6?C?O??O#150!17?@!4?A#96@#246!81?C`SGa@?I@GaL?K?C`ACJCWAkcPxEibZrirzbzbrlzPZlIrx|}[~~jKTdLxqST|Jg{|{~v~~~Uk#218?G#70_#116@??_GSgEHaT?ATpAa@#121!11?A@?G?CJjT@A@F_PA`A@RaJDRdJ~\g{oo_wo_#72!18?@A?BS?_ISbIrKp[aCOI@_D?a?C!4?A??G#88!11?A?@!4?A?C!8?_O!4?G!5?CCC?G_GaG_IOaPB@?ESIGOA?OG??A#131??G???G?!5A?@?@#103!12?BA@BAGU?d#112!5?A_@G_?Id???A#143G?C#116!15?k?XC_?_?O#132??AAI??KHSGA_$#184!17?G!6?A!5?O#193!43?_?G???@A#196!29?A?O?G?A@QC@_?_C?@gO_A?dg?DqHUhGGO_W_d?O?A_?Q?cO?_AHCTiOG_QgOdiTSigUPlaS?gSS??CO_CCAc@A`?P?_{Ud[?@oc_q`gc_]TcSkSkSjUhUHQdIpIDqHQdI@GQhAK_H?G`CAG@?`U_ACW?G#244!52?_#74O#52Ao?@OgVxUKg??_#112!22?CA#115!21?@A??APKO?hCOJ_TI_PC#77!5?AShOgAKO?G#99!8?@?DGF?BAKmpTglWpY~cWO?`CCC#80!8?@#99??A@?CO?GC???B?@A#94???_?_?_O#107?@#94!9?G#99!11?A!5?S?CQ@?GOD!5?@#114!15?A@P?c?GC#126!10?SiO_@oIyCgBO$#246!18?a@gA`GOdAS`E_AxnAjq[UZoiKfTRQjMjQWVdriXxtZqxvdQ]tSJjttlY]VSyOJUdq[iBi|HkIqXlIfA?A@@wAGR}SgLiS{?EO`W__???@?OGACB??@A#184!108?O!4?OC_S?O?O_Q???O_?A@?@GC??O!8?G#55!38?wC?A!5?@#125?G!6?ToEH?YH@VaG?a!8?_#69!22?C#114@?A@LQQ_SB_TI_@#95!24?A#72!36?A??A!4?AA?A?@?@!6?A#101!40?O???OO_CGqP`ZgSgCw_O$#239!124?A?O??C!4?A?_#192!120?G@??@_?Q?A?P?C?C?C?C?C???C_?OC??@A??S`IOaCHa??S?A#142!16?A#101!135?@B?D?AA@!5?@??@?@?@#72!42?G??g?GODKiUcOgSG$#102!458?A#131G??O#118!4?C#112C#77!6?@?@?@$#98!460?KAA???@?@ACA?@!5A$#77!460?@?@?@$#100!461?GC??C-#193~?~?Ti?i!6?OI@A?@??O?_!4?C#202!27?IC?QCH_COAOCH_??O#184!18?@#193???i?VcGPC#184!5?O#193!4?@?@??A?AD?eGD?GRCHe?JCD`LUpHKYShBXElQ|pN~zu|JEJOy@T_iCT_iCTaIPdGY`twyN_yy~~mvz|MnflmNjlM~?~?~NnOnWfXlZcZcZcZcZcZcZsZM`sB[`ehcJG_O@C??GQG?GaC_!6?A?_#202!5?O#252!9?O#202!11?Q?`???_!5?_!4?@#240???Q?Oy?P#14@#52@?FKgkVAJ?R_g???_WO?oW_O_#127!5?@?G?@G??AGOCIC??OOgW#143!4?A?CPAh??I#118??K_ANwC_iO?o?O#102@AB}JulJukO#72??A?GFOJgQHCO?I?sA?cQH?e?AG?_#95!4?@?ETgYDaD?f?C?O?O#88?DRYM~o@??c?wGGG?{oL_Cqoz{zox|zWZxarrGHB???CG#95oAGe@_@CA@#98cySYv[zu}V|Z\vI{AAC_#103!5?AH@IKbDG?W?O#119@E???Wg#126?PA@UKp?BGS??o?g#128??GPUPSKApKYDJccZgESPa[A#132?j{S$#237?T?i?TiTzvm\zVitiSxUlYfG]vkR]`yVhQKPeGV_TiSATiPiSbShEhQL?OIC_OAHHCC_OCH_G_T?HaKPeGrKHShQhQcZ?YcH!4?A?OjWfKQcHU_TiSyCz?|_YdObWcAgAoHs?wAOa?CQ_@AOc?O#105!7?HAC#137O_D?i?T?i?T?i?T_IOd?I?D??D#239!44?_!9?C??_O?O??KA?AG!6?C???G#184!32?G!6?C@#252?A#193A!8?A#244eO#38M~w??OgsCGc??TO??__??_#132!9?A@?OB@GD?G@@JEFfABB}xCp?o#112!4?CO?hQ?C#119l#114?BOTCiC@g_S?_#101!4?_@ADUHCZeWfOVlsyj}dtIOwOGcoOO__#48?@#93!5?`?AEDqTg~O~r}l}jtygC`!4?G?G?Aq_!4?OO?C???C!5?CGCGSokylvytF\vXqLUjLSZ@iDG@??@#72_??_?SA@taZShghO_#114?G??G?QI?QKG_#121FVDAQ~mt]GrKn{t#125@PKMG@U~`K`I`?GA`???A??RGbKXaTVS?i$#239?i?Ti!8?_C#246?CHE_OdGq@?@K`ICGUcriHt_^i?j|gTEThKjQXUcq~dpZKisUQjXLjqU\sIi~UTriXTCqqjUCUlHcudZu?G??cibCAOplJqh^i?@CPCSA???GC?OOCPC?A?@?K?G#237!90?OAG_AGOAO_OJ??`Id?_@s@?PGRGV?jODGBSH_ACaP?Q?T?T_@a@WAc@gQCH???A?`GC@AC@AC@?{?sG_G!7?G#20_#116??ADA?@?v?OS?D_GC?oG?S_O`#141!5?@?A!6?A#140_#121!5?@!4?PChEXaLUzltUlrIOo#103?g?P?iCPI_KW@SHQSGO_G__#53!4?C#100??A@???I?DA@_O??G!7?ACA#85!4?GG!5?@A@CI?C`O?NyzrWuEd?V]BMaNJLJCBCJEACfcATGCaEODQG@AG#131_??G?_??a#101!10?Ac?G@@kGXCjSRSmS_s?_#115?AD_`g?O#112???A@C???_#132!5?AamQ@vAh#116!4?cIBdCQDgc@Q_CpG_#121!5?A#73@$#196!6?T?CGPaCG@?O!6?@#239???_#252!31?_@???_?_A???A@C??_!20?T_?PC#196!18?H?G??AGD??A?@cAg?O`IcRchEWehQlAMo?C??ohSiDSiITPiITPiGTcIQdSIADoYDD??PGCApOWQPoSQp?~?~?oOnOfWeQcZcZcZcZcZcZcJC`[B[`UHSJOFCIcI?QD???C??AC?g??G!52?O??_#64?A#63O#56??o!4?_#125!10?@!4?@??O@!4?@c?Ea?D`A?OgGGGCC#135!11?A#115!4?P??C?I?@PIEDIoC#77!6?@I`UXcP_G_#98!4?C@O?@g@GC?AH`WTOYT@jDQ?hgP#131???A#75!15?C#84C?@?@?C#117!22?@#99!11?CQGOoG?C@_?aCH?G#100??A?_#77?O!4?ACA@HU?s#107??O_#118DEDbeXwgwc#73@!4?`!5?G?_??S#140!7?_OG?_?OOG#126!10?@$#184!17?_??A!4?G!7?@??O?G??@#193!19?@!10?A#192@???G?C?aG@C??h??Q?G???T_?P???OdGA??C???Si?i?h?S_O?O?A_?_???O?O#184!103?_O@??dG_@c@O@G@?B?R?@?@?@#239!48?_N?\#96?C#55???@A#128@!5?N@?INV@FMFAINM[~n}~}{q{IswSGaCWo_O_???_#107!20?B??C!5?@??_#99!24?CA@AL?EDAnCi}Swg[O??_??O?G?G#94!13?CA@??@?@?@#102!63?A@RSg?O#143!12?G???AO#127!4?@!5?UaG??O!4?Q?G@C???AC@gg$#192!19?G???C??Q??O@_?G?C?A???S??A?g?AO?C_?H#242!42?AGG#184!22?A@?_???G?OG???A#246!104?CI???Q?OG_SaS_s?gOawuOau^|xLm}lniyi^]Kmf|X]Vdxu}~l|[]Rq[xy{xyYuBXHuVv~lN_D?G_#140!4?O!7?A??O?AG??D@??A#49!6?C!6?O??C??O?_O#117!103?O??_??O?_$#202!99?A??G#239!23?@#192!116?O!5?A!4?G??C?C??CG???A??@?O?D??_@O??A_?GA?@???A?c@AC@AC@?G?c??G#142!16?GO?G??i_#126!22?@!6?@!5?@CaISHaKo$#116!356?o#73!8?C???AG-#193~?~?Ti?i!4?OI@A??C!5?I@O??@#184!19?P???A#252???G@C!7?G!5?_?A#192!5?C_?H?_C?Q??H??AS_C?CO@???h?C???cHaGQcG@GC?ODAS_T_??HcP!11?G#239C???_#137!12?@???@??A?C@i?S#237!49?gC@G?_?GQD?APAKOC_COCPaXaOcPA?CGC`?QGAgA?G?V_@cHQ?TGc@iODGAS`O?C@??G?A_?_A???~TuHU?g!5?c#217AO#38F~?E@F^?ACCNCH?GC@g@?wQi?_?_!5?_???o#125?D??@I`MpKqHcCO_O#121@kAXcXnZLYmtBo_#114AOL_JOIgOiCP??_???AOG#101@AD?BTIVK~i^yVxjS|Q??HueXO#95!4?B?RiSxDiA@A@@C@A?DA?_???__GOG!7?__?_O??O?_O_??O?O??GOMSAD??D?O???@?@#101???A???G??P?gRgAtIeHUhUiCBG?@???C#118?@``FfE]TB@A?CE__?Oow_#132?@AD?qG#127FgG?G#140???s?AGQ?_?Si#127!5?G$#237?T?i?TiTm\zViti[jtIhV}hVSojExMydYcRcHU`YDgU`Y@YcRK_LQHShA_AO@?iP?cP?AOFg?CH?gCCqChSjOjChU_UHQLQc?C?CQD?DOhQlOLQcHuHuHYdYDJchYdiTiTcWeXePA?CGcO_@GQ_O?O!4?_#239!72?A?O??C?@!7?_A?G?I!6?C#202!4?_?O!5?P?A!19?C@?_G?A_?GAO?C#193??g#184??@#240?@?U?NG?D#2A#58G?_#52@!4?H?B?O?FA??B??FD@{R]A{WsG_OG??G#132!9?A@CR@?EN{?w_#112!4?QD?I#118cBFsLq^Sg_S!4?__#59?G_#77!5?@?BKATGR?S_?_#100?C?AGlvC?G?_go#93???CGC@A?@@SHKWBY`^Q\vZv{]U]umsckORxTxY[u[N]~M^]N]~~k]kM~Vn`BHAHfI\eHb@CBKCG?G@#100!4?O?a@!5?@#77EGEgSJWAP??A?AC#107?O#119!5?G{u[MIHK?__G?Oo#73???H?O#128?TaLUtHsA?@C@cIT@?SfWHqcGo$#239?i?Ti!6?_C?C@O!6?_?C#202!32?O??kP?i@GAOD_?C??_C?a#193!17?i@Qh?AgOA#184!4?O#193!10?O_GA??@G?APA???CXcXaRGVgU`DJiLiTmTYTjZeVnnmlkmmlmMyxtry?SBjj~~?y~~z]j~u~?}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}jDPacTQLu?GySg?_@?H?B_GC?C@??GO@#252!10?C#196!44?E???O#35@#14_#56?Hw}W_qoW_O_???_}O}w??O#128???H@BBFUB@FF?FYEf]d]pMpKq?O_O#143??A?CIAOc?_#119@?WKW#115Ha??_AT@IDOgGWO??Oo#108!8?_#72???@?DGEOj?dQ??H?aCO#131!12?A_ACG_C#85???GCGB_H???A?BBG?GA?A?B?@?@?@?@??A??@#98!6?_O!6?Wo?OXrnTm\~D~fMKUgEp!7?@#103oCOiQdgOGhICK?W?_#121??G`@_oB]VL@FFKqlQc#125DfwATa??A!6?@??A?@?DaLRvN$#196!6?T?PaCG@?O_C?O#193!39?G?C#240???CO#193!8?_?A#252!19?@O_??_O#184!17?A?@?_??A?G?c???A???CG_?O@#192!84?G!8?@???A_??G!6?OA???C!4?AG!4?C?@_?C@O?C?_@G?C?AO@??C@??G??_??A???A?C#239!5?O_BRg#104C#70O#142?A??_?DCbW_JuwsR?C?F?gC#129!5?_!4?o#127!15?G_CG_#103!20?D?AD?hCSDKoQb@kagOAS_G?__#98!11?Gq?PCGAHkFob_PgCySG??_#88!11?@?!5@?CCCA?C@@#98!7?_#88???@@B#100!17?o#113_#72???_?a?O?G_P?CPCItOo`O@???@#59??A#115?_OO_?Q_?O@_!6?O#126@!5?BKOgQG#116!4?O`IsJH~{rkYTigTiWaS$#246!17?A_Ug?AG@I?xEO@IdPKYqhMcyRhMcudXkaZqlsbU|VciyRCmPIetliWVzZU\PzXLzQJSeSZQhLhucqlX?G??gGEidUCQjalZQ?S@c@Qc_OQC?O!4?I@???GcXaP?AGC_C!84?A!5?_?gC_@?HOB_@cGCHEJGtlyrZ]nlttV|mrxg]]ZqknirZ]Sfyr|hMmzyy]vvt\^V\l|z~??Hqg~U~hhOc#193G?G#144??S!4?G#116!7?@!8?BK`SACGoGGC?oCO?`O#73!9?A@!4?@#107!20?_OA!4?C?CG#99!27?BDERwKWC?A???sgSOaoCW_g_!10?GOG_?_!6?_?_!7?_?O?_??_OGaW_aHUKeGC?aCO?O??a#134!7?G#53??G#102!6?_cCkWTL@ACG#112!9?_P???G?E?G$#192!17?G???@S?_!4?_CO?A_@C?O@?C?O@G?A??C???G!4?@#202!37?A?Q@???G#196!20?G!6?OAG_?A???D?A?GQ_TaTIPiDiScXgOOPQQPPQOpDCIGCTjgSS??~D??C`S?H?~@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@SOiCPiHq?dOD?ATAKOAo!6?G???A#244!58?O#203??_#130!16?G#132!15?@#140CAwGBg_WG_O#141!7?G#126A@?APCAPc??_?O#102!15?ABABBLGCBTUkwgO_#131!53?O?_!8?_???_!8?_???OGcOC?O??_O?AGA#108!31?A#114_?OA?W?h?A#69???O#143!5?A$#184!18?@!7?C!6?G#242!64?H#184!136?GA???GO??C?COAPaO_?_#49!116?G#117!97?A???A?C@?G-#193~?~?Ti?_DO?D??a!4?O!6?C#239?A#196??P#252!17?CO!6?_!4?C!11?C??CO?A_#192_???_C?AG@?C?OAS`CHQCOcGQ`G`IOaCGPaCHOcG@aCg?_AcI?QCa??aO???C_O?G??_??A#239!51?_#237G???_?_?_?_?_?_?_O?GOCP?IDgOaS`A@qHOGo?QcBG?KOA_QG@c?AH_OA@GcA@OC`GC??T?gA?gQk@APcGC???G?A_G???O??@OcWC@IOc@W??K?S?_#56[BArrWe?@EW[pNNV~N?B^|Mw~ksovSW_#116?DgAOF{Ho#132!4?@UHCPI?@Bh{{ocwOgY#112??@?Q?Oc?O???_#114AAGP`CCAQg`S?oG_O#101@!4?oCQ@KiXe`HUhA]kiB@gWOCj_@_??_O?_#93??@?BACC??@AFRGBCICJ?C??@C@A@D@E?A?AO?AD??CB?@?@#77!5?_#103_#99@??A??SI@S?EKAA@C?C?AA#103!5?ORecAWCQ?@A@_?A#121!7?OGo_!8?GFTaKh_#127AD#116@QICjTn^I^LzUxlup}`[_gs$#239?~?Ti?@A?_???@???G#202!32?AG?C??A?PM_POAGdOAHcOAl?O!4?C??C#184!8?_#202!11?@#193@??C!11?A??O??@ACGO?C?_GCJ?G?\@I@C_DYDOiD?W`UiFsJKZSYLYuhe\It\b]eXeXeYdYdYeWeXeWeXe!4~?~?~TyVdQtmTYLuLYTMTYLuLIdR?G?i?O?HC?AGS??aC@C!5?A#202?_?G@c?AHcOI@GcA@OC`GCaGT?gA?g#192?gA?@?OC!5?G?A_G???O???OC??@G!6?C#239@#105@#38@!7?GO_??A!8?A@C?QBE?AcUlWOSh#128?@?N!4~{hCP?sgO_#126C?BCG?e?CCgO#119@??A?ED[WKW_#115D?C?A@G@SKATK_OG_#108A#72!7?B@EX]ahUh?OCgA@_GO?CI?OG?_??_???_???_#95@??GCfKrDxCy@AgAa?`AA?@?DGC?DH?A@@G#72G?_O??O?G?OG_?G?tiTSaUWRsDCJCIFcP??CAG#102?_???cp@?_#69?A!7?A?OI?CA#107!4?CZ_D#126??I??U[o#128AKdSIC_!7?AOHE@M@]PI$#237???i?Ti\qL~Yj}T~gVuJd}R|jSza|P~GeGdItAsHeSIOjSbWA_?RGgEOCI_PG?`S?GdOAHcOAH_SH_@OCG?sAhChEWbYdGTaSjUhUlQeWehQpMpMPiTiTjShWeCDySgPdIdYcZCq_TaOAS_Y`Y_?gD?gDAG@OG?O_?_?_??O?_#239!54?cB?_?o???@??C?C?C??@#252!13?O#202!32?aG?A_G?C?OA?@O!8?O??W?@#204?K#74AB#58WcGC!9?O_?O?_!8?G#129!5?A#140!4?A#141!5?A#125?QIc@Q_S?A#143?B?A?D#118!6?@?B@IBFBF\wti]wyogBOG_#102@BAEESy]bK??G#98!5?S??C@A@CGO@cJOR_DKaTJsQDiSiO[@hHUGo?_Oo?o?o?y[EGWCKGWOO`wTGBWoI\i?OeM\m^mN^EIFUK~TnI@_I@h??@_A?A??@?A#114!7?Ac?AggAT_URhgU@g@#112???O!6?I???@???O#125?BLWqG`#140pOIO?D_QCHCA?G?O_$#196!6?S?GA?_#246S???B_G_Y?C?Cj?K?E?aXvYPIkJqXHtfSiGf|ZhcvRxnxTM_RKIhtQIlsQJlOuJjuZijxTZJ|UZQxdSCYriLh?GQ_?hGAPCGEOC`KPaCGOaCBPiW@ADIO@O@@?PHCG?L_g@??C?DQ?O?O_S_C_#192!68?_#246IC@?QCW?GOg?a?bKilX{vupj\\duYZLsQNd{uRX{mjYUrXviiVT|VVDP}{mJrz~\vvt\TVr~nln}mnJbz}sfZmfNcRqIO#70C#37_#144cX#136CG!5?__??_#144G??~[_?o#52@?@G@?@BHAADHEwAs#127!7?__I?DIGO#121@??RDHQ`zVm}l}lWw___o#103???A??@?@??A`IASL_W_C`[A`GcO#100!7?O_@OOsEE?_??O#88!18?@#100!10?_O_?oO___???_!4?_??g_O!5?_#134??C#77!15?OO?o?O??G??O?`CXOH#115A?CUGgWHCS@gUOs@??A#114!6?@C@#132!9?_#52!7?_O#38?_#55?_#127!6?A@E@$#184!14?G!4?C??_A!5?_!7?@???_!4?C#193???C#244!9?C???A#193!13?C??A#184!44?O!5?G???O!4?AO?I@?_??C!4?G!72?O?g?_?a??A@OGO!8?C#196!63?O@?G_a#83G#142!5?f@RcGFAKo???_!5?A???G?g??O_?_#49!16?C#73?A??G#107!26?CC!9?G#99!23?B?CG?YbTICJLYTiTK`yQUguKoG??G?A?D?@@S@I?S?Mg]?ApkaCO_SQC#131@?A??@??@@??B#103!14?_#100!4?cpB?C#108!6?@#59G?@#119S!7?GFG[MCdBH?}Oc_???CW_\b#129!12?_$#192!16?S?@??@G?O??P?G?C???c?O?C?A?G?@O#240!14?a#196!69?_!6?Da!6?A??I@OgDA?@OJcRcJdQdHEXAtIa[`XeXeXdYdYdXfXeXfXeX!4?~?~?iDGQlIPIdQHQdIpIdQHQdY?kRC@CADA?HS`?G?@?A!5?@#193!65?_A#240_#96???O#165!6?WcIP#52?@#77!81?@?@@??@YdQ_S_#95!17?C#101!52?o??_O?_oOG_O?_O???_G?`_GGgOHpgWGC{zhvMG?HO#107!6?C#118?g?U@_??a``?GS~@nZO_OAq_$#239!143?C??O!4?A#192!87?C???O?A??G???A!4?_#103!308?Mw-#193~?~?TgO?AG???A?O???_??A??@??_A!6?O???G!4?_?O!5?OC?@#240???@#244???G!7?@#240G#252!5?_#193_#192?OC?AG?C??A??@g@QcGO?S_ChAGQcHQc@O?O`AcG`IOaCgAGQcG_G?i?IOAS@??GCHO?C?O?O?PG?A_@?CAG?C!7?G!22?_!7?_#246??O_O?OCO!4?C_GOGC_CI?`_QoloeP}tRKwtsUNjX]ypX^ji]BlcQNTuyJltuYJLtuYXkmvtlnJby{mNjz|\TVt|lnjyymjiy{ZVes}jNldv[Tf`W#239_O#56A_RFdiT_?@BADKd^V_Q`OOO`AGS]PA@Q#116???OhQDyJ?GO@?gC#127@AP?Q_GSGG#126A_PI?DcOgS_Q_!4?_#119@B@???ozo#103?A?GBGEOKBGoAIc?G@_C?O#100???@??@@??C@@OWAA?_?@?OO??O??GCQWKc_O@KSOG?S{YZWTRh?@?HDO?@?ABH?A@@???A??A#53!12?O?G#99!4?A#102???GG???O?OceACDD@DJHWCOg??_#112!4?G?_???_!5?@?G???A#125??O^ic#38!4?A@?O?A?OC?GS_$#237?S?i?TjUkR~tk\zekVyLTylO~g]tI\o^?j?@AcQ@?aTAGACB_SGB?_?gA?CAGDOA`OCQGCQG?QC_JOAGDOdWEhQl?lQ?I@y@yDYcgSiShUhUgZclRc`W`AdItItJSjShUlQsGsJSiTIsJS@HSJSHU@U?oCPiPIcA_LAkQcGTiOAGs?CG?GOG?GOG?GO??_?_?_?O_?g?_?O_COcGAC@Ga?H_AG`OA?a@oHO`K?K_COLOk@ICpEGBG?OC_CGE_?S@_?QH?_G@cOAG@CoAG@cAP?GAOcWDAP_S??A_G?A?O?C@?OC@AcGPI@S_OOG`IOKc#240L_#38C???O??T?K?_#144?A???BDCCDA??A#38??AGsGBsJgQ?g#128?c^vn}~Vx}Ti|CW_#73@!4?A!4?_#112?@???CO@G?AG?_#114?@!4?H_EoCPGAc_?_#59C#101?@QCAHQLQlSmz[mynyhsmaDWsSGgs`?ApK?q_O??_OOGgO!5_??!4_??}WUoiCy[wWOoSgwAXShOElOjOZhPzAKDCZPalUhSIDgDHAPprba`b`@#114?G@?oCQ?sA?A@??B??A@A#119?@?BwNYdAGKO_@ADYcXg#132F_#128TQXq#55??O!5?@#149?G!5?_$#239?j?Ti??@!7?@???A#184!5?O#252!9?O???G_???_?O!4?_OCA@?O?_#184!26?_#202!6?_!7?A#193!11?GA?C?O!7?@???@A@AO?C_@G_ASa?Oa?h?gAJ`AC_SGPGQ_P?HQ_?EXdBX`UdUDEtEdEtEdI|UH]hUZJJZCTYlJEXIHadWie@WeQL`EIHsLSAC_?A?@?B???A#202??_!5?OC_@?A_?S@_[AHcOA@COAG@COAG@cAP?GAO!9?A_G?A?O?C@?OC@#193!9?A!6?@#203A#14A_#58H_G#142GD_I\Ok\ioG_?Cg?h_?A`?i`ktId{Js@#129C#140!4?_#125!5?A?gCAhCSa@DO!4?_#143!9?G#118!5?N^}NCN~s]pGA??_#102?DNH`Z}cwWo_#98!6?A???@?A?D?c@GATG?EhGQc?Z?Q`?AB?DKQBGDSHA@?DAGS@A?A?AD??@?CI@???@?C@???A!5?@?B??G!4?@#107!9?GK?GG???AG???A_OgSgkKxSc_?G!9?@AGO_o#73!4?g#116??@A?KrkEB@@DEd_??BJFE`$#196!5?ACgPc?IO_C#192?A?D?G??g?C?G??G?@!4?A!4?A???A!5?_??A#193!43?@A?@#242!12?C#252?O#196!10?@!6?@!14?@!6?@?CA?G?CQ?GC`?A?CA@Y@iPIPIPIPITAHu@UHccSCRiDQcXaDQTGB?PKB?D_UG`SB??H?JC`?Q?G?A@#252!8?_??A?@#240!7?O??_G#252!6?_#192_!11?OC?@?O?C??A_G?A?O?C@?OC@?_G@??O!4?_G#184O#218?O#2G#144HOK#136?AO???A???@Q?gO?Q?IgSGt#52!9?E?lQDO#132!12?BB?Eal^gtGQHA#115!21?@?CPgePWO?O#77???@ADAK_kOgOC_O#99!10?A@AACH?C@@@CAhCA@GFA?@GFQJA@CCAGCA??@??@??ACCA@?EC#134?A#103?_!4?C?CACOao_!7?O_?o?gC?K[O?SCQ?di_Ag?O?DICADO??g??O#121!4?COdYkSO_!5?@EB#140???GcLrK@?OgUgOAO?T?C?HU$#246!12?@??GPg?OaDOF?A`AT_F_}S~mLHluVLg|V\hKNjt[NJpSkjXSqilSAjXcrhluK`ZTcntUYnIbxSDQzQl|t]CUCg@QDh?JQ?S`D?Q?GQKbIKGPAS?cHOAS_?G@U@_?@?_@?_iSa_?a?w?lCIk?C_PGS_O?@?@???c!4?_?_?_?_?_?_?_#184!22?C??_?G!7?a?O???C!9?G?@#202!71?I!4?A#24??@#20O#74A?o#165??I?__O?O#58!4?G?GA?DGS?@#49!28?G?O#121??C?vGQLVi^l^znuv^{s}O_#107!9?_?@??A?CO#72!6?@A@AB??@?COCQGOGa@G`S??Y_CA_IC?d?GD_?O?_!5?_!5?_??cGCOg?aC?g?_S?GaGE@GQLC@?Q??@??GCKDO`ABCADAA@#115!4?C?G??W?OG?Qgc??`@?Q?OE@WC_?O#126!6?O__!8?C#129!9?OgCgO_GA^agOoOG$#252!12?A#202!23?_O???O!5?_O?A???G?OCaHCOAhSCaHCQ?@qC_IO?G@#184!54?C?O?C??G??@??C?A!6?A!5?@?_?_APG?OG_#239!42?O!8?A??OQ?H?A#196!81?A???A#83?C#37?C#129!6?A#141!47?o#95!77?G!9?A#77!15?_!6?_!5?oC_OGo?_Ogc?k?kOIO_a?A?Sg_WOGsSaE??@A?A?@#118O?O!10?B??A@YDvM~{B???@BAKOe\IdW_O#52!9?gCA??G?@_???G$#239!173?AO#192!43?O!8?O?G?C???G!4?A?AG@_!4?C#95!237?@#103!79?B$#114!568?C-#193~_~_TI?AT?@?_G@C?O!9?O!4?G!4?G#218?O#192??GA@#193!6?@#218!9?@#240??I@!7?H#192!8?C?@??C?@???G??AC?DG@I?ACHAC?@AS@CHQGAGQchAGQcHO??GOCI?@?@AcGO?@OCGPAcg??AGAdG?GA?@A?g?@_??I!8?GA?CG??I!5?@?C!4?G@?ACGDA?OCP?GCA!4?A?I??C?A!4?@#252?G#240!7?O??G!6?G?CGA?O#252!5?G#193G#192!22?G!20?O?I?A!4?A#239?Ca#37AP#136@?Oko!6?@!4?@JA?@DI#52!4?_!4?ho_SHQG#140!4?O!6?_#132!4?@HNGEhco`gDqDOOo_??wC?o?O?_#115!4?DGA?C@GHcbHCq_G?O#101?@?A?A@NANCNANEAN|jNH|mA^jMJTNZKkykveqnZLf\FIMTjlRFQLAdA@Q@??LI?HAKJ?dQG?GOQ?A?@!9?@?BIDAT?JPCK!4?@#118O_oO???A?A_!9?Oioo_[ug!8?@ADJ{h#81C#116??@???@O`_o_?OQ@#130???O?O$#237?D?I_TYtit}lZdMitelqzkvjSjcjcjSb_qw`Q?dCA?qkaX_uG?CGQc_I?T?i_CPC_i??@IQH?QHC?HQ?icidahciDQ`S@OlacjdiTITicjcLQDQdiUHUlQKRkRSLRkRShOHShYdjAPaDYSgPadWTiTISGa_UlYDXALaadISH?R?ISI`?gQODYshewsgPSIP__Q?LodO?grgaTitiDAKPCZSicQG_aSISjSHE?JO?JCPAG?T?I??C@AO?I?C??S?A?G?@S??CA??D?CAg?PC?AGDOAG?QGCA?G?G!4?@!8?caOGAOcQcICI@?Q?FI?o#58Ka@#142E??@msJaucmun|icwhsi?Ti^~CqnqC#116ACZ`UlADyC_hqO_w_?OO#141???G#121???GQHCOBGDifIF^{pFHvNjMnWwgO!7?O#102!4?O??@JDM}iKAogO?O_OO??o_??oo??_??_#99!6?@#103!9?O!5?G?G_O?K?K?{o?OQCOo?o??O@@??@?A?@o`?aOJEQAKS_gsgQsgPpdB?ys@]A?l?G_OG?O?o_y_hO???@#114?@#119?@UDIH!4?@ACGCBU#140???C?G~sjOCITiD$#239?Y?TI!8?A!5?C#184???C#252??O??O?G!4?G_??_W?@!6?@???A!6?O!5?S!24?G#193??O!13?G???_???__!4?_!4?Ac_A!4?g?CG?`ACGA_a?g?@aGT_??__o_SGO`AcaChc`_GTE`di_B??A@Rc_`gCJcgaGAdiAC?L!4?w_aga_`?H?@CH?@#202!6?O?G?O??OS?IOOS@IOCI?S?IS@AG@SPCI?TAO?T?OAG?PC?AG@OAG?QGCA?GQ??S?OHOCHAPCY@CAOGA?CA!4?O?O#240???@G#35C#74AKk#56GRK???_??I@@?ACO@EIOtiT_??H#165?G#129?O#128???_?tyDz^ELnTEXfGfruCOC_?O#73???A!5?_!5?_???_#118OA??HRqt{yq{_o!4?CO#77!6?@?@A?D?I?D?GC?AS?A?OK_S?oao_o!4?OC?_oW_g?ogSQcocALY@M_qBCADLqGAsNYdFG?``?@@AA@!5?@@?B?DQHAL?Ei?O__#115?GC?CAADRG``P_O?I?@?_OJ?A@?A#121?@YtegA?@AC?Oo??y_#128?Y@E#52?ICI@???__A$#196!5?_dG?I?QC#246OoPIHO@CPGOjSJCZCjSFDE]dRIh\fDOKeZHvziclZLtiitTIieXTOnisdkuxcqjuclvTZPY[UZPyk]jufQLXOYOas_TXOQohqkW@Gq_?DPc@GAOc@GaCJQ`E_OOCkGo@ADiSGB???PAPTG@???ECOHSGO@QSGSP?PSiPCGO???O@ACA??CISGSOAGITS?SOgO?O?W@AG??@?hsZShs`Ciqx|cnvsimtfjitdnjislbttjysja|pu`mi`~ixlvaynxtVmiz|tuiltvldrx|vdvvj~numzu|mzd}zXLft|jHlPtpd}nl|woC#38@#20_#144O?_#129!5?CG#38@O#130O#144!5?C#38!8?ZCODzCJCI#125!10?I?CODG?HpeoOV_?QGCO_G#112??@!8?S@?C?O#114???A@DGACAGCQHG?q!5?_#72!6?@???@!5?CA@!4?CG?CBOCOGH?OCA?A?D?A!4?@!5?@??@!4?@@#114!6?A!5?G???`!4?C??G#108!8?AGO#107G??A!4?O!4?KNnJSDYSNNcSKKM_#126!4?OFL\AK?G#107A#149!12?CG!6?S?G?G$#192!18?AG?A#202!10?OG@??COA!4?O?C??COA??O?T?I?T?Ga?CO@IO@?E?COHQ?G!50?C!5?O?O#184!9?C!7?O?A?@!4?C!4?A!7?A?D#239!6?G?O???@#184???O!11?C???CAO!8?O@#252!24?@#193@#184!62?G#0!7?@#83G#145??Q#165@?B}PJOTG??GO?O??O#127!27?@AGA?K?I?A?_!6?O#119!15?@FFekG!8?O#107?A???C?O#108!9?O#100!4?H!7?@!8?B?@??H!7?@#114!6?O!8?o_#59!12?GA!5?G#111!20?C#114??_??cOicSMCA#112!8?_?@?AO@G?_#73??Oo_?_!6?@\#38!8?OCGSILsgqtiti{$#240!51?O#184!81?@#196?C?A!14?C!5?O!9?G!4?CA??G!4?SH!4?@CAP??A?@???@?A??@A??@!7?CA!103?O#126!61?@C?BGCA?OGCG?BM?QG#103!13?@?BCRGc_@NCoi`?TO|KS_w_?_goo?O!6?O??O#102!17?o!5?G??_?_o?K?G??_?c!4?G_usMC{{ss{EEMLNswg{o_O???_!4?AKRDAG@HH!9?C@?CA#125!15?A{?wo!5?A~_}p#129!4?A@A@??GBLADADB$#202!216?O#98!237?@!7?A#108!20?O#134!4?A#115!17?G??G??O#69!28?@#119?O#132!25?O??_$#107!510?OO?_#103!57?@\ \ No newline at end of file diff --git a/ruby/setup.rb b/ruby/setup.rb new file mode 100644 index 00000000..27429329 --- /dev/null +++ b/ruby/setup.rb @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby + +require "mkmf" +if have_header('sixel.h') and have_library('sixel') + create_makefile("Sixel") +end diff --git a/ruby/sixel.c b/ruby/sixel.c new file mode 100644 index 00000000..3d7d59d4 --- /dev/null +++ b/ruby/sixel.c @@ -0,0 +1,173 @@ +/* + * libsixel Ruby bindings + * + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.* + */ + +#include +#include + +static VALUE +get_version(VALUE self) +{ + return rb_str_new2(LIBSIXEL_VERSION); +} + + +static void +sixel_ruby_encoder_free(sixel_encoder_t *encoder) +{ + sixel_encoder_unref(encoder); +} + + +static VALUE +sixel_ruby_encoder_alloc(VALUE klass) +{ + sixel_encoder_t *encoder; + + encoder = sixel_encoder_create(); + return Data_Wrap_Struct(klass, NULL, sixel_ruby_encoder_free, encoder); +} + + +static VALUE +sixel_ruby_encoder_initialize(VALUE self) +{ + return Qnil; +} + + +static VALUE +sixel_ruby_encoder_setopt(VALUE self, VALUE option, VALUE optval) +{ + sixel_encoder_t *encoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_encoder_t, encoder); + + status = sixel_encoder_setopt(encoder, + *StringValueCStr(option), + StringValueCStr(optval)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_encoder_setopt() failed (%08d).", status); + } + + return Qnil; +} + + +static VALUE +sixel_ruby_encoder_encode(VALUE self, VALUE filename) +{ + sixel_encoder_t *encoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_encoder_t, encoder); + + status = sixel_encoder_encode(encoder, StringValueCStr(filename)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_encoder_encode() failed (%08d).", status); + } + + return Qnil; +} + + +static void +sixel_ruby_decoder_free(sixel_decoder_t *decoder) +{ + sixel_decoder_decode(decoder); +} + + +static VALUE +sixel_ruby_decoder_alloc(VALUE klass) +{ + sixel_decoder_t *decoder; + + decoder = sixel_decoder_create(); + return Data_Wrap_Struct(klass, NULL, sixel_ruby_decoder_free, decoder); +} + + +static VALUE +sixel_ruby_decoder_initialize(VALUE self) +{ + return Qnil; +} + + +static VALUE +sixel_ruby_decoder_setopt(VALUE self, VALUE option, VALUE optval) +{ + sixel_decoder_t *decoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_decoder_t, decoder); + + status = sixel_decoder_setopt(decoder, + *StringValueCStr(option), + StringValueCStr(optval)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_decoder_setopt() failed (%08d).", status); + } + + return Qnil; +} + + +static VALUE +sixel_ruby_decoder_decode(VALUE self) +{ + sixel_decoder_t *decoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_decoder_t, decoder); + + status = sixel_decoder_decode(decoder); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_decoder_decode() failed (%08d).", status); + } + + return Qnil; +} + + +void +Init_Sixel() +{ + VALUE mSixel = rb_define_module("Sixel"); + + rb_define_singleton_method(mSixel, "version", get_version, 0); + + VALUE encoder_class = rb_define_class("Encoder", rb_cObject); + rb_define_alloc_func(encoder_class, sixel_ruby_encoder_alloc); + rb_define_method(encoder_class, "initialize", sixel_ruby_encoder_initialize, 0); + rb_define_method(encoder_class, "setopt", sixel_ruby_encoder_setopt, 2); + rb_define_method(encoder_class, "encode", sixel_ruby_encoder_encode, 1); + + VALUE decoder_class = rb_define_class("Decoder", rb_cObject); + rb_define_method(decoder_class, "initialize", sixel_ruby_decoder_initialize, 0); + rb_define_method(decoder_class, "setopt", sixel_ruby_decoder_setopt, 2); + rb_define_method(decoder_class, "encode", sixel_ruby_decoder_decode, 0); +} + +/* EOF */ From 8d849b4d42dface6d0ccdfc961a51d0895d520f4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 15 Jun 2015 00:15:47 +0900 Subject: [PATCH 327/451] Supperss uninitialized warnings caused by MinGW gcc --- src/loader.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/loader.c b/src/loader.c index 5b820427..967bc2c1 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1448,15 +1448,24 @@ sixel_helper_load_image_file( { SIXELSTATUS status = SIXEL_FALSE; chunk_t chunk; + chunk.buffer = NULL; + chunk.size = chunk.max_size = 0; status = get_chunk(filename, &chunk, finsecure, cancel_flag); if (status != SIXEL_OK) { - return status; + goto end; } /* if input date is empty or 1 byte LF, ignore it and return successfully */ if (chunk.size == 0 || (chunk.size == 1 && *chunk.buffer == '\n')) { - return 0; + status = SIXEL_OK; + goto end; + } + + /* assertion */ + if (chunk.buffer == NULL || chunk.max_size == 0) { + status = SIXEL_LOGIC_ERROR; + goto end; } status = SIXEL_FALSE; From f569c7ae5ec6de8992cce0462d6cf63df7128a99 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 01:47:48 +0900 Subject: [PATCH 328/451] Introduce newv APIs for semantic error handling: - sixel_helper_set_additional_message() - sixel_helper_get_additional_message() - sixel_helper_format_error() --- Makefile.in | 4 +- configure | 1 + configure.ac | 1 + converters/img2sixel.c | 11 ++- include/sixel.h.in | 21 +++++- src/Makefile.am | 1 + src/Makefile.in | 12 ++- src/loader.c | 163 +++++++++++++++++++---------------------- 8 files changed, 119 insertions(+), 95 deletions(-) diff --git a/Makefile.in b/Makefile.in index d966ad45..40c907f2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub install-sh \ - ltmain.sh missing py-compile + ChangeLog NEWS compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/configure b/configure index 43261269..68478609 100755 --- a/configure +++ b/configure @@ -13609,6 +13609,7 @@ for ac_func in memcpy \ clearerr \ stat \ setjmp \ + strerror \ isatty do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/configure.ac b/configure.ac index 18dec34c..5eced85f 100644 --- a/configure.ac +++ b/configure.ac @@ -217,6 +217,7 @@ AC_CHECK_FUNCS([memcpy \ clearerr \ stat \ setjmp \ + strerror \ isatty]) # for HDR diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 07cc2535..be4deba5 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -357,7 +357,6 @@ main(int argc, char *argv[]) show_help(); status = SIXEL_OK; goto end; - goto end; default: status = sixel_encoder_setopt(encoder, n, optarg); if (SIXEL_FAILED(status)) { @@ -383,19 +382,19 @@ main(int argc, char *argv[]) #endif status = sixel_encoder_set_cancel_flag(encoder, &signaled); if (SIXEL_FAILED(status)) { - goto end; + goto error; } if (optind == argc) { status = sixel_encoder_encode(encoder, NULL); if (SIXEL_FAILED(status)) { - goto end; + goto error; } } else { for (n = optind; n < argc; n++) { status = sixel_encoder_encode(encoder, argv[n]); if (SIXEL_FAILED(status)) { - goto end; + goto error; } } } @@ -413,6 +412,10 @@ main(int argc, char *argv[]) " [-E encodepolicy] [-B bgcolor] [-o outfile] [filename ...]\n" "for more details, type: 'img2sixel -H'.\n"); +error: + fprintf(stderr, "%s\nreason: %s\n", + sixel_helper_get_additional_message(), + sixel_helper_format_error(status)); end: sixel_encoder_unref(encoder); return status; diff --git a/include/sixel.h.in b/include/sixel.h.in index 4df79b3e..07fcdacf 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -47,13 +47,18 @@ typedef int SIXELSTATUS; #define SIXEL_FEATURE_ERROR (SIXEL_FALSE | 0x0300) /* feature not enabled */ #define SIXEL_LIBC_ERROR (SIXEL_FALSE | 0x0400) /* errors caused by curl */ #define SIXEL_CURL_ERROR (SIXEL_FALSE | 0x0500) /* errors occures in libc functions */ +#define SIXEL_JPEG_ERROR (SIXEL_FALSE | 0x0600) /* errors occures in libjpeg functions */ +#define SIXEL_PNG_ERROR (SIXEL_FALSE | 0x0700) /* errors occures in libpng functions */ +#define SIXEL_GDK_ERROR (SIXEL_FALSE | 0x0800) /* errors occures in gdk functions */ +#define SIXEL_GD_ERROR (SIXEL_FALSE | 0x0900) /* errors occures in gd functions */ #define SIXEL_INTERRUPTED (SIXEL_OK | 0x0001) /* interrupted by a signal */ #define SIXEL_BAD_ALLOCATION (SIXEL_RUNTIME_ERROR | 0x0001) /* malloc() failed */ #define SIXEL_BAD_ARGUMENT (SIXEL_RUNTIME_ERROR | 0x0002) /* bad argument detected */ +#define SIXEL_BAD_INPUT (SIXEL_RUNTIME_ERROR | 0x0003) /* bad input detected */ -#define SIXEL_NOT_IMPLEMENTED (SIXEL_FEATURE_ERROR | 0x0001) /* bad argument detected */ +#define SIXEL_NOT_IMPLEMENTED (SIXEL_FEATURE_ERROR | 0x0001) /* feature not implemented */ #define SIXEL_SUCCEEDED(status) (((status) & 0x1000) == 0) #define SIXEL_FAILED(status) (((status) & 0x1000) != 0) @@ -502,6 +507,20 @@ sixel_decode( extern "C" { #endif +SIXELAPI void +sixel_helper_set_additional_message( + const char /* in */ *message /* error message */ +); + +SIXELAPI char const * +sixel_helper_get_additional_message(void); + +/* convert error status code int formatted string */ +SIXELAPI char const * +sixel_helper_format_error( + SIXELSTATUS /* in */ status /* status code */ +); + /* compute pixel depth from pixelformat */ SIXELAPI SIXELSTATUS sixel_helper_compute_depth( diff --git a/src/Makefile.am b/src/Makefile.am index 7c792fc9..329ff960 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -34,6 +34,7 @@ libsixel_la_SOURCES = \ writer.h \ stb_image_write.c \ stb_image_write.h \ + status.c \ rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ diff --git a/src/Makefile.in b/src/Makefile.in index e88dafa8..d264fb3a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -144,7 +144,8 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-scale.lo libsixel_la-loader.lo \ libsixel_la-frompnm.lo libsixel_la-fromgif.lo \ libsixel_la-encoder.lo libsixel_la-decoder.lo \ - libsixel_la-writer.lo libsixel_la-stb_image_write.lo + libsixel_la-writer.lo libsixel_la-stb_image_write.lo \ + libsixel_la-status.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -405,6 +406,7 @@ libsixel_la_SOURCES = \ writer.h \ stb_image_write.c \ stb_image_write.h \ + status.c \ rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ @@ -534,6 +536,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-pixelformat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-quant.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-scale.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-status.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-stb_image_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-tosixel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-writer.Plo@am__quote@ @@ -665,6 +668,13 @@ libsixel_la-stb_image_write.lo: stb_image_write.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-stb_image_write.lo `test -f 'stb_image_write.c' || echo '$(srcdir)/'`stb_image_write.c +libsixel_la-status.lo: status.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-status.lo -MD -MP -MF $(DEPDIR)/libsixel_la-status.Tpo -c -o libsixel_la-status.lo `test -f 'status.c' || echo '$(srcdir)/'`status.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-status.Tpo $(DEPDIR)/libsixel_la-status.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='status.c' object='libsixel_la-status.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-status.lo `test -f 'status.c' || echo '$(srcdir)/'`status.c + tests-tests.o: tests.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_CPPFLAGS) $(CPPFLAGS) $(tests_CFLAGS) $(CFLAGS) -MT tests-tests.o -MD -MP -MF $(DEPDIR)/tests-tests.Tpo -c -o tests-tests.o `test -f 'tests.c' || echo '$(srcdir)/'`tests.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tests-tests.Tpo $(DEPDIR)/tests-tests.Po diff --git a/src/loader.c b/src/loader.c index 967bc2c1..55bd462d 100644 --- a/src/loader.c +++ b/src/loader.c @@ -177,6 +177,7 @@ static SIXELSTATUS open_binary_file(FILE **f, char const *filename) { SIXELSTATUS status = SIXEL_FALSE; + char buffer[1024]; #if HAVE_STAT struct stat sb; #endif /* HAVE_STAT */ @@ -199,26 +200,26 @@ open_binary_file(FILE **f, char const *filename) #if HAVE_STAT if (stat(filename, &sb) != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); -# if HAVE_ERRNO_H - fprintf(stderr, "stat(%s) failed.\n" "reason: %s.\n", - filename, strerror(errno)); -# endif /* HAVE_ERRNO_H */ + if (sprintf(buffer, "stat('%s') failed.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } goto end; } if ((sb.st_mode & S_IFMT) == S_IFDIR) { - fprintf(stderr, "'%s' is directory.\n", filename); - status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + status = SIXEL_BAD_INPUT; + if (sprintf(buffer, "'%s' is directory.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } goto end; } #endif /* HAVE_STAT */ *f = fopen(filename, "rb"); if (!*f) { -#if HAVE_ERRNO_H - fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", - filename, strerror(errno)); -#endif /* HAVE_ERRNO_H */ status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + if (sprintf(buffer, "fopen('%s') failed.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } goto end; } @@ -247,11 +248,8 @@ get_chunk_from_file( chunk_init(pchunk, 64 * 1024); if (pchunk->buffer == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "get_chunk_from_file('%s'): malloc failed.\n" - "reason: %s.\n", - filename, strerror(errno)); -#endif /* HAVE_ERRNO_H */ + sixel_helper_set_additional_message( + "get_chunk_from_file: malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -262,11 +260,8 @@ get_chunk_from_file( pchunk->buffer = (unsigned char *)realloc(pchunk->buffer, pchunk->max_size); if (pchunk->buffer == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "get_chunk_from_file('%s'): relloc failed.\n" - "reason: %s.\n", - filename, strerror(errno)); -#endif /* HAVE_ERRNO_H */ + sixel_helper_set_additional_message( + "get_chunk_from_file: realloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -317,14 +312,12 @@ get_chunk_from_url( # ifdef HAVE_LIBCURL CURL *curl; CURLcode code; + char buffer[1024]; chunk_init(pchunk, 1024); if (pchunk->buffer == NULL) { -# if HAVE_ERRNO_H - fprintf(stderr, "get_chunk_from_url('%s'): malloc failed.\n" - "reason: %s.\n", - url, strerror(errno)); -# endif /* HAVE_ERRNO_H */ + sixel_helper_set_additional_message( + "get_chunk_from_url: malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -339,10 +332,11 @@ get_chunk_from_url( curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)pchunk); code = curl_easy_perform(curl); if (code != CURLE_OK) { - fprintf(stderr, "curl_easy_perform('%s') failed.\n" "code: %d.\n", - url, code); - curl_easy_cleanup(curl); status = SIXEL_CURL_ERROR & (code & 0xff); + if (sprintf(buffer, "curl_easy_perform('%s') failed.", url) != EOF) { + sixel_helper_set_additional_message(buffer); + } + curl_easy_cleanup(curl); goto end; } curl_easy_cleanup(curl); @@ -352,9 +346,10 @@ get_chunk_from_url( (void) url; (void) pchunk; (void) finsecure; - fprintf(stderr, "To specify URI schemes, you have to " - "configure this program with --with-libcurl " - "option at compile time.\n"); + sixel_helper_set_additional_message( + "To specify URI schemes, you have to " + "configure this program with --with-libcurl " + "option at compile time.\n"); status = SIXEL_NOT_IMPLEMENTED; goto end; # endif /* HAVE_LIBCURL */ @@ -366,15 +361,16 @@ get_chunk_from_url( # if HAVE_JPEG /* import from @uobikiemukot's sdump loader.h */ -static unsigned char * -load_jpeg(unsigned char *data, +static SIXELSTATUS +load_jpeg(unsigned char **result, + unsigned char *data, int datasize, int *pwidth, int *pheight, int *ppixelformat) { + SIXELSTATUS status = SIXEL_FALSE; int row_stride, size; - unsigned char *result = NULL; JSAMPARRAY buffer; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr pub; @@ -391,7 +387,9 @@ load_jpeg(unsigned char *data, jpeg_start_decompress(&cinfo); if (cinfo.output_components != 3) { - fprintf(stderr, "load_jpeg() failed(unknown format).\n"); + sixel_helper_set_additional_message( + "load_jpeg: malloc() failed (unknown format)."); + status = SIXEL_BAD_INPUT; goto end; } @@ -400,12 +398,11 @@ load_jpeg(unsigned char *data, *pheight = cinfo.output_height; size = *pwidth * *pheight * cinfo.output_components; - result = (unsigned char *)malloc(size); - if (result == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "load_jpeg() failed.\n" "reason: %s.\n", - strerror(errno)); -#endif /* HAVE_ERRNO_H */ + *result = (unsigned char *)malloc(size); + if (*result == NULL) { + sixel_helper_set_additional_message( + "load_jpeg: malloc() failed."); + status = SIXEL_BAD_ALLOCATION; goto end; } @@ -414,14 +411,14 @@ load_jpeg(unsigned char *data, while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, buffer, 1); - memcpy(result + (cinfo.output_scanline - 1) * row_stride, buffer[0], row_stride); + memcpy(*result + (cinfo.output_scanline - 1) * row_stride, buffer[0], row_stride); } end: jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); - return result; + return status; } # endif /* HAVE_JPEG */ @@ -764,8 +761,9 @@ load_png(unsigned char *buffer, # endif /* HAVE_PNG */ -static unsigned char * -load_sixel(unsigned char *buffer, +static SIXELSTATUS +load_sixel(unsigned char **result, + unsigned char *buffer, int size, int *psx, int *psy, @@ -774,38 +772,33 @@ load_sixel(unsigned char *buffer, int reqcolors, int *ppixelformat) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *p = NULL; - unsigned char *pixels = NULL; unsigned char *palette = NULL; int colors; int i; - int ret; /* sixel */ - ret = sixel_decode(buffer, size, - &p, psx, psy, - &palette, &colors, malloc); - if (ret != 0) { -#if HAVE_ERRNO_H - fprintf(stderr, "sixel_decode failed.\n" "reason: %s.\n", - strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return NULL; + status = sixel_decode(buffer, size, + &p, psx, psy, + &palette, &colors, malloc); + if (SIXEL_FAILED(status)) { + return status; } if (ppalette == NULL || colors > reqcolors) { *ppixelformat = SIXEL_PIXELFORMAT_RGB888; - pixels = malloc(*psx * *psy * 3); - if (pixels == NULL) { + *result = malloc(*psx * *psy * 3); + if (*result == NULL) { goto cleanup; } for (i = 0; i < *psx * *psy; ++i) { - pixels[i * 3 + 0] = palette[p[i] * 3 + 0]; - pixels[i * 3 + 1] = palette[p[i] * 3 + 1]; - pixels[i * 3 + 2] = palette[p[i] * 3 + 2]; + (*result)[i * 3 + 0] = palette[p[i] * 3 + 0]; + (*result)[i * 3 + 1] = palette[p[i] * 3 + 1]; + (*result)[i * 3 + 2] = palette[p[i] * 3 + 2]; } } else { *ppixelformat = SIXEL_PIXELFORMAT_PAL8; - pixels = p; + *result = p; *ppalette = palette; *pncolors = colors; p = NULL; @@ -816,7 +809,7 @@ load_sixel(unsigned char *buffer, free(palette); free(p); - return pixels; + return status; } @@ -957,15 +950,16 @@ load_with_builtin( status = SIXEL_BAD_ALLOCATION; goto error; } - frame->pixels = load_sixel(pchunk->buffer, - pchunk->size, - &frame->width, - &frame->height, - fuse_palette ? &frame->palette: NULL, - &frame->ncolors, - reqcolors, - &frame->pixelformat); - if (frame->pixels == NULL) { + status = load_sixel(&frame->pixels, + pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + fuse_palette ? &frame->palette: NULL, + &frame->ncolors, + reqcolors, + &frame->pixelformat); + if (SIXEL_FAILED(status)) { goto error; } } else if (chunk_is_pnm(pchunk)) { @@ -983,10 +977,8 @@ load_with_builtin( &frame->ncolors, &frame->pixelformat); if (!frame->pixels) { -#if HAVE_ERRNO_H - fprintf(stderr, "load_pnm failed.\n" "reason: %s.\n", - strerror(errno)); -#endif /* HAVE_ERRNO_H */ + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message("load_pnm() failed."); goto error; } } @@ -997,12 +989,13 @@ load_with_builtin( status = SIXEL_BAD_ALLOCATION; goto error; } - frame->pixels = load_jpeg(pchunk->buffer, - pchunk->size, - &frame->width, - &frame->height, - &frame->pixelformat); - if (frame->pixels == NULL) { + status = load_jpeg(&frame->pixels, + pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + &frame->pixelformat); + if (SIXEL_FAILED(status)) { goto error; } } @@ -1407,12 +1400,8 @@ load_with_gd( frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; p = frame->pixels = malloc(frame->width * frame->height * 3); if (frame->pixels == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "load_with_gd failed.\n" "reason: %s.\n", - strerror(errno)); -#endif /* HAVE_ERRNO_H */ gdImageDestroy(im); - return SIXEL_FALSE; + return SIXEL_BAD_ALLOCATION; } for (y = 0; y < frame->height; y++) { for (x = 0; x < frame->width; x++) { From dbe557eb2d27143cd8ee6513ddd5b1e81a8ba234 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 02:15:05 +0900 Subject: [PATCH 329/451] Improve error handling --- converters/img2sixel.c | 3 -- include/sixel.h.in | 2 ++ src/decoder.c | 32 +++++++++--------- src/encoder.c | 2 +- src/loader.c | 2 +- src/writer.c | 77 +++++++++++++++++++++++------------------- 6 files changed, 62 insertions(+), 56 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index be4deba5..62dc43b9 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -42,9 +42,6 @@ #if HAVE_INTTYPES_H # include #endif -#if HAVE_ERRNO_H -# include -#endif #if HAVE_SIGNAL_H # include #endif diff --git a/include/sixel.h.in b/include/sixel.h.in index 07fcdacf..ccc87f03 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -51,6 +51,8 @@ typedef int SIXELSTATUS; #define SIXEL_PNG_ERROR (SIXEL_FALSE | 0x0700) /* errors occures in libpng functions */ #define SIXEL_GDK_ERROR (SIXEL_FALSE | 0x0800) /* errors occures in gdk functions */ #define SIXEL_GD_ERROR (SIXEL_FALSE | 0x0900) /* errors occures in gd functions */ +#define SIXEL_STBI_ERROR (SIXEL_FALSE | 0x0a00) /* errors occures in stb_image functions */ +#define SIXEL_STBIW_ERROR (SIXEL_FALSE | 0x0b00) /* errors occures in stb_image_write functions */ #define SIXEL_INTERRUPTED (SIXEL_OK | 0x0001) /* interrupted by a signal */ diff --git a/src/decoder.c b/src/decoder.c index 45a168fb..5499055c 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -179,6 +179,7 @@ sixel_decoder_decode( unsigned char *palette; int ncolors; unsigned char *pixels = NULL; + char buffer[1024]; if (strcmp(decoder->input, "-") == 0) { /* for windows */ @@ -193,11 +194,11 @@ sixel_decoder_decode( } else { input_fp = fopen(decoder->input, "rb"); if (!input_fp) { -#if HAVE_ERRNO_H - fprintf(stderr, "fopen('%s') failed.\n" "reason: %s.\n", - decoder->input, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + if (sprintf(buffer, "fopen('%s') failed.", decoder->input) != EOF) { + sixel_helper_set_additional_message(buffer); + } + goto end; } } @@ -205,23 +206,22 @@ sixel_decoder_decode( max = 64 * 1024; if ((raw_data = (unsigned char *)malloc(max)) == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "malloc(%d) failed.\n" "reason: %s.\n", - max, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); + status = SIXEL_BAD_ALLOCATION; + if (sprintf(buffer, "malloc(%d) failed.", max) != EOF) { + sixel_helper_set_additional_message(buffer); + } + goto end; } for (;;) { if ((max - raw_len) < 4096) { max *= 2; if ((raw_data = (unsigned char *)realloc(raw_data, max)) == NULL) { -#if HAVE_ERRNO_H - fprintf(stderr, "realloc(raw_data, %d) failed.\n" - "reason: %s.\n", - max, strerror(errno)); -#endif /* HAVE_ERRNO_H */ - return (-1); + status = SIXEL_BAD_ALLOCATION; + if (sprintf(buffer, "realloc(raw_data, %d) failed.", max) != EOF) { + sixel_helper_set_additional_message(buffer); + } + goto end; } } if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) diff --git a/src/encoder.c b/src/encoder.c index b9a84d4a..4335f09c 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -365,7 +365,7 @@ prepare_specified_palette( int finsecure, int const *cancel_flag) { - int status = SIXEL_FALSE; + SIXELSTATUS status = SIXEL_FALSE; sixel_callback_context_for_mapfile_t callback_context; diff --git a/src/loader.c b/src/loader.c index 55bd462d..3dc3439a 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1098,6 +1098,7 @@ load_with_gdkpixbuf( void /* in/out */ *context /* private data for callback */ ) { + SIXELSTATUS status = SIXEL_FALSE; GdkPixbuf *pixbuf; GdkPixbufAnimation *animation; GdkPixbufLoader *loader; @@ -1107,7 +1108,6 @@ load_with_gdkpixbuf( #endif sixel_frame_t *frame; int stride; - int status = SIXEL_FALSE; unsigned char *p; int i; int depth; diff --git a/src/writer.c b/src/writer.c index 6ac0b4b7..19671430 100644 --- a/src/writer.c +++ b/src/writer.c @@ -29,6 +29,10 @@ # include #endif +#if HAVE_ERRNO_H +# include +#endif + #if HAVE_LIBPNG # include #else @@ -56,7 +60,7 @@ stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len); #endif -static int +static SIXELSTATUS write_png_to_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ @@ -65,7 +69,7 @@ write_png_to_file( int /* in */ pixelformat, /* source pixelFormat */ char const /* in */ *filename) /* destination filename */ { - int ret = 0; + SIXELSTATUS status = SIXEL_FALSE; FILE *output_fp = NULL; unsigned char *pixels = NULL; unsigned char *new_pixels = NULL; @@ -82,6 +86,7 @@ write_png_to_file( int i; unsigned char *src; unsigned char *dst; + char buffer[1024]; switch (pixelformat) { case SIXEL_PIXELFORMAT_PAL1: @@ -90,12 +95,12 @@ write_png_to_file( new_pixels = malloc(width * height * 4); src = new_pixels + width * height * 3; dst = pixels = new_pixels; - ret = sixel_helper_normalize_pixelformat(src, - &pixelformat, - data, - pixelformat, - width, height); - if (ret != 0) { + status = sixel_helper_normalize_pixelformat(src, + &pixelformat, + data, + pixelformat, + width, height); + if (SIXEL_FAILED(status)) { goto end; } for (i = 0; i < width * height; ++i, ++src) { @@ -127,12 +132,12 @@ write_png_to_file( case SIXEL_PIXELFORMAT_RGBA8888: case SIXEL_PIXELFORMAT_ARGB8888: pixels = new_pixels = malloc(width * height * 3); - ret = sixel_helper_normalize_pixelformat(pixels, - &pixelformat, - data, - pixelformat, - width, height); - if (ret != 0) { + status = sixel_helper_normalize_pixelformat(pixels, + &pixelformat, + data, + pixelformat, + width, height); + if (SIXEL_FAILED(status)) { goto end; } break; @@ -150,10 +155,10 @@ write_png_to_file( } else { output_fp = fopen(filename, "wb"); if (!output_fp) { -#if HAVE_ERRNO_H - perror("fopen() failed."); -#endif /* HAVE_ERRNO_H */ - ret = -1; + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + if (sprintf(buffer, "fopen('%s') failed.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } goto end; } } @@ -165,17 +170,20 @@ write_png_to_file( } png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { - ret = (-1); + status = SIXEL_PNG_ERROR; + /* TODO: get error message */ goto end; } info_ptr = png_create_info_struct(png_ptr); if (!png_ptr) { - ret = (-1); + status = SIXEL_PNG_ERROR; + /* TODO: get error message */ goto end; } # if USE_SETJMP && HAVE_SETJMP if (setjmp(png_jmpbuf(png_ptr))) { - ret = (-1); + status = SIXEL_PNG_ERROR; + /* TODO: get error message */ goto end; } # endif @@ -191,20 +199,19 @@ write_png_to_file( width, height, /* STBI_rgb */ 3, &png_len); if (!png_data) { - fprintf(stderr, "stbi_write_png_to_mem failed.\n"); + status = SIXEL_STBI_ERROR; + sixel_helper_set_additional_message(stbi_failure_reason()); goto end; } write_len = fwrite(png_data, 1, png_len, output_fp); if (write_len < 0) { -# if HAVE_ERRNO_H - perror("fwrite failed."); -# endif /* HAVE_ERRNO_H */ - ret = -1; + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message("fwrite() failed."); goto end; } #endif /* HAVE_LIBPNG */ - ret = 0; + status = SIXEL_OK; end: if (output_fp && output_fp != stdout) { @@ -212,17 +219,17 @@ write_png_to_file( } #if HAVE_LIBPNG free(rows); - png_destroy_write_struct (&png_ptr, &info_ptr); + png_destroy_write_struct(&png_ptr, &info_ptr); #else free(png_data); #endif /* HAVE_LIBPNG */ free(new_pixels); - return ret; + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_write_image_file( unsigned char /* in */ *data, /* source pixel data */ int /* in */ width, /* source data width */ @@ -232,12 +239,12 @@ sixel_helper_write_image_file( char const /* in */ *filename, /* destination filename */ int /* in */ imageformat) /* destination imageformat */ { - int nret = (-1); + SIXELSTATUS status = SIXEL_FALSE; switch (imageformat) { case SIXEL_FORMAT_PNG: - nret = write_png_to_file(data, width, height, palette, - pixelformat, filename); + status = write_png_to_file(data, width, height, palette, + pixelformat, filename); break; case SIXEL_FORMAT_GIF: case SIXEL_FORMAT_BMP: @@ -251,11 +258,11 @@ sixel_helper_write_image_file( case SIXEL_FORMAT_PSD: case SIXEL_FORMAT_HDR: default: - nret = (-1); + status = SIXEL_NOT_IMPLEMENTED; break; } - return nret; + return status; } From 0788f8e2e6a05b90845e6455988139ea70367443 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 02:17:39 +0900 Subject: [PATCH 330/451] Add missing file: src/status.c --- src/status.c | 203 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 src/status.c diff --git a/src/status.c b/src/status.c new file mode 100644 index 00000000..1aeb4f5d --- /dev/null +++ b/src/status.c @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include + +#include + +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_ERRNO_H +# include +#endif +#ifdef HAVE_LIBCURL +# include +#endif + +static char g_buffer[1024] = { 0x0 }; + +SIXELAPI void +sixel_helper_set_additional_message( + const char /* in */ *message /* error message */ +) +{ + size_t len; + + len = strlen(message); + memcpy(g_buffer, message, len < sizeof(g_buffer) ? len: sizeof(g_buffer) - 1); + g_buffer[sizeof(g_buffer) - 1] = 0; +} + + +SIXELAPI char const * +sixel_helper_get_additional_message(void) +{ + return g_buffer; +} + + +/* convert error status code int formatted string */ +SIXELAPI char const * +sixel_helper_format_error( + SIXELSTATUS /* in */ status /* status code */ +) +{ + static char buffer[1024]; + char const *error_string; + char *p; + size_t len; + + switch (status & 0x1000) { + case SIXEL_OK: + switch (status) { + case SIXEL_INTERRUPTED: + error_string = "interrupted by a signal"; + break; + case SIXEL_OK: + default: + error_string = "succeeded"; + break; + } + break; + case SIXEL_FALSE: + switch (status & 0x1f00) { + case SIXEL_RUNTIME_ERROR: + switch (status) { + case SIXEL_BAD_ALLOCATION: + error_string = "runtime error: bad allocation error"; + break; + case SIXEL_BAD_ARGUMENT: + error_string = "runtime error: bad argument detected"; + break; + case SIXEL_BAD_INPUT: + error_string = "runtime error: bad input detected"; + break; + default: + error_string = "runtime error"; + break; + } + break; + case SIXEL_LOGIC_ERROR: + error_string = "logic error"; + break; + case SIXEL_FEATURE_ERROR: + switch (status) { + case SIXEL_NOT_IMPLEMENTED: + error_string = "feature error: not implemented"; + break; + default: + error_string = "feature error"; + break; + } + break; + case SIXEL_LIBC_ERROR: + p = strerror(errno); + len = strlen(p) + 1; + memcpy(buffer, p, len < sizeof(buffer) ? len: sizeof(buffer) - 1); + buffer[sizeof(buffer) - 1] = 0; + free((char *)p); + error_string = buffer; + break; +#ifdef HAVE_LIBCURL + case SIXEL_CURL_ERROR: + error_string = curl_easy_strerror(status & 0xff); + break; +#endif + case SIXEL_JPEG_ERROR: + error_string = "jpeg error"; + break; + case SIXEL_PNG_ERROR: + error_string = "png error"; + break; + case SIXEL_GDK_ERROR: + error_string = "gdk error"; + break; + case SIXEL_GD_ERROR: + error_string = "gd error"; + break; + case SIXEL_STBI_ERROR: + error_string = "stb_image error"; + break; + case SIXEL_STBIW_ERROR: + error_string = "stb_image_write error"; + break; + default: + error_string = "unknown error"; + break; + } + break; + default: + error_string = "unknown error"; + break; + } + return error_string; +} + + +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + + if (strcmp(sixel_helper_format_error(SIXEL_OK), "succeeded") == 0) { + goto error; + } + return EXIT_SUCCESS; +error: + perror("test1"); + return nret; +} + + +int +sixel_status_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From 3e115dc443cfcbb1c83f6d0575697cf665b4fb2b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 02:19:55 +0900 Subject: [PATCH 331/451] Minor fix --- ruby/sixel.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 ruby/sixel.c diff --git a/ruby/sixel.c b/ruby/sixel.c new file mode 100644 index 00000000..c2c6db6f --- /dev/null +++ b/ruby/sixel.c @@ -0,0 +1,175 @@ +/* + * libsixel Ruby bindings + * + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.* + */ + +#include +#include + +static VALUE +get_version(VALUE self) +{ + return rb_str_new2(LIBSIXEL_VERSION); +} + + +static void +sixel_ruby_encoder_free(sixel_encoder_t *encoder) +{ + sixel_encoder_unref(encoder); +} + + +static VALUE +sixel_ruby_encoder_alloc(VALUE klass) +{ + sixel_encoder_t *encoder; + + encoder = sixel_encoder_create(); + return Data_Wrap_Struct(klass, NULL, sixel_ruby_encoder_free, encoder); +} + + +static VALUE +sixel_ruby_encoder_initialize(VALUE self) +{ + return Qnil; +} + + +static VALUE +sixel_ruby_encoder_setopt(VALUE self, VALUE option, VALUE optval) +{ + sixel_encoder_t *encoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_encoder_t, encoder); + + status = sixel_encoder_setopt(encoder, + *StringValueCStr(option), + StringValueCStr(optval)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_encoder_setopt() failed (%08d).", status); + } + + return Qnil; +} + + +static VALUE +sixel_ruby_encoder_encode(VALUE self, VALUE filename) +{ + sixel_encoder_t *encoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_encoder_t, encoder); + + status = sixel_encoder_encode(encoder, StringValueCStr(filename)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_encoder_encode() failed (%08d).", status); + } + + return Qnil; +} + + +static void +sixel_ruby_decoder_free(sixel_decoder_t *decoder) +{ + sixel_decoder_decode(decoder); +} + + +static VALUE +sixel_ruby_decoder_alloc(VALUE klass) +{ + sixel_decoder_t *decoder; + + decoder = sixel_decoder_create(); + return Data_Wrap_Struct(klass, NULL, sixel_ruby_decoder_free, decoder); +} + + +static VALUE +sixel_ruby_decoder_initialize(VALUE self) +{ + return Qnil; +} + + +static VALUE +sixel_ruby_decoder_setopt(VALUE self, VALUE option, VALUE optval) +{ + sixel_decoder_t *decoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_decoder_t, decoder); + + status = sixel_decoder_setopt(decoder, + *StringValueCStr(option), + StringValueCStr(optval)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_decoder_setopt() failed (%08d).", status); + } + + return Qnil; +} + + +static VALUE +sixel_ruby_decoder_decode(VALUE self) +{ + sixel_decoder_t *decoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_decoder_t, decoder); + + status = sixel_decoder_decode(decoder); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, "sixel_decoder_decode() failed (%08d).", status); + } + + return Qnil; +} + + +void +Init_Sixel() +{ + VALUE mSixel = rb_define_module("Sixel"); + + rb_define_singleton_method(mSixel, "version", get_version, 0); + + VALUE encoder_class = rb_define_class("Encoder", rb_cObject); + rb_define_alloc_func(encoder_class, sixel_ruby_encoder_alloc); + rb_define_method(encoder_class, "initialize", sixel_ruby_encoder_initialize, 0); + rb_define_method(encoder_class, "setopt", sixel_ruby_encoder_setopt, 2); + rb_define_method(encoder_class, "encode", sixel_ruby_encoder_encode, 1); + + VALUE decoder_class = rb_define_class("Decoder", rb_cObject); + rb_define_method(decoder_class, "initialize", sixel_ruby_decoder_initialize, 0); + rb_define_method(decoder_class, "setopt", sixel_ruby_decoder_setopt, 2); + rb_define_method(decoder_class, "encode", sixel_ruby_decoder_decode, 0); +} + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ From c752cda02b9c97f2482af77daf415abeb7ea74f6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 02:45:10 +0900 Subject: [PATCH 332/451] Update NEWS --- NEWS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NEWS b/NEWS index b6d243fe..7e2af8e3 100644 --- a/NEWS +++ b/NEWS @@ -44,6 +44,11 @@ sixel_decoder_setopt() sixel_decoder_decode() +* core: Introduce newv APIs for semantic error handling: + sixel_helper_set_additional_message() + sixel_helper_get_additional_message() + sixel_helper_format_error() + * core: Improve processing quality of loading paletted PNG images. * core: Improve processing quality and performance of loading GIF images. @@ -58,6 +63,8 @@ * Add PHP interface +* Add new build helper program: libsixel-config + * A lot of bug fixes and minor improvements. Thanks to @msmhrt, @ttdoda, and @msmhrt. From f5a575708d14d4c3dea4396b73dc75c7f3dcb56c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 02:50:57 +0900 Subject: [PATCH 333/451] ruby: show detailed error messages --- ruby/sixel.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/ruby/sixel.c b/ruby/sixel.c index 3d7d59d4..c3b515a0 100644 --- a/ruby/sixel.c +++ b/ruby/sixel.c @@ -67,7 +67,10 @@ sixel_ruby_encoder_setopt(VALUE self, VALUE option, VALUE optval) *StringValueCStr(option), StringValueCStr(optval)); if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, "sixel_encoder_setopt() failed (%08d).", status); + rb_raise(rb_eRuntimeError, + "sixel_encoder_setopt() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); } return Qnil; @@ -84,7 +87,10 @@ sixel_ruby_encoder_encode(VALUE self, VALUE filename) status = sixel_encoder_encode(encoder, StringValueCStr(filename)); if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, "sixel_encoder_encode() failed (%08d).", status); + rb_raise(rb_eRuntimeError, + "sixel_encoder_encode() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); } return Qnil; @@ -127,7 +133,10 @@ sixel_ruby_decoder_setopt(VALUE self, VALUE option, VALUE optval) *StringValueCStr(option), StringValueCStr(optval)); if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, "sixel_decoder_setopt() failed (%08d).", status); + rb_raise(rb_eRuntimeError, + "sixel_decoder_setopt() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); } return Qnil; @@ -144,7 +153,10 @@ sixel_ruby_decoder_decode(VALUE self) status = sixel_decoder_decode(decoder); if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, "sixel_decoder_decode() failed (%08d).", status); + rb_raise(rb_eRuntimeError, + "sixel_decoder_decode() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); } return Qnil; From 4fe7a957d0d70318aabf9c45085c842ed90f747b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 02:53:09 +0900 Subject: [PATCH 334/451] Update README --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 7e2af8e3..a707d372 100644 --- a/NEWS +++ b/NEWS @@ -63,6 +63,8 @@ * Add PHP interface +* Add Ruby interface + * Add new build helper program: libsixel-config * A lot of bug fixes and minor improvements. From 0c7e66d6861ee999c1e4577f119158bf6759aa5b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 16 Jun 2015 03:07:41 +0900 Subject: [PATCH 335/451] Fix build error caused by calling undeclared function --- src/writer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/writer.c b/src/writer.c index 19671430..d372ac35 100644 --- a/src/writer.c +++ b/src/writer.c @@ -198,9 +198,9 @@ write_png_to_file( png_data = stbi_write_png_to_mem(pixels, width * 3, width, height, /* STBI_rgb */ 3, &png_len); - if (!png_data) { - status = SIXEL_STBI_ERROR; - sixel_helper_set_additional_message(stbi_failure_reason()); + if (png_data == NULL) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message("stbi_write_png_to_mem() failed."); goto end; } write_len = fwrite(png_data, 1, png_len, output_fp); From 9d2010449fd49fb806900b9bef69ea7f38ac9e89 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 22 Jun 2015 00:22:27 +0900 Subject: [PATCH 336/451] Initial commit --- .gitignore | 14 +++ .travis.yml | 3 + Gemfile | 4 + LICENSE.txt | 22 +++++ README.md | 39 +++++++++ Rakefile | 14 +++ ext/libsixel/extconf.rb | 6 ++ ext/libsixel/libsixel.c | 187 ++++++++++++++++++++++++++++++++++++++++ ext/libsixel/libsixel.h | 6 ++ images/egret.jpg | Bin 0 -> 18986 bytes images/egret.six | 7 ++ lib/libsixel.rb | 6 ++ lib/libsixel/version.rb | 3 + libsixel-ruby.gemspec | 26 ++++++ test/minitest_helper.rb | 4 + test/test_libsixel.rb | 21 +++++ 16 files changed, 362 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 Gemfile create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 Rakefile create mode 100644 ext/libsixel/extconf.rb create mode 100644 ext/libsixel/libsixel.c create mode 100644 ext/libsixel/libsixel.h create mode 100644 images/egret.jpg create mode 100644 images/egret.six create mode 100644 lib/libsixel.rb create mode 100644 lib/libsixel/version.rb create mode 100644 libsixel-ruby.gemspec create mode 100644 test/minitest_helper.rb create mode 100644 test/test_libsixel.rb diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ae3fdc29 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +*.bundle +*.so +*.o +*.a +mkmf.log diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..8a8ac568 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: ruby +rvm: + - 2.1.2 diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..4f7f2f96 --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in libsixel.gemspec +gemspec diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..e4b6d2f9 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2015 Hayaki Saito + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..2ecd5336 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# Libsixel + +The libsixel gem provides Ruby language bindings for libsixel(https://github.com/saitoha/libsixel). + +## Requirements + +- libsixel(>=1.5.0) + +## Installation + +```ruby +gem 'libsixel-ruby' +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install libsixel-ruby + +## Usage + +```ruby +require 'libsixel' +encoder = Encoder.new +encoder.setopt 'p', 16 +encoder.setopt 'w', '200' +encoder.encode 'images/egret.jpg' +``` + +## Contributing + +1. Fork it ( https://github.com/[my-github-username]/libsixel-ruby/fork ) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000..2c8f5b04 --- /dev/null +++ b/Rakefile @@ -0,0 +1,14 @@ +require "bundler/gem_tasks" +require "rake/testtask" + +Rake::TestTask.new(:test) do |t| + t.libs << "test" +end + +task :default => :test + +require "rake/extensiontask" + +Rake::ExtensionTask.new("libsixel") do |ext| + ext.lib_dir = "lib/libsixel" +end diff --git a/ext/libsixel/extconf.rb b/ext/libsixel/extconf.rb new file mode 100644 index 00000000..cc515e83 --- /dev/null +++ b/ext/libsixel/extconf.rb @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby + +require "mkmf" +if have_header('sixel.h') and have_library('sixel') + create_makefile("libsixel/libsixel") +end diff --git a/ext/libsixel/libsixel.c b/ext/libsixel/libsixel.c new file mode 100644 index 00000000..546ed142 --- /dev/null +++ b/ext/libsixel/libsixel.c @@ -0,0 +1,187 @@ +/* + * libsixel Ruby bindings + * + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.* + */ + +#include +#include + +static VALUE +get_version(VALUE self) +{ + return rb_str_new2(LIBSIXEL_VERSION); +} + + +static void +sixel_ruby_encoder_free(sixel_encoder_t *encoder) +{ + sixel_encoder_unref(encoder); +} + + +static VALUE +sixel_ruby_encoder_alloc(VALUE klass) +{ + sixel_encoder_t *encoder; + + encoder = sixel_encoder_create(); + return Data_Wrap_Struct(klass, NULL, sixel_ruby_encoder_free, encoder); +} + + +static VALUE +sixel_ruby_encoder_initialize(VALUE self) +{ + return Qnil; +} + + +static VALUE +sixel_ruby_encoder_setopt(VALUE self, VALUE option, VALUE optval) +{ + sixel_encoder_t *encoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_encoder_t, encoder); + + status = sixel_encoder_setopt(encoder, + *StringValueCStr(option), + StringValueCStr(optval)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, + "sixel_encoder_setopt() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); + } + + return Qnil; +} + + +static VALUE +sixel_ruby_encoder_encode(VALUE self, VALUE filename) +{ + sixel_encoder_t *encoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_encoder_t, encoder); + + status = sixel_encoder_encode(encoder, StringValueCStr(filename)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, + "sixel_encoder_encode() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); + } + + return Qnil; +} + + +static void +sixel_ruby_decoder_free(sixel_decoder_t *decoder) +{ + sixel_decoder_decode(decoder); +} + + +static VALUE +sixel_ruby_decoder_alloc(VALUE klass) +{ + sixel_decoder_t *decoder; + + decoder = sixel_decoder_create(); + return Data_Wrap_Struct(klass, NULL, sixel_ruby_decoder_free, decoder); +} + + +static VALUE +sixel_ruby_decoder_initialize(VALUE self) +{ + return Qnil; +} + + +static VALUE +sixel_ruby_decoder_setopt(VALUE self, VALUE option, VALUE optval) +{ + sixel_decoder_t *decoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_decoder_t, decoder); + + status = sixel_decoder_setopt(decoder, + *StringValueCStr(option), + StringValueCStr(optval)); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, + "sixel_decoder_setopt() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); + } + + return Qnil; +} + + +static VALUE +sixel_ruby_decoder_decode(VALUE self) +{ + sixel_decoder_t *decoder; + SIXELSTATUS status; + + Data_Get_Struct(self, sixel_decoder_t, decoder); + + status = sixel_decoder_decode(decoder); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, + "sixel_decoder_decode() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); + } + + return Qnil; +} + + +void +Init_libsixel() +{ + VALUE mSixel = rb_define_module("Libsixel"); + + rb_define_singleton_method(mSixel, "version", get_version, 0); + + VALUE encoder_class = rb_define_class("Encoder", rb_cObject); + rb_define_alloc_func(encoder_class, sixel_ruby_encoder_alloc); + rb_define_method(encoder_class, "initialize", sixel_ruby_encoder_initialize, 0); + rb_define_method(encoder_class, "setopt", sixel_ruby_encoder_setopt, 2); + rb_define_method(encoder_class, "encode", sixel_ruby_encoder_encode, 1); + + VALUE decoder_class = rb_define_class("Decoder", rb_cObject); + rb_define_method(decoder_class, "initialize", sixel_ruby_decoder_initialize, 0); + rb_define_method(decoder_class, "setopt", sixel_ruby_decoder_setopt, 2); + rb_define_method(decoder_class, "encode", sixel_ruby_decoder_decode, 0); +} + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/ext/libsixel/libsixel.h b/ext/libsixel/libsixel.h new file mode 100644 index 00000000..c626ae0d --- /dev/null +++ b/ext/libsixel/libsixel.h @@ -0,0 +1,6 @@ +#ifndef LIBSIXEL_H +#define LIBSIXEL_H 1 + +#include "ruby.h" + +#endif /* LIBSIXEL_H */ diff --git a/images/egret.jpg b/images/egret.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb87c099057f832f99042efdab612676fdfa6704 GIT binary patch literal 18986 zcmb5VWmH?;6E_+PrIZ3K#l5AtYbf3p4M9q932wpNrHac#kYELhdvJFP5Zv9pw73Pk z{NH!obwA&8KAfDj&zhONXOCp|{2pc>RspY+-m$Q{(oN&?Eqpttj;I8*jS8!C&XCT#8?mA09pV5 z`%&2c$@~9aSWmDY<$Z?tI4b)J@Z<^B6C7;Z$NL#J4mJRQ^@JE3=k3$i{2$d#U2sVl zzsCN4CQw28?h~YAOmOXpOvcRh8~m8uJWEJJv(vq@>X8c7|7Gz1arhsVM;?zu{KQy~ z901t3Palc@-wz&#h;iQXKYdLi@KK$V(bVPlr`U?GV~?Z-Asr9%0D{Nw9%Uc~NCR$N zKICFMs-Mu(>7F=^l1fB1JR2Yj4~bP`Y0hOE!?k7ZWeI0y`_C#i+^!U;kOb?tnBM7NN`Ut zbHPu`{#Dw%eevhr1U_?TH0zdgqr%AyvsC>MmYL{Ys_am2>? zqRGMYQ^r)sRQ*%tk2VzPJNKuVvz=zePDj32qT-!eo9|DXLdC zsDmgB;_PzR60-)>xn)x|+2XToVnJ9bGFw8KTiC+H1u0BIU-SI4)Pb2>Pe?z?))40q zGQS;z5q+z&?UAqMz!t+7`tAA^|6M5>`F18#Q;R5Ki`wXel3b2ZxH=c1lryTffuSh=1eJ*zVB8OM0&%xTjRcY+}7LG|A<0=T2jiMrW#}XD8 zTt_hu@Pu>qB2*CX)E)n5-CcV!!FDe#=U#&&gc1V7y=%AwT#i zm4J#xsEJj-%~+QHEC*#1h3qJaY~^kuj(|RQ)~B~{bS!Uv(yK9U@-c3#H)8l$Pw*+R zUv)ph3d{UI)`q7cYe4`txyiGM}>AIoLcJ3_N8rS%Uw&4f#MS^nEmk@U=nw ze~-(PHU9dPomhoCLNTF25jSy*Q2`dKaz-}u`GE0@vRL@-hfgN6sj~&Lmy}7LY*g%l zZ%AZ?448j_WrZ!_@pznOTn-0NFz_AE&veSP(|~ zB}aJ6EKCuX6gvw?to-GZ;4fldgm9VozIrgY00=(L6aWIhlZ7~EX32l?G9bgig`P6T zzH9k1Mr!RBA6l%ObGiSC?%?U$x#!V+`KD$S0wHF&tlO`?wgDQM}z)T#SP6d-%GN&7^s zS#dxKE`iZIEc{+f=##GcZtrFlqD)LQcjuIO_yF2saOdu9- z^Xs){F|U&P*d(5sp5o>7s*Da$>V5%uGWD2z)&r8i>cHcSpU|I^gub4lup<0mC5ab`{UO;j0t z3r{-x$|2aY;)0N4a|qrvhBWqU7b7w;f` zg&y~J`$Cr45^a^M9~x$r2EUC~q5sXMva}Zy1Ie-NRl+;I@R{us;DF8T5sfb@Ed-JY zaQYqZa4~UyUy=#q`>>w3bcAA;BTe~Co?uCS;nLZDizOo)RZeqC7T(!TgZxZlLMZuy zE*VJM@wO&JYzHntsg?9Z$CBpMcdEB3@B?ZPWEE1e41SFduTg;z(J}X7<`-DpxnedzSg$rc@@z9$xk}HkBUc~u4 zG=!uK$9979G(iKUcQIvaD_?z|Ku11(y|fBCh5<*U zXKN0IVdnV4U@n(BrmC5~?Veuxz&vAi#nR0|+WI}%_-HSiVYKa~#c}rBZ3NSdm5g-J zIYV$@&pur%cJRvwfHjYDP)-c1-j(1%de&X%y1vc>pr&XWyv2n2>TOKTFhr0Tcv^b< zY@*dGbK`pb&suagm@2?f|L$e%2E%vyDVw;&XfYnx zM%Ql{LXZ4o7|2I$t2OrYj^DHHE|2W{+|}kas|R0_jE1p&026=0k0omTh9_kLcv5ac z@Rkqo#3y9Xd}y1tH+jL)1R|hp`_XeD$yT02j-A+ZNfHg=QyZ-BgO^Tl3zDLhIV~_` zR-oukq3zNTD{Z0n@m;Qn7f%jELz{5hi%l(zI?IKWRbo9BwV%#5gjM`+mn^2T+*o*HAj-$cO6%)oAnKmtc*Vw9K?gxvO^sV7IK;4QX?*l?df64` zt%u>Qd;olF76dV8%u5^A?RK-gtjuv^#B#c|pdqD}(snTAfuxdkI5FIbk z#OnB7W^GR}KCvBhfm0^XlbVMr9f`J1SVlAlYN6^zJMpD+vGk z-GTen(Ox-zp z`2AMw^bnIZ*T98U7V#X{e+M&@y&4ANvzv)oiQ|0f`GIYGWe))F=5RemALHtpMj8F& zwgJRwqe8)nmSgL;%jyd_hCZkT=I_|t6kqjq<#6RRGaBYS|31-RPtlGwiSC+}c6OO- zELhp8gq4h~Elx^2=AOony?1dZF1SmfAo2c2_HME@Vl7B!Z$n5w%~<=6I5|g6D{Mw# zEq&}B&(8Vd=7nFV`84u=IIm*3Ij1(r{FF%i-~m9ks%Ip{pE;5Pn*l1`@{U6pChxnp zW5THJmi^Vpy=8#x9M1h@O!vwg_Qbn;hPBbi^*qp>nd7XfpkL7HDAR2rNU9~ z?dmzJ36lE?VxJ1HOweGHKa{!UXJhM61Ir~>f7p)g))w8&ul|Pa*3C2Yd z8B(oXS6F`kfhh7zx~6oW)0q^De8Pl_Lo$o?W&Hi2bIafXuba&rpYlL&GI5bRBsNkH zlvx@dMZ%|C-^T_14R*K5aqE@qN!H$*os85B-^O1^BCX|z(EV^2r0vzFZMPfR<}nv} z3&c(97_>Iq#@6A*5~VtQkwi%QW7FEqshd;P)Qw8ik+y?c_d3$&D|nD+;n6+%gm2^h z&%S7T*q_?xKw`heDt&Mmn)P3xT;ABmU2wx6L-1XP3T;0|UD_V`#f3AR|Km|>#SiQ{ z>jUc|>?(HajSxVjPTa|Q7d=cT;>gI!{Ne#%67-B8Mk>5Kd(%9peYAFz0epYG3BMh= zC##FFDhAcbJJ=v~w$l4may8On(V$RJj222x1e(nZUp7GQF-CTZ*UU#|_ zdk^DvHr%;HH{HBhhd|$3o^rLp6pxv*$D65Efhdq^i?vO4_iTbd zC#~Lq2|eFm7_N1lj6w+4xdn#NOF<1&=G9{m+HPBuCvp;T*Lw4`%UzR@dZywg0UyIu z*eSUCD8HNcq*~!d{{8-@`d=_td|{>lrBBMmjdHqzVtw;S#eJw`&WVV>`7}(a{x%rQ1oC z093W~&*f=n`(&E6WZ`-5ma5%0@08;$gkHtK%YU&0X6D5? z`pluvv}*tKV3BQ}zDz zKt$sQBAffl5_q=Q(*`tk_z4?DzbfwRoU*H#IJEJ(QM$#X(frSdIBZ0});4!o8Fp^t z&Yxn(BKRfR7aYxeA{%~etrJ#1CM!IqZrBbDUqML?go=dm!8xXb;w%57aUH1{oP+zw zQT};+4q+YSF~2cgNdnF!aiNn$OCo9)JBAt(uIT(ZL-w!A+Q=h9O!_ml5++TbP7Jli z#zgqNt+pIeS^)9v?9%t$Q@FHB#^56L`aA1A_2XS_Nqk)8E`z07qcvO9N-s2yZhqbf zcUNQ51q)FmHSV-R21ZxH6IwdG38>fyT;zdWu$w6_%1@lDY34XGANa>zqxfR)I4LJ0nBF5 zk+S?_-DS1W;1jTo)NVn^kuiil0L*FqooG{1``>>uPS9{PW>i)D-o#tkUwQ@q76+Y& z5>(n|A~ROEmbaL#`?fEtz&{O-hh5r&c?|3J?PBI>sl!U(W9#u-m0O0B&9NB_w1L@8 zyg6NEzG-EYiF&z94y5i}#p&@AWz{1HLmm1+8*OEsCRJ6=?I`j_z8H>pm^U4xnNO!w zp5Aef*20l;%mU-ecd0Lc#yD~UsTc^FT zTg!HKJp)AV+7U#Z&Cy%9wXN0dO8dbvyb6;qt*Ep-c$a;uefZJBI?qn5inZ7pBi~W1 zPL)ea`+#p=Z)5UYP(r!>{Y+AR|L&FTy<|AG+C~@XWd}vwKKP| zLJIk~^ji(6T;iW;LoaG}`zDn{kLzts31*jvMa}Xu`se!cpXqn>*^8KLfAn`EL#6L=IA5L ze<{|yDf`J7AML@7hA{qZ{O|gbU)jH#hMiEchd+<7cAG&uIVyw?xR53~=o4ZJoJkXn zECGy-n7TR2g?H36yxx@Y`)&bjHQ5#{FK>bkiVLV>aB{K@hj?{lWQ?qIfIWLc`YmQH z^l@4RIyxZ)+sLVRE2B5h|4LPKEgkt^ne(ns4!nmv02)?icl;;w)5jQm9IIQJE9ypA zAl5534*>kD_{?17dYZK2p?8m(ASMT~c;Vg_+)VMJ#hPShzqvx5@-ZW>k`VPX{@ycv zEbV|EQ++0h(Yn@zqD&$u;NfuBfVjFdX}3{7k%O{tWJH8{LmVqSWso7>dsW2fdG)Oh zIO~VYuF#dxF!_4*?C+Q}g>*kRf(O71iFAnXg_YWrSRh5ts-d;+%t0D!s8!29G1$yh zk>nEZ+Ddi98kNO3?5qOu0EjF6L4B??hvBK3Pvg--K(;fqJP-HfiFi(GkIaS-vt3}c ztTiViO5F<6(2Xh>JuKNj5pmR}zZm4WKF`HbTJnA;5&UPMb!Xz}0no)@^)?J_(BpBv za|`itS&bQE4=g#`h|^2wadU3J_EfQNZBaFxe}99LXzc5O8ve=tH|+V>J|QXnOgTVQ zn3kN|Zpu60zl(PSDwN9q#%nM55ABpLkQWmQ`w3 zhDYAscjo+-_)oRg86la#E%mjaYZ+wWS3hraYO!&$+?eWgBv0U;uAX0cm7c+4u|{h+ z;>E_XGRO=k?#mnhV`ttyguqP)FZO_#rwyF;y_;o1Evm=+63(D6xt;u$J%$5MhH746 zN}3J8;m{$t_8L6n@v;`MhDM^(&VjkknuH zE8pJdqt?EuIR9{}x9Ss}0G@d!vd1_w)Q$yBw(n0+*3M@0DCpA`iwZ+>DCFieqDD-S&@=`w4EbXQcKNU5~> z_;CvZu`7y8u%kF+yNlBUs()-`tsMvD271eoF6Iku;Z6;-#{27#I6bSOe(6=c<&xT3 z0b9y&Ihf3rNHWamqILCbrdgQy-Aa8Cp#x2h#g6jjqOj8OUV!Iz(F&TYQOg#|r&5v^HZtQBDiRYk32qEDI)4PNIjK z(Frs$3Pz66QjUuYn2KJlY1cN9JHWq4P3t#zyIacaR2B7N}Vn06a(D`$pgE-AI;1yk(7G9n)%}z z#KlSg@;%AB->JyD@R|!?y`p^y7BS9{FoFf0It09=cbw`7_p53^Wc|uWJZ_kj#(`+S zBlY9c7b}+Ti2oiPTHO6!heWy?QW#6w7J^@(7;f?v?*?eqRJyX!`91k#>rExLlsaQf zKJzhlLa`Y=B`7%TFC}Q`E{3eh_EZcNgIKwdnJ^lR@}Iu@eU!q`87P_JQ99+^@*3(> z)m*7I{v6qGMs3{jmjh&bHH-wxHBYC4X`PMFRoV*o)#jH1?Xpc4@6O{O;U0bYcblmUhLEyLL03xWl@x4)_igdiF`X5-^ z+2sot1mWtfIIdz5q$@An?!J(f^Hj=KEbwhCZ$Js^sh95Y%Kn(k>eb1}<@_&sJ&}oD za?)@KDsctjd)>NIUg&!Xt)2YQKP}~PJ^xN@^}j8#a@rgTOHFh7C-dI<&?tP{UBBn1 z-9F6Tu{IQ%J?bsr-H7HaX_=_%@OMk}S58g#<+Pm^*7X*=KxiaR6X;cf&Pp7TH-=Ec za0l2q-B7eTgP`_q(}|-e>k%+O7Y6e( zEr?bf6?UrZ+#xmEj$DyVQs04w_1DbbHDbhV=Og3wF%c?-Qx@Ba{(>Epr8~(p_p0gS z&`Uee%FV&x=Axr@+;+wOiSsq@TtLdymYpMPQ}w=U@&^2uHft^O0=5>XH56NCtaPVV ziY}Ni{lUzw>L0Ds%Ep#+D^lyS|Ni^7(FTv9Q`JzSMCnCK?M-^jyxY zktA!}+Uc%j-Flp!z~)F^gcmxP{~M;sY2W59?jl2-$ne%!1FyBvLj3`N$=(zAa~0R- zyM{Zx()QhH7ent^9O}a3T_T8zYwJjtl*-##XAIPr4N`mnNDuVt-#h@AyWSHagKdJW z`g@AF?|q!4Wk+&QAs=%(DA8JRK$yn1>%!RIODPSBEiNKe*Fj{i6W*J*-)=)`1A441-0AZd8q;ahJ&o!mb zKBBpHiR?atr;E#@dqTeHTE!7*bW#d-!_oH3vo`#e8eMT3u}lr=;wr6o{sox#?_Vgp zmgSzhZbhAM-q9Fz9V_v!>M>6#y;jd%A3JGwlR=PKOl(EkS>-YZ?YT=CsQ>k>W3uFa z_V<*W!fvC8yqbZn>75gy0QVA)%Ufo}< zhGC$U@UrxfY;uD48yY-1H9KQtF?w)Yy|>}z(|?v~s7sd~02(SpRTl-tDVH&pj{k-w zwGB@v&}u&ibPWoXC~Y-PmRe$@ye;#G&~ZYUi6^S!lBG;-Eicwlj_N!vz-XkO3>|r} zekm9K`q1x5>E+#%CY`08Hu{>4@zAv^Z{8gN+;eK@ zA&80*YV%AKWmiz6n8%2=hP^wNdY;vlGcKx9<^x%HJUZn3=e>-wxsq@}0VVxC^h_(` zqPPN5J_jLo1MGz`_LcSf*1~hD2E1~k7+NVhwZLJW+BrF{m`hljtV4`)W51M>V4=k& z7?CK{=o-tdV=;d&IqZ=AjB*jO(DwB;;#4rjH!(qBJ&-#I)F2)0v3+<$nBqRd!dzLm zS<6Vp%z|KS?N2Uo`9pK+p)Iec#BaMpw#D>JxzevTegm(KASNh_d7lR1-kk6*SllD8 z>7To){|bC&j2K!kFh36o%s12#I8tEYMrhxrikaNnXB(*dwPiB5^b-0Ws0sNSj}|oU zA}60gnv|qv6qUff@0J~=ShwUp*4=`>jy+r4{c#(2B5Ic5K9rfdcZrRpO`NjUmPlA! zkAS%wS*0yatguPzzCFlp-jYQDf9s~EoMLd*I8sMsC= zIk>U698#OJMmu3k+BmZlPfB2MCdp*5#K;Mb_UZxUA1IIAk6AXbf7%jMt_mr9whSX2 zk%35aB>4AbC1_}LDrT;S(G@ElzF?>l)OGNmx;4a2dLYtb_Xh-oF zX41B_X9CA4+%O1d%sX(xP|EpGdVhG|3OavwJ8)_fW%S4PAcF(LA(2>OJOZ~0TB(*4 z&Y3|ghD?k^*@}1{?Qd`08m1xl_tJbkn!%E2@(dNcBEz{;17jxtRwvl0sw2cj6$%S_ z3?F{t4*8tcFU-zLl<$_qr>)b_f6VVk`{0OI!O~om(#3E0-o`E$LyJ=aS}u9#7^o1@ z`xY683`6IltUWca9}VRJ@K5ll!FonDgGp*@&s&v>9gNG4zOM8SDx8W4hdFnkaJkgO zq402NkvpV%EHFDA+)L~irp7A(R!dPiQx(3fyd}*4Rnp2FkdfWWpZ%?*aq#`ErV~?Z zgi}LL>OA-B)Gc%>lb=7n$hrMhsOj_;;$QUuyU}0dsbG5C=Y^gAa89QomIr`LwX^P> z;SQJVc|f|F9e?jMH&E2z0pQ2VTba#%1*{oDfV3mph1=#ekZ#c$z2fUBnH;ecMS^dB z%r{BfZy_<1U@(loboA2Ij3*(>FTEb}+ghl0rJ&r9v0g;W7&9heXQLBv%xz*9njA0&Q|C*HF(M0QC=mibPecblb{5?u)JXTNjda(gcah{^R{) zj&U`o*14Ihx>XkNbdb`e76-_??(uJ{W`qLBwT+k_`Kza0s6KUPQr@Gpvght@^SQedA_ zUg7%CvygV1fS;(sZ;Afi8-t}>a37kRu~vqzA?j2$aIlIu@6g2@LjY|(GukP!iFa?+ zF`sS?Pd{MC(<2(cf;u^4Y1lhLS`2;VmFZ&GNGq7|_f}-47(YWS8CAds`DGry~+>P?dH>ekaNz&A#E+b(BVr zw*E0OaaAoYVLI#DPv7cQH%C#9eUOhPPC5e<9H$o8Dw*((ub z6}@$J?1-=V>lKrqB;b)*)58KP((-n3(jvzqtLZ4;3+eALbLrV?-LnaVo>|SE=NVtd zvuN($aT4>#QR&e(YdZ)*s01eUlY=|rl3WF-C>GDm0AzkHXTLu4qn3+M@}P0)?g5~F z+F*Rh`R8u%(epGmC~T(SHOIh&9{>)d#+-8tZL(3vg+9n%aWQlr$nl|U!XiZW;tSO} z2VQw6f~a$cyFpX7o}4}Z=o0UVWr4^x&8PC}$4HsPEYvWV$eCo>}SH%+zE72h4 zDIfAeo>ss4_O4%^0aDYV*-WUoz8}cZe$dn&f`~NG$OpyiSNoBysf0 zxZKbz6`wT9YG!S9P4a+*dg9{{%ZCHttn$$dBkvUyMhzh>08Q}y~KtUrIRYfZ}+ zaks5%eOq65b9Seuppe@y%IgwLIkAuqP6uya7&AF!k15bGl_E(dx9*fYfL{ z@(Nw7_lJt)#m1BPu{1B;VckR{q#Ro)&aH`5e81aL>p*?~nbll3z*e`RX}{D%JNP*z z=9^kYDOsAOdt}c<=nAg|%icin=EL{QZg(h8suOWaUR0V8qPGss1 zo^^|hCR+_|=`6l7`4q3eYZzU37%lcswt@@AqS=WQdo24_0(Bk!Gz|T-$R?9$w2|kv z3=J{~cCy?k+DWAKuEg*>dyF1?pa$HjEjtEJDK(GYk|6bC{@Mtn;-8s?g{W-}bP9>XskuAij@6MSxP^DQ@6-})AYXLm0_HmISq-Kz;waebiDq}RW2TJ* zJNEPL`w#oa{a68VwR+Hl&x@<_Uy}9=v>c>(fa(;cOS&a0G4?*?8;133q$}UFJ$N%}3UY%Q>l0&7cTuiKeD=?k;i4_W!D z)8&G@6Id|sybD>|jJjt(YebJnoFDTDlx|g|x+a{uAA^4z_H!SmP851Zy?x4_FQPc_ z(#3!d5~OuQu`OCk-hi~ItokNzqdIw|Bp^}m^8=qDQsoO7` znla9QjnwNIaoBnM;2cEacDPecTHD{Mbb*+Y+9-2)8#l&Hmo)uOgGc--e^aG502oL} z_LK?3iLHoibGLh;+7M@iqY&2&yRP#0EXuxo;~XBq6ya@=IB;*SH6^$5on7R%ln`$M z#oRxnV-cmf;wK!gN@jbfYzS*Y7W%%E;}dMb*aLz{Uz&Pi_w8HF9w~ixOVvH*-9QAX zk&tBR7lKKGmA!WYm^PXN#EH%K(ezmYeHFXTXrR$Jysb{wS4{PJw=jHXQh}E@P*GIm zRDmZo)J~}0^0B^yjv)P2->I40c4HTA-!@NOo!HM+%6uYfSqs~WQNL-N=!*6XL$u|t zUb_!SZG>3GBlIjHg3OUXdgd7*k=A(5q|Su-MsCTJ+UdR!uE=0tb1$<6MR-bts%@cXW4mP&B_$Pi z2S)mT^U6H!wp5EZ#mRqTX&6FO$k-M<5kTo|s z4*LP1vqyTJJHm8vWwv0f;V(5~! zToQ8ZZc19v>yq0LBEuxhp%A8HbT3hxOg;n2^hPUGRWrkmgzc_Qp@&>YBhC2dFTI-9 zZ2@%N5HmaXctYOY%ii}v)hR7PYa@CljWb=m8i(E@loKvc-sY|ZFq3q57k5rGowrX) zn3d^Sj21ysew;*nKKJs<=yp#CuJ`HCN7k_#g`wjz=@_-nt)jI#_c=oWHp__}Rl%|- z*K-x=1YdgXn1x7}?hOQ3!a<3f>ADmO@)4>t5|*#~mlF7up5mLjD)B5&OffC#45g%WIvUZwm#P6ZbiU}! z3%*j#hO6rS*^coexAS5t?jVy?v&ph0JGtfqtB$7xh)E6`#u+0j&U|P6cK_8Pe{X{2 z>jL^~TtBThXw+XQqt$uzz_tN1=J`NTg(>FK_ox3b24G~EXNqa^>ESrIir)_@D^YmU zgZ3*n{^X&KjLU)M-iwx1VGELFK`_{Nuy5&HL%$5qYgvkIkr$c6n`ykl2c2Y8+NwcpGQkcA!?(&{B92qSoc2q-Zkc$pDshJ<`%t{*9%p)>{@^e?OEYXP1h#ryKq{EVCV@1qC5a>viB6BrO zoZ{u0zP&G$OZwZ3Q|axvKkPn_rH4j3X~I$1nHT|IM{Wlhf%nEZdmyqYV8MR(2mDw6 z%1`>nadsj%abMlytJdI3w0g1K=xVer6mqtR=CNx+a6t81D)-Z^{p{VWhM<@HK9;;k zGaUEUQ;&TX2m!cC{%OFlXDvdt(3bnL_&o>~K2y7)x3FfKcXmB(2{~M=16pOA6r}C2 z%ulBmr4|R3zV+LMva|crySsJ<(B}RjDI&>rEUEbg-@hzuqq!lR@Ehwtj0=>x9H?~~ zqhqAf_UF*X=yk=ZI2Lbv`t?p9I_X!^Zj8B~@VfgnRC^3u&Tb6C7bY)RCbOY2tkB#V zmueLopDH-K8k6hkyt9>;y34Iu1>2sCbMY)qS4CyQC!$9kkd?q8x_Yv| zEG6Y4-NjXQ-Mim(#7jxqF)HXlC#FoVVK}D{ipNRyb z{FSoTn`lg(2?Dk zjuk8G$9_kw^kRc3g;2ZsekRODH==`Lrz!4SVaxc(;!~Fq+X}QgkpoK@*R_U$NDzT> z@eNCm!T{7@fB4D{lT?in3)o%|q=@rs$dKwK>04iN3K+gHov&ir!}k2A;y=s=>fxRd z6xLWso)>sLEn4~{ElR>ZAf4iVuOM}LJH8nc;vC-H#^jR`A#VkwZS$F$O@zPnjI~ud zv=E7NEE#d1*Jh46ft;JG9=gxHPGAKgA-_H9hNEP07mITN?FnQ1a#UH{=nLT!Oo^7bFX*`ia zF?nVWPMdGR``|}bR%EN(?|Of^%b+3>awi@Dk02m?=TmDI2WifQ@~<8JO-6)S75XV^ z4YSpy9rO2`k3cxwl!JkgpE|0M2Pm4NUANVc?!R8*6*87k^#U5Rhyb3Ol#QRY%BGEW zR_9DSR;sMt8; z0%~`CRriE9Mn?!p-x-`-iC7i7)j(em=fu)_ae`Rv%lL~c*Qi;n+H>oP{k}ds8toSB zJOBW`UQn}^kCM$QzUoZE@Dl=VqMrK@eEW|li;`4GiBbcL;0*wfDFgVyxXZ@DCO0Nr z@dT@;{tLzDS6I+?8LZ!MA>t1|a7fADV0{Up&kWqUdYg4AH8P@6saJ_+S~(3O(CL?J zOU5Wy>YW$|i}}FrzOGil*e$zH#f*noX69oGZ;J;nw1tU@T*tt7-Z;OC_brgc9K2Kg z7e^eV22F`u4d;iflVR>o4bQy|1UXvm{Qiae7!4#x=C*L7Xqxs{G(S#|FAscoY(`HH zZfG{7oGA)e>}f->Q&zSu-5?7|9h)mwh|I~&8xT^71L(R^2wGmC?CEcrI8&U+52`Q$ z-f9u;IoKghF^@W+zf2S8roWJOjM2>INeP*Yw^puSbp7!YK1V^gz;M zG+YV(&mBcB+Snvs1&c4z3S{M~ZZ2D&KV#w)rqtJNobCp{l$o;Bha{dMm z>^+MS5OXx@Ev6sJ@f>E?`I)RFY}Z$iB(t{X?y-S_iO-@*z3BbZ_sQ06v0|51lH@_& zdIKlm8q%DL){@Xakw`nSYINUvH?nXkY*NZ9(_P=j&TsDNKG0{5 z5Hv-%lj1y~492E@)tN&5n)*%VKRiI@C!D9B#~vX?=C3IM(}SW|wdwi&bb1l4IaD&8? zhB|hS#7$A2k_(I|LhTJ%?QVeBf6Rtuka>2hVMmp7^_w=vtz#d#z-;GSC;=zij80u9 zyHp`l2wPh$H^lP~28YP0CwE^aajARdr1Vx#dVhdN@SHQlje;rh;;`;xuj&o&r|jPr zF_vxd5gJaG6h?W(u6`_IC1Qu1Y}0&@Wdk1yx{NMhSfqmo%$GEq%yYpAV3S(ox-vLU zS0~RQbYWPqLW7h}qG5wN$j3%Wzc#rzzE0h^A$);?L)K$^bSCHGf6|p7{#{A!Dnr)i zj}8c!mTw@2EQiy<>d%X5nUDWn-VssRt_Uh2Ja2wcYc7dQE2rv|5@tn*ihoz&GU_c) zP#>qV8b{aH<|=b7(J1qzhEzQOW(Q}%@ki}VdH zw$#W`81J1&PCR0(D+SztqH}KDlf5rZP<0dIaOGsYEc$q=&`2=l+X==nTh>B;UA}h) z^&Nbhz3?!trsL&PLAyd)bD1_ynWElR=1!fRQ0sV1G`)`EzBvzM3742o?039m3HC2i zb4<5rHXLGh_h55}^7iGyqq}5&t|4V;W0w&!W0#Ilu`t+#ALkLZLVVWpScAwCwE_v) zeQYmqczh`tO{?xMN-7ay;IVX}X@C3xC}NG}%*0u`hw;+IX1Nz_u~=k$lk1()3e2=k z*;7SF_lseY^TwAjqkoN6+V@es+8*W^p3a?`PSHx27*cm7g9F*EwR08?=ISxo0S7&V zq=9R@|^*e|GfiM`m1<|A1$kDuLxfrM4oH=sxWKBxdwPGo*khOzPns}S56gWi%ry_ z<6wiwng*XMtp$uuVyWMCc36M~lF6gyEZ};I{qAZM+Dq!a6pGs|2jIht{rSu}FZgXH zC8h%F(Tq7W$K*(V1cw%}GpgJDmVwGQe|3MvSYq*Ed0~Y-;t8Sc;{V}PgyOIO8F9wA z@>pJlSX@$LWxjeP_!z?R+>u&;FTQ2Fbj1K+KFm=)(j~FSA%7UY%qy0pSsSgFagwLJ z?EL3?$LJW_^hx<7u;DunzkK>ZkvfdgJXWghO_O6&I!Z(qLTgfK;nf&p&Nh%SSZ1}l zL0=MHpfaG+Mv_fpM8n%K)IR`^k@4rNZ#x|QBpiI)deCa{$6iY_HplMd>*sH_E3TV` z_OGBTMtwBLE2G)$EQf8ek#R>zmDn-XIV7Af)hP>`ox52%_w2Db#fduwYiY`-%e6=c1@9Q-*_l)`Enx1I&G1wxp=j-m!NofMp`+He) zQBlSTThh-WpCI;Oio*hnO$tg$n|~?U<8wgRaoV_Uj}X}V4_FZmo1SkD`2Gi~e|w1w z5YU1A2k4o#E5w%h)Y2P)UoFHuX@f79#i&b2pa?Jn07w`<@&U?8u)e=~1!z}(x+p_} z^*o+M_QNx0tnhX~_Jvaiv(canI}g&Z?E&z3Htu#DA#Hz4qTGqxU?o~{l`?Ef6!cTst5|g%6bg6hUuVbDvwPnV4&?8AbfQIM@ zKarS=WS&QGF2fGMAOIi%fB+!w9l!=1zyM_;I~5Qu6uJ;npsR^!&LyBJ0DuO-FU&wT zAO->eVz3(!F?tX%U?u_v0s!(PeZ{{5>D8 z{ts$-y`RzGnO= znxvPJP>rQ;uI7@8UqCZk$?e$bf~c=9hEYj+oA;y!xT9wAOX$pC>W!1wqgZuDiFJE< zBN)G_v|Yg>fkxxhZF4U&()fO5V@snT=AJn{m8IlkEHUr*XQbmu&n7P~L80e3^7g+& zDW$&Bze9Yuq_>iaeg-nOt))a9^5(wv=1-pOBT4n7l3%He{OuqnZS!?9x^~^S(|(B2 z$}6*v`tUMxSHCiTf6${BC4P6YmP)^itLsM6X)WD+xBmbmB&92KytfGFnzlsTlG#=G z9jY9Q&(FD*SjLw(t#@E~`6VRfPj+FM$*A4!D?8;Ix>ea(%b8WW>(I=r&DFIzx8%O3 z(D2PaxY4C8q}|E+o@R$m^J)`+mK)cJ^my?&<4N`E#3ZK{UQCMaj@P=i)Z=U9ywSWQ z+&s~!5kAbqZ+(q&y^eXk{X#1n>{>8`rf+Fb8a>bnY})Jqem<5W!qyim)?ENS3a%ny*6)oSoZa?>KerkR1;O0iS{<{_YGtxI+ zYH_dCo2Qv2`vwW8x!H>`-UZtgyBAJj|FH+m>H5*u^T_sdB}SEMJeH z(mrxfbrZE74lz&yE4tsRPoDwlDAfSu+e9p z(8DI5@p95%Ql-FhG4-CDDBa`-`u^?@p04V$q(G%lm7sx`-&VFHcj&?zN#+Y)cbj3jdV$RocVDk z{{Sj}R!OP1&*}Jb#Fg?wE3$X@H_MOV_tcsHYUA z`C`eHCaE>#6&Y6B9N8a6Z$9hjVJC5*h+E5Jc*#6!*~;GLxaG4<4y)!#_yIWNxljau zD6&d@Nj$FN#0(h#03rZZF)$9}M4^DjA%KPe7Ea0_U|K0XwlhU028oo6;>t`40a()j z5HJ82Z~zMc5CafCqF@3BOClR&SU0%4fb0Y?1TscIA7A)csr{eY>{0&!?_tT0?4|zz z>U@Ff`zxwiFKIY-qD@9I&lM*8CGfx0)N+)U^c3WsJL+1UzPl)+g=OvF{{X3LCwuKj zrX`o6@^0(E)){MK%Ey(rzmd}%o2%ThCZ3DUYCc0#T}~L}P5P#730f}E-Hu(&;U{R} z$34J#iXqk5z!aFT4Q))l2LN%jFkO74ROnDpU9}c+3>0JJb3y1 zR8{>=5{l@IUSAb!$T`=Ilx<>fw#Gj9%pOgtlVYXO(UYdwr9J79Ii&tBo**f7*|Qv% z;{JWhlk-pYGLzqC{S1tx+Vk`|Go>r+{F&1x*JVZ-C4Fj$uQx0mZ@qaKO+AkMsXxmv zlR0LWHtMJ=mnFE_&n}jCJXaYblQe1}9F5eOQJJ1cS46372W}~KObl^M0RCT*52kIvtXR1tv7E-20VwZGoaMoyDmnzQ474YmIOv~U<;llb)0c)#g;$Mt_h?Be;OYr0+ zOb)dF0LaoZ-^}HVi&NPYbt&(@%%zib*3ZQpt0!hYdt2Dc0VD(rso^ta^6vC{JGxhpl=mfoi;n_i!x4r;cf$+J$!HFfqPQ<8h7 z3wP$ql8*Z{{F#)SPrLOJB3InTcAttmZ=0!<(snc> z43{-Cn?5&EUSW~AJ6%z#oN~g~Ug)UtGsc@nDV=(#)TQKcy{yL7aF`f#Q`?{yYW{AK z52wrk^Gm5Qb^st!=m-D%?>`G0_uNHZ)sOX&`fe_tFayzx z%FMKpEAxOGlx>atOzMy2Ucb-)K)Cc?jNc#S05r>g_iN;8zmL!W3QuqKcan(...) + ok 3 - output file exists + 1..3 +ok 3 - decoder +1..3 +;31;25;22#11;2;31;25;19#12;2;28;28;19#13;2;44;38;31#14;2;31;30;27#15;2;47;38;31#16;2;28;28;22#17;2;25;25;20#18;2;47;38;35#19;2;41;38;31#20;2;44;42;36#21;2;47;49;28#22;2;35;25;22#23;2;49;47;38#24;2;41;35;31#25;2;42;41;28#26;2;38;27;17#27;2;41;31;28#28;2;44;35;28#29;2;31;22;19#30;2;38;28;25#31;2;41;31;25#32;2;35;28;25#33;2;38;31;28#34;2;38;35;28#35;2;35;33;30#36;2;38;35;22#37;2;44;44;41#38;2;53;53;53#39;2;63;66;63#40;2;74;74;69#41;2;78;82;78#42;2;82;82;85#43;2;93;93;91#44;2;97;97;94#45;2;93;96;96#46;2;89;89;89#47;2;85;85;88#48;2;78;77;77#49;2;63;63;60#50;2;61;58;56#51;2;56;55;49#52;2;56;55;55#53;2;75;75;75#54;2;71;66;63#55;2;58;60;55#56;2;50;50;50#57;2;33;31;17#58;2;50;49;45#59;2;69;69;69#60;2;94;94;97#61;2;91;94;97#62;2;69;72;66#63;2;49;49;44#64;2;22;20;17#65;2;88;91;94#66;2;89;85;74#67;2;88;91;97#68;2;91;89;97#69;2;66;69;66#70;2;39;38;35#71;2;83;88;89#72;2;72;75;75#73;2;63;63;63#74;2;47;47;47#75;2;85;88;91#76;2;28;22;16#77;2;72;72;72#78;2;88;88;94#79;2;35;31;22#80;2;78;82;82#81;2;66;66;66#82;2;25;19;16#83;2;24;25;25#84;2;85;85;91#85;2;82;82;88#86;2;35;41;35#87;2;82;85;88#88;2;80;83;86#89;2;85;88;94#90;2;20;25;20#91;2;52;55;50#92;2;64;64;55#93;2;78;82;85#94;2;82;85;91#95;2;78;78;85#96;2;16;19;16#97;2;17;19;17#98;2;75;78;82#99;2;75;75;82#100;2;72;75;78#101;2;72;72;78#102;2;69;72;72#103;2;69;72;75#104;2;19;19;13#105;2;19;16;9#106;2;24;14;8#107;2;66;69;72#108;2;66;71;75#109;2;22;19;13#110;2;19;19;9#111;2;69;67;75#112;2;66;66;72#113;2;69;72;78#114;2;66;69;69#115;2;69;69;72#116;2;53;56;60#117;2;78;78;88#118;2;66;66;69#119;2;63;66;69#120;2;75;78;78#121;2;63;66;66#122;2;72;72;75#123;2;78;78;82#124;2;31;28;14#125;2;60;63;63#126;2;60;63;66#127;2;56;60;63#128;2;56;56;60#129;2;53;53;56#130;2;50;53;56#131;2;75;78;85#132;2;60;60;63#133;2;75;75;78#134;2;72;75;82#135;2;61;64;69#136;2;47;49;53#137;2;19;16;13#138;2;25;19;13#139;2;75;78;75#140;2;56;60;60#141;2;58;60;66#142;2;50;53;53#143;2;63;63;66#144;2;47;47;50#145;2;44;47;47#146;2;75;75;85#147;2;72;69;78#148;2;60;63;60#149;2;53;56;56#150;2;17;14;13#151;2;69;67;69#152;2;47;50;50#153;2;13;9;0#154;2;83;60;44#155;2;67;55;44#156;2;66;50;30#157;2;39;36;20#158;2;89;72;49#159;2;78;63;22#160;2;85;71;35#161;2;69;56;19#162;2;60;53;22#163;2;60;52;11#164;2;44;42;19#165;2;50;50;53#166;2;25;17;20#167;2;31;22;22#168;2;25;25;11#169;2;28;27;8#170;2;24;25;16#171;2;25;17;5#172;2;25;13;6#173;2;42;33;17#174;2;82;56;30#175;2;80;60;9#176;2;56;42;19#177;2;56;49;38#178;2;44;41;8#179;2;17;22;6#180;2;35;30;8#181;2;28;19;13#182;2;22;16;14#183;2;11;16;8#184;2;16;16;6#185;2;86;61;20#186;2;39;25;3#187;2;33;16;5#188;2;35;20;9#189;2;44;28;25#190;2;88;58;8#191;2;17;17;3#192;2;16;13;3#193;2;16;13;9#194;2;25;13;0#195;2;44;33;6#196;2;16;16;9#197;2;78;50;20#198;2;19;13;6#199;2;77;50;11#200;2;71;52;8#201;2;30;17;3#202;2;13;9;3#203;2;3;3;2#204;2;9;6;2#205;2;35;17;5#206;2;67;44;17#207;2;31;25;8#208;2;16;19;6#209;2;19;6;3#210;2;78;45;5#211;2;78;52;6#212;2;61;42;6#213;2;5;5;14#214;2;19;16;17#215;2;13;13;3#216;2;49;31;13#217;2;8;11;2#218;2;11;6;8#219;2;66;33;3#220;2;25;6;2#221;2;33;8;3#222;2;71;44;8#223;2;53;31;9#224;2;58;31;6#225;2;50;56;56#226;2;14;13;14#227;2;53;24;6#228;2;49;28;2#229;2;55;22;2#230;2;49;22;3#231;2;47;17;2#232;2;42;20;0#233;2;16;6;3#234;2;39;14;3#235;2;39;19;8#236;2;49;20;3#237;2;11;9;9#238;2;41;14;0#239;2;13;13;9#240;2;9;9;3#241;2;11;13;14#242;2;13;9;6#243;2;42;25;5#244;2;8;11;6#245;2;16;19;9#246;2;13;13;6#247;2;45;20;3#248;2;35;16;3#249;2;44;17;0#250;2;69;72;69#251;2;69;75;78#252;2;9;9;6#253;2;78;85;85#1_O_W?WcGcWCYcQcAc?O_?OC???O?g?IScE{A}A|A^_NOfGRDHVHeHRCBGBC@!4?BCJ?BC@A#5!6?_#4???_?_?o?o?o?o?o?oKocWcW_}_}guxukNNNDNNDNNDFfBBP`@f!6v!11FBBP?C!8@!11?BB!5?@BB@#6!34?_?o?_O_?o?sgsgSgug}h}i|y~}~}~}~}!4~^n^b^J~B~@J?V?@?@A@#8?__GocWcY_wcYsIsGmWeOmGvGuHuKzCyDKa?i?a?cC?GCOGS?kQGSIOKaCYCQcgC#6!29?@?@?@?@O@Q`HQdIT@Ul@~DzVj~j~V!14~}!7~}z}z}!12~|z|~}~}n}~}|y}}[B_?O_?O#4!20?BFLFXFJ\v^~~t~~t~~t~z~v\z|v|~V~~V~~V~tkS[SKSSGOgW_wgO{~vV~nz}juzmzuzmjV~Tj~|zVlzTlJPhntZntz[tzlv|j|vlv~^v~^v~z^z~z~z^~^~V~nz~$#0^n^F~FZFZFjDJDJT@RdJRDR@JRdJPBD@JPBD@@A@?@?@#3!6?_?o?OgOcWewuxm{zs~{z}|!6~^~~~N~NvJ~B~JvJnJvNrNZfZf^@^@VHEHR#5oO_Oo?oO_WgOkomYkW!6G!11w{{m~z!8}!11~{{!5~}{{}!34~^~N~^n^~N~JVJVjVHV@U@TAD?@?@?@?@#7!4?_O_[_s?{?}s~g~}~}|}~^^vNZfZd^FZDJDJV@F@NPFGVHEHBCJDIR@^@VHVJRnVjNfJnRLvJtNrLZDZLZVZn^~F~VjVnRnVn^vn^~n~^!8~}~}~}~}n}l]ulYti}hQ}?yCgS?S?g#5!14?@!7?@C@C@!12?ACA?@?@O@?@AD@@BSJTATj?jTjTnZvJ~n~^!8~{wqwewsaG_#11??I??I??I?C?GaCAGA?g??g??G#5??@a@_`ahAdADADAD#11???g?OC?SGCOCGCOCG?iS?ACgQCgQCgCOIcOICaGCQGASAGQG?_G?_G?C_C?C?C_???g?OC$#2???_?_?o?_O_OgOgYkISkig}skIsE{oiOg?w?{?{_]omWvkyugUXEkjSfWbWFHEP#12!18?O?OGC?K?CGCOCG#10!17?_Oi?oI_OaOGOK?C#3Q#13!154?_?o?_O_W_?o?_?o?o?o?o_[_SgSgOgO_O_O_O?_?_?_?O!4_??_O_?w?gSgOkOgO_GO_?O?_#9!91?_gSilISnSiSiOcGs?O?_#10!43?_?IQHaJQHAOIOaWAOi??G!24?A?_AQ#3!6?@A#5!25?_$#3!520?d?D?D?D?B!6?@?@?@?@?@O_#5!11?OC-#2s~s~s~t}|zu|v|z~z~z~z}zv~]~n~U~nU~F~VnZm^vMrNRDRCIOBC@A?@A?@#12!7?_O??_?O_??C?GA#5!18?__?oO_o_OoGoKvxmzs~y\vy^t~m^j!10~}~~}!4~^~n^vZVlZf\bNPnRnRnRnVhVJVjVjTnVxVkVzNrNrNrNrnVz^vJ~B~B~B^bZBZd]B[BUhFGQL_HAHACABABAA#7!8?_?_W_SgSiSgvWv}t~{~|}!6~nVNfZB\ASJ??A?@#15!11?o?_#7!9?A?@A??@!9?@??@A??@A?CHAHA?FOBS@U?CJ?jAJQdJsBkZd]`^lv\z^!13~}~}|zulQlQlOjCqHqLOiC?cO!7?_O#5!34?@A?DGODgAGS`IsJ{B{Js^lvz!9~|!4~n{{AOeGQcQKOdOCG_OGC!9?g?bB_B_B@A@#11!9?A???cHCODGAG`?GAOC_GQdGCPAG@QCI_CGCOA?@??T?G@??A???@??CP?H_SG?c?Q?@$#1I?H?H?I@ACHAGAC?C?C?C@CG?@???@??@!6?@??@!6?@#5!18?_OC?aG?P_GC`C_#12!22?O?O#10!5?GA??A??A#4!18?@??@#9!4?_?O_GcgQcWa[omOkOkOkOgUgsgSgSiOgEgRgCoKoKoKoKOgC_Gs?{?{?{_[c{#6cY`{b{hUwvlq^u|u|z|{|{||!8~^~^f^jVjTjVGfG@I?B?A@#8!6?OgO?CSalJ_VlPmOMPeGTAHQDA@?@?@I@IPEHeH?CG??A??D?D?D?DGQdI_H_JOcZ?QcOCX?C#6!40?@?@ACHQlQlQnSzLuLqnTz~Zn!7~^n!34~}|vGqDgQ`SBGC#4!20?A!4?OBB|nXvlZlrnYnzv^mvz~tZ~|v}z~T~[{[{[{{{u|~u|n~~|~|~~~Zuznyv|v[~u|nz^vlYvhAs@Slzt^zvzn|~m~~i~v}^n|~n~]n~zm~u^jv~Z~l~}~$#0@?A?A#3!20?_?O?g?Og?w?gOcO_GoKokiKzsn{z]|^m|N}VjVl^nVNJfZFHFHAJ?BA`CBCHAGA@A?A@A?A@?@A?@A@?@!5?@#14!7?_??_??O_O#13!140?_W_g?O_SgQkPmpmXvi|uly|}N}^}t}tmxuXu|zu|~|}~y~y~y~yvkYt]s^smXczcXexewj{j}h~zs~S|slYsJ{RcY`]_QGaC_#9!82?GqDiQD[bgUpJsB{BsJ_QGC#11!31?@???Ic?AG@C#10?A???B?B?A?GA?HAO??A#3!13?A?@#10!8?QG?cA#5!10?O!6?_O??O?_O$#10!46?O!6?_?_O?o?gSgQ_OgOCG_GS_U_CRGOG#3!440?@#5!34?cHQg$#16!47?_#4!23?O???KO_oCOZ{zu|v|}|~|}|~|}~}\^}LmNMNnNvNq?CPCH?D?GD?I?@?C-#3osgQSwQWESRoQDQQcATaORcbSBSB_R?VcZcv[rczQtJpWeOlRkRKbLQdID?@I@?A`I@IP???@#9!28?_O_?O?OgOcO_#6?G_?COCG??CA?iC#9o_WcycZsjSjsjSzSzSi\yD}JuLuF|Juj@MPlPidLpIuOdIpEhIrEhUPvCjSfKrElQDM@IJ@NCRKJ@ECL#7!21?_?O_SgUgTiSzkV{j}l~~}!6~^n~F~JVlRIDITA@?@#15!6?_G?Gs?kQcY_VCRCJOFoFGeGQcO_Wc?SA??o_O?o_O#8!9?@???@?@!8?O?O?O_O_#19!18?_O?_O!4?oO_?O#9!64?zCrSjcWfGUpUgvGv?SaGPG#4!13?T??~~TMDJE|yVn\j^vl]nznVzlZulZulZulZuj\uj\uZt^n~^~^~^~^}^~]~^|v}~t~z~}z^xsYpj~Yn~v]nz^u~Ynl~u\vz|m~\vz^u~\~zu~^~V|Z~~$#2NJVLjFLfXbKJDy@lBXaLJcJOJoJgVGvGBCB?BCJ?@??CA?@A#5??_??_??o??o?o?o?sAPgS?ACHasYpmo|!5{}{~~z~~z~|b[ju[Je^SjkfQlZlV}dZuXeztztyTyTrJ^dZDZcJSjSJSjCjCJTADI@CHAH?A?@?C@?ACP?Q?D?HQCGPAT?HQ@I?JSBGRCHQDiPaDOc?BGB?CG@A?@?@!4?@A#8!38?_O?W?cGAC`Q_?GCQcITaH?A?@#18!7?_?g?k_cG_G_O?_??_?_?O_gw!4?_??_#7!28?@A?I?AChAk@lAlJuLzEZl^Fn~Nn!4~NnN^ne\zUlYtilYdzeHsHUgDiPCaOH_S??_?O?G_#5!34?PA?S`MhVGvG~j\vmv!13~i~~??ipysxADgOaS_GQ`OCOgCQcHQcHQcHQcHSaGSaGcG_O?_?_?_?_?_?_?_!10?_CIdIS?cO?G_OC_H?dO???aGCAP?aGC_??_!4?_?_$#16???_??_?_G?C_?g?O_?O_?O?_??O?_G??_!7?GC???C??A!8?AG??I#12?C!5?A!33?_#14!7?G?QCHaH?ACI@gD?GC?A#6!14?_?_?o?o?o?w?sGSyomOiCY_MoHeGpEgS_KoCgcGo?gO_Go?gO_[ocYowcosypyo~}~}!4~}|!11~^~n^jVhViTjCRgBS@Q??@#13!9?_?O_OgSgTitylYti\u~|^u~vJ~RlZD^?z?ZOfWFWfXVlZN^FZnJTF~N^n^N^N!9~}~~~}~}!8~n~n~m\nT~|zU|R}Q|QsHqCxcQ_W??O#6!7?O_?XaChQdITQdYCXuJuhVyTmz\nu^j~~^~n~v^!29~CzKjSIdWbG#11!64?@??@?A!10?@??@??AG@?I?C?@C?A!5?@???@!7?Q?H!10?H?A?CH???GAc$#10!10?_?G???G?G?CG?G?G_CGC?_W?OG_GO?k?oIcPiOkPKr[QlIDyLEdITL??C?CA@C!4?@!479?@?C$#17!14?C??C!5?C?C!8?G!4?C?A??@G#4!9?O??o?OC_?Y@wcAh{xyu\JcMPNA!5B@B??C??C?A[bSHbSH?JCRGDA?A?@-#3~Oq@ugRokRg?vgQgRsApQcX_Z_X_Qs@titjSjDa@a?`?@?@?JQDI@?@?AC?@A!4?@#9!11?_?O?_?OgCgQgSgSgSgSiSgVg]isJ{RkYlyT}sj[yUxuGokOi}Wv]|^}^~N}\~]|^~N~ExEhUHATAT?TASAS`SHATASBSjCjSjCjSjCjU`MPm@mPm@mP#5A???@#7!12?_!8?_O??O?OKoDyCxExe|i\v}t~|~}!9~^vnPKaLOBGQ??@#15!7?OgCgTa[`]?n?PAD?ADA?oC?S?C?H?O`CO_CAgACOC@G?O@??C!19?C#8?dG`I_ITi#7???i?IOAS?tItItItlAQx\Kmzx|GidOIut~z}tmxfzexehV`]hUwDiWa\?i?PGCa@OCO#9!28?~?~?iU?lJoESqeOjS`KPI_H#4!13?H?~~T!4?~~~`^uXf}hVylVylZulZulZulZulZulZuZe|jUzuLyVyVi\uj]j|^uz|m^zmvz\}nvz]nv|zn|vZn}v^l~uv|mzv]zn|vZ}nz\}vz^l~Z~~$#10?i?sGQgCQgOeGOcPkAxGcXcQcXcYcHqGSISjSYL]PMYjUxIz_C_@sAY?H?CG?DA@#4!32?@?A#6!22?A!6?_?_?_?o?_?_?_?o?wExUhu|i|i~i|j|j]ju|i|i{jSzSjSzSjSzSh]pmP}PmP}Pm|~~~}!12~^!8~^n~~n~nrNyDzExEXATaG@I?A?@#8!9?_GOe@OA_C_D?Qc?C@A??@#18!8?_?OgCgy|[wx^Nz^j~Z]u~M]zN^z\V|Znz]U~m]oqhsAxCq@GC@gAPGA!5?G#19!26?AOlCAaPCCAvOIdPG#5!67?T_HQ_CXaLOnSj]rmt^u!13~u~??i!4~???]_HeW@UgDQgDQcHQcHQcHQcHQcHQcHcXAShCHqDgDgTaHS`SA_HCAP_CPGCa@OGC`OGACOAGcO@G_???GAPCG`COAGc@OCa@GC_Q#11?c$#16?DGA@C?H?C@G?BGA?GCAGA?L?E?DGAKA@!8?@?C??C#5?ShYsIx?|siyU|q|Yv}T}}u~z~~~|~^~m~^~nVzVlVjVjVjVjSjTgV`TJsBkRdQDi@JSbDhEHvLQnT@fG@A?@???@A?@A!4?@!21?@#13!89?GqLoNwVg~lY~z}|~~}nVzVi\b]@~?ViT?A@?C!7?`??@#21!11?_#13`?@?NLQJ|EzL}vz}V|mv|!5~r~Yv]t^tiT~~~T~tn|j~ItItItIOl?A_P??A#6??DOIc@I?C@IPEWCXEXUg]`UhFyTf\a~T~mvz\}nzn!28~?~?~?Hu?SJ_H?H#11!111?Q?H$#2??DG?@C?@?CP??@C???C??A???A?@#4!8?_O_KoCOGEOC!5?CcA?P@_?G?CG?i@@H?C???A???@#14!42?@#20!167?_A?_??_!6?_??_??_??_!6?_$#17!7?A??A??C???@??@#12!23?_?_#14!16?_#21!235?_-#3yDiOMOlQcRkPmObChUGQlOLQKOHA?AS?P?DGDGCG??A!5?A#9!9?_?_?_?o?kOiSiSiTiti|j|j[ZuLynYTi|YsnWviLuLrJuHv@~@lJTiVgViTiTjTmRlUhVkRiDYbEHAJTaDIPADGA?A_O??CG?CO?cO?C?_CO?CO?OG?O?G?O?G?O@GAHAGAD?D#7_GCOGC_S?s?s?s?cWasGqGsGqLSiLyTmXvi\u~|zu|y~~}~}!4~^~^nnZdZcHaGQDOD#15!11?OkPM?NOBGCI@!8?A@???@??@!6?@?A@?A@@??P??PI_COG_O#13?bNY~Vj~ny^uz|n}j~~lZ~~ze!4~y~yvm|j~iTmTzT?i?T?G?A#6!4?Ag???@?@??DG@QdIcJOfGVgTipEhU|Yd]b\uZl~v\nvz~V!20~?~?~?TgDQ?C#4!23?S@?S??~~jvNxvI|Ze|jUlzUlzUlzUlZulZulZulZulZulZulZulZuZe|jVkZvi~V|u|}~m^~U|}~\lvz~U|nuzlZulZtmtN}i^uxnyt~V|nuz\~mvz|n~~$#10DIDm@nALBkBE@NSJU`ELAfQdBjCTjDiFCB_?A?B?AC?C@E#6!35?_??_???_??_??_?O_GoGsGs?{?{QsiTgVgTiTiSiOkQgUgQkOyc[xu|si\ytm|yv|~|NnvRrVzjnZJfRr^ZjnZjn~fv^nvv^nvv^nuv|u|v|y~y^vznvz^j~J~J~J~Zf\JvLvJvLqjTqDiPeGTaH?ACHAD??@?@#8!4?_?_OOcYCRCPD?gA?Q?A?@??@#18!6?_O_Gsapcw^}vnn|~v[}n|vm~z}l~~l|v}|t}|tumvmin~mt^jnvNn^[od?gS?OD_HCAO@S#8??Qc??CX#7!4?D?DGPAS?TiPiCGiTTiifrp||~CTR~~~}~}~~yv}lYtZsnWvgViTMxUhAdY`[aHcQ?GaOGC?g#9!20?~?~?TiEWhcZ_]`UkPaLOd?QGCA#11!77?P??HA@?A!18?@$#5?_O!5?O???O??_???_!4?O??_?O?O???E?DGCLACAC?Da?Q_ggw{{~u\~Z}^~N~RnTjTjTiTITASASBcHQDOdITADJOFGDQ@AC?@AGA?A!13?@??@??@?D?@#19!16?O?GcG_CO?cOGcG_CO?cO??G?_?G?_?G?_?G#13!68?_GqKqlQlyl~|~}~~}~~~nRmPnOfGTIPE?@??O!8?O!7?A!7?GO?P#19!53?aT?i?TOKKAA?zgC#5!68?i?PaCZ_^`]hRm\qnY~lvz|!8~j}~j~~??SGoEGtAcXAShQChQChQChQcHQcHQcHQcHQcHQcHQcHQcHcXASgRcGT?gAHA@??_?_???_QGC?hAOHCQcHQcIPIo?T_HEODI?gAOHCa?PGCAO$#12?O??_???G!5?GO??_???_?_?_GOg?gA?A??A?@!4?A#5!106?G!8?G#21!122?_??O?A?G`?OAG!4?Q??Q?G??G??G??G?C$#16???@#4O?O_??Og?_???GO?OG?G?CQ?C???g{Wpwooqoxxxwxy\|l^VVFBB?HA?C@#20!223?G!12?C!8?A??A!6?O!4?O??O?_$#16!18?@!11?@-#4O?PAGqSApG_ADgS_@??GJ!4?_AO??AGn~~}~~^N^KFBbB?G??G!6?@#6!13?_O?_W_Cy@QGdAGtAhSiT_ItK}hUxulyd~kZu|}~\NelV|]ned~~EvmlvT^nmz^Znzmh^evZp|KyViVlSe\rFYfTjTnTjRmRlTiUjSkXeYn\tM{TmYjqMt[C^mQlQlQlRmOnQlQLQeGRcAHA?A@A?@A!4?@A#13!13?Ok?gSgSgSgti\y|}hVzmznzv~~~^tf\js@?A@#20?_?GA_C_C?O!9?@!18?C???_G@c?@?_?O??G#8!13?A???@A#7!8?@?@ChAGAtAY@laUZHl|RZW||RrnbVJb^BjBbf@JePzuLyc\sJSjQdI_ShU_SIP_COAhOCg#9!18?~?~?Zc?ZcgN_~?|A{@}@{?Qk@W@G?G#4!4?@?C@G?BbALZulZulZulZulZulZulZlrm\rmTzUlzUlzA@BA@BA@B}tZe|J|Rmt[vj^vYf|J}RntmZtnYvj\vZe\ze\ju\e[tYvjuNzUzVlZvi^bLRiRHv^$#3i@G@aDGTA??@ADGPcHODOdG@?CGAGQCO#11???@#9!20?hAgRCrCz?~?~OnYTjlYfIz?}hfYxvI|UjTiZtIr@UhEHQDY?RcHA@?A_HQgA`?@I??PG@Q?I_?PC?cOC@Q?PG??AA@!4?A@!15?A?@?A?A?@??A??A?@??@??@??@#8!47?A?@A?B?B?B??A@A@SgCPCOCG#18???_?W_SI{}|}^^Vvx^z\z~nunz~^z~\~u}l~u|n|~u~z]~|v~\~z|n}^v{Yz{}U^Nf~E?PegcQ@OD?@#19!16?_??_??_O?G@cAOH_cQAGcfAAkCOK_SG_S?[?WcOGC#5!51?cHQcHU_^?~A|B}@}B~lR}f}v~v!4~}~z}v~{[|qcHQcHQcHQcHQcHQcHQcQKPaKPiChQChQC|}{|}{|}{@IcXAsAkPIbGS_GcWAs@kOIPcIOdGSaGcXaCXaSHaXbIdGSHoChCgQcGT_[qkTGuG_$#10DOeG?Ga?GCIS_?ACGACa?AOEgBO`C_HA#19!78?_O!5?OGO??g?O?G_?O??_???OC_G?cI?@??D_A@?A??D?A?A?A??@?A?@?C@A?@??A?@A?@??@?I@A?@#15!76?I?A?@A@??_?g?C!7?O!8?@???A!16?@??A@???G_?W???G#6!50?G?OG_S?gS_[?YcPiCHqDZaJsjSlYt^jUh^jtm^zn|UnzV!18~?~?~?Ql?Q@O#11!90?@#10!46?C$#5?i?_T?@gCaP_GQ`GQshOcWdgTWcKqLocO!5?_o_rw{[{~v~~v!5~U{VkzKzC~?~?nOdICQD?T?D?CO?C!7?C!20?O!5?O!23?C#7?oCgOGOgW_Kw_WgSgOgSkOkOgSgOgOcWcO_Go?gOcSKo?_w_OkQlQlQkPnOlQlqlXvkZ|u|~|}|~}|!4~}|!13~lR}TjSjSjSIT_C??A#21!27?A???H?C?_C?a?G?Q?H?OA?H?C`?AG?a??AO#13!5?CA@@?_??p~eXVZl}ny~}~~|~~~}|!8~]~}ZU|VlItcYOL_CQ??c#11!216?_$#12?C?S!5?PCGO??A??A???AOA?@?@??@#5!140?@!7?@!7?A-hQCOIO`QcGqCxCOdZeWvGvi\a\itYlYtOwk}v~n|!5~v^jvZvlRmPmPnPmPeXAl?dI?AC@?@#19!18?G??O??_???O?G?cAPCgAS?IOCO?gS`IsApCgQcHSaGT_DWaChSaHO!19?@???@#13!59?_OGOgCOoSiPiTiTiTi~y|u~|!4~|~}~~~^nZdYlUHF?@???C@@#21_???O!4?C@?A?GA_G@?AG@c#15!5?OOG!5?_?Gc!5?CG?CG??G??O#19!23?I??aGC@_?C@_QGDO?iAPH__O?Nd?IdSHcQ@kRCiPC_O#9!46?~?~?Zc?zChIShRItITITaKpCRk?T_P?O?G#4!8?O??C_p~mP~UhvmXvYf{jV{juZu\zUlJELJM???O??T?_NNzsnTyvLyvI|Ze\ze|Zt}tz|u\julZulZtm\rmTzlUzlUzUlZulZlr]tjSJoiSHun$QcxjskYcZuLxEylY?ODGaG?AS?OAcOc?nFR@G?OA#9!5?G_SGcGQkPmPmOmPmXe|QNY`TkXa]_^_NOjCZdITaDIPEHQ@Oi?HQ?@o@?@Q?G?c?PC_?O?A?@Q@G??GCA@!4?@?A?@!5?@#7??CiTj}jU|A|iTzuhU|q~syS~SwU|qnYt]tI|iTyTi\mZuLydZu\qnYti~ytMzv}l^}!19~^nvnVznNjTmTiTiTiT?DAH?A#8!4?A?@#18???_OcWdQhuw~]~~Pym}^n|vl~i^~j]NT~v\^vM~|V}Z~ululjfR}h^r^E\QH~m^|nyvvzvzZVEeABP?Oc#7!22?A?CHaGAL?qIdTTkeU^Nn~OYytOjcQHsQ?gPCiXfLzsj]hvH}hUhUGvGqDwDoGaPCI`SA?gA_C?GC#5!13?cHQCOAS`AK`ITiTi\rMzkR~i^m~n~v!8~n~~j^M?Pm?hUGPeGdWBSgBSHcHaChQsxqsp~~~n~~i~^ooCJOiDGqDGtAcXaCXAcI@ICAHaSHQcHQcIPaKPiCQhCQhChQcHQcQK`ISjsNPHcHO$#10CGAC@ACG?@?A?@A?cHa?T?T_HaDG@A@I#6!33?o?SiPa[`]_^onSzcYti\ytmxul}fT~el~]N}~mlvvZXkiR\jntlzmlUb]sBxKyVlZui\ti]yf\zUi\ujTiS@ShA|ATiCHUhAL?JCj?jEhALOdI`ItATiDiTaPcHqDYcHaLOdIT?DIpCG@Q_@#15!56?A!9?I#23!13?_?_!5?_!9?O?G??C?G_O_c#21??O#13!9?C_pXh[k~nZ!18~t~~\tzyU\r{QlDoIi?PG_?O??_#6?D?I?QHcI@kRCiPEGqCJS`UGu@UhUhvGvLyFyNv\mzt]j|~V|^z~vz!9~?~?~?Ql?jS`IS_S?_?_#3!26?O#22!101?C?A$#3?@!5?@#5!100?A!13?@#20!149?_??c@O??OAGA?T_?O?OG??_??O??_???HQHAC?c@Q_C?HA@Q?@_AO@?G??C_?G?C_A#11!258?a#10O$#12!5?@#15!284?_-#5iT?TIPcQcHQlQlQ?~@}DyLqnO~Y|^l~y~~y~~}~~^~n^vlZvItITiDIPATAOD?A?A#7!14?_???_O?gOcGS?OcGq_g#19CODGQ_HOCgAWaSHcPKPaKOjSIpEPiTAcHeOTAYDqDoJOm@O#13!69?_OGCaGCQGCQgA|?}PiSjszl]zulZulz!12~nZtJuLRKB#20!4?Ga?GAODOc?A_RG@I?@G?C?A@?_???O?CA?H?P_H?GCA?Q?C?CAO?GAO@c?H?C??_G?C_OA#19!23?c@GaOCA_OC@C?I_CBOK_QHCQ?g@bOsRIodKAp#9!48?dIPeHuIYcHrCiTGqTdIjShEOi@}@M_O?Og?_?_#4!6?A!19?FDAFDAFD??OC?OD?OD?Q?CO?~}Tze\julZulZtmZEDJVynVzluLzUlZulYvmXvmXvmXvmXvluLzUlZulQHqLQ_ny$Ti~itmZlZulQlQl~?S@QC_H?i?dA?A?D??D??@#9??_?O_GQcGtItiTytm|i\niVxnOnOfGVGbCHQdGA?@_@???@!4?@!5?DOh?O@?A?H?C#7!17?G??_W?OG?g?_G?GC_?Omlz}|~|~T}T}z}|!6~tn\zV}T~tn\z~}|~|~|~|~|z}|z~~}|z}!4~^!4~^!6~^nvz\vzlvzlV|A~@mTjSJCQ`CHQcHQC#18!12?OcIsHqkr{!4~v\^b|nynZ~t^Kdkdh{fljFly_TXqYN]q|ne|kXsncIlrH^j}z|nzv|n}Y^uuzz^VFvqQJHp?C@#7!22?GAoCHaGQ@T?Z_KbRLdQhlVV}KlJGtDIQpM}~~~}|z}lZu|zmXeXuH}hUh}?y@}?yDWaGcQHOdO#5!14?@?PaCGPAcH?Y`SjUxnT}@}p^n~nV~^~^!6~|!19~wy|wy|wy~~nz~ny~ny~l~zn~?@iCXaSHQcHQcIPcxysgDOgCQHqChQcHQdGPeGPeGPeGPeGQHqChQcHQluLOdIOD$#10!17?i?g@QCOD#14???_O#6!28?_?OgCOlOnWvgv[zulYv|~]^}~^n}VnZvi~nZvLYFQniul\uezR|f\juZmrm\rnSjtMxeTi\BuHfiTdYDyFoNPm@QC@A?A?i@i@C@A!6?IOaCg@i?IOaC?@A?A?A?A?AC@AC??@AC@!4?_!4?_#15!64?_S!8?_?Q?SA??O_O?UGAC@_?@??O?ACA?Q`OGC_?@!8?@_?H?C_GO#6!56?A?c?IO`K?@???@AC@QcHACPeXeHu@UhU@~D}@~Dyf\vZlunYn!8~YtmXuHsdISGrCgRCi?S#10!128?_GT$#21!280?G!7?O!27?O!4?C#13!12?_GHLcsM~z}!19~Z}vTlJxULrkyitCZoK_QGcQ?g??O#11!204?A$#23!283?Q?OA??Q?W?CHAcHc?`G?O?A?A?O@O?C_-#5{k{k{k{s~zl}Z|v\~~|~~|~~|!9~nVj\e\jQlRm?I?CG@A#19!14?_?GS??G_CO?aT#7?iSHcYCiCy@{RsiTypiXeXuh}lzu{sm{Z_G?S?_?G?gOOi_OGO`GS__Og?QHcAC`IOOiOsGOtkaTga[Sa!45~^nvP\nhdU}RJkUVgIdOn?^dYdIDOdIPAC@A#8cG`I#18!6?o?GsAsGdys~]~~V~\tm|Z~U~n}zNVIfJmh@csPPlWlZK|v]Qv[IIty\wl\kYNxyh\zv^}vMnz}fz~fyz\\vXZ~G?_yNA@OG!5?G#7!15?@I!4?@AC@cIDoEIjTCqHlSURjNffuyxsq!12~}|~|ZulYtiTytiTydWfGqDgQHeOISpCo#9!17?@!8?@??@#22!6?G??cA??O#4!14?OE?gA?gAOC!17?DO?d?Q?@@@?@@?@N^ItnWwOnvZluZlugQdYdYdJoEWaTIS`]_?iTrEGrHU`]`UWBOGpm\i}$BRBRBRBJ?CQ@cAGa??A??A??A#14!9?OGCA@#6!8?oIsA{a\qlqlYtm|z~Yv\~fbznuVRj~XG}TjuZdzTzD}BkJTiDITeXeHU@QCHBIPBcITeHuDZcjU@iCPNOfGUbKRM@UHsA[`YC@m@CJ?fGAPGAT?bG#13!45?_OGa?OAG_?cO@g?ToIdO~_YdYtynYtm|z}|Zv]t!6~N~vJ|JvYDJ?@#21!4?_?O?C?H?O@C??@!36?G_@G#13_!13?c?ez^D_x{nv!5~v!15~}t~~~zm|ymPsiLoS?iXCq?h_CO?G#6??@CA@!12?@A?AcHQdITiDITiDYfWvLyVluXntjMzN!17~}~~mXvGrMw~?}?vGQcH??cIP?O??_#3!12?@#22!57?@!7?C!9?t!7?_???G#26!5?PAC$#9!35?_O_WaSlQkP~tNpB{@\aLQLQdIPAC?dGA?O?CO@GgC?C_@#19!16?C!11?@???TaXaHYcRS@mDPM_fGU`GRK`UhcAX`YCpm@Sj?vGAPKaTGbGT!48?Ka?SQG@GcQ@gADOI#20!37?_??g?AG@A_?_!4?OGC?C?A?@??A!6?G_C??O??@_@O_OCOA@O_C!4?P?C@OC?OD?a??c??OC??OCA#19!28?CO?@OI@OAH`S?aHCQAHgCoOWHCAHK#5!64?PeGvKpE?~?~GvlZuv~ZPk~nn~^!12~mx~V|~V|nz!17~yn~Y~l~}}}~}}~}o_tIOfFnOGcQHcQHUlYdYdYoJxf\itj]`^ITiCXvGS@]`U@f[jTI???@$!69?G!8?A#24!134?@#15!53?A#23!9?_?oGO@SiOJcGQdQcR??@g?bCPICA?A?@_?C?A#25!22?@#11!230?C#10!13?G_?C!5?_?_$#15!278?_?O_O?SI?Ic?A??_A??@G?`c???E?AA@_?CCA!6?O??G??G?C?aGA#11!251?aG??G???CaC?_P-#5~~~}~~}!15~^~n~N~vJnj]tMzDYdYCXaHC@#7!9?_O?Og?sGQk?wCyCwcYoWskYskynynynyry|~}|~~}~|~}|~}!8~|agTQkaXTRKtRGicT}{|\[Nfvu~~mfrYMFbzz~vrz{keut||kv~V~n~^n~~n~^n~~n^~^~n~^~n~^n~~n~v\rf\z~Tnv\uj\uLrKuGza[bHUhAGQ`ChAHQ?@?AC#8!6?a??@#18O?o?ShCRkr{~}m~|^|j~|zn\vyl|ny~mz}lxXbQ[LI{l}|ftJIyzk]vYvrn|fk\l|Z~m\[h{v~z^z~U~L|m}v\t^mVr@@@_?EA?APG!4?@?@?C#19!17?OC`?C?A_DOI_Ca@OAtOGK?gCEA`_??C#6!13?CG??@aKPA?cHQcHqDjTItJuHuHulZ}V!17~ZulYtn[zExExEgTiCWaHQH?cPAOA#14?A#4!12?Sk???k#22!16?_?_?_?_???c?c?CG#10!17?A#22!5?@?_!8?A?O???@@?O#26!8?A$#4???@??@#9!15?_?O?o?GsOS`IPCYDYDZELQRGUH?@?@?@?@???@!5?@!5?@#19!40?\AgdPKagcRGcVPIg@AAA`oOGH??POGD_wWCC?GGCBPPGIAAP!52?@??@!5?@#25!35?O#20?A_AO??COaGDQ??@!4?A?_???O!5?G!5?O_GC?CO?G@_O???@_@?@???_C?h?Q?@??AG?O?C?A?@?_C@#7!31?CGOdGAgDOJwCidGIdrr^Rxx[]Nvzz!13~zv~~}\rm|~ZulZuLySitIsHuHuHQc@g#5!17?cHQdIObCxExExViTxfLsluvZm|n|~|~~^~^~^~^~~^jRj^nRV!15~^~]~^~^~||X|XlXdzjvkqmXui\qmXui|iTyTjUzUHUHvGvITiThEhCzEwEgDiShSJs@gP_$#6!34?_?__?___Ocguhu~}~}~}~]n~nU~JvlR}FyDzEYdJfIRdJQDODODODGDA?@A??@?A?@A?@!8?A?TAGAPCAG_AG_CPA?@??A!10?@!9?A?@???A#8!57?_??_?_#21!39?C?A!7?OC?PC?O!8?O!15?A!5?c?O??O?G?C#13!15?G{{}]~Xx}|mv!4~}~}~z!17~nzYvjYt\QidSBXSIt?IC?_CA?`??GC#22!78?A?OA??G!9?_?_?_?_??_??S_O?g#4!17?@!5?!5AQaQCSGRLPeHTaLPeHTATgDiShCgUHuGVGtiDiShExChEwFiPISbSHuEGVl~$#19!67?@??@??C?@???@!7?C#13!43?_??G!5?GC_O?C!4?C???G!5?G?g?O?_O??O?_O??O_?_?O?_?O?_O??O?GaKWaC?iOGaHSaHqKrHuC\a[UhU\uL]zU|ul~}~|z!6~\~~}n~N~jUzkRKB?@@#23!13?A!7?ACShA_PA?@AOIs@C?B??_G???OA?A!4?A?A#24!84?O#11!168?_#10???_???O!4?A?O!4?C_AG???OC$#15!277?@?CAGC`Ac@A!5?s@C?@?@?G???OA?A!4?aCA!8?_AO@G_A_@g?A#11!243?O!6?O??@??_AG@_GQ-#5~tJ}Tj]dZ}TzmtZ|nVj\jUj[b]`]pExEpCZ_JSaT?O?O#7!6?_?Ga[AlA\aLyTj[jsZ}T}zn^~]~~}!33~mMM~}mevp|srT[QqX|[]n~vrrXx\{UuRz~hlsunSqZh{mRxWm~nV|m^jv]j|nV|U~^unnZv~Ti\vlYtmrmT~n^qlRkZdYdZsJ{ALiDiTIDQGpI_ACOd?T#15!13?O??O?_?O?O???_??G?_??G!8?_!7?A@?A?A!4?Q??A?A@A@@??GGC!6?GDA?@?G??O?OA???G!4?A#19!38?OA_CQ?_G?c@?I?CIHCCA?L@GCFB#6!24?@I?OcHqChUgQdITiTiTiTi^t~v!8~n~n~n~n~ZulZulZvkRkRkRkRgQDY?D?WaG_#14?_#22???CH?AS_Di?iO_NOJOI?o?o!5?o?o???I?I?ACG@iSgDA!4CA?OOGCCA?OOGCCA??__O??@???A??C??_@!4?C?@???A??CA$#9?Is@iS`Yc@iCPIcAOGCASHCBK@M@MHEHA__OO`O_O_O_Oo?o#19!64?PpO?@POGEAHKA`lCCAB`??GGKCEAA@HGC?CQAH?AHCCA@GCE@#8!41?_?_?_??@sQCYCa@WdQCODW_?O?_?o?o?o?O?O_?@#18?GcBOHqCxas~~^~vt^Zn~q^un|uj^I^yn~Y~l~{un{v[zm~xcY|xm[ukYuzUtQztn~tzvRw|}}vvivf~n|FJP_f~r~|`_O?CaOGCA@G?D??@??_?_#7!17?O?h?QC`I?ID?iPSqJxlQq]bXW{^n~n~~^~~~^!13~}t~nZuLzUhVlYtiTiTiTiT_I?G#5!8?O?O?O?O?cHQcHQcGRkRkRkRkVlWcVi^f\v^~^~~~zu~|j^yT~TlZoNsdd^N~N~n~n^N~N~n~d~d~lzf]TjVi|hZypkZedrjWxVmDrYpkZuHNitj[qlOl?Z_zCISiDyPiOmOLsHSjGl?ISA$#6!17?_O_?_O_O_O_?o?oKZCNcILInNnNnN~N~~^~v\b|Q|a\qDiSbSJc@i@CO_?`??@!35?`???@?G?A?GA?H#20!129?GA_C??D?HOAGS_T??O!6?G!4?C??A@_??P_GOCGC`A`!4?IC?CA?@?G?@?G!5?A!6?A#9!148?_?_O_#4!19?AC?_?IO_!4?O?O_!4?O?O?O?O?O_???O?Q_@GPcH?CO`Cg@_C`GPcHU?DISADAL?n?ICRCi@ICI@M?fAHcBS`OmP`kT~$#13!118?G!5?_???a?_?O??C?a?_@g?c??Q?H?OhC_Q@OcA`O?OgAP_SG`SAOgAh?_HOOcG?iTaGQdIPKPi?O_LQkRCYDYCJsAH_P_PGsaGdIdYdZnI~I~N~N~N~n~n^~}nvZknULjELJ#21!8?O??_???@!4?D??d?Q???O?G_?O!17?AO!4?_!6?C#25!5?GC?@??C#22!151?A@G#11!59?A???G??A???G??A!4?O!6?A?Oc??_P??O?C?@??_A!6?_$#23!271?_!8?@??@?@?@?CGDAC?@?@_??G?C!6?G#13!7?OG!4?ookUW?G??[^n~z\nvz|}v~y~~}~~^~^!16~nl^QllZUtZsytTi`CoAOl?_Sa_?_O?O??_???_#10!139?A!6?A!11?_GO_O??P?G??S_@_O_OGO?Og?Q?PCIPi$#13!305?G-#5~A\aLQdIPiDqDwBsAdGRcHQDODQcIPaCjT??A?CHO?O_#7!5?`GCaGTa?hU?zUhvlY|vlZ~~vnv~u~u!30~^~n!4~v\nz]v|nvzz\n~znv|nzUlZulZul~u^z\ujSjSze\juHu\ivYlvYlvYluZlZu|Vm^nq|VlylR}d]tYvlYvi|A|aLqDYdRkJyszkRIcH_GOID?Qc@S#15!12?CHcAOG?O_O??GAOcPI_?G_!7?@??OC#20!15?G???_?G???GO!6?A#15!5?_G@CO?dI`?G?@_OG?DAo?G?A#7!25?O_CGQ???g@QcH?sOCPi@UgRkRkYtj]dYdYntvz|]nv|^u~~z!13~}|~|zulZtiVkZtI~?|AsAH?G#5!16?cHQcHQcHQk@}@}DY|j}tZ]lzTM~ZN~~~j^juLzdZM|ULxJyPvl?~TiU|vl?lZci~aRqnUprl?~QU|rh{h[YVepjzEHjPe\_^a[aXcXeHwSBwDqMGel_EhUlQHeXaTgPC?A@?G@$#9?|a\qLIteTiDyFsB!10?@!6?A?@#8!73?_?O#13!4?GaOC`GAOGC?aO?COGAOChQcHQcHQ?H_CaHSjSjCXaSHuHaTGdQGdQGdQHcQcHAgP?OLA??@A?@??A@!4?DA@?@O@G_OgA_C@?A?sJcZCJs_ZcJsJuhVlyd^u\vl~zuIxNa\aD#20!12?A?G?C!4?CO?A#13!17?G#15??A@G@?O?O#13?G!4?C??B!9?G[SNA@___o{M~V^|V~^}^}!19~n^zvl~~^QmlZuJJdYeTihVkRkRdIS`YdYdOI?CA`OGA_H??C#6!13?@A?ACHQcITgRcIt?~A|J|u~v!16~ZulZulZulR}@}@ydAS@Ic@QCiP?cO#4!9?O_??@_A_@aGQ!4?hAGQ!4?T?T_HO`AGQ???hAGO@S_CGPAOCOC?G@?C??AHA@COA@gCAG@OA?QH?Q??dO?CG_CAqHgScASIv$#6!5?_O?G?OG??GG|YvkZulynykZtm\zSg~}|~zun~n^!5~]vz\vi\~Uh~ChUGQdAGQc??GOG?H?H#19!47?C#8!53?_???gQCOk?Y`GcGQdGO?{A[aKqDICPS@ICPk@OQCrc@YcHOI_HUgQDY_HaGQ#18???PC_TaLIn~~v|nZmt^~v\~v~z~}t}znnxnz~~v}z^}v~~l~}vzv}^{uvy~dnnzu~~~|y~~{~^v}zn~YtQbbo{]NVNI@@?_??G??@?@#19!26?_DO???s?I`G?S!16?G#22!85?_???_??_???S_SHqCICpAgQCSCK??~?iT!4?~QcZ??GGC?GGC?~?l??CCAAA@_GGC??_?C??A??@?C?A??CA!5?`P??O#26!9?A?G$#20!249?O#21!18?@G!5?OC??G@C_@G??Q?@?C?@!4?C?A??C@!4?@#20!12?C#25!7?O#8!5?_?_?_?_#11!186?C???C!8?A??@_??C??_OS??A??@?C?A??CA@wCAG`O??UH???GcOASG???qDgItIp$#13!269?A#23!25?@#10!256?HA?aW_X_[_O_W_Ho???@oC?CG??_ChQ?AH_@APk@COAP?_CG-#5S@QCHQcHQDODQCPe?CHAC@CHQdI?HA?ACG@A#7!10?_??OiDgQdYdYdYtJ{jUlY|V!43~\vmZ|n^~nZ}Vl~U~~v~}Z|nu\jtmZtmZsnTyVmxVlYvi\juZ{z]tnZnvLyvLyvLzu\zu\zu\ju|nz]tj]jsZvkZuj[vlYehUhSjcZScZAkRGcRGb?IODODODO_!5?O#15O@C?A?APG?aG?T?`CO_??I_CPG?C?OCaWaS?O_O?O_!4?_!13?_G??G_?I?OAcG@g?dA`?@C_A?OG??_I@O?c#8!5?QCOdGPGPGPGP#7!5?O?OdGPAS@S`CHQcHQcHaHsBGjT?~?zUlZulZulZtmZun|V~\~~~vn!9~u~un~~~i~i~iTmTzUhUhUoDyChAHD#5!16?cHQcHQcJShA|ItiTzA\Ge^Hc}Lmurzn~lZulZulQnydtn|bRqnYvmLbcWMJmjmBaxPIXR?}d]FLzmraXGi}IpGCKbOhSRcjCQhUgR_IpB}?[BsJTS`iSAPMpAx?_O?I?dRGc$#9jShQcHQccIjgcJiH#8!96?aGO_?O_?O_?_O?_!51?CGaCHaSHAOC`IS`SJcGRcHSbGQ`WE`QHSJ_JPcXAcRGcPKOd?iAgAgALOaSgDi??OcGO_#18A??CO@_FMjBA~~t^zmuzzunx\f[j~f[nvmN~z~]^n|~}n~\~m~v~~^v~~R^ut~n|Zu}V~Y|]xoo[W^NV^C?_?C#19!43?OCAG_S?i#6!35?H?HO???T?T?TiPiChUhUhNyDzU|uy!16~ZulZulZsjU|AtITiCxAtG_QH?Q@GC#4!14?IOAS_HOD?PaCPcOC@S@cPAgCAg?@Y@Ga?PCOa?S?TAPGaCbOHCP?hCO@?GT?GC?A`GA?i@S?@G??G?CODI?_OAKbGZ?Tn$#6?iChQcHQHoCQHoCO~zu|z}zulYt~u|~|zv}|!10~^~~nTyVlYdYdYdIsBShQdAg#13!45?@CA!4?C@GA?H??G?@cAOHaSIPcIPcJOiDgPEgQdGTaSHcBC`IOcOGqDGqDGqCHa?@!24?C@OGCa?OC_I?cPGcRGeOnOnOlQlQlQn\jVyDn}jZtn\kv~Xf}IwOOg[#21!18?@??@??C?@??A?@??A?@#13!23?CMIBd!4_z^T}j~Z!5~lznYvmvmvmvm!5~n~nYvm|j}j]zulZulZuLqHsV?iT?~ChQcHQcHQcIPcHOAg?a???GO#22!71?C_AP?cQ@_O@GCO?QcHQcHQlODY???GGC!4?OOIA@_O??WGCC?_C~??__O??GGCv@@?GCaPOGCA_G?O#10?AgU?AcAw?W?S@s???@iSaPE_ALQ_PCIO?O?Ci?O$#20!257?C!7?@C?H?A??@??G??G?O???_?O???O?_?O?G!6?c?H!5?@!8?@#11!189?C!6?G?@_O??O?C?A_C!5?O!4?C!5?CaP?GCA_GASAhC?@_GP??@cA_G??i?S?@K_?\?_?DMPdG_CR_Ti$#25!258?@#13!18?A#25!41?A#10!194?_G!14?P!8?C??@!4?_#26!16?C??C#22??@!6?I#26??_!5?AG?_-#6om|{}{|}|}|}|}|}!8~z~z~z~z!11~|~u|ZmtnTyVlyTmPnOdY`ICPA?A#8!11?O??O??O???_QGCQG!16?OCQ?L_JShATgATgA_O??_!7?_!14?O!28?@A@?QGDa?HaODAOHeOdIOiCRGCRgCQdOGj?Hs?TgAgAGacICOdG_DQcOdW`Y`IOh?O_#25!13?G!9?_#13!35?_???__owM}Jtw~Nvz~|~|~i~h~j^zvm\zV{V{VkZsJ~j^yvm|j^}n]zUlZe\rlSzd\qMXsIt[c^c\aSIPCA@?aPAK`GA?A!5?A#6!4?CG???A?A_???T?T?TiSATgVgVkPmP~iV}!17~n}l~m|m~iTmPmPiTIPeHAS@a@?O@#4!13?S_L?T?cAo?HCGA?A_@G?aGQ??hOCGPA@S?@?GA?K`Q?D_AC@C?QHCOA?C?POG_[?OCW@Ca@O?gAH?C?A@__P?@oD@GaCPmP$#9A@AA@@A?A@A@A@A@#5!8?C?C?C?C#7!11?A?HAcPIOiDgQDiPmOnYd]tzm|~l!11~n~~n~~n~~~^lvzlv!16~nzl~q^sjU|iV|iV|Vj^tZf|Uj\uj\uj\u~luz\}vLzuLzUlzlRn\qn\qnYlr]tjU~lv}Zlv~}|}~lvy\~u\ny|nuXnYtnSzktzkTylQlbSjsI|iToDOdO@O`EGQCG?HA#15!8?C@G?PK?O@G_G?C?S@AG`C?hAsBGRGaDOLaSGdQChC?QC?T?AOC?T?Cg@?g?PcIOI?HC?C?o?SA??OGC?A?A?@?A#7!9?A?A?A?A_?S_DGPAS_@O`ChQcXaKOiCWaKpcItGaZ_Za\jtmz|}~\m|r]v|~|!5~|!4~zv~~~|~|^~~~i~i~iTj|iVgVgRmPm?Tg@#5!17?O@Q?PAP?TiPmPmTidkXSsji\[}NkzmZulR}TjUxVkj[QV_kItBXSgU`^hUYDePqKVlEljcMLajZujUhZ_M`NoKPb[_YDcPId\a\aCB?B_B_?cGWCjAT?sAhQlSM@M?M?I_C?G??G$LO?@?A?@#27!60?O#13!59?GC_ICWAhSaHSAHSaH?QHCa@GqCHaChQCQkOaLOaLOdQK`ISh?QG@cQG!22?@??A??A@?GAS?SA@A?ALQlQLYdYhQdZqlQlYf]d]tnUzmU~krulye\So_??o_#20!5?_A!4?C?G_??_??_??_??_??_??`??_!4?@??_??@???G??@#8!12?S?S?S_CGPaCg@g@gPcHS#19!19?A@?A?@?A@?A@#22!97?OA?aH?S?a@_QCPcHQk@iShEgR?B?_IAP?GCaA@???@?_OGC@_?O??R?_O!6?CBO???B???A@??A#26!6?G_C???G@??@!12?O?_O!4?O$#18!250?@?A?HACPAbNZ~jE\v]z~U\H{VkvXyfQ\jVYlZUz^lz^i~\nz]i~ZV}~V}mZTNt]uJ^BE@?_GF?_#11!182?_G?P??Ca?@?W???_OGC@_?O??O?_O??C???C?O??oA?_GAHC_QGcOAG??@?O_\_ACOaCo?X?kAhOC?A@??C?J_SbGbIP$#25!312?_?O??@#10!194?G???O_C_SGCA@???GA?A!4?K?_GS`O_??K?GOKO_O_G?_@G_PaKaSJ?AKPaIP?ICcAP?SAhOgOM_Z?COIODOc?e$#3!590?_-#6~~v|z!39~^|vZ}tj]tj]d^_^_ITgT?T?O_#8!19?AHC??A!23?aP_K@IcPIC`ICQHCaHc?GaO?CO?_?GAO??_?O@cOGA!24?`???@GAC?HC_QG@C?QGCA?CPGA?aO@CQ@OgPaSHaKOcRCaODyA_]?Si?TCxEpcISgTiShQcOCg?_?_#18S?G??@BEDBA@@ADJ\ANADBIDBALBEBMDAFIBEDANAFHFDA@??_?OGA_?_?O??A#7!21?O?OCOd?IOAs@ShAcGtAkPmA[`ITgTATgVkZkZc~gvwt^y~l~vY~v|~}!6~^~n~~n~n~N~~~Zv]tjUn^i^i^itInYdYdIdYdGTaGaG??_#5!13?dIT_TItOdYcZCjTiJuqZ]}~v!4~u|zulYdZmxflQt]tIdQzaLBohEpIUGf_XSGuKPkOSGon]lbItA{@mIDI@MPC?I@_PGD?@OA`??OC@ADGCIH?GC@AS@CQH?EOH?A?@_O$??GAC#7!39?_AGc@IS`IS`Y_^_^tiVi|i^nYn~~v~~n!12~|uz~~l~v!21~\m^r}tZmtz]tzluz\uZ~v\m~zl~Z}v\j^uZ|n}Znv|mztzU|iv|]vz|n]znv|^u~Z|]~~~}v|z~uz^lv}z~lvz|~zmv|~\n}zl}nVm\ju\rmZkzSLy?l[@uhCwaG??G?O_#15!7?@?AOCAPAGCA_?G`A?O_G_QCAL?DAcDacDAc@C`AD_DC@AD?D?E?aP_GCQ?CAo@SAO#8G!4?CG@IO?O_DGPASg@iOIOaCi@i?IOd#6!53?_?O??O?O?o???cG`IShO_T_T_TItOdYdYtYdYvi\v\v~~^!13~Yti^itInYdZcZCiT_HC_@#4!13?O_???O_I_I`?c?W?cBOGC`GA?R_HC?RC?i@CA?@?S?G@A?P?_CO_?I`?S?C?AgAC?GChA?_G_AP_CC@Q?g?Ag?C`G?a@?GS?A?D?QH$#27!64?A?_?DO??G??O#28!17?O?G#13!43?@??A?C@?_C_HCA!6?PCIChATGA`GCAO`COGA_H?cA!41?@???Ha?DOB_HAPFGrExEZdJViTjUlZmzTnZ|Mhvr|^}sWwwl]u\go__oowWoOWwoOwwOowWoowwwoowooWg[uzL~jtL]j\nf~~|~zv}tn~n^yvm|jV}Tntn\jTmPnOnOn|J}jU|ZvI|RmP|b]tiVi|iVgRcRcZ?VGFI_D?Q?Gd?GA?@#22!77?_O??S?HC_@?G!4?HACHQdICPEWAL?@?OOG?C_OGC!4?`OGCAa@?_A@?a@???G#26!7?O?_??_???A!4?C??C!11?A??g??_$#25!270?C!7?O?G???G???G???G!8?G!5?A#10!200?CA@?@A???@AS?C!4?OG?G?C?OGO_Q?`As?[?SIpI@cOCOALAp?TGhSAXA_HS@Q_GCApAgS@iS@_AW?c?WdA?HChOi?c$#20!296?G!7?G?C?@#11!200?G?C?OGCAoG?`OGCA_@?_AP?i@C!4?S?G@a?`??COI@YdgOgEwAoAhOaSLqIsGTaPoGs@AS@GQLoEpJSeWtiUhUiTlQ-#6!41~nz]v|j~uzmTzmPmTiTiTiCj?hAGQ???OcGqCO??O_#8!38?C@OC_Q@G_DOA`GC?Q@GCaP?A?@??AG@a??@#13!5?@??C??@???@??C??@???@#8!12?@!8?C!4?@??C?@?@?A?C?A@?CA?@I?QDGQC`Y?CY?lQMqOlAkQdISHuGtIPi_Ip?PCOCOCOcG_?_?_?_?cG!4?Oc?_?_?_?_!8?_?_?_?_?_?_?_?_?S?S?S?S?diCQDgDQdODoD_HAgQcG`IOA#6!53?cHQ??dGPASj??QcGPeGtASiT?TiTiTjSntYtJsnTyn~|}!14~ZulZc~?~?~?}@IsASH_CQ#4!13?Qc???IOACG?QC@cQ_L?aH?A?@GAOb??@?A??@S@SGC?Oa??GCQDG@aOD_?@_O?CAP?G?Ca??GACa?OCH_?Xa?D?c?Q_G?QC???@$#7!41?OC`GAS?HCPiCPmPiTiTiTzSnU|Vl~Z}fZuLzn~~n^~^!36~z}nz^l}v^yn|]vz~l}vz\m~|~}~~|v}\~~}!5~}~~z~~}~~~}~~z~~}~~~}!12~}!8~z!4~}~~z~}~}~|~z~|}~z|~}t~lyulzYd}zc~OkpChAO@cGO_!4?_#15!7?A?@??A@?CPGAOD?H?A`ICa??S@C?S?GAPGCa?GaOHCA?GC?T?GC?QG@#7!9?O?O_?O?_GAgAGQcODG@QCOd?TiSzcXeGtASiT?TiTydYtiTyt]zl~uz}|~}v!17~Zul~~Yvm|jS~~lZvmXvI|jTi~iTiTiSjOIdIsJOiDO?A@#5!14?cHQcZ?~?~?~@mtBxhuUZhl~~iVi~iVmTzUlZSzUtn\Hc}LJkA_ZQSGSa[BkRCICXfGVgEXeH?A`OHCHSaP_G_O?K??I?S?D?PG?cAO@G?C?O?G??_?SA?CO?Q?H?C?@$#27!64?O??_??c@G?@!8?_#13!147?@??C?@?@?A@?HEOlQHQdJuHvITmT^tM~mxnynzlYvZmV|Ny^uZt]tz\nZj]z]j]v\mvz\~v\nUz\~Uz^i^uZ~Lv]~j~j~j~j~ITjLyFyLQlQLqLQlQdYdYdI|iTjCZeXvI|jTi~iTiDYdITiDI`CQ?HC@A?@G#22!88?O?GCA?H_CQ??TgT?TgPiCh??jCh??_aQ@__QOHC?a@??@!4?@!6?@#26!4?G?A!6?A??A_??_!17?@??@!4?G_$#18!291?@?@!14?@!4?@#11!192?O@??O?HC?_H?aH?_O?H?Oa?O_@O_O?u_Og?iSaHcG`W?KODY@]_^_|ITeY`LiTmXaKyCycJsA@COJilHudYdYdyTmtY~tM$#10!517?S?S_[AcOcGCWeGSgEGaG@E@u@?HSAPCAdQ@i?S`I?IA__G@SaO?PaT_@PCJOAHsAHcO?Q?G@QcG@iPIc?Ip$#26!524?_-#6kzul!4~}~}~}~}!30~}z|}~t~]z|~iTylQ|itIOtIxAX_IsAgQcGOdIc!4?T!16?`!4?O?s#8!24?A!95?C@?CA@?ACxFy?EwFgAtIt?ZCjIsI?vGVGrKrKpMoItIoIoAcGt?TgPIOiOIOiOIS_S?S_Cg?Y_Y?Y_Y?Y_Y_ISg@yTiXATAPc#6!72?O?OcGPiCOcPcHuGRk@iTiTiSjOeXfWvgVwfXuhuxU|yvy|v!8~i^yV}Ti\jsnOnOnONQL@BOCgOAO#4!10?O_G`I?AS@CHOCHA`C@AC?Q?I@?O_SA?D_C?GAXCI@QC@AO?H?cOC@AO?`GQ@_?O@?O!11?hAC?`O?GAS?G?S??@??C?@aG@QC@AB$#5RCHQ!4?@?@?@?@#7!30?@CA@?I?`CA?TiDQlATItnAtE|A^tJtVlZvnWTZ|~u~i!16~]!4~n~J!24~|!95~z}~z|}~|zEwD}xFwAtItIoCw?t?Tg?O_#15!15?A!11?A!5?A@??A!6?@#7!15?_G_GQgQcHQgAgQcWbSiXa\aXa\_\a\itYluz]tzmztZmr}tZmtzu!25~n~nZvmTznZmZuHvkR}TiTiTjSnXeWfGVgFWeHUHEhADGDA#27G#5!8?T_Dg@iTaSJONOmOnoLay{niRf|Mn!4~lZuLzd]t]tn|JMjugZeTShIx?zCitSiD?BgTIPI`S?_?O_?gO?Ca?Q???_?C?C!9?@!14?GA?@!10?A#3???OB?@`Ahs$#27!66?G???c???G!5?A_?A?H#13!158?@???TG???N_BS?J_VGfGvKrKrMpNtItNtN|XvI~iVmtnTntlTntj^h}j^xV~d^d~c^d~d^d^tjV}DiTe\a\eHVlZulV|VlZf[jTe\a\e\a^a\aTIdQHC`ICPCIcPK@IcPICH#22!91?_?@???_OC??PCG?`O!4?QcHqCI@A!4?__O?F!4?A?C???@#26!4?G!8?@C?@C?@!7?A$#10!498?O!6?_?g?Oo?x?gC?_SITG@gOAOI`SAhCIdAG`HCc?I?JSGbGQ@_CY@iCgASaSHQcIPiCQCOhQCHaS_HaT_I@UgCO`IS??cG?G$#11!501?O!4?O?I?C?AC@O?I@_A_SA_K`SAg?Q_OGOe[aXQlPloItGvGuLyD}DyVli\julZtmTzlQlQlQc\a\a\a^`}hUzlYtiLsYcYsSG-#6Vn^j]r]tn|n\v\vl!4~j^zV|V|V|~|~n^!5~n!9~}!5~}~~|~~u~|yT}ju\ytmXukPiTiPaCGO_?`CGO_!4?S?S?S_CgA`A_?_?a?a!46?_?_?_?_?O_O?_C?C_?_?_?_?_?O?S?TiO?O?O?O_!5?O?S_?_?_?_?_?_!5?o?o?O???_#8!8?A@A?C@QHCAGTArCxItGTaKbGTa\cZcXQdQdISpEHqTiTIpU`mPmdYdiCzCheXcjSjcZcjSjcRwBcRsRgDSjOdASG_#19!5?Q#6!40?_?_?_?_?S_S?S_S?S_S?S_S_LoDiT_TITaKPmTiTiTcXe\i|A{@}@}tI|Rm\rm|u~~n!4~z!8~T~Tj\jUhUjUHQdIPcGCBOI@S#4!8?OcG@I_IOcGDOHCP?D?AC_AGHcGP??@c?AG@C_SI?AD?Q@Ac?@O_C@G?S!24?GCOd?A?@?@?@!12?A@#3?A?@a@$#5gO_S`K`IOAOaGaGQ!4?S_CgAgAgA?A?O_!5?O#7!9?@!5?@??A??H?ADi@CGaDIPeHQkTiTmTzVi^nYzVnZ~v^~j~j~j^zV|]|^~^~\~\!46~^~^~^~^~n^n~^z~z^~^~^~^~^~nvj|iTnzn^j~f^~~^~~n^j^~^~^~^~^~^!5~N~N~n~~~^!8~|}|~z}luz|vi{KxEtItiXqWsiW_Y_WaKOkOc?GOcG???_CG?O??O?O?O?O?O??O??O??O??Og?gOg?GQ_IOcYShaShqDwdguHuhUhvI|zu\j}l^|^u|nzv}z~}~|}~~~|}~~~|}^~^~^~^~j^j~j^j~j^j~j^j^qNyTi^iti\rmPiTiTiZeXaTA|B}@}@ItAkPaKPAH??O#5!4?C!8?i?iSaShUhOhudYPmIvrwld{ij~~~j~j^iXu]DNphWciJAbIvGpKpGS`Q?BCiBGAHOcOI@??_G_G?cO?G?A@??A?@!32?A$#27!67?O@!6?@A!4?G?_D?OC?_?C?G_!92?G?A???C?_C?G???_???_#13!46?@?A???A?C@CB?DA@CBC`I@IPjEhQDiTiTI`]@mPIdITjCjUHeZCjSJcZCjSJCFSJCJcDY`CJ?hATJULyFYDHuHUhUGtACHaS@Q_A_HAOCG@C?@?A@???A@???A@#22!89?C??G?c?P?GCAOA@S???S?S_DA@__OCCABO?cO???A#26??A??C?O!11?A??@??@??@$#11!492?O??A@O?cOG??AC_?O`O?H?i@WcGqdQI`SgpYcGqKOkOe[`]`]`\a\zUlZtmZ|vm~T~i~Ti~iVylZeXfWfWvktkZsnTzmZuZulZuj\ivxn]Xe$#10!502?cGoGPIDGE_Qc?ScQPCG@cOI@CDOQD_I@IPaK?Y_SaGaChQcIPcAGP?i?T?iT?TgDQcPaGAWdGQGQcIOiCPcHcHQcHS_SGCO_CW-#6GfKbM@JU`YdZdNyN~N~nT~Tntnlzn~n~HVlJ~JUh^vnV~VnV~n~n~n^~v!11~}~~~mz\mzTmZsZcZcIcGRcIcHQCOdG@I?IOASi?ICI_IcG@ACG??O?O?O?O_!8?i?i?I_IOI?I?I?I?i?I?I?i?iCiOiSgTqgPeGtIgAgaGagAgUhUhQtQoLa\A\a\qCoDoDy@eWAWaWAWa[`MOl?lOlQkXiSgSiTgDiOaS#8!12?@?CAG@CHADADAPeHU`[aTIdGVChDYaKhBQkBgWdAiHSM@iEXCePIeHSEPiQHSdITgDiQKBgTGcQ@i#19!5?CE??G#6!20?G???O?O_???_?g?iOiCiOiCgTiCZcXa\_LQl?|A{A|A|ItItJshQtYdytJulQ|QdyTityT}XvuZjvp~zxvz~z~z~z!4~n~n^tnTyTnONiDY`IChA?C@???@C??A#4!5?QcHAcO@OCAP?A@CO_GH??G?@G?G?h?CO_P?C??GC_A?gCA??@I??@!27?@!8?O_?O??_#3o?o?o?o?o?Oo?OsG$#5vGrKpmSh]dYcYoDo?o?Oi?iOIOQCO?O?ugQs?shU_GOg?gOg?O?O?O_?G#27!11?@???@?a!7?O??_?A?G!5?G!19?_!62?G@?C?@!4?@?G??O?_!5?A?G???G?_?H?_?@?C?`?AO#13!46?A@!4?@?GA?C@ASGD??DA?HCA@?S@GA@GC@GA@GC@C?B?D?B?D?@CA?@???CHSLqCQ`?GF?CbS?COG???@C?C#9!78?G?C?K?CCGC?C?C?C#5!4?O?O_IOiDiOn_Twd]srQ||z{u~|uyj~h\un\jlZedRbyLysImX_YdATaSJcRKaPCQ?Q?HACI`Ga@?G?C@??GAC?C#29!58?g$#9?O?O?O_#7!65?OC?PCiPcJcJcZTZtkRtZulzfYv}t~tn|jT~tzt^tZv}\zv~~n~n~n~n^!8~T~T~t^tnt~t~t~t~T~t~t~T~TzTnTjViLVmXvItV|VTu\R|UhUhUkIdNqLa\a\aLzLyFyD}Pf\fSf\f[bYpMQ|AnQlReTjVjTiVyTn\j!12~}~z|v}zu|y|y|mXuh[a\itYugrSy`[pAsgR{QdYsPsipiSpcyPisPsipiShugYoiSyOlqwTiuZl}PujqLzhW~vo~z[j~znv~~~}z~z!5~v~~~n~n^~~~^~V~TnTzTnTzViTzcZe\a^qlQ~A|B|A|AtItIsJUlIdYDIsHQlAlYDiTIDi@eG@cOGA??A#22!23?O?A??@GC?A?AH?AG@S?SaHOaS??OOGGCA?@?@?C#26??G!9?_???_!8?_$#11!491?G?C??@?_?CA@??aOH_OGaPKAHQLHESgtQcXUWFSjSzKuhQtiti\j]tj\vlulZu~lzV~i~TynyVylzU|zT~j}T~j^un\j^D~J}F|J~D~mN~FJt$#10!495?_?GCO_W_IT?CaSBcOCaPcC_Q_HA?GRC_BOhOA?p@Sg?PISaS`ISaGQHQcH?QCg?T?iDODgDQCgACi?S@i?C?H?aS?I?C@GAC?I?@!4?A-#5~|i~Y|j}Ti\u`YtYDYtiTGsjchuleteEXQlyPMxIPmPMtGugTiDoDyCxa\?Y_ISg?GO#30???_#7???A???G?BCHATgDoLqExAtKRlQf\juLqLVi^dyDYvhUlZvj^rujvYvxvlV|VlvlZeXf]tjUhV|V\R|V|B{D^tJTiTaXATALA|AtIdRCJ?DIODQCHQdI`CQ@?~@}@eHAHUHe@IdYdITiDiTIdHEgVGfGaL_DIPCJ?jCRHbCRC~TmT~SntI^hvn~~nn^n~n^n^}~~~}~|!6~}~~~|}~y~|~|]v|mz[nyvz~v!4~}~}~z}|~z}~z~|~}~~i|~v~|~}z|~}z~~}~~z~}!10~n^zVlZ~nZuH^rmTnTzD}@~@}@~@}@~@}@eXAcHuHeXaDi@IPIDGbSHADOAGC@?AdOA@G??ItAGaOCA@#5!13?Oc!4?hAgA\aTIOnYtjuLzUn|n}!7~ulZvmXf[lZEhToDDkEd?U`YmPEpGOcQHOCO??_CQ?O@G?g?_C#26_?A#3!12?g?g?g?GO!24?TgT?TgPiChUGQdY_ItA|OfY|$#9?AT?dA#6S@iTaHU`IdYdITiTJSJUHQHIXpEhQDiPEpMPmPItHViTiNyDzE\a^d^tjV~vn^~~^~~~|~|~uz{Zu|iVyLqKxA|GrkQdWaSHqLqgS_QCYdGShQcGO_CGS?CGCGQgAgQGQcXeW`IShUgAgAgAgA{@Y_IOiTi\e|i|q|A|ItYkzs~ytnylzulYt]zl}~?}@}Xe|UhuH}tYdYtiTyTitYewVgvWe\q^ytmzs~Szku[zkz?i?i?iOAS_CGO???O?O?O?O_#8@???@?A!6?@???A@?D?A?A`GAPCbODGC?G!4?@?@?C@A?C@?C?A?@??TA?G???@#6!23?O_CgQc?OcHu_KPiOiCy@}?}@}?}@}?}@}Xe|ZuHuXe\yT}tmtyv[ju|yn|vz}~|Yn|}v~~tI|v\nz|}!13~nZ!4~U|V|a\itnOdISHqChOAO@#22!7?HQcGPeWb?__S?AG_QPOG#26!7?A!5?_?C@G#29!78?aG$#22!12?GC??_!4?a??O???O??G_C??C_?C_??_?A!4?O!7?_!8?_#27!8?A?@C?_!5?A?@?C?A???G!8?@?G@_??A!4?C?G@?G`?A!20?_C!4?A_??c!39?O?_??O!13?O@!4?P!19?P??@?G`?Q!4?O?_???_#13!66?A??CA?@C??@??C?@#4!144?QCHAgCQG@gApGC@?_GC@AH?c?I@iS@?Hc?cAOA@I?HO?_D$#11!490?O?AG_Q??GE`WC@?oG?hAlOE@IO_?QcHlIseTUSZQLoLqnYvi\ulZlZU~T~Q~tni~T~j~U~l~Y~t~i~T~~T~i~TiRi}iTiTzUhvlYd^tI|ALOdA$#10!493?@!7?A_OM@AsCO?AhOc@IUh?QAO@H?g@_CaLQGOdGTaHQcQc@?A?D?A?T?i?S?h?Q?d?I?T?i??i?T?i?C?@?AC-#5!11~Vmvm^j|l}mzl\|z|l]}UrZxl}mzl|neU~l|neuj\t]~mVvlttzhcyCPAOhQCG_#30?_#27!5?A???C!5?C?O??@?A?G!5?O!5?G?@?S!4?G?C?OC!22?A??A!5?G!35?@???A??G??A!5?A?@!8?G!21?C???G!7?@??A!10?C#6!43?_?_?_?_!15?_?_?_?_?_???OdW@qCgOGQcY`M`GQdYtJ{jSzkR{jS~lynyvY|mz~|~}|z}|~|~lvz}Z{~|v~z}|~t!4~|~~|~~}z!22~n^}~ZvJuH}@~?}@s?iPIC_CO??A#22!7?HQcZ?u???OOG??PCOGC#26!4?A??A??Q?C!5?O!6?O??C#3!16?S?S???@???T?T?TiPCPCPChA!5?dGPeWbKpEgU_SHQgQcGtAsJcXvG$#22!11?gPGP_S?Q?PCOa?C?Q_@GGcCQ?PCOAOOh?OAOOHS_I`?P_GOAG?CQ@?g?C??_#7!12?@?A??I@QHAlRk?HCPeHUhEHaTIcRCzC~@jUlReTiZejSjSJcHU?I`UHQdITaLqLqNoLqLOfGTaCRcRK@i@Q@GCA?AGC?D?HC??c?GCA??C?A?C??C??@??@??@??AO??G??A?@AC@ACAC@!5?@A?AHA?AHCA@?i@QdATiDYdYcYfGRmTjTnYvItIzn^znznznzv^~^~^~^!25~^~^~^~^!15~^~^~^~^~^~~~nYf}LzVnvlZd]p]vlYdIsBSjCRkBSj?QDODGdAPC?A?@AC@A?A?QGC@cB?AG?C@A?I!4?A??A??@C#5!22?O_@?cGsHu@}?~@}J~Tmtz^zn~~|!7~ulZc~Hi^yFetjeGjaPGfWf?OG`?OH??_PGcRGAHe?AO@?C#29!20?_??@?A???g??iS??g??g?O!6?_G#10!8?@A?D??@A#29!4?OA$#6!17?A?@??A?A?A?@?@C?A?@??A??H??A??H??A!4?G?AGACQHCzE|jUlZv^~^!5~|~~}z|~~t}hulQkQ~szeXuhUxe\itZkrCy?iShQkPiPcHOjSjsZuh~t]hulYti\qLqLoLqLonWvi\rkZkr}T}l}vz|~|vz~y~uz~~Z~vz|~~z~|~z}~z~|}~v}~|}~~|n||u~~|~}|z}tz|z}!5~}|~|u|~|uz|}zT}lQ|iTydYdYdWtkPiSiOdGtIpCO_COCOCOCG_?_?_?_#4!199?T_Dg@AOGaODaO??OHcASGe?cPICA???c??OG?cAO`GT#10!39?cHOAc$#4!30?_#31!179?A#11!279?G??OC?GCaO??sG`GOHc?g@IcRGc@EOlPlIKbIpA|jU~lYvi\ju~lzVj}HnyumXu~iVi~?@mzEzmRUlZun|ZYVeXf[rMxVh]hugVlYtI|JsJcGv$#10!492?C@!4?@GfGA@SAd?QHEO_PGcRGoHAcAO`GSAgASh?QdGTaSH?QCg?@AODGOcH-#5^VNZvL]W^W^]nEV]?^?^_^A|B^aTKrLQkZcJKJCjSzTMXmXuB~dZtiD|lZvnT}}rWLdw[h{?{?yCgS_S_S?S_#7!4?@??A?A?@???A@?A@?C@C?@GACR?J_RGE@QHA@A?@A?A@?A??HC?Q@GCA@?A??A@?C@A?@?A?C@#5!19?O?O?O?O?O?OCOcOk?kOcOCOcOcGSgC_GO_GOg?gOg?g?g?g?gO?O?O?O?O???O_#7A??@?@?A@A@A@A@A@QBG`QHEhQNsNsNsNsLzD~D^lzMrnR~Rnrn^j~jVjZfZnZnZnZvLzd^tjVyTnTjTnt~JvJVlZd^t^tnTzFyLzE|A|B}@}?~@ITbJQDRK`ISa?`GCASC_HC??@#9??kOk?kOKOcSgCgSGS_S?S_S_CgSgCgSgCK{k[[[sK[CKCKCKC{K{SkoS!9?CKC[?KcKOK?KgCKC#32???C???C?CKKCSK{#11!9?A???A@??@_?Q@G?ShACaCiPChCPI_J_]_[b[`[cYcZlvYnylZulYvlZb}HVyamTrmO~QlYsJgZeXdZmPnQ~PnYdZATBTIdRCjOJCBOHBaHA?A@$#4___??_`b_B_@?`_@[_{?[_[?{?[gQKQl?CGcOCgS_?gOCOcG??OcGO?A#6!5?@?CbOIDBU@zB}DzVi^j^j~j^!4~}~}|~|~}~}~|}~|}~z}z~}v{zk~s^kvx}lu|}|~}|~|}~|~~uz~l}vz|}~|}~|}~z}|~}~|~z}!19~n~n~n~n~n~nznZnR~RnZnznZnZvjVz^vn^vnV~VnV~V~V~V~Vn~n~n~n~n~~~n^|~~}~{~|}|}|}|}|{l{t]luxUkoJoJoJoJqCy?Y_QC`KOk?kOKO_S?SgScWcOcOcOcGqCY_ISgDiOiSiOI?sGsgQcY_I_IOiCwDqCxA|A{@}@~?}ti[slykr]tj\~]vz|jz^uz~~}~~RnR~RnrnZhVzVjvj^j~j]j^zVjVzVjVzrBBbbbBrbzrzrzrzBpBHBLj|vn~^m|~|bPbbRA@_`A@?B?@A@qC?ICCgOG?o?G#4?AKCKCKCYKISHCI?KStKKSLKS[gUk_SiOgPCpC?I_I_I_S@SaG@Q_#3!13?S?S_CGPaKOl?lOdIsPcX_YcPkOk?kOdYc|i{itYkzSnsz{nu{\u|yl}~$#10?GOCGO???_?_OG!8?_??_??_?_?O_#11O?_O!5?_#30!33?@#27!13?@!6?@!13?@!35?@!101?A!10?A??A!5?@!12?_???O#7!105?A!10?@#31!13?O???G#5!10?A?A?A?AGO?_PA?AWaW?kPIRMp]rSzQx}LzzDrrRfRbBrBb@qxrwrxdrtHczs\?IAaOb?q@_@?@AH?DAGAGaPCOD#26?@???A?@#29!21?@!4?A??A?@?A??A!31?DO$#3???_?A#22?C?C???OG?b?B?B?@A??@A@???B?BOB_R?JCA@a@A@{?I?ADy?QcGOi?@GCaOA_?AC?@#31!361?_O!16?_O???_???_!5?_#10!23?@_??GOAG_?a@A?OH?P?CaOAGcPCO@SBGaG@QcHCQGdODQcHQdGQcG@aG@S?G?@!7?C??C???A?@?A$#11!15?_???_#22!448?OGG?G_O?G_O?@A?B?A???_Q???q`??@#26!4?A???O-#4VNs?O_@ObLPK_]_YDS?z?}@Qk@yClRGS?@G?@c??Q?g?HC_J?`A?PC@iO_GAC??O#6!4?GC@aHCHaLA|AtIvItjUl~n~n~n~n~n~n!4~v~v~v~v!20~v!12~v~~~n~n~N~N~n~n^rnZvnzmXv^v^vnVnZnJ}JuLqNyTiNyDyF{JtITiTiDiRM`^@}DYfGVgRcREPjEpFgVGVGVpE|A~ITi^a^jUh^i\vN~N~n~n^~n~n!4~|vz|}~~~}^}n}v}~u\zt]jszSzsjUxvg^uXu|qkP}tylux]titiTjSjsZc~I|Rkq\ulYvyluxuxUx}tyv{zu|u|yt}tz}v|^z}~\z~|!5~|!11~TiT~DyD}DzLyFyLYfItItJdITZD]djli[{x\^[~K]NENEFEFfX|[\BNDHB?@!4?ENFEFAFFHBIDJCIL?G#31@#37_#20_#12O#4A?O!6?_!7?O?o?_GOG!7?_A_@yEtTjmTxCpHk_N_Y_T_T_T_I?O_?O#3!9?xASG@qCwBkPeGtAt?YcQgISiShEgQLOd}~Z}n|^ze\jv}\v}Znt~~|~~$goA[`]OcO_?_#22??@C#26!6?O??A!8?_!10?_#22@?@!6?@MGBoA\_DgC?O?GC?aH??_??O?C#5!49?G!12?G???O?O?o?o?O?O_KOcGOCPeG_G_GOgOcOs@sHqLoDiToDyDwBsItiTiTyTkp]_}@YdWvgRKZkxmCpMwV?v_vgKXA|?diT_\_ShU_TaGo?o?O?O_?O?O#7!4?AGCA@???@_@O@G@?HaCI`SJCjCJShEGV_HeHALRm@IDQHE`ITITiSjSJcZ?tAkRLaHQdGDQHEHEhE@IDGBCHAHADI@IC@GA_C@?aC?A!5?A#9!11?iTi?yDy@yCqDwDqdGTItIsITICY`ISAT!9?o?oW?w_GCA?AG?IUCNEMDNC??O!4?O!8?IC!4G?O??!5O??__???_#11???_??_o?iDA?qLCwOQCX?ICPiC@IcQH_^_^_^_^_^_^dYvLulZulZulZCtjUsLyB{RmXvI|IudZcTtaTjUxVlqnY@?c@OA_CXaSG@aG@cOI#29??A$#5??@BM@M?C??B?@?@?A@C?@?C@??@??d?@U?T?RGD_C@RCQIcM]HvKrmS`VsLxa^iVz~nvry\Squ\Q|AlIpGtIShQ?O?O?O?O?O?O!4?G?G?G?G#22!98?_!4?C_!4?OG???g?G??A_???O#5!164?O_!4?O!4_?O?O!4?__!5?G!8?@?C!6?@A?AH?GGGLGGCKDWCID?DBEFFF\MN^!5N^YY\NxxNnxHWWuG@wTapaLaZCGc?_G!4?A?CA?Q#29!41?G??G??G$#10??G_??_JGQkO^_Y_AhA?B?g@QC@Q??A`I_QaS?bODOCCq?O?o?SGaGO#7!361?`!6?`!8?O!4?O?O?G#4O!5?O#30??@!9?@#2OO#3!5O#33_#10?_?_!4?_#6??D?_?C#26!12?G!5?@!9?O$#11!10?A???C?w?{?{?Eg?wCgQkOIsGDGiGSiGjQg?HCO??_#33!365?ABEA?B?A@?@?@?@??_!4?O#16_!6?OO#43___??_?___#46_#47_#41_#16O#40__#49_#50_#51_#2!7?_?__#32!4?A?A!5?A#10!8?P???@EG@?A_O???i?O@CO?D?I?I?I?T_IDGaHQcHQcHQcAG?`I?@C!8?@??@A?@$#31!421?_??_?o?_W?G?A?A#3_!6?OOO#41_#35G!6?O#22?A??A???A!7?@!8?D???CAO?EEDF@FEF?WCK#30?O$#4!423?O#36!5?_?O#32???_#2?_#10_#14?_O!7?O!6?OOO?O!9?_?_!7?_#3??O$#24!441?_#37_#19G#39_#34G!7?O#48!7?_#1!13?_$#38!443?_#40?_#31?@#44???_??_$#42!447?_#33???OO$#45!452?_-#3~|~~|}|y~sz{QkqKoCg?GO_?g?g?g?GO#5!4?@???A??C??CB?@A@QGAEGraWMZe\huhUjVn^zvm^~{uZh_qkZu_vGtQdWdAdWDGtAoCOdGt?TgT?TgT?TgPi?gOcWaWqCOCOCOCOCOCOCOCOCOcHShU_}@}@{@iSPEWdY`YcQgQcZcYD]xe\yd]huXe|ivy\}v{~y|}|v}z|}vz}]zb[tZzVt{ri}j|{ZzQ~]kfYzktqx{zYlhudYtYDwCyDy@kOdY@KpAS?Sg?gO?O_??_GO#7???@!6?@???@??A!4?C@A!4?@??@!5?C?I?CA?@???A@??H?D!4?@#5!14?_?_?_?_!21?O_CGO?_CgQGT_?S_?S_GO_HAD??OAAo?@DTT@@C!4?@#37C#60O!5?o??WWGKG??CC??GA!7?_??O!6?CEAE?C??CCC?S??GggWGG_?_oo?__??_#6@#20O#66_#11@!4?@A@CCK`Y?dIOI@IcXeGvGeXCzCzCzCzC~TmtZulZTulQlZQuhVyTmTzTmXviTmXvI|jTmTyV?Q?cPGCAhSa@GOA`GC?QHC$#4?A??A@?D?A???A?@?@A??@A@A?A@??AC@?D???@?g@??@Q_OGCg??d?o?CPaOCHaCGO_#6!9?@?CQHCRcHVGvIlYfYlYfYvI|NznYvI~iVi~iVi~iVmT~VnZf\fLznznznznznznznznznZujUh^@}@}B}TjmXfYd]dZlVlZcZdY`EXaDY`UHeXATGDa@GB?DA@AG@CA@GC@?CGAGC?GA@C@??A@C?D?@Q?D?BGDA@C@QCHQdIdYDzDyD}RnYd]rM|j~jV~Vn~n^nN^fNnN~Mn^nN~Nm^~~}~~|^~~~Z}|!4~}~~}~~^~~z~t~z|~}~~~|}~~u~y!4~}!14~^~^~^~^!21~n^zvHeXATGDaHU`ITaHUdIodOlQDX?KHAI?A??A@#35A??A??@#36@#20?A#61O??O??!4_Woo_OsOoUY}cue[e?iMy}wqsWowowwG[?__gGGI?O??_???O#58?C???G#10C??A??@??@??CAG?I?dO?@cO?@A?P??P?aCX?rChCQ?iPIcHQc??OG?_C@$!6?A??HCBkPKQC??HaCOC?h?SAh??aGaHUgACPCi?i?HCq?TiDOk?u!5?O?O#9!16?C#22!79?_!13?_!32?`?S`A_C_GAGS@S?A_Cg?_@W_COAGCA?c?Q?G???_A!9?_#9!13?Oo?O_Oo?oO_Oo?oO#5_!6?_???_!12?_#9!71?eXExAdqGUhITiHU`ITEWiQliC[BEC?GGCE@C?BB?@@??B#58?A#55A#10@#48A#33@#24@#37@#52@#40@#42@#43@@#67??_?_?_#68_!6?_?_#67!5?_#43!4?@@@#41@!7?A#62A#1@!6?A???C???G?OO?_G_#26!12?_#3!26?_HADACh?UgDiPiCiPeGTiPeGtASiPiDg~l~Zmvz|Uj\}vn|]vz~luz~~$#11!12?@?@_JyTuTiLyTUTiTUtj[vWugV{zCyTzSlQ_DY?OgA@H?GC?_#4!347?__?OOO!6?C?C?A#12A???@@#59?A#53!40?@#54@#55@#56@#37@!5?A#3@??A??A!4?AI?G?CCGA?_$#26!47?G?_?C??O#22?@?GD@_??A@EHSgO_CGP_?AH_CQH???G!7?O??_#19!311?@??G?A?A#16G#41O!8?C#34!50?@#14@#0@@!6?A???C#57@#35G#14C#43?_#69?_#23_#22A#0?_$#13!411?_#51_#40_#66_#44!5_!4owgWWW[!4KCEUQEEEA!4B@B@D@B@@B@DD@D@B@B@@D@B!6AEAE!7CGgGGGOOOo_?_#31!6?C$#3!416?G!4?C!4?AA???@#46!47?A#51??A!5?C!7?O$#52!416?O#54O#10G#7A@#49G#48G#46G!4?C!5?A#2!48?@#20A#5@???@@A?A?@?D?KA_@?G?O`Pa?cQ?_I@COA$#24!419?G#63G#14??C!9?@#24!51?A!4?C#17C#39G#65?O#47O$#43!419?O#51!5?C#45!5_?o___??OW_GG[K?KKG??WGW?WY?O??CKGAG?GC?s_wWWO_ooo?O_OoSO???_#48G#64???G$#39!426?C#4!59?@!4?@@?@?C?BA?@E?U\iWaPS@GITcOIdWcXeGvGeX?aCG?Q?h!8?I??_O??G$#9!486?A?@???A!5?C?GGOO$#42!486?C#12@!6?A???O??O$#40!487?C#46??G-#3~nVv^NvV~^^~^^~NlvlFZflVQnD~UN|nolololodycxaSg_g?@O_#5!4?@?CA@CbIQC{HViFqgzeJVm\j~~}l~~ulytmXvkzuJ|uwi{r[rkR{b]pnWfXuhUwqlQ|a\itYdzSzdYtjSzcZsjSz[j{vWn{yTmxulyTm|ZuzkZsju\j}|fz~|~}z|~~|}~~}~|!12~^n^~~~^~^~^~^!19~^m^!5~{}~~}!4~|~zm|YTqlitZW`Mpm_nOMtYcZcXaKoDW`Y_ISgSgSgSgS_S?S_S?S_S?S_S_CgOg?gOGO?O?O?O?O?O?O?O?O?_CHsH_Q?cOCOCgOcGOC_S_COcOc?S?c?S_S?S_GOg?g?O?OeAIO@@D??A@G@C?AA#38C#4?@#61?G??__G?wAsl???A!4?a_aaA???A@qrrzu~V}LEZFMOFiDAeDID]dYLuJ]tErVvARFJrQReBFReEaUeAeUaQEAEAMEMojUUWs?g?Oo_O__???_#11@???@??@D@AFN?siOGs?wOooOooOoGqHeXEXEYDS@gATI!5?_!10?_PC_GAOH?cAOHCA#76??S??C?G$#2?O_G?O?g??_??_?_O??O_?O?G?O??_#11??CQCQCQCI?PAShASD??cHUg?vGpIpKoGoDwA?_?G#6!11?@Q??HQDIPeGRCHsAHFTBKbKRkB[`MOfWeHUhFLQlA\aTIdYCjCYdISjCZcJSjCbSBGfOBDiPEHQDiPAcHCRcJSHaS@AGC?A?@CA??A@??@?A#4!12?_O_???_?_?_?_!19?_O_#6!5?@!8?A?CPAdIDQDIcB]`MPNOnPIdZcZe\rNyf]d^tjVjVjVjVj^j~j^j~j^j~j^j^zVnV~Vnvn~n~n~n~n~n~n~n~nQ[B_I?UGdQCRCiPEHQDiPIDQCRcIPIcRRJBBJbZVNV^V^l~nH\dFAAADH@CAA?B@?@#24?A#16?@#45__???@A???_okK[MrrPVPXpvRRp}HGGCH#67?_@?@??@!9?@?@!9?@??C?@?@??C??C??C??C!4?C!4?O??C#72?@#60OGG??_#10@!6?KHG??ySoC@g?hI@CqIiCdMII@NIHrLUXExExDy@iS`It??wCw?G@U`IT_S_G$#29??G?_?G??_??_??O?GOg?W?gCOg?gO?O#4!11?@??A?D?A?@Cj?UIpGQJODgA@c?T_DO?O_#22!97?O!61?@!6?A@??@!10?_G?O??c?O??O??_#9!64?lBwU@uHdYHjgjPEhQdiPM`YhjGJPm`ZGk?KgcGC?_?_?_!6?G?_GA??ADC@??@?@#41??A#33@#70@#56@#71?@#78!31?_?_?O?oO?O?OO?_?_??_!8?G!7?G!8?OG!9?__??_?_#24@??A#16A!9?O??_#14?_#6??O#29!27?C@G??C?@?@?AG!5?@?A$#1!5?_#10!10?A?A?C?A?@?A?@?A?J?J?J?JODICGATHQy}HUgRSG_C?C_?C!4?OG#79!300?_#31O?O??_#33!5?A!5?__?OO#35_!7?C#68!41?QwCW_NGDiLHiDi?YCqHS`IxKgGsKoOKkcWSg_GwGgGwGgGCgSgG_Wo#44??@@BAAEA?CC?G?O#4BAB???A??C???G??Q@SJD?TAG??cG?_???_$#1!24?_#22!40?@?A??OGFCHSgPaS#19!304?O!8?C???A#3C#60___oOw?O?G?_O!6?O__OKCCGCCKGkkC?CCC???G#65!4?_?_??O_O?_O!12?G_?_??G?gO?O?O?O?O??_OgOoO_?G???_HG#73@#43O_?WCOG?_oO?_#80_#49_#9C#17O$#14!385?_O?OO?GOGG#43_??O!8?A#45!71?!17@FCGG??S?CC??G?O?O??_#38O#74??_#29A$#4!388?CC??A#52_#16O#70O#44___OOWGkCsK[U]UmD|JQ^NBPB`?GG?G!5?G#74!71?@#75A#46G!4?G#53G#5@??AA@?L@IGAcO?C??_!6?@!4?C$#7!388?GG??C#41?_#55?O!7?A#59!101?A#2@@?AAC!5?O!8?_$#10!390?_??O???G#37G#54G!9?@#64!96?@#56A#77?C#14@@#1?C#3CC@C?G!4?OO!7?@?@A@C@E?DAC???_?_?_?iOAS_?z~EzE^tuh]ti^i^t^mz^v|nu~Z|nuz|~~j~~z~v~$#2!391?_!9?AA#58!107?C#35C???G?O??_$#17!396?G#48O!4?C#68!108?_#50?G#20G#22A??C!4?AG$#1!399?C!4?@#48!110?O#76???A$#46!400?G!5?A-#1xacpSw`aP_T_Pg`a_`S@?_PGO_I??O?_?COI?cOA??O???_#10?FADiCPD?G`?Q!4?Q@I@aTGDA??_#6!13?@??A@?A?D!6?@A?@A?TA?J?DOGA@GAPAGDAODQC`I?@AGAS?HC?A?A?HCA?@??A@?A?A???@C?DA??A#4!17?_OgCgSgCWaTIsYcJsJkCZCjSJcZSJcjSj[BcjKBkRKjcSeOf?vcsGSgCgSGS#6!11?A??C?A?@?@??AHSASHQDiPIDQHePIDqDyDY`UHeHUjEhUJeXEhVHeXEhQLa[B{B{B{BsJuJuZuJuLA@!5?P??A@??A?@?A??A@?H?CA_@?C@?C??C???@?D?A#42O#56G#60_??_???o?AA@?@!6?@!7?A?@#78G!6?_#75!10?_??_O___o_osoWWuM[USYGOSSOQOSOOWWWSOY{wswaoq_i_eaaUaqqoisogOO_G!8?A!7?A#43?@!4?B?CGCKO?Wo??_?_#16???O#76!5?C#1_#22O#29??O!20?@#76!23?A$#2EWPIhAYSgVgTiCYSYSGqkQcQcPOhU_QHO_?_!4?_#11!10?TAk?ntIVkZviTgS_SG_?_OGC??_#4!82?O#22O#10!39?_?O??O?_!6?_!6?O?O?O???O?_#22@GG?G@!9?S!7?X?SGAHGS?A?@?@C!18?C_???G_O???S??_#9!32?pMoNoNPiEx?UgBxEgUhUhTgU_FyHUgu@WO?AWQLAL?VAE@EB#80G#45__O?__GpW{{wy[^}}\OO?BIAEFFDDA?@?@@@!5B@?@?@@#78??W?G_WIG@C@?DE@?O?G??OC@@C!4?@@?@!6?@?A?Q!14?_?OOS^SMYE!5?@A??@!8?G??_O_?_?_#82C??G$#3?DICADCHEGAICRCHCI`KRKAdJCdQhNcUjYdSzIls^ilu~Z^vgTy?xAwO?O_#5!5?@IPiDIDIdQrJyKZUv!8~}~~|}~|~y!6~}|~}|~i|~s~ynv|}v|m|vy|nylz]t~}|v|j~uz~|~|~uz|~}~~|}~|~|nn~}z~y|~~|!17~^nVzVjVzf\itJCZcJsAxCjSJCJcJcZSjCBkZCRkRKrCRJWfO~?YJvjVzVjvjj!7~e~jt|urj||!4}z|uj|julyTmtyluXmtyHYDydUHeXuh?xUHsXexUguXexUlq\b{B{B{B{JsHsHcHsHqKoNoNomCxE|gV{CxUhShUgUhUw@sHUHy?AG@C@QD?I??@?@#43??G?C#61O!4?_??DCa_?@_ni}{TwWgwwg{e}^M]MKCC[cIFADIC@D@LDHDD??@?B??C@#85!11?_?_#61??@!30?A?@OD@@AGBACD@ba@@A`@QAOCa_G#10@!4?A@A?A?@!9?DAA_FOj?RCqSiDA{@}?}@uHsGsIShSd$#29!16?@?A??@G??I?C??H?C@I@CPAH?TAH?c?GOg#4!4?A?ACG@cGTiC_C?O?aOGd?ODOCg#22!121?@!4?@A!4?_O#14!154?_!5?_???g?W???@??@?@#53?@#65!15?_?_O!9?__O_???_O_o_yOAoQ?AOOEWMGG@AG@B?J@EBIAIDLAJKECCAJD@EJATHLHTTHXThHHLIDBITMhMd@__@_?w?_?wGoGGG???KeC[koWO#14@?@@@!6?O?_???_$#26!70?O#22???GC?B_@G#11!128?O?_O???O???O_???_??_??G#31!136?A?@!5?A#83_#2?O???CC?A#81?A#43!24?O?O#68?_o_OO?W_WoWkWCYCIcA?E??FGA??A!5?@?C@G?G@GAHCA?AAHC?A@?CGC?C?IOCG?SC?DOGDA@E@Ag?I_?wE|SkDa?A?C!6?_#41?@#49@#47A??C??G??O#11@?@AB@FBFBNB@A@C@_@C@c@C@?Q@A!6?C!5?A?GOcGQgDgQcGQcGTaG$#4!368?CGOC?G#19?G!9?@#59C#67!35?G???C??A#84!16?__?!11_?_?!7_#60!34?@#67O?OGsSO{}{QWg#60@!7?O#0A!7?O$#79!369?@A?B#16_#10?O!6?G#17??A#44!131?@??A!4?G???OO?_#37O$#7!369?_?G#33_#20??_#70_!9?@#45!135?C???G#4?B?A@A@AC?M???C_?U?W@C?C!4?G$#36!369?C#34_#24_!5?O?G?C!5?A#70!134?@#46O_?_???_#1C#54O$#3!371?O#35!4?OC!6?A#37C#53!137?A#38A??C!7?_$#49!379?_#46_!8?A#24!135?A!5?G$#44!381?__oOOWGk[]EMD@AA?@?@?A?C@??D@???A?@#2!110?A!5?G?G?G__!5?G?_??O$#38!381?O!8?@#69!135?C#6?C!6?G$#0!381?G!6?@#3!140?C!4?C???OsGWOO?gCoIGi?}Gy@iTg{@}@~@}HqJuJtjSjQnZvlVyVlZvlZvi\v~|!6~$#5!529?@??CC??S?GGO_?g???G???O$#40!529?G!4?_$#51!530?G-#2_pQpSr_psq_xcQpwL@T?E\QLWHMCNGE@sGqSGC`Q_@_O_OC_?O_???_#4!7?A?HOa?HOcQwOgsoopgdWRKo!4O_O_O_O_!8?oo#6!7?@!6?@!16?@#4!6?ooOoOoOoOoOoOoOoOoOg_gcgsgSgsWsgSgSgSgSgUgRSidItQLqtItqTigUpUGsIPDiA@LAI?lACAT?LA{PmQpSgpShuOdySpI`MPItB{?{?kOKOaOaS_#6!12?A?@?A??A?@?a??A@OAK`QG?@GD?AH?C@GA@GC@GA@GC@GAPCi@Ci@SaLAdIDQdIDG!10?_???_?O!5?_???CE@A#33@#47G!5?@#69?@#61g__CSWMMdeNgOyT^FJ!4B@@@?@?@FABBAD@B??ACAC?A?@#85!7?_#88?_O_ooowoow?KGCIO!4?AC?C?O!4?q_oowwGsGoGOO?O__?_???___??O#85???_#78CAD?A?C?A!4?!4GKGKKkYSOGA`_?___??`?`?O_?_???_#91C#3CE?AAI@LDIlZ]JcXEHEHUhEhuhUlQlQlZE\jULzLrm|r}tz|!8~$#1VMDMBKVMJLNEJLMFa]i~x_cqfa@xorw}AtG_boWcS{QeXAoG???O#5!15?C?A@?DADAHFIDYFkQNNnNn^n^n^n^!8~NN!7~}!6~}!16~}!6~NNnNnNnNnNnNnNnNnNnV^VZVJVjVJfJVjVjVjVJVhVkJTITADALADIDI?D?I?@A@?A?D?A_DOAGRG?hAO@A?HCA@CAE@MAC@MpMpItAsB~B~RnrnSfSjTZ|z}z}z}zu|N|~}~|n^|~}~\^~x{mlrUkvv}fqzlsuzyv|}vz}v|}vz}v\mzT}zT}j\q|YtylYtYvlYvi\juXmJDmTiLze|zUlJEC^E@GCD#38G#83C#35@#10@#45G??O_wOWQOG@!5?FF@A#75??oo_??__o_o_!7o_o?___!4owGkwsW[??ECDEEF!4B@#85?oOoGSM]IF]Li~yvNudBd!6?_#94!10?O?O??O??O_??O#89???KI?C#68!5?AAAB?AEBE?AAD?B@C?CS#67??G??G#43?A??AGG?GC?G#5@!8?O!8?__#29??_#4!18?O$#0G?g?g?G???O?O_??O_!7?O_#29!5?@??@??A?GA?H??GACi@GCoGOGo?O_??_#22!19?@#10!98?_!4?_?O_?_O?GO?G?T??C?Q@Ci?OGs?@ODO?gPAA_?AG?CG?AG@??@G?a?CO?c#22??G!8?HGH?IcAC@C@C@CHAo!5?O_!5?_?CA@O?G@?G?OGCOAH?C#14!13?_#9!17?_?QdGTaSHePsY@iTACHACHQSWj?HI@A?A#39?C#86A#43CC#80A#59A#46??@#67??_!4?GG!4?G!16?CC?IKKC#84!8?oO??__owWwWgGGCKCCIB@BDB@@@DG@?@?@G_HYkYD^NLDCEIUMUMMMmMKMKGGW?OWGW_O_OG!4_GOGO!7?_!13?G#89???GG#45???@!5?C???O?_#11C#37O#48_#56_#17O#96_#14??_#76?_!5?O$#3!21?AH??C?A?C@?GAD?CB?HB?L?ElBTzC]`yLShuHugTq?S_??O__#11!121?G?_??_??_?Qh?h_GoCoDoIo[_i?t?cgSOl?_P_AhSAgOG_O@G!6?G#14!102?O#4??O#31!4?_#3?_?O#34_#24O!5?A#42??A#37@??@#68!5?__?O??_O_?_?GCKCCCMIADIEMGC?GC?A?RD?H?AD?DA@?@???@#87!4?O?G??GCCM?A#95??_?__?_#94!7?O#65?G???A??@#85!12?_#65??A!8?R@?J@NBN@FDCC?EO??O@OO_g?UXQB`[\ApQUO[}?S_S_O_??__#10A@C@E?IDQC@CJ?HEHEHEHEHUhQlQlQ_o_O_o?o$#76!26?O!8?IOGC#10!10?@?A@?@!7?o?C@D?C?A@?dA@AGCQ???_???_#22!104?G#26!12?C???G!16?C#19!133?@#16??_!4?C#65!15?o?O?O?GC??_??O?_OO?O?P??G??G???_YPOH?ILACABA@@A?@@A?@#93!8?_?o_?_OO_OO#75!11?A?B@?!8@B@BFFFNLFFENNNLVGOOSo_o_{!4wsoCoo_o_???k__GWAAATCc?d??i#46GC?G#0@??A!6?O??_#11!4?OAO_O?_O?O!8?CHACHACAK@AK@ICA$!51?C?AAE@EHFILLJQmWjQLWkAGOGC!4?_???_#2!278?_!5?A#78!14?_?O!5?_O??GwW?CKICG??@G???O?G?KACH!5?CGEALE?A?@#87!34?O?_?___o?OO_O_O_???_??_?_#67!12?@???@???A@#44!18?@?AAC?GG??O?_#60_#83O#33?_#1!8?_$#14!364?O#0O!6?@#43!38?@#68!78?@???A#61!13?@?@?@?@??@?B???C??@??A@?I??C?O???O?o??O#77O$#81!365?_#44_?oow{oiKkIEEFHHBE@@A@#47!148?@#54@#70@#16@???@#66G#4@@?@CGAO???_O?c?O!4?O$!366?G??@#68!169?O_?O#92??G#8G$#70!366?O#60_!5?Oo?S???CA#42!157?A#55A#1@??A??GG$#41!367?O!6?@#35!166?A#2@???C$#1!367?G#59!174?C$#90!542?A-#2TjSATISlJcXASbMpA?_??A!7?A??nTiTeUKTmIxIyTTulI[PWDI_T_G?O#10?@?@#11I@Q?ATgD_Z?Bs@egUgQCOGCQgOgAo#26?O#11!8?_?_!38?_O?_O?_O?_O?_O?_?_?O_GOG_OG_W_W_Y_SgOmOkOiShUwVGQHQGR?ePk@eOl?`MZUlYvI|ItYlYsJ[bS`KAT_LOEPISBS`KOkOKoKOhGOgQG_?OcO?G#22!11?IDA??DAs@AC@C?DA_#6!31?@?@A?@?@!4?@?A#9?C@AG@C?HaC@?BCA?@OGGDAB?@#61O???__og`OOIGDcMDCCKCE?A@A@???@#88?_!8?CwSG??WoooWOGK?CCEEAMGAAAEBAB?!6@?@?@!17?A?@!6?@???@@??@@BBBJbvFVSU||eCESS\GKHWC[s[Acc_o#78!12?C@?A@@@H@D?AEMD_QHSPGAR_A?@?OCWO???_#5@?A?AA???CC?G#11??CGOGoGO_OGO_O??g?O#29?O$#0iOiTiShQcXa\a[`IsGTaOcGOdIShQCGO!6?_#3??@??@?A@ACBGDAdQiTuhE|it}tyl}|iOiS_Sg?GO#5@??D?dQGCB?D?JCB?C?S?C?A??CPBR@HBBbBBbBBbBBbBBbRCCUCESEC_AG?C??I??@?A@??H?A@??H?BB?CA@??@??A!4?D?HA?@?@A?C@?@#3??oCoCoCgOiOiOiOiS_?_?_?_?_?_?_?_?WaWaWaWaG_G_G_GO#5?A@?Q@AGA@AD?RCj?RCRCJsBlRLRnRnVta\bNqLJe\z}z^iT^!7~^~^~^~^~!8N!8~}z}|~}~}!4~}~|~z}|v}z~u\z}~{z|~?C@C?C???@#60o_[IBKFG#78__O_OGo_O??jHA?E?A??@?G???A@#85!10?_???_?O?GG?G?K?SCCK?CC?@IACAA?B?B?@@@A?@?AOIHYJTB@B@BCGK@A@BA@A@A?B@AASkOCG?g?@?A?G???G_P?OAo??__#65!18?@?A?!4ADTGOA\dqjEQhc??_O??O?_ooO?__#4@?@?AAA@P??CGO?C!4?G?_?G$#1?C@g?`A?OAC_H?OCHtI\nXvnYtjUlxvnOiTiXhRiPsEtCigG?p_caoOG#4!10?C?@??FOJCjSJuHEhU_ZGcr@OlQdCrk~z~j~z~|^~Zm{k}u{{[{{[{{[{{[{{[kzzhzxjxz^|v~z~~t~^m~\m~^e~\m~^e~[{^zl]vnu^nt^f^bYdQ`Si@iOl@iS?EgFhEhFgVHCBSHDATI@?GO@G??DG?O?I?@CHEPdGFOfXeTb[bKrKOm@KoFOcGQlCJOFGbKbSB{AKqKOkOg?W_[oGo?W_???_Og!8?_?_?_?_?!8o#14!9?C#0!30?_!9?@#37@#46@#65!7?_?_O?O_Q@?_HC?C?A@???G?@??@#93!14?__OoOG_WOO?WGOGgG{cS[I[CMCIcQeiU@b?uOJsQDSISE[_[AT@IDeccEDMSMsMk{gOkoSGOGGG???!4_?_o__?_#68!30?G??G!5?`C??oSg!4_#60C?G??O#10@?A???K???pQ@A@A@ACBC@E@E?DiS?SgG$#76!17?A!30?O#29??A?G?D?I@UhASI#10!16?O?@G_A@?gCA?W?G!80?C??CGBCOC@AO?Ag@!17?Oc@AC?TAOACAC@Sa!15?A?`A@_A@_CQd??_OCg?G_O_G?O_?_#4!84?I@?AAGC#7@#45_?CC_?G?OOMKCCAA@#67?@#75_oOOogGg{{}}WUFNMl}qpo@!6?!8@#99??_?_?_??_?_!6?_???O?O_?O!17?_???_O?WO_#84!14?___??@GG?A?CBE@JBIAKIIVN^n^Kk[k[{{wWOO#61!21?DC?AIGA??G?_???o#11@#2CKC@?oG$#5!218?@?@#6!131?CAA#47_!5?C#54A#68!10?OG??IIHA??C@?@?@#85??_#87???_!8?_ooG#95!7?_?_O??_?__O?OOo?W__O_WOGSGKWCgSKuHlc@c_??gw_[_WAQsGGO?gGOgOGoO#94!9?A???O@O@?A#67!48?O#46@???C??GA!6?_#35G#3@@?D??MDytititJsjUhUhViTjVjFvn!8~$#34!352?O#14_?O???C?A#84!22?OoO!4?E`OoOO?KMN}zFJFNvEMMMEMEAFBB!4@B!4@?@?A#100!31?_#87!23?@?A?Q?I@?A??C!4?OOOG?_O_oO_O_#43!29?A??AGA???GWG#70C!6?_#16G??_$#10!353?GC#31@#44__OoWgGYATSB?E@B@B?@#98!43?O!6?_!9?!4_!5?gOG!6?__!6?_??O?G??O_?_#75!18?@!9?!5@!5?!7BFfjm}|{}{s{wy_p`oAGC?gCOGIGHCS#45?@C?C!6?O_#50??_#64O#29A$#2!354?O?G#3@?A#1A#44!187?@@??A?CC??O???_$#38!354?_#55?O?G#50?C#47!190?@!4?C?G!4?_$#43!357?O_G#50!192?@#20@!6?G$#0!554?@@??A!8?_$#40!554?A#58A!6?O$#1!556?@???C??GO??A$#14!556?A!6?O?G$#54!557?C#53?G?O$#96!557?A#97?C-#0~\SuzxKmzgnx{}Jc~|zmz]tz|ju|iTzcZtiTiOcGP_@_@???_#29!5?@??D??H?Q@?G?O#4???@!4?AGAc@??AC@SAIPEGASASBGUGViUlRmRlZdYVlZlvLzLzVj^jvJ~J~TnZVjTnZe\bMPeLQnTYF|A~DYDZEXFYDZDu@^?nQLALQLRc?A?GAC??A?@!5?A!7?@A??@A#10!11?@??@#4?@??@A??@A??DA?AD?CA??AC?A?HA@QCJDaHE?VGDiPMShS_Mh?n|Qh]i~nY|M~]y^}hEpM@uHm@YdWTItWnu|mz{nuz~z|v|z~s[k{u[{[!8oCYW!8?A#45__?O?CWCH@CAA?B@#80_?_?o_O?W?_#95!8?_?O??G???GGOG???O?G!6?CCE@?@@!4?A!9?C@??A???@?@???@?C@AC@?@@?@A@???@?@@!8?c@PCHQo?G?g?GC?CCA?M?T`CQEA@AC?C??_#88FFCCCKAKG[GW?OO?o_oC#75@@@BBBF]N\xooOW`GOX_O_?_#61??O@?DJRVI{ico_G?OO?_???_#59?_#10??GO?G@_i?A@CC??CAG$#1?_@?C?P??@?A@?S@?A?OC`IC?SGADiCJcITgPeHQmPmQkRcj^~lztmYqOYD_OG_O#76?_g?_#10!12?QD?_I?@c?@S_G@G??@??@#5!27?A#3??_??O!4?O_GO_?_?_?_?g?g?g?g?g?g?g?gOcOcOcOcGO?O?O?O?s?s?dGPa[ti~y|u|Ytmxu|i|}t}}y|}m}]}}]i}uxmty|ulyTisYdwTy?gOg?gOg?O_?_???_#26???@??C#5?@A@CPAT?A???@??DA@?@D?@EPM`UHEPmDYFiTIFOHAPCBOHC?CAGAC?JbRBHbBb!8NxdFgL?I@@???@@@#1@#61GGCQ?G?KCCCA@?@@#78?@A?A#93GGGwO???_oOOG?W?C?CDEK?KOGGG??GKCKEBB@A@?A?@A???A@A?@!5?A@?@??ACA?BD?A@??@?@!20?A?ICjULJ\?GCSC?MAIPF@fIEAL@\A\J]Zz}WWowoo_o_O_?_?___#78!11?@?AAFFf?Q`@?B@CA??c_??_!5?O?C?_#37@!8?O?_#83?o#17?G#5?GG??_#29?A$#2?AG??A??CQ!5?I#76??C@!4?A?@?O#2??O???ACHQd?MOLQkZS??QCIPcLi_gQC`?I_#11??@?DAGCA`KPcPGUlQlZSj[Pmwa\a{bKR_V_ChAKPKQCYDgQcQGqCqCgS_SGs?s?gOcGSi?cXa[`MPaLOIdWA\?QdQcPeOdQcQHU_V?HaXaHaGRe|JulZezGvI|QfkT`IT?DAHAcGPEG?TA@I@@DA@P@?@@_T?HEOGDAGODiOHdWAi@|ReTzUlRUhUkZSiXUgvgSiPgPiS_Y_O_O?hS_S?O_?_?_?_?OG??_!6?_???_#3!32?A??D_I??A@#60_??O?g!4?CE?@?B#85_O#88?_!9?oCC{WUIMAC?CC?AAA?@BABA?CE?EABB@#77!7?_?_G?O!8?_??_#100!14?_?Oo_oeoYCW[Wy{_gSAg??c?O#85!7?CA@C???A??@!13?@?C@F?G?G?OGO_?o?o#65!17?CGGGfKSieOkJpNvJMUkGS??C??WG??_g_??O#96C#86G#4C?A?@???`?A?_C??O_$#82??aH?CaP?COCA@_O#3!40?D?QLaULc^VVm^y|uz|]rkRkRg?gO?_?_!8?ocG_GO?O_?_?_?_#10!65?H?c@?_HC@G?AGOAG#76!25?_#10!23?CH??@?C_CG@?_OC?PG?aOCA_??I@?CI??CA@!5?O!6?_?OG?o?O_???_#22!36?_O#14?OS?G??GA#38C#75O!7?_Oo!4?KG?IMDE?BBB@?@@@#99???__O??G_GO??OO?O??OO??W?GG???E??FA@A?A@A@???H@AA?A@?CNCBG^CIEKAY@?IKGGC?H??D??[?gSQzZGcJ\IOiO_??_o_OgogOWoKg_W_Gg_g_s?o?_#87!5?BBA@C@AACAKJCGEKAg_gGO_#68!11?AC?GAOKOGO@gQO_g_o#43A@@AKCI?KwG?O??_#11!11?@?@$#5!91?@?@#6!245?AQD@?C?@#44_OGgCUQBH??B?@#87??_?O?o?OgO?sC?AA?a???K?FAAB?@!7?AA?B@#48O#102!14?_?__??__#88!54?EBAAA@@@#84!23?@A@AD@BDBCJVHRLR]Uuk[{w_o_#67!9?C!8?@A?CG#46@@?A?@!5?O#1A!6?A???A?S???O?A$#10!341?_?O??AC#59G#43?C!5?A#84??_?oW?W?SK!4?_!5?A??@@@B?@@?@?@???@?!4@??@#103!15?_#72???OG!4?O!5?O?O??_?_??o?O#84!34?@?@#80!26?G#45!50?C??AAC!4?_#53??O#76!14?G$#2!342?_C!4?CA#24A#40A#68_?_??O??G#47!10?_C#85?OC?g?CgS??G?G?C?C?A??C?CC??C?C??A@#87!75?@#44!80?@???C!4?__#97G$#9!343?A???@#56!4?@#65_?_??O??G?KCAAAD???@!4?@#98!8?__OOW__o__?G??O?G?O?OO_GOC?E??C?D@D???@G@AI@KDK?IBOgWC?WOWPGCKICQEOJC?EBADABUAhDCcRZc_Pc???_???O???O__?_OO??OP?O?G_?_!4?_#60!57?OOO#16@!4?A!4?GG?G?O$#33!343?G?AC#46O#41!5?@#67??O?G!5?A@#42!5?G#100!16?__?O!4?!4_???_!7?GGGK!4?C?CCCSEMCC!4?CC#54!131?@!6?G$#17!343?_#16OCG#78!9?__#46!13?@#101!28?__??_?__O__oooOwWsWGWWwgAOooOgoWowog_?_o?_?__??__!5?_o___#41!109?A#0@@???C???O??_$#70!344?_#0O#37O#72!55?_??_???OG#50!158?A#33A#3@?@BB@DFCFFFCA@D^Weoh^~z|v~~~$#35!345?G#42!224?C#2A!4?KG?O??o?S?O??G$#69!345?_#55!225?C#14C???AO?_!4?_$#47!572?G?O$#5!572?@-#0~}~~~{}~~x||!4~vu^~}~fv}~z}~|y~tszmhupG^cZsPIdy?@A#29!9?AO?D_A??O??CO?C??O?g??G?G#10??C???@???A!80?@?A???@A?@#29!4?G?C??A#11!34?A???@??A?CB?B?B?B?BA@AB?@B@IAQHtBaHRAdAXAiP_EHCjOHeGaLaSi@]_]_]`Yd{`]_{dYc?_?_?_??A`?A@?A?q?__?o_???GC?GC?A@#44OGGSCAB@@#84??_COOAIE@A@A@#100?G#95?KW[O???G??A@???A?@#102?C?OO?S??G?__q?@??AK???_?C?A?C?C??bodW`@dS`?DWCGSGO?GG[Soo?oo_Wwgw_wWOqOk{cc_!4?_#100?@?H@F!7?A?A?GSGb?@GWCKKGKGA#48???A!5?C?O#85!8?A?@A??@A@??OCG?O_Og?_#75?@@@BBAFFNNLX[XOke|wsow?_#44!5?@!9?@A?AA??!4C?!4G?!4O#17C#60_$#82?@???A@??CAA!4?GG!4?OG!9?I??O?GC_???G_O??_#3!11?@??QGPCJDMRJfZj]lnS^}c^c}{ykq{qkqkOno^_~Ono]sisYcwDwcWcwCwcXcxCxShqKolQkpItgsHqkQhUweWugUwSj{j{jsZkzkzsZkuxUhu\u|i|{l{|k|u{[m{\m|e\RjVXExVhVj\b^`^bMPvI\b]hTNSjLlVlZF|jV|Lz^vM~n\~Zkn{^kn{^[|}{{|}{{t{huGsGsGsGs?s?cGO_O?_?O?O?O?O_#10?P?O@OC?AG?TAO_GQ?SA?SA?HO?G?_OCGC?CCG#31??O#1O!6?G#60__?_!4?AA@#87??_!4?GK#99O??O??g?c??OO?C[CGG?CC#103??CC?CC?O?[G?CC?GA?@@[A!8?AAA@edOFQfUmQb[lwcWcGA?WOS_g?GoG?WcCS?GC_CGEQAW?Oo_O_O#53?C#99!4?@A@?B@?C@CB@?SKFCF@B@@ABCDAJQHPIhgS`GAOAOG_g_O_G_#123?O#88!4?BBAGCSKK???A#65!6?@!4?ACB?KAP?C?G?c[O_Ko_g?O_?@#43???A#47??@???A#2@!9?C!4?G$#1!5?@???A!7?@??@?G?@?C@?A@?A@?@A?A`?Q?BcPA?mYtjRhRgOmXa[_YaKtCQ_w?gcO?C??O?_#76?O_O!99?_O?_O?O_GSGcXEGUGSA[?]?[`I?dAG@QA_BCQAGAcWASgAoC_Go?O_?_#29O???O??_#10???@?A??A?@!4?@??@?@??@#26!18?@#5???@???@??A@#3?g?g?g?gO??S_SG_!5?_?O_gG__G#104__#23_#43_??_??I#65S??W?CCG?C??@???@#48G?_#80?B@B@AA!6?@#100!6?!7@C@#107WGO?CYAI#119?_??GWG?O_#107??CIWYK?G???GG!5?O?O_#114!14?CC?C??G!7?_#98@???@?I?AHeASAE@A@GUH@OgG_CG?AC?BG@?DCEDQBAGSkkwcOOO?G???C#87!7?@BBBA@MESS[s{w{wo___#46??A#78?EBPGABJEBY?mOo?GOg_G_#40!8?@???A#65_??O#3A!4@B@@@BF$#104!18?_#2!11?C?G?COCHCQ?HcGACGDOCGSkUkRnPe\`MdW??g?C?o??G_O_#4??A!9?@?C?G@??D?I?A?I@A@I@QDA@RCB?RCB?RCB?BCHADAHAC@GR?ADQ@CHA@AHA@AH?@?@?@?@?@?A?@?A?C@A#1!20?_?_?_?_?_?_?_?_?OcGO_S_CgOgO_O_O?_!15?O?_?O??_#4!10?C?AGSAcGQGeHSIVhUjSNuHvLqLjD]`M_N_M_Y@U_I@GCRD^B\VJTnsMjTiVLzDZVRZFJZB@FHBEBF??A#61O??OGG?CCAAB?@@#98__???G_gOOO?_A?GOAAWc?c_??A?@#114?_?___??_!6?_???G?_?S?C[s#112??O#101!10?AAA@@ABDIDABABHBD@FABB@BRB!6@BRLJFJEJvaUq?gS_GcgOW_WOc_aA?Oo?_oOoooOog_??_#41?C???@??C?c!5?O#80!12?G?O?OG?_#68!20?@??B?LBKACOCOOO_???g?W_W?OG?_O_?_#109A#43Ow?__?OO$#76!48?@!6?C!8?@?Ah?A@#11!5?@A?@?@B?B@B@RKBGRDQlOI_T?lOD_HS@cHAwEGbWFgBWeGAwEgQCpIOcPIsACJsG@kQ_DWd?TgDaSASASIcQCQCHcQHChQG_HATAAQ@ARAG@B?BA@A@A#124!129?_#22G!5?C#9_?O_#19?O#105O#33O#0G???@#75_?!5_???IKC?A#77__#117!8?G#87?@@@#42@#69!16?_#115o??O??__?_???_??_?g?GW!5?G??GO!6?_?_??__#107!16?g?_#72!7?C?C?GgCsOgSOW?k_WcgO??_???O??_!5?SSgoGo?O_O_#84!24?@A@@BHBIAE?CKWWOoo!4_#61!6?C@?@A?BTAFJENm^~~{S|c[_ygOWWgC_Oo!5?__$#5!323?G??CC?EOACPGG@?@?@#68_#78?_O!4?O#85?_?_O??@E?AFC!4?C!8?A?A#118!12?O#111??CCG?C#113C#118??_G!7?_w_#122!11?O#72?A!8?@!4?A?@#108!7?A#115C#93!20?@#95??@!9?A???A?@#77?_#93!8?C?A?@A@IBHDZd\fIxL}}|]s{koo__?_?_#45!34?@!5?@A?A!8?G#67O#115C#116C#37C!4?G#35G$#76!332?O#79???C#6A#55G#20C??@#59@#67?G?WWG?B#88_O???K!4?@??A??@!4?@???@@@#108!14?G?O#112CWO_O#121OOO#40C#69?w#100!20?A#77@??DAD???ECICGC??A???A!6?GACW?W?GO#93!22?A#95!15?@?A?@?@?EACA??S?a@??_G#60!55?CCC#75_#49A#63A#0@??A!6?C$#12!337?C#110C#7@#45O???CC?A@@#68!4?@#93OO?GCC?AF_???KCE??A@E?A??@#72!22?C??@#114!24?_???_#120!68?G#56!76?@#24@#64@#104?@#105@#20A#1@@??AA#41G#4A?A$#41!337?O#106?A#10A#71G#89???O!4?OK#101!4?_??_!7?___?__?O_W?wg{YyyIAMEIABEBBB@@???@?F@BBA@B@?@#9!176?A#88C#78??_?_#62G#10A$#47!340?C#92A#72!16?OO?O!9?O?_?O?O?C#34!213?C#96?C#50G$#77!370?_!6?G?O?_??Og?G!4?_!8?@?AC??A??@?@?@#104!181?C$#41!370?G-#0~B\jTJ\b^jVj^jVZ?Yd@IRDT`T`DZrBvTTlZ|{]}~~~{{~~}nco}gOk_SoS_S_O_#76@??A?C?`???@GC???DGQ?@Q_@AGSc?CO?O?O?O?OCg?g?O?O_?_?_?_?_??_??_?O?_?_??_?_?_?_?O_O?O_O?O_??_??_?_Gc?Gc?g?GC?SGAGaGAGaG`AcH_EP?@C`GCBS?T@cAT@cA`IC?_QC@C@?aH?i?@G?Ha?SA`GA?Dg@Q@Q?T?CO`?SGA?I`GAH?_C?O_?_#4!6?@??A??C@?I@??C@?DG?C?I?C?G?SaC@CAH?DAD?DACHCOG?A@i_???G??BA@#133_O#95O!6?OO!5?G!4?G?O?CW#107?_???_??_O#115?_?_#114?O??G!4?KC??AA?@??@@@!4?C?@!9?A???C??C#81!5?O#128??_??O_#127O#114??A@?A@??_???cGSHC?_XK?KO?Kb??_??_W?_O???_?O#98??_?_?A#100?@??@??@?AG!5?A#98?@???@?BCGE_B_eXESs@g`a?OC_???a?O#85!4?AC@C@OA?W_OOO_O#75!4?@@BEFDMMNMN[y{wsoagooo_OO__O_?AQ??gCCAaG_GkC$#104?{ASISA[?SgS_SgCZcYSTgY_]_]ocGsG_GO_#1?@!5?@!5?JC@UaRMhJ`]`YdI{~\tlyTItyiqPgiI{qsgOcGSgS_GOgO_?_?_?_?_O!47?O_?O?O?O?O?O?O?O_O_O_OcOS_SoCoCwAsIoiSyo]ti{i|isY|i{Yt[ti|Zkzsz{v\q~?~QtmsXuhsYcxuwQ{_[_Y_Y_IShAs?s?S?S_CGO_#10!29?@???@?@?@#1!14?O?_???_!7?GG???@#87_???O?O!5?E!7?B#101_C??@!5?G?A?DCAQ@?@B?DD@B??@!9?_#111_!4?_#107_!5?O??C!5?C@@??AA?@#112!14?_?O?O#107!5?OG???@?@!5?A!4?_#72?@?B?@?@@A`@a@a?T?c@??@?AHC@??QU@DG?LISJ[`SgQsG#93???HAKQCXiDITh\pHvJ~V~^lwww}cs__O__#78!10?@?A@!4?B?A?GCSB??BQ`ATGaCg__PAObX?CAA@?IC$#137??_!5?_#82!7?C@?I?C_I?I?I?CG?IaACAA@@???AB??@OOJ?@C?O#3!13?@G?A@CGAPCPBGBDnYdJUhVbJViN~N~N}N~NjV~U~n|n]~Z}\~]~Z}|^}~\}n~]~\}~^}\~]~\~m^n~n\n}nN^}L~m^n^fZnvJ~F^fZnJfXfHVhFXFYDXATHCjCJ?AP?@A?I@??A@GA?PAC@?I?AG?C?T?kAPACHAHCRCHADALaLdIdZdIUhB|JtIvhUzVj]n^}\~~}~k~y|}|u{z{ytylux}tyukqmOmq[a[a[a[qkq|yTy|iszCZKRmTITOHq?OTEC@A@#75G?S?O!8?@@@#98O!4?GCBBCKE?IBHF@?@O?O!5?A#125_!5?_!4?CEEACAAAG#127G???C?Q#103?OGGK!8?AAA??@!9?@???@?A?@?`!5@?ADA?OGOKP@Ki??U@KCOWg??gOO??O!10?O_?_?_???_??___#48?@!4?A#95!11?G?DG??CAICGC?G?_O#88@EB?JG[CMKG_O_ooC??_#65???G?@?@??D?FAJHSEMGKIkGQCWQWGaxDW_wWoSoQoo$#106!4?_?_!8?_???_#109!18?_#2!14?H?@ACI@IDITA?aGQ?aOGC?Cc?P_#11!14?@!5?@!6?@??A?@?C@A?@?C@A?@?A@??@?A@??@A?@?A?@!4?A?@???@A?@!101?@??@A??@?R?CA@?HB?AD?CQHA?I?@RGPdPGbSbG@XaHPCA?g?AOH?A?Ac@GC?COGKF#57A@#44_??GCCAA#68GCC?@A?@#94G#139_#72_?_??_!5?BA@@@!4?@?G!7?@AAA#52?_#81?O#49_#135_o__???_??o#130O?O?G???C??_#102?A!9?@@@!17?@!9?@!4?@?@???@LNHK??K??W???_?O!15?_??_#115??_#53???A#99!6?@@LGVXexaHqDQ?Oa`IO_?O?_?_#80???A!5?A#84B?@A?BCJCJReM[wW!6o_#68?@?@???H@C@C@?CHA?CDG?A??C@CHA?@A$#96!5?_!10?_???_#29!50?C??P??A?C#5!232?_!5?O!4?o#0?_#2O???A?@#84_??GO?GGK?CG#99O???OO?C?GO??G??G#112?_#118_O???_??_O!5?G?GCC!4?G?G??H??C?D?@@@!5?@??BFJHKG!7?@?A??AB??D!5C_A?OkWs__ogWc_c?_c_?O?O?_#101A?B?F?BCJCidIEXE\lI}J]iNIU\CRM^TCHSIUHQsIs_Y_O#41!11?C!4?A?C#87!13?@@?@ADNKJCJokWO_?_#61!20?A@?@D@?CC??A@?@!4?@$#76!313?_??O_??G??@#12?G#40_???C?A#34@#78o_??E!4?A#131??OG#77_#103_?_??_!5?ooOOGKC?JKHMNEK???CCABA#107A#102@@#40@#112OOG??G!4?_??a??OG!9?A!8?GC#77!38?A@B?E?CKQCICGCWCW?O_?O_S_Sg?O?O?IH?GO?S_?_#123!19?O#84!71?C??G$#10!314?@!9?_#55??O#60O!7?@A#41?__?A@!4?AEB#134O#100oG??__?O#119!4?O!6?_?_???GG?OO??W?YG?OOICSD?@BA!4?@???A??CC!8?CCE???@AA??EC!5?_!4C#108!27?O#114!22?_?_??_#43!98?@$#124!320?BEDA#42!4?_?O#70A#47GGCC??_A@A???AA@#122!7?_#126???_#77!4?C?IAO@CO???C!4?@??@#141!4?___!4?_#136O#116?WOGCGae???O#125_G???_O!6?__oOOo_O$#138!321?_#58!6?G#80_!4?G?__???_!9?C!7?E?CE#120?A#108?__#102!5?G#121O?W!5?GGCK?A@!5?GDA??A!4?!4@G??Og?O??WWOWGGEAMCCKCKGGGwgwWWGWGG$#105!328?C#46O!6?A#85GGCC?K??G???G#132!24?_??O#126!13?OO???_G??OQ?G?CQ??G__O??_!5?O!4?G??G??_O?O$#24!329?C#123?_#49??@#43B?@@??@#88OO?C!7?@#73!21?O??OO???O??C??@C!4?A???C#132?_!8?OG?_??O!5_?O??_G???O?_$#65!329?G#93!11?O??O?CC[?G??AOG?OOGC#140!14?_??__?_#129!19?GC??_?_#73!5?O??_??G!4?G!5?__O$#48!342?_#120_#53??_#42A@@CB#128!25?_!24?_??A?O_O$#115!406?C??DB!4?A?DCC?A?@?@?@@@??B?AA@?AA@AaQAAIE?QDAAQaAIQOCo?_OO?_??__-#0T?@AP@?E@AOHACO@??@DI@IoC@?@A@QDA@?cJASJSIuHvLrfGBELf^unVmU~ny^}_?c?G?OG?O?_!5?AS_Sg?g!8?_?_?_?_O?_!22?_!47?O?O?O?O?S?S_SgOGqGQgQGqCXaKAgAKA_!4?O?O!8?GOiOIoIS_O?Sg@AC#3?@C?A@A?D?@CPCbCOAHC@a\ADQM`NtJtNtJtNtJvl^l~l^l^~~n^~n^~nnN~n^~~E^jTmVjvoI?IO?A?@#40O?OG?kcooo_?O??OOO#154?O!5?O#151G???G#51o?OOO?_!5?_!7?O?G!5?K?G??C?C#36_#57!4_#21OO_OooO#121@@??A#116@?AUYKKIKKKA?Q??oOgGOOOGW#126@?AC@?C?CA?K?G?GC??O?oOG???O?C?C?GC#103?`??A@??_A!4?`A?A?AERAD?ICSGbOkIHk?WCI??G_#98???@?@A?@RCTAAWpMgVC_G?s_WWGCO???c_#85???@A@ACB?KOgOg?O#75!8?@@@H\{l|Z~n~m[mk}]|{ygcP??@ADADD$#104A@A!6?@??O???RHKIdetBBAfAH]DA|MlIc\ISJsHsGoGOcgO_#1??@??@???D?@NBHFRNfRnLZNv\zu~wgJHAuRF}VunRxT]^]^]^]NbXL}|y]\\]}\^x[]~oz{ncjwNKzWlaTwz\SuxzT[vtwNduxzw|}mdvx{~|{mf|ryUmvUnuVmbmJvJjfj@lbHI@ErKAcAKaCWaCPhDdPH\^n~NfnF~n^n|~}~VaCL_EP_JF{aA[gpz}z}tmwvW~szkrKyJlcry\Alyk`]oAsIoIsIoIsGQ_Q?Q_Q_!8?O?O#11!5?@?CA@!4?O#12_#1?C??@C?@@#41A@!4?C??GGG@@???@@#48@@?G#108A#103A#111CCC#59AA?AAEKC#49O!4?G!9?A!8?C#126@??@@#58C???C?CC!5?G#145o??_#136?_!5?_#52G??O???O#73?AB?@?A#127??W?O!6?_!4?_#112??C???_!4?OG?_!4?G#101!4?B?@?@?@??@??@!7?A??A??A?ACa_F_DITkRc^[?_[cO?s?_?o?_??_#95DA?A??O!4?Y?COcW_O_?O_#87?@@?AAKNCY}WScW#78!12?@@@B??A@CRGepwwTw[WW$#137_AGPa??@EOHOGO`qC??O?G?C?CG_???O#150?_#82A@??@??@!5?G?O_O!6?@!6?KQGcOGCOAcO?_#76?@?DBSaTHCw@gHOkCi@_@_@_@_[Cq???`_a_@__Ca`?GC?OOOCOo?cOOg?C?aH?C?a?GA_OG?CCA?POGCA??APO?GChPGhOHgPKPcGcSGSiQGU`UHC@THT@THBCHACQGAcA!11?A?@??LPATHCJSgBHTaTIC??@GODGa?I?AGO@cOQGC?_O?@O??G!20?O_?O_??O_?O_??w_OgOgSGJ_XPaIH?A#48C???C??MEAOO#87A#50_#155?_??__?oOOo??O?OO?O#21__#81C??!4G#128O!4?C!6?@A?@!7?A!5?AA???A?A!6?@GHCAACAA@?ACCHI?@?!5_WO#118!6?@@@!5?B!6@!4B@@?@@@_aQOUoO!4SWO[SGMCC?A#107_#59_C???O?GO?_?C#72!7?A?@?BKW?aX?aGa??S???O?O??g#88!19?@?BBEEMD{_ow_??_#65!15?A??@@?A@CRGIDA??@?A$#105G!8?C!10?O??GwO??_?G#109!12?A?AC?RCHAW_GOgOg?O?_?O??O?_?_?_#2??GACG#3!14?A!10?A?@AD?A?@?A?A@??F?B?JCB?BCBALAF?aH?E?i@GADOI@E?B?@?I?A@?A@?GAC@#138!22?_??_??_??_?O_!6?_O?oGOg?O_O!7?_??_#4!81?C@ECGC?A#46O?C!7?G?GCCC#147G!4?G???!4C#73GG#163_#40?GKC#20__#102A#107@?@@#91_???O#38GCG?C@???C?AAJA!5?CC!8?C???CC?GO!6?O??o!4_#132??AA@?@A???c_K?WKWsAOOAS?W?__!5?G!4?A#114??@?`??A`?a!5?G??Wqo[K?_O?C_g_?G?@??@G?O#108??O#53!5?A#100??c]??GgG_!5?_#41??A!9?G#84!15?@?@B?BD@fJZf}}}uaBQAc?O?O_OO?_#46!6?CACGA?A$#96?gSgCItGOgCaC`ICgcQ_?O???gOGS_?g??O?O?_?_#138!24?o?_#109!135?O?O_O!16?_#138!88?C?_#5@@!4?A#10A#0@#54G?O!4?_?OO???O!4?G???G???K??GG!6?G#119G#121C?@#37O!4?O???gO???_!8?CC!8?OO_#129?C?C???OO!4?W#121!9?A?B?B@BAFBBA?K?MSIU?[[KwKksWoOK}ici[SGKK?KK!4G!4_#107!17?@???O#99!15?@??@A@HFE@FGI[SOG[cccacas_?Og#68!51?_??__$#106?S_CGcIOg?aC`ACG?Q_!8?S??_??O?O?_?_#51!277?_#66_og_OK???G?G?G#84@@?B?A#93AAA#159_??_#101A!5?A@??@#99@#50OOo_#55OO?OOG!4?G??A?CA?@?C@A#23!4G!4?G?GW!4G#86O#125AA?@?A???@?@?@A@@@BEDFCD!5CccW?og_o_Go_???__#114A#107!8?_!7?@#102!7?_A!9?_OWGKYZDP@fSKOPS?P`HOW?O#48!16?G#93???@BB?@B@BRHJ\JV@NRnZe\m\yk[ogO_O#61!39?_$#150!5?O?_!5?G#153!303?O#9OG?@#92__OoO!6?_?_??_??O!5?O#134?A@#23??_#62???G#133?A#118E??ABA@#142C!4?@#20_?O?O???OO!4?OGG???G#140A#73A!6?@@?A#140KO!8?CCGGO?g?oGGGO??G#119!9?!5@??!5A?CCCA?@OOAA#77!9?@?@?@??@?@@?@?@???A!4?A??ACA?D_LaSiO_?_$#6!318?C#105C?A#43G?C?B#47@???DE?A#67?C#99!4GAAAE#120@#115A!7?@???@?@E?C#103?@#63_!9?G??_O??_!9?C!6?Gg_O#142?O??_?O?__OO#73!25?A#128?__#73!11?G#115_!6?O?A`@?a@???I??c?_G!5?___!7?__?_$#44!321?G???A#42?A@?@#85A??@!5?C#77?GG?G?@!5?DA#122??@#56???_???_OGAI#52OP!6?A?@#19_?O!6?G#103@!5?@#49A?A#149C#152G?G?_#127@?@???@#119!60?CCAAQO??K$#155!324?_#80!4?@!9?@@#146??C#72??@?@@?@#58!10?_!4?__O__???G??k[#13_#91??G#25ooo?O??OO?_?_#55??CC???C#165!5?__??_$#68!336?A#117CCC?CC#160_#161??___#162__#69!11?C?C#73?A#116A@?@#145?A#50G?C!6?C#148C#121A???A#118A?A#100@#107@??@?@#51_#91_#132??A#141!7?@$#158!337?_#139@#156!10?O#100A#112!11?A@#125??C#140??@??GCD?@!6?@#141@A#56C!8?C!9?_$#74!369?_CA_#70?o#24_#35O#125@#143!8?@#164_!5?_#81??A$#144!370?AC?A#86??_#132!10?A#157?OO#34G$#135!387?@#112??@???@@???@$#69!390?A-#96A?A?@A?@?C???A?GACG?ACI?A?C?AG@C@A@GFgDOEO?O???gS_W_G_?O#109???A?CA?A?`a?IC?Y?W?Oc?OiOgS?Og?_?_???_O_#2!22?A??C??C#76!35?G!4?A?HC?A@A??@C!7?A???A!5?A?C?G!12?A!5?A#2!5?A?A?BB@B_?_??G??POPOOO?OoOoWwwWwGCKK?C?B?AAAa#29A??A@@?BB@@#2A@H#106O?OOO!8?C#171CCC#82A#14@#28C#83@#16@?@@?@#3@#5A#26A#171@#154A!6?!4@!9?@#161??__!8?AG?OA?E@A@???_#164@@?A??C??CCCBB_K?C??A?H`?I??_???AA??S_G#92CC??G#20@!6?O#116A!5?@A??@??oR_OOYOYHCKCCGDWKcs?O?GG#112??O!4?A!6?C#132?@#107!6?G!7?A?@?@#101!7?C??C?A?@???@?@???@?AL@J?BYsLQlOlQKxCgcG_CgGO?_?O#41@??@?A@C?ACQ?gA_C#88@???IH]k???G#75?@?B?@!4E??abFN^^}}x}{w{{w{xk$#137|w{{}!4{yqZ}|poSWoxoopWpYwwOosyccA??QG_gc?_OGg#150!5?_#82!10?OgUGSgOhO`O_Gg?@#76!13?A???CA?A?HC?BGQ@QCOK?cOK?c?_I_W?G_W?O???O???O???O#2!25?@#138!9?_OGCOAG??_OC?OGDA?_@???A?C???OGAcB?C?OGE?GG?_OG?C?CGC?KGG!4?ADBG?I??G?E?E?A?@?@`_!6?G!5?CC?A!5?O!8?A#158!5_o???_oo!5O??W?wOWWWKFEFBCEAA???@!7?@??GG#92OG?G?G?G?O?G!6?G#21?B?CC@CSGWG???CG#178@_wo}LDQ?C???CP?G!7?_#179o_#91GS?S??G#145@???GoCKWwwwWO#52?@???A_!4?OG?G??G#125?@??@d?CCGC#118?oo@WWXlLKKCOo]UEz|\rQpzgyTkmSCgW[GGECA#77???C??C?EA@@@?@?@?@??@AESIScIOgO_?_O#48?@??A?@?@???C_?C?GO?_??_#95I?P#123?O#80?@Ao@!7?O#78!19?@?A?!4ABAAB$#106?A?@??@???C???A?HACAHACAC@AC@AG@A@?DGD_EOAO!4?S_W_GO?O#138!20?A!6?A?_A???O?OO!5?_?_#109!77?_?g?s_]?iOjkQogTYSkr[pkPyTidOtGWsjOjTohV_VGN`U???SO[OC!9?A??G#167?_#170!13?O???O!4?O??OW?W?WG?KG???CC#154_#160_!8?_!6?_?Oo?o?!4_owww{wwksMZrizryzzq]}~NSvnUZvUc[cOaG_?O?kocCwGo#157A???@@CC?@#57A#163??GOEJ?A#195_!6?_#157?O??GG#177??A#162???G#23?@??G@??__#136ACKG!4?C?GO#128!5?@?@ACAB@@BBAB?GI}?C#121A_qojLJMfdeAAARPBB#103!9?CA@A?@??OA_Cq@wDeOAoaHYCgOiGeYSAABASX??g_SG??_#99!9?A?@???ACA??Q?sACh?IP?_#87!7?@?@??@BNZev^}}[s{o_???O#65!7?@C@@D@@C@CO$#150?D@A?@AA@@HC@?KA?@ACCH?CGC@ACD!4?O#1!41?CA?C?C@IDHUbMbM@CHUJ?@SHE?rK_D?K_JAbQJAbQJYLPFbfvBFfnn^nnn^nnn^nnn^n~n^n~n^n~n^n~n^~Vf^n~NWeQqLOkSl]IaRiDsB]?L?hC@?GDA?G@?@?BG@iDA@GAcI?_?aGU_SGE_UG_!7?ULLF@@AC?@??BBJ@BHJ@DAC?EIQqkZ~{C!4?c!5?A_?O??CSC???I??A??@@???AA!8?A#109A?@#76@#177A#172@#173@#40!4?@#185?OG?CKCCC#174@??@#155???O!4?_???_#175???@#163?@#176!5?@??A??C!9?CAA!5?@#186C#179A?@?GG#79_#28__#15_?_#37!8?A?!4AMG_o?___#73A#140?@!4?@@_P?JCL@C?AA?C?CQQ??GW#73`#126@???AC!8?A#115_???g??A??I??C?AO?i?CA@C?Ao@`P@P__??_O?GC#107?O?O?_?_#72???@?@?ADANQLaEwEWdYgSakYSg?Go?_#85!15?Q?PA?O?cG?_$#0!8?A!6?@??@!8?@??A!9?@?ADI@A?@AC@ATaCjDjTNRlE@@A@FDANCNFTBX}jTjS`Yc@[PKPmHuHcZ{JsXuGr[qlqLolOlOlOlOdOcW?W?W_W?O_O?O_O?O_O?O_O?O_O?O_O?O_O?O_?gO_O?ocXcHqlQhQ`SHCPAH?@`ODAO?dAOgD_QGaCOaC?OGe?P?@OHC?@??@_P??`?c_a___o@A??C!6?@!4?G!7?O#3???A???B#17___!4?__#181A#3cC???OA?GB?GC???AA?C@AA#154G#124?C#79C#166A#157C#51C#170@??@#175!15?o!4?G#162!11?_??gO?O_G_???_@KB_FOCwW?w_O_Oo?wooS@@?@??_o?G?A?AA#57?G??G??O???_#86???@?C?OO#144@??O!5?_#149!7?A#130!5?_#132!7?@@?AB?Q@JC#119??_???Oop__GK?@@!4?`??C#102!5?@!8?GKGGKA?HPGCeO?gg{k{GeKoO?__#98?@!6?@?AP@O?QBS@`HRNcIJSiS[ogPOg_D?G#84!11?@???@_JAHXxx~n\[wo__$#193!11?_!4?_#104!17?C???A@?@@?@eTBIDBUDILjSySgogOhSgSGO_O_?_?_#168!16?_!119?C!11?GGO?G#76!5?A?IC!5?G???G???C?C@C?O@@@!4?!4C#64?_#12O??_!9?G#156_#155_!6?O#66?!4OGGggg!4G?KCKCCCA?@??A#159!4?_!4?CCCK_???B??@C?@BB@FDET}h]OAWO!4?_#124?@???AAA#169!8?_OC??b?hO?KCCC?CKG?O#63!7?CP??C#132??A?AA#129???A!4?AGGGC?___?OogoO_#127!5?_O?C#107!4?O#114!7?G??_gOCA_KCC?P?gP?hOE`?q@w@GOA_A?O@o???O??AC???A?O#100!19?C#93!9?@??@?A@EK@DMQlVy{Mk}cs_?o$#105!15?C?_!5?`?_??g???WWgqo?OG?GkIcO#166!178?@??@#29!7?O#166??O?!6_O_?_?_??_#109!9?_O??O#90??_??O#171??___?_#26_!7?O!5?G#21G#105!6?A#185__?_#190!18?O#155!30?A??G??_!4?_#7@#180!9?OGGA?O??@C!8?G#35!10?C#74@?G!4?C#38???@@??a?CCC__???O??O?_#108!59?C#59???_$#110!224?OO#171G#168!13?ECCACCC?C?C?A?AA?@_??_???GWGGGW?KCC?OC!7?BB@?A@@#167C!9?@A#92?CC#0A??A#156!49?C???O?G_???_?G!10?G#21C?C??@RBO_Qq_CDJPVitisw_w#142?AC@!5?C?Cem}[K!9?_!5?_$#82!225?A!4?A??oOgoogw#171?G?C#166!21?@#10@!4?A!6?AA@?A??G??!4C?C??@???@#183!4?A#184A#54C#40C#177!54?BG!5?GW!12?O#155?C#192O#51A!4?!5@BA?A#152!9?@!4?O?C$#167!225?@@#179!40?O???G??G?G#0?C#109C!4?S#181???O!5?G#174__#173!68?A?A#12A#36@#191!16?O#25!5?O?O#127!19?@#126B#125@@@A$#167!267?@@@B@#22@??@#16???G???A#28_#166???!4G#182GG!7?A#25!64?A!5?@#194!13?_#168!7?C$#194!280?_#76O?@!8?@#2AAA?@@@#79!68?@$#173!283?_#169!4?@@#189?O#15O#29??C$#188!289?O#187!5?G-#137~B}@~A|JtkRlYfYuHbI?`APCAOdADI@IdIRHjTKSoQqoSsSsAO?O??Oa???Q??O#109??@A??C!7?ATA\v}lytmTyTmp^qlQ{jSlQlOgoLsGuGS__O?o?gS_OgCo?gC_?gC_OcGC_OCgC??gCO_SGcOCGoG_GO?G_?CGqCHQcQ?qDgS_Rox{{~o{YuzTr~r~|~~|~~~}~|~~|~~}j\jvlzju\QiuH}IA?C?c???AA?@!7?G???G!4?C??G#26O???G!5?C!5?A#156?A!6?@#197_!8?_???oO?_C??CK?!5C?CID??A???A#163!11?OgwwoMoSafcxaKiUkWGg{w_O?{S{{G{wgo___?_O??_GA?_O#180E@??g?WF#36?C#203{Ku}{{wO#0O#25g!7?H_@??Ak#24@#116C?Qi_O{Wmal\MDB!7?_?OOGMA@#140@#132??@Q`???g?__G?O?G?_g#73!12?_#103G!9?@O?P_PG?e?bO_POO_FQ@EXSiC`AQgRCkW@KAGcO?GS_O_?_#99!7?@EGfSA`k?CcAH?O#80O!4?AC?W?Og!4?_#84??`B_bCrdUxJrZVm\kprpppooo$#193?{@}?|AsIPkQdWdGaWsLYCkY`LY_YoKs???c??_#96?A?@?@A@A@GBK`YC?gPC@QG_??_O?O#1!15?@??A!10?A??AG??Q?AGD_J?aHI`UGAHSaGOChAGVGBgRCJ?jOFgBGV_JOjCRcRCJtATaRAHcRCHQcGRCaHOEGB_@!7?G!30?A?C@A??Dc?_?A?QOOO?@@??@!7?@G?GH?CDD??@BA@@@B@#176C!5?A!6?@#174??!5_q__?Oww??_!5?A?OwGOW?g?_?@#175SGO?OCGKAmNmIeKSKCC?K??A#162@???@?@??@?A@?HgcA`?@_@CQIXEGY\MNFB!7?A@#169?@#124_#157W_#138G#3A#213oG!4?_#33G#21P!7?CA?B~[#86OA#145@@#136@?@#142?!4@???_owwkCANBJB#125_?_OGMGAp_gGGG??GG?OW?G!4?G??GG!8?__#126_#107??@??G@#102!7?@?CCEBA@B@?HKXEJDZY\lVKh?__oooWgwc?C#53???@#100!7?_#48!4?CO@gAO#41?C?cA?O#88A??IEEJ?OgZO???GG?GGgKO?C??_#65!7?C???C$#96!9?A#150!5?@#196SC?_?p??S_?K?D_?Gs?O?I?_#106???@?@A@?@GBGdG?PcH?H_?G_OGOG_#76!30?@#138??DA??@??A?SGC?C???C???C??OC??OC??_OC???Oc???C!5?_!5?G_CO?_!6?H???@?C?A?@?A@!4?C#104!27?_!6?G#171W?K???C???A!4?A#169C!6?C#205_#106OO!6?G???C!4?A!5?@@@#194@#188?@#173@#159!11?A#156_#206???_!7?C#159_??a?oO_QPO??aA?POPXPo@sWoGBABAB@@!8?@@ABC??CF@@A@?@?AD@A@OC?@#178_GCCtNNNw]lO???_@#173B#28@#5@#7@@#13@#20@AC#218_#164Eeuo???@?XG[#34?@#4@#58C#52O#128Sk??_?_OW???A#52?@#130C?iH_WCKA#126_?__OowKO??q`a?QOH!5?o?O#107!35?C???Ag?O!5?C_???O#77BCA@CDAC?@gPkOgSgS_S?_#93!11?A@?TGd~l||xo`@_DE??_#75!11?@!5?@ABMKMIMJJJ$#105!18?@QCGA`GA?P_?Q@Q@kAS_RJLlKMiGgG{es_Q?`???__#182!5?C#82?A?@AHQDIPID?P#76!44?A#168!51?GC?A??C?@??G??G#138!27?@???@_?o?GCO!7?@@!4?G!4?AE?AA?A?@?G!6?A#2@?!4@#210!24?OGOOGO#66?@#161G??G?K?SG?A!8?_!6?__!4?_A@??@??B??ACC??EQ?W?GAAUA??CCWE@A#164_OoWRG_O_?_OmB???]#215O#202?A#204??A#1A#177@A#57??O?AC???O??_#16??A#63_#55G#165A?@?@!11?O?C?C#127?_??O?O?CC?A!4?G#73?_??_??O#59!45?C!10?_?O#72!6?A@AA?@AAA?@AhA]hUHeWbgA#95!7?@G#85???AC@W_Sg?T_?gO?C?G#78!19?CC$#104!52?C?ASCI?CCULaVIcdfQ\ulytitg?g_#110!144?G???GG?K??GA???G#2??@??O#172_!4?O!9?CC???A#171?A!6?@#199!20?O_kC__g!5?AA??ICGU#211GWG#212!18?_O?G???O_?__#160@A@??A!6?@#155!4?@#21_!5?_#176?O#195??@???S#191k#153A#217??_#193!6?C#23@F!8?A!4?_#91?W#125_#126_#129?C[CAA!4?_OGCBBOoO_OOLND@@#121_???K@UDUTVDFCD_?_oK[?oSSC?gg_??Oo???O!4_!6?C#101!26?A?BCA@A@@EO@GALTGTi\A{@S?_O#87!22?A@ACNVN~rUsVSR?IgAsKCgO_O$#0!55?@A?QG_@ATG?@G?G_!4?C?OiCAG@QCIPgDiPM_LQlBShQkOfQL_Js@qHSJDqDY@b\aBXFhRQLr?rKBGrON?jORkR?ZcJ?rGJgRCA\aLcTQJgRChQdGhSCiPa[?IC@A?HAc@CaG?C?A??A???@?A??A??@SaSGQCSH?lOGs@sOBBAB@b@`@@O!5?@@@?@H@GP?@?HG??AAA#66O?O!4?G!4?C#211!28?_#200GOO!9?CG??CCCIEAC!8?O?C?OKGKWQE[oCGO?OO#192!33?O#194@#214!10?G#163??@#157GGo?@A?Cq#144!5?A#130G#140?O?G?C?CQA@#149!13?A#128?C?A@A!9?O!9?G#98!63?A!4?A???@?AGO@?GPKQVxH{qiA??A$#150!55?G#168!170?O?G??C?AGAGA?C?AA?IEA???E?CA?A?@#82C#182C#185__?!4_OoOo?WwGWGoSsgSOSS[]C?A?EFDENKAAA!5?B@?B?@@?_??_@``?@!7?A#201!54?A#207C#178!13?G#36@#179@?A#192Go#76_#180?C#38!9?AA!5?_OGCA??@#112!15?C!9?@_!6?_?O!8?O$#64!226?@!9?OO#170G#182!5?_#82O#209_!9?G#155O???G!5?C#29??A#190O_?o_oGgGSGKGG??G!8?ACG!5?B?A@#173!93?CG#124o?C#118!50?AAECEAA?BABbaABQZvDBFEBB@BMUStoOck?_I?Eu?PG?G?GK$#179!227?O?C???KCCCKEGAKCEC?CAC#76@???@!6?@??A#205C#10??@#212!32?O#156??A#191!98?@?UG#114!53?A??@@!4?@??@??AC?H?GA?@GGGDgO?h?OG@?OaO@OG__KO!5?O!9?W?G$#82!228?_?_#208G#166!4_??_?Oo_oO#198_#29?O#3?G#216_#162_#174_#160_??!4_??_?OOO_?gGg???CCC???!5A??FLD@?AH??@@!7?o?_@!4?_`@???___???O@@@B?@?@#169!67?A@#138_#119!54?@?C?ACC???sCCCGwgG?SCCSO?!4A?AC?Cc??G$#106!228?O#97!6?O_?OO#180!9?_#194?O#181?O#158__??O?O?OOGG?GG?C?CCC?!5A?!6@O!7?@??!4@#168!100?G#116!55?G!7?G$#83!237?_?__?O#124!11?O#104G#10C#17C#198??C!7?A#171!134?C#115!56?@@???@???@O!8?OGG??@??CI@QI@AoG@G?g?cE?O?_a___?_$#156!256?O#177???G#3AA$#154!262?GG!4?CC!4?AA!5?@!6?GOWG!8?AA-#193Ono^onO~_^o^onoN~p}P~P|rkR|r{zcy_spSOg___WS__?Q_A?G#96???A??A@A@I?E@A?@?T_A???_G_#109??IELIcJDJBLbNBMBlFNLFLYfYLJELyDzCytwsyTyulyt]tI|U{ytwpubRr^NFNJN^DACJCIP}_oIC@AKAFMKMNFNnNnM[mikUBHJFLHFBJFCLJBLDnNN^NNNnn!7N?B@JAHBABAH!4A?C???A#160_OGG?GGGC??CC!5?A??@@@#210!4_?_?_?Oo?O?G!5?C??_!4?G!4?CC!6?O?!4O???GG#206?O_!6?O?_#174?A?@#156!10?O??O?__#212???@??GI@AB@LG#162?@AA?G??BA#180_??GCS#36???_#180!8?_??@??G#21?o!9?OgOO!7?on`B#55o#125B?_@?_#142!6?@@@???@#121?_?_?OG`?_GO?aCaIaBAPAEH@OEDABbJbAAE?FjAFvJ\N\GPROP_o__oOo?_oooO!7?OOo_O_!5?OO#102??ABA?CEDE|@Eb]k??o#72???C`?g@NHcUXaWc?_#41?@_C@aG#88!7?B@?@!5?GENFYEyB?NE|?W?e?C??ooo$#137nON_NOn?^_N_NONo#196?M?m?mAKAkAKBCIDPI?I`QSIOA_QHS_GS??G?_#106!4?A@A_I@A?@C`GQ@?C_G_O#168!36?A#138@!9?_#168??@??A???C#1??O??O??I@?CA@G?DGCBC?BK#90OOO?O??O#179???_???_OooOOO#182?_???_#82???O#179?___??O?O#191O#1_#168?O#2_#166_?OO?OOO#1_#22_#23_#155_#40_#158_???o!4_oO???G!4?CC???!4A?@@#211?__!5?O?O???G#222?O?G???G??CCOO!5?C???A#212???_#229_#228_#230_#224__#223_!6?O#229_#212???_??_#163?_???O_??_OgQHUZUEFBB@@?P??CPB@P?@??AFF]TGT@?@!5?@?@#191!16?@G!4?O#57_#192_#105???_!7?C#57_?_c#36??G#91oL#38_#116EEWG\}M^iMSkw{YM^C?A#135_?_!5?_?O#132??Gd@OTCK@aWG`a?KK_O@O?DGC?O?___?_#119AGKCE??O!4?O?G???oxhhIH!6?_gOOO#107!4?DC@?@HAH?C_O_O#101GALqDdYQu@}OcQg_#48C?@?O#93??@qOTAtnV~n^nwkvepqOqooo_!4?_g_#84@A?AC@K`IjBMB$#105!18?@!5?P!7?C@I?IC@CHCHC?AHA_iDoAZDhIhKGK@S_gsoW]_Go?W?O#1!43?@!7?_#110???C??G#170!4?G?C#64??oO#138!7?A???G#2O#64O#214_?_#97O?OO#110!10?C?GACGS?GA?CGAG?OO?O?_O???O???O#104mGM?C???C??G!4@#2AA?A@@???@#166@?@#221A#26A#189A???@@#156@@#219!10?_?_?__?___oo?_??ggGGCKKKCCC?C??@#227!10?__???O#224!6?__#162!19?Go__SG_a#223??A#195?C??Sg_?_#164???sIsXm_?DA`__?_inUPfVBJ^XU?RsG??@o#168C!8?O!5?G??@#86C??OQC#152A#149S#130G!8?@A?AA@@?A@#119!4?__OwWO#127!4?O??K?_??O!4?O??OG!4?O?O#143!9?@#115??G?@?A?CAHC?HC@A?Q@U@?@?CA?R_@aAD?i?_SH_OO??OG#77??@AL?LaY`CGS?_O#99@?E@AW_HA_?H#95C?tIOg?O_O!6?_#94!20?O#75??@$#137!30?P?I?C`C@IPE`AHUhCTHTqF|CwUtSosOS?GS?I!5?G#82??@?A?@!6?O!5?O!5?_?O!4?_#104!26?G#166!12?_#82!13?_#166?_#168@!8?@??@?C!9?@#208!10?O!4?O??OO#214_!6?O#226O#106???OG???@#105C#82@@??@@#182@!4?@?@?@#154A!4?@#199!16?OGGCCK?ME?CAA?A??OO??A??__?o!8?OO!6?_??GO#155!19?_#176KKKA@ELD#161!14?@#21??a??@!6?@!5?g?O#76!7?_#203O???BMX^^~}PN#4@#164FJJC???oO@#63???G#225?G#140oO!4?@?@?_O??_O#126?__OW[]LDMFCElf[zC?C??A?G?Ad??D_???cC??_?@?GS?O?P???_#114??@I?D?ICA?F?AC??C??GDIA@G@C??@KAgC_O?cO??_??O#59!4?_#100!6?@#53A#98??AG@?WdA^E|]U?iG#85!8?CQGOIGDGHAH?G_G?KC?G?G?GO_O$#104!60?_?@??HCa?ADCebZEVLnmtxqdYsgO{_[okO{Oo_Oo_???_Oo#170!58?G!4?_!5?_#97!4?_??O?_O??O#196!6?_#193!11?_??_???O!6?G#184G#208G#192C?C#138AA#190_?oOoo_g_!4w!5{}}]]]^^]^N^M]NGEED?A??@!7?_?__?Gg!5G!10?CC#160A!6?@@?!5@?B?@@#178!12?A!4?IyK{qc}gS]oOw_g?_ACOCKALMEJIED?@!4?C?EhNkJu??EN#25G#177O_!8?O#51_#28_#157G!5?AB#127!5?@?AC#125!13?OO?CB@AA??B@AG@?@?W_gGPOCC?WOGOOCC?_`w?OGG!4?_?___#103!5?A?C??CA?C??C??C??G?GA?A!4?@?B@???A??gOAi@K@AtOA?W??G#123!15?G#80!14?GC?G!4?Oo?o???O_?O?O$#150!62?_#0O!7?GP?C???OO???O@?Ac?Q???`?AGOAGAdWdQCHqDyCzDIDIDiDGQDI`ITAHADI@EHSgK__oo_o_?Kzoxse@YDpwyt_@G@A`__!4?@A@DA@GAC??A_GCOWAos_a!9?_?__???@??C@eKLGLEDCCCE?@A#15G#156?G#185_Oo?_??WOW??CC!4?A!4?@??@???@@?F@@AB@BB?!4@!7?__?O?OO??KCCCEBCBFABDEEE?A@A??!4A?@#21!16?O?SG?_#157!19?WoWo???_???GCW?G?__#106!5?E#202_!7?_#23???_#13C#178?C#176C#124_!5?O#129!7?G!6?C?@AC?C???A@#112!4?O#128!9?O!4?__!4?G!5?GG#116G#112A!6?A?A?G???@!4?_#107??G!13?CC#112_#59!14?A#87!49?DADED???D@DOR?O?fdbGRIdSK?K$#104!166?_?oOO?OOOG???__?O!9?O???_#82!12?C??G#66!7?___?!4O#209?C#194CC??A#220AA#150?@#206?A#174A#29@#224!26?OOo!5OG#174!4@??@!6?@ABBA@#231!4?_#200G!6?GW??OGWGw__?_oSe?kO?C#177!6?G#164A?OO?_#169!21?OO??G#194!15?G#124@#204_??C#213@E???@M#18?G#79???O#192_?C#3A#25@?K?C#128!4?@crA@o_OoG!4?__#127GKKB#73!21?_A??_!4?O@O#118???c_!5?ECCAIWF]CLGJp@?@GaxI?U?o_ea?@GT[?NmK_gSOWGgOG_$#214!184?_#166_#198!24?_!6?OO#188?O#173O#177O!5?G#155?G#181A#172AA#212C#10@#159C#209???@#212!28?_!5?_#211?__?O?GG!4?CCC?OO?O!5?G???GG??O?O#161G???S?O?GOG!4?_?_hHO#57!33?O?OOO?i??s_???O#208???O#171C#169O#215?A#96G#36!8?A#173???B#138C@#137G#5C#7G#12G#126!98?O$#83!210?O#218_#196!9?G#191G!4?C#201!4?C#195C#162?C#197!34?K??AA?@@!4?@???AA?AbA@??@??B??@#222OO???WW_!4?_#207!70?A#217??@#162_#155!8?_#169!4?B#153_@#14G#20A$#12!226?G#228!45?_#206!4?A?!6A!4?@#221!12?!4_#171!97?O#106G#191O$#200!279?O!7?_#109!116?A#202A$#175!280?_??OO?_???OK?G?!4GKG???@@@E!4C?G!4?KGOGEIHV@EH#215!75?O$#156!283?@?@@@$#159!285?O?O!6?G??C!9?@@A?AFCCC?E?CEE?@!4?_??_-#193~}x~}~~}|~x^~m|!4~|~~}!4~\}z|~Sjx{B|gCTu[yhdu|?O!4?G?CgC#104!4?@!8?DBA@kyP@I_WMBBbZ]}\NzM]|V^x}T~i|~j]xukWgwWGwgW_WgwgOo?__!8?oO_O_Oo!9?_GG!8?O!6?C?GgOw#182A?A?AA?A!8?A??A#54G??_??_#160?GG??!5C?O?GAK?C?@?A??@#224!7?__o_o?O!4?WO?S?G???CE?CAA?A!4?@@H@??CCSOO#199_A??_?_!8?O?O!6?W?Gg_!4?GA#161AOP@@?P?A??B??@#51O!9?O#21_???`Cag_OO#57?_!5?_C?IA?C@CEEAECDNDIW@BI\oos@?W#192@@#195?K#162@#155@A#124G??G!9?C#20_?AA#39GE#116w??OopIOHAG@?@#132SaAGC#119?OghPAO#125!4?_?o?O_?@OG?cSa`bOIi_IO@_?AO??M_E`AfAM?G`po#119???A?@?OC__Dff|WGH!4?CDC?GEEC!5?GKC#103?_?@?C@iOCO?ScaH__gCG#108O#99!7?HCKE@A?Y@cieHqComGs?gO__O!7?O#80CCC@GRG#85O?AG?C$#137?@A?@??@A?A??@A#105!12?A#137!6?A???@i??@?AG@?hATiDQdrGBqPj`GI`??O???_?O???C???I_?G#196?O#109?@??OCP??G?A!8?A?@ADFFvFVf^eUFVnE}^V^~n~V|mzMcZcIcGg?A?AGJFLLVbHHGGGPH?HH@F?C@@BFEEFC??C?GKGIAKC!5?@@?@#1@#31C!4?A#218@@#159GG#174_!4?O?W!5?CC??A#219!5_ooowOW?WG_gGgK?CES?AAIFJA?FBD@B@BAB??G!4?OO???O?O!4?!6O!5?GG!6?C!4?@A#159?G!5?AA!4@#92??O???O!5?C!4?_#164G?G??C_g_O?_???@@@??@@!4?@!5?@@!4?ECA?kAEGGOOC___?___?AO?GC#63?O?_#51O#92G?@#140@@!4?O!5?@#112!9?O#118_O#127!9?_O!4?G???A?A?OA#115?_!6?@#127?E?E??@???G#73C#112!4?@?CO@A?@!5?@!5?O!9?C#107!11?O?I?Dg?G#77@??XEoShOo?O#48!5?@?CG_#93@CGSHOLON@FHBDJFRNIVfJ~D~MzjZyuce_oooww{}$#196??C!7?C!8?A??@!4?_@CA?jSCB{AUPiHaDSQG?Ak?Cqc??O??_#96???C!4?H?AOAGC?A??i!6?G#82???A!4?A!4?i?CA?S??GOC#106??_#168!5?@!4?@#171!19?ICGCAC?A!8?MEECAC?A?A!8?C??C???C#154_!7?_g___??!5O??GGWWOCGCCCA?@??@@@#175!11?A!4?@???@@#197_?__OoOO??O?_GoGWg#206GO!4?C#231?GGG!5?C???A?GG?CC?C???A???A?AA@#212C?__A?@@?!5_#176_??_C??A?@#160_A??_GOGO??_#163?@#178@?BC?W?O@@B@?A#35_!4?__#86@???___?_!8?_#177?@!5?A??CA?@!6?_#179??@#91OgSA#125OE?DEDACaCSPSS]I?@BB#107!5?_#132!10?A??I@D?@???@??O??S@GG!4?@@!4?@E?AGHOg#143??_#118?_gw[[qOW??ECJ@DfBQrjaxXXhXXHxvQZMMe[Ig#102???JiFJQ[UU??G#98@??A??A?e?R?PiTNcwP?Oe?i?Oo?oO_OG__G?O?g!4?_#88C??ONNKFFBB@$#239!11?_?O#105!33?AS@iPGHQKbSHMS]voY~~nuu|Lg_pkP?K?sOE_og#179!58?C?CG!8?oo_o_#96_?_?O#214_?O_#64_#96!5?GG#237_#242_#106C?A!4?O!4?CC??AAA#104@#2@#220A#150@@#177?A#226@@#201@#185!4_!8?GG?CCAAB@#222!8?CCC?C?_cA???OO???GH???!4C???GOOSCO#185??A!4?A`?_@?@??__?_?_?O_O_O_?_#211??WgGOOO#174?CAK?I?GO??G#177!5?g!7?@A#176!7?BG#180AC?KM?S?KC#4_#1?O???G#157@?@??@!9?HG??@!6?_???_???_??G??b#38!4?_O#49_#121?G!7?___?_?SgOgtGVCI@lWiPICPEGFCNCCEABA@???@??p??QP@GGG@!8?C?ACJQlk^yNE@BA!4?aoooGWWGGGCC??AEEAEE#101!16?@??HEOAaCkHYchIO_?_??_#41??A#95A!4?@???AGACGC???O#123_#87!8?@?@??@$#106!64?C!4?H?AOCGA??aS@?@OC?C_??_??_??_#166!47?_!4?_#191!8?O#97???_?__O_?OOoOOG!5?O#191_?OC?A?A?@#48O#66O?O??GGG??C!5?A?A?A?!5@#211??_?o?GWGKG!4?CC??!5A?A???@!9?GG!9?_a___`@`_#221G?G??!4CAE?AB!9?!5@#200???CCC?___#155G?K!7?g???_COc?A?C?AEA??_#186???@AFB??A#36_!7?A#179A!4?OO!5?_#178?@A??HCOCGC?A?O#156?C#173G!9?A#69!6?C#55G#73?A!6?_!7?C#128!19?oO?_OW??SOKcCK???C??AACoG_GdO[Oh`O#114!13?G!6?CA??_??O??_?O__O??`?pPG_SQi?D_#72!8?@@?ABCdJStHUgQ_O?O#123???@#41!8?C!5?T_GC?Q?`?O#42???G$#0!75?O?@???D?@?S?C_@?_??`??_C@??P???`C@A`Q!8?@???G@?G_?O?gAPC@JCJTJFV!5POOoQ_CEEFFF??@?O??WIGIK_?`?@?GG!7?@@!6?@#198???A#233A#181?A#180!6?@#164@#156@#92@#197_??O??GG??K#212!16?GC_C!4?AA??@G#174??!4_O_?o#229@?@!4?G?G??CCCO?!4O!5?G?GG?!5C?C!4?AA#228?A@@#160?G???C??A#195!28?@??@A??A#173A?A?@#97_!4?O#90o?GOO?O_#180A!4?B?A?_?OS?KGG??G???S#25O!6?OC?@#148_#130??__#129_#126!8?_?_GOcOIf?ACKAfTmtZmHvGH?I@!9?@??AA?A#130_#112@#126!11?AC?AcDQO#115!8?G?AC?A?ca??_??P??_???_???_??PA`@CT_O?O_??_#120!16?G$#110!145?GA?C?G???Oo!5?OO#138ACA?@!9?C!5?C#153O#174_#158?!6_o?!5OwkGkccssOQ?AGJEAAG?FABAA??@#229!13?O?O?O???GGK?C#200!4?G!6?CC??CE???@#238???G?G?!7G#161@#224@!4?GG!4?C??C???@A???@#154?CAC!8?O#25!26?_!9?C!6?@#168AA?A??Kg?_#171!14?OO??W??A#204A#152!8?@#132??S#128AHAK`LQHEII?@@#116!21?__O_?g[?K_O??C@GGcC?sq?OWOWG__OO#69!18?@#126???O$#214!145?_?_#97_?_#106!11?G#82??GGC?C!9?A!4?@?@!6?AA???@??@#190!12?_?_?OOO!6?C?E!4FBBB!5@?@@@#199__?_!7?O!8?sC#210A??O#190A?A???@`@?@??_#234?C!4?AE!4A?AAA#227C#190OO???O#158!5?G?A#163O@!6?@@?@#124!24?O!4?GC?C???A#170O!9?OO_#28!15?@#15@#23@???@!6?CGC#127!5?W?G#140!39?G#73!4?@?C???O#140C$#64!146?_#90!21?_!7?!4O#192_!4?OO#208A??C@#188G#28G#209CCC#199!18?_?O!8?C#228!16?O?W?G???C??C#175!5?G!7?_??A?A?_ABA!4?@???_#220?A??!9@#235??A#206!12?O?O??SOC#169!29?KGK!4?C#16_??O?G??_#21???_!9?OA???@@A?DAACEEAB!5?OGGB@#129!54?G#119_!4?@$#168!168?@!4?@#226??_#166!7@?@#196?G#11O!8?C#210!19?!4_Oo?wo?OOOWGGG?GCK#200!5?A?A#210???@@@???@#159!5?OG!4?_#228??G#227?G#236!6?CCC#206??A#159@??_!4?_??_?_?_#156!18?CGGGOW??WCCG?@?b@OG#79!16?_#207O?G#196??_??O#17?O#14_#83_#169!7?C?CS!7?oaa__?OO!7?G!4?A#142!62?_$#181!177?A#1??G!4?G#168??CC#155O!9?C!5?AA#185!44?_?__O??O#161!4?_O#212AA???@@#197!7?_AAA??_@!6?O??O!5?G_!7?CO#162!6?C?eaCiEegREZkZ[[badLx\V]Q[SOG#12!7?_!8?G?GKG?G?WC#36A!7?G!9?@#191??O!5?_?@$#241!177?_#193???O!6?G#15O!9?C!4?A#223!80?A#235???CC#222O!6?G?G!4?CC?D??__#168!43?O?OO#21@#110O??C#194!32?O#51@#153GG?C$#105!182?O!9?@#177?G#232!95?@#160_#200O#174??_#175???O?O_??O?O?GG?O#138!44?O?G#109?GGG#207!33?G#216C#57?_??C??@A$#207!182?_#243_#156_#179!4?AAE#227!99?G#210!7?G?G!6?_#23!53?A#64_#192!36?C??A$#237!189?GG#150G#240!170?O#168!38?_@oWK_$#110!189?@#202!211?C?@$#79!401?@O-#193VFdBFTBlAO@L?P@WVfdVFdfRNfrmFTFrkJC^cj[JuVVvFzFqGPcY?hO?PADitIPg@?C!8?_#0??A#104?@?CA@GI?dXEAiDPIARHIeBJAhXHdvffU^bfl{zskv{}t}|u|Vm|JsySkDvJHQIAB!7?C?@#160_???_!6?O??GG???CCCA?IAB@?@@@#161?_O?O???C?O???G?C??C#227???G#190?@???O?O?O?O??G#159?_?_?_??O!7?_#190ACA?C!4?A?AA@???A!8?D@BB@?@??@!8?@#228O??O?O!7?!4O#206G?G!5?G!4C#195?__#156_!5?@!7?@#226!6_#12?C?CC?C??AAA#245C??C#97CA?C???G!6?G#104G!5?C?W#110O#34_#169?@_?@@!4?AA#36?C!4?G#92_?O?A?A#142CCC#119_?_O_???C!4?@!4?@#128???___???AGeIBIHH?M_EKRDP@CAOY?WG!6?CCWIOIPioSACA#118!5?@!5?O??WSA?OP@??AHBNH`@P`@OGGYuQTsM\II?aO#102!4?GWPXnvDt?wO#72CCB@CAAtLUPYPi\gydwoGoGO?OG_OGO_O?_#93A?DkO[TY]|rn^|~j^vm$#196g?W_W_GOChEoBkAD_GOGoGOG_OG?OgOGRcZ_JSBsHggGwCwLtiZduSjlisgO?_cAWaOaGCO_C_#106!7?@??A@?I?AOD?iCP?cO@GS?CA?QG?OG_?G#82???C??GA?G?A?A??AO?C_#105?_?OQG?G_???G#2O??@#153O!7?CCC!9?@#208??@#174O#197___O?_?_!5?GGOO?O!4?ACACC?DdA_@?@!6?!5G?_?_OcW_k_iA_A_??Q`o?O?O?__O?oO_??P@_A!8?G!7?A?AA?A?Q!4?AAA!9?@?@#189_!4?_#235_#186?__#228O!4?G??C#79?_#162A?@!4?@?@??@??@?@#96G??GG??K???C???A@BA!5?GG???C#90IAEB?A?ADC#157?@@???A?C??C???AA???A#16@#132_!5?G???IGg_O?OO??O?WGGCoYCG?GEC??@?__??o?O!4?GG??@??@#129_MYEG?O??@_#132!4?H?O?g?E_Op#112??@?GCa!4?@??G??CO#114???EA??A?BO@?@_A@o_TsICiT?ahC@?C#101!4?_BkQzCsJoSGq@mCgS_O?O#120!6?G#41!5?@???A?D?QG@i?`AG#85?_??O_G@$#237?g?W_GO?WEwA{AkA?OG_GOG?O???g?g??O_?O?_#137!9?AC??HACQCGO!4?CAG@ODhASG?W?P_?a_?GC?OO??_G??O!7?_??O_#1!36?OO!6?C!4?@#158__?oOooOWGGG??CCC?AA?A!4?@!9?BA@@??@?@#219??_!4?OO??KCKK??ACCCBBABABBBA@?@@@#200?G?G!6?G??W?GGCGC?GGGWG?C??O??OO???CC??C??CC?CGGG?G???AA???A#178_#195_#243___!8?_#230!6?O#164?OO?OAC?m?BCA?AC#51@!7?@#57A???@!5?`!5?O??O??_?_!4?O??o?O?@?ASSAaA_?QGSSOO!4?B#49???_#39OA?@@!4?_#112!6?H?@!7?@#116???O?owSSOCCDAEL?A@ACGAcqs_cuAQP@pRmlzbcDcdcCC#73@?@??O#143!5?O#119?@HHTb`gkNfemxHduwo_GKGSgc_?_GCGG#107??_?OGCa???O?_???O?O#98!5?A?CHA?g?`A??A@?DJbFPF`N`FhVcQMUXdWQ?D_?D#88!10?O$#239?OAC?AcA`!5?O_G?A??A?c?GCP?A?C#105!25?@ADITIPcTiLqQlJr^f^m^|\]}rw{cctOC_w??_cW?Co??og?C_!7?O#196!27?_G#166_?O!8?ECCEC#173G#96@@@#174_#185_ooOoWwWWWwkWOWG[GYK?L@LLDDC#206_???OGCCG?AA?A#210!6?a`_AHH@@#206?C#175o_G?WCG!4?OG?cSSI@WGC?O?J?@?P!4?A??A?!4AE?A?C?ADABBA?A#199??A?A#159?A!4?@@#163O??_#199???@#26???_#155?O?O#216?!5O_O_O?O??OGG#26__#7?_??OO#193_!6?__w!4?__o#106_#105__#14A!5?G!5?G!4?@!6?O???O#164??A!6?_?_#20???__???C#63?A#118?_??O!7?AEAC?A??!4@#140!7?o!7?OSO?@??@!6?C!4?_cGc@A?O??@#127!4?A?a#115!13?GOA?OO??O?O??C!4?CGSG@Q???_A@???dO@?iTCA_E?O#77???ACAh?wGoH_!5?C#99@ACCGA?CGaGQ?QGA?IC``CW?g@_A$#96!83?@?A@?I?@?T?I?`G_?PG??C?COG?O?_#182!31?Oo!8?G!4?G#170?AA#180??C#2?@#190_?_?___??!4CAUCQMAM!4A#156_#154@!5A??@@#230O#185!10?O#211?!4_o_o??SC#185?G?CKOKCCE?A?`???@A!6?A??A!6?@?@@@??C!8?!5@H@@?B!5?@@#223_??OO!7?G??GG??G??WGC??GA#21???A?BC@@???AB?B!5A@@@#16C!4?A?A??G???O??O!9?G???G_#21!6?O?A!5?_??O???@#69??O#81?W#73ggG?O???O#126!8?OG?C?C!4?AIC@?@#52??O#129O#130!5?@#127?_?a??@?G#121@#126@#38_!5?O#121!12?O@g`LiE}Zm~uqCaKCA?_???Ea!4?OOo_???CcC?G#48!39?@???CO?C_C_COC_?G?G??_$#0!96?C?AC??CO?A?A???G?OGOA?HA???A??G?gO?cA?H?Q??c@@??@!6?AFCD!9?A@??@#82@#106@#173A#205!4?@#180@#176@#199?__!4?o??o!5?G?C!7?A?A`BaaqP?BP?O!5?S?WC?O?O?A?oW@@bSGCBWlBF?@Q@?@@OA?AO!7?EGI?K#206GG!5?C??OC??O#210?C?!4C?A???E#15!6?_#156o?o#15!11?_!5?OOS??GG#13?O#35OSCKG#0?G#90C#218O?O?O??O#25?@#104COB?CC#83A?@CDH@HAA#170G?OG??W?G@A?GG???G?[CC!4?GG?CG#114!7?O!4?_#127C!4?O!4?_??_!5?C#49!6?_#142!21?CC#126!17?G?PGQDG?c#69!8?@??G!4?G#103!4?CAA?A?A?@?@???A?@?@?GTGQ`EGa?GiIL?@#93!17?A#95!13?@!4?A??A??_??CO?A?C$#109!103?@!5?G?@?C?A@?AP?@@?@?@??@??H@ARGGc?csDCGG?AAI!6?@!6?A#196?A#194??AA!4?@#175!8?_?o?O_??OGK#174O!4?A?A?@@@#212!18?@?@#211!10?OG??C!6?CECCC???!4C?CKGGKGH!5?A#156G!4?!4_??__#189?__#173_#219!4?G?GCGGKCKCE?E?A#178!11?AC?DC#177?@?GW???GG!4?@#91?@#182?_#2G#170C!5?C!4?A#138_??_#36?_?__!9?_!4?_#25!8?_!6?_!5?@#38!4?CA#121_X??O?CeDHhZEL]ME]AEAB?@JDDB?B?@!4?__?O$#191!144?CC?CG#194_OO#138G#156_???O!4?G!9?A!6?@#200!10?_???GCKGC!7?_#161!37?_??_#222O!7?G!5?_OOO?Oo!7?CC!7?CCCGCG??G!4C??!5A@B@@@??@A@#173!7?___OW!4?A?E#70??CGG#83O?G#150O#82??o#239G!5?G#153O#76_?_#90H@@?CCG#79_#12?O!4?O?O?O??@?@!7?g!8?CG???C?@#103!4?O#74A#112_#128@!4?@#73!11?O$#179!144?A?C#64@!8?A!9?@#207???A#212!20?_!7?O???Gg!5?O#206!35?_?_#174??__?_?@@?_@??@!6?__???G!4?G!6?_BA@#175!4?!5@?@?@#18!4?_#163!14?G#25???G#6??_???O#37?G#14?O?CC#198!4?__#164@#168A@!8?__?_!7?__?__!7?A@G!5?G?AG?IBAEGCC?A#145!7?A#116C@AD@$#97!145?@@?@@???A!5?AB???@#223!29?_#224_!5?__??WWOG?G!5?CCCAAA!8?@?@#210!14?G??G??GCG!4?C?O?C#224_#161???_?O!8?CO?OW#178???O#212O?WG?WOGOg?C!5?C?ACDFA@ABbBBBFGB?A#2!6?___#25!4?A#166?OO#157!4?A#86AA???@!9?G?AEAE@DVCDA@!8?O!4?O?O?O_??_O#192@#91O???g???D#152!4?A#125SGG?OO??___?__?__owM_OO??G?GaG`G???A_KwOgOcQGHA?G?@!7?GAOIOIPAgl?SE$#110!145?AA#29O#168C#106?G!8?@#164?G#229!34?_???O?O?O!6?G#159!44?OO???@#219?__?_#154!5?O?_?WOO?O#176??__!6?!4_??_!6?OW???G???G?GGCCG???@?@?C!7?A#204!11?O?O??O#246G#196O?W#109O#3O#35W?G?B!4?C#37???A#208?C#179`@KacCG?_aG{CC@?G??G??@!4?A#130!10?A@#141A$#209!146?__!8?GG!9?A#66!28?@@?@#228_O!5?G!5?G#154!42?__#158_#212??O!5?_#54!4?__#66O#50_#177__#155_O#224!16?O!5?G!5?K?A?C!8?D#57!9?O#28C?C#203!14?G#183C#169@#110??GG#124?_#34??O#4??O#145??C!4?A?@#245?C!5?C#215!8?@@#191!4@???@@#126!12?G$#171!146?G??S?G?G???@!6?C#236!32?_#222OG??G??_??CCCS??A?GA???@?C!7?AA???@#206!24?_#159!10?C#158O?O??G???G#211!13?AA#189!33?G#244!17?C#241G#20???@#9!12?O#20OO#124??_#55!18?_!9?_?OgGK$#220!148?_#96?B#216_#174_#192O!9?C??A!4?@?@#231!24?__#160!77?G?G?G!7?@#25!78?_#51!31?_OO?CC??@$#207!150?_#150???A#154_!4?_??_!4?CC#23!230?O?G???@$#201!154?O#198G??G$#243!155?O#176O!9?CC$#214!157?A#155O!4?G!9?A$#179!158?@-#196ASASA_GQKO?C?CHSaSJCgU`SICaTIPgEhCPCi@hQ@GPiT_TItI`ZeZa[c[A?AOTipQWZ_lYShYSiSiOaSKQKOcG_?@?a?o???__???KcWOGC!8?CSK??O#214?C??CC#160_!4?OO?GGG?G???A??GABCE?B?@#222_???OO!6?g__!4?C?O??AG!4?@@!4?aAA??!6_oo???O?G!4?C#154?G??CK!4?C?CC??E?C!7?A#161@#227!6?G#230!5?_?_!5?___?_!9?OO???OG??G?C?CC!8?C#206A#234_!5?G#194_?O_oooOo?_o_!5?!5O??G?GG!8?A?AA???A??G??GGG!5?G#168@@??@@?@?BF@?A@?A@A??A?AA!5?CGG#90A??G#38@??CC?GG??_#132C?IA?AA??C#38_!4?GGg?o?O?G?_#127!4?C!5?@?AA!5?C#140@??`G?g@?OO?I#127C?C?E?G_?WG#73_?G??_#143!4?A??A#119!4?A?A@@A@??S???GK?AYAC#102??C??AA{goAOUaVSC!7?_#98!4?C???C?G!8?C??GC?@?A??I@WJ[WUGlB@#41@#85@G@G?C$#193g?g?GS??_Cg?gO_?H?_Q@?GB_PG?_E@OQIIPCQSCmbETiNiTAtMcXc\bZb|~{laDKcCcS?_?C_!4?CG#208?_#104!7?A@?A?_CAA?@??A@??OQP?A@@BPHB_@AAHGA@?A@@B?@@BB@@???A#4A#20A#50A#190_#188@#173@#155?@#159?A??G??O!5?G#219?O___??G?OOO??CGGGAA??C??@??A!5?@!8?O!6?__!4?O!4?Oo_?OO?OO?OGOO?OG??G??C?!4C??CGCC???C?S??O#223OC!8?GG!4?C?C?_O!4?G??GC?C!4?A#178A#201?_O??_#188?CC?C??A!9?G?GG???CC???G!5?G@G#162__!4?_?_!5?___?!5_??___#171O!4?G???_?_#157C?CCA??@C??O#63@#91@#55@!8?AA#69@#73A#126??C?G#52!4?_???_?O?C?G?G!4?@#132!4?CC?A?AG?C#38!4?_?A!7?A#121!6?@!5?@@D@BBmFLj^XntZ~h~z^l|t[{QwWEqaeAEAAE#107???@#101!9?KCGG?GGHITUhVGIDZChZ_\aXiPuLsZ[nO}KWSOsWk[?S_?_A_?_#93?G_OC[}}rypyx|{$#237TiSJsHSkRgShSHUhSjShUhUgTITiTgUhC`?i@gA@O?g??O?_G?O#105!9?@A??A@B?B?@AA@A@@@ITHQLonZv]y[gO[@VR`@@ao~pWAdA?KCCK??KCO?o?O?O#191O#186_#173_!7?G#199_?!6_!4O_O___!4?GGCGO!6?AAA?A??_?_@BOooOPWHw?wKsgcOo_{sWSDWCGB?h`?GQTKLC?AEPA@!5?@@@??@!7?@#212??GC?C#155!11?@@#154@@!4?A?AAA@#231_#232_!8?__?_?_!4?OWO???OO?OGWGCoO_#189@#187?oGGKW!5?G!4?O#171O!7?G!6?C@A@?A!9?AA?G!4?!5G#106C?C#76C#204GGG#4C#13C#207O!7?G#138A#57H??G?GOOWQKWOs?_O_#140@!5?A?C?E!7?O_!4?_??CA??A?C?C???PA!5?W#73???G#142_?__???g?OA?O#126!10?@???@??AA_?@gOC__OGC?C??_#118??A@?CCeGHHWlHd@X|dwIeOA@#77!6?GC?G??QSI`QgP?O_AO_A?Oa?A?aIc??c?_!7?o#131!12?__#88??CCEDAAB$#239?@@?@AB@?BBABA?A!9?_#246!7?OC!4?g#239?C#137!20?GO?G_?GQChOChSiS`?a@_B???@D_UH`MG_WGWGG??A???`_?_!4?o!9?G??GG#185_?_??_?OO??G?G?G???O#200?_??_#206_!5?C!4?G!7?C#230G!5?CC#212???C#211!5?G???A?IGEBFC@??GDD!4AB#224!5_ooo__GWggGwggwgOgGWG?OG?!6G?GKK?C??KSSOW?S[CCGG#58?A#216W?o?__!8?A?_!7?A??AA!7?D!7?A?@#209CG?K??EC?AC#164_???_#176_!4?O!4?_???_?O_?O!5?O?O!4?O!6?O#173O#9?C#3C?!4C!4?A#35A#12?A!5?A?B?CSG?_#136AC#52C???C#121@@??BD@G#129!10?__OO{?O??OO?___!9?O?_GG_Gg?o_O??COO#132!8?WQPA?eoKG_?O?O?C#115!12?A?@?@??@?_?O_??COPAg?Cl??@?@??@#72???@?GC?EDACXECWaLCPK?O@?`OJ@QbjiBaRaCg^US?B?Ba?A$#246???_??_!6?_#192!20?_?O!4?O#106!49?C???G?OAOD???@???A@OaCGA??A?@?A@?Q@?A??AG#154O!6?C!5?C???C!4?@?@?A?AA@@#185@?C!6?@!6?@@!7?G#212!8?@#185!5?AA?A!4?O!7?@@?@?A#222?O#229?_!5?_?_?_?_O_O_O_OoOOoOw_WgOgggC_G#155???@?B@?@@BC!9?@?@??@@#229?C#238O??O!8?O#15?@#173A??@?A@#220_Co#198C??A???C?@#182C#214A??A#30C#196A#105A#109A#138AA?@#26G!8?@!4?A#212O#79@#57@?A?@B@AA?AACAC#203G#36?@#194?O#191GG!4?O?_#164??C?H??@#14?A!4?A??G#116@??B!6?o?oo_OGOoOWy[Y[?CA?CM?K`l\UCXryhhx_osocGG?OI?ROFFKfjAmhJJ^?O?o#118!9?C#112C??A??A??_?O?C?Q?G_?g??OC#114??OO?_???@_GdOGQ?P??A?@_#53!11?G!4?@!4?_@???A#99???@??D?@??@@?@?SCS?D`TAWA$#184!11?O!25?C#150!58?C??C#96A!4?A_??A@O!6?ACCCE??A??A#174_!9?G??G???KCKG??ECC#224??___!8?O?OO!4?C!6?A!5?@A@#197!14?A`?__o?GGG?E?AAAB?@???@??@?!5@?@??@?@?A!5?@!9?AA#227!4?O?GG???_?O??G?C?C?CC#235?_!5?!6_?O??G?GGC?C#195??@@#172GKG?OGOGG!9?G!6?C#180G?G???G??G!8?A???A!4?A!6?O!5?_??C???K#25?@??@@#86??@#180??_#124G#109C#37A??G?OO#125@@?K?OGi?CBCcBM?E???@?@!6?A!5?C??AE?BGB?ODVCDC?C?G!7?C_C@dIE`leS}??!4O!21?_#103!5?O!7?G@uhOkBU@oa@S_b___???_o??_#53!24?G??_?_?_$#182!97?CC#0!5?_?@!5?AO_AgG??@??HGC@???@AA!4?@#156C!8?@#161!4?_#54!6?A#228__??_O?O???GGG???G!6?C!5?@#174!17?_!4?OOOW?CC??GAA?!5AC?EAAA?!4A?AA!6@???@!5?!4@?A#243???_??__!7?GOGOGG?CO???O!5?G???O??CC??C!6?@A!9?_#195_???_??OOO__??_OO!4?O!6?O#201?G#173?@?A#169???@!7?@!8?i@gCSOOoo_kCk__g???_#170[?_#96O#104_#128@?G???WK?O??S_@G@H@DADAB?@B@@BB?A?GICG@QO?DK?C@?Q?BOR??G!4?@?Cc_?piY?w???G#48!92?A??G@G$#110!104?C#208G???G#150??_#97_!6?G???C#156?__#188O#179CCC#207G#153C#162G#109A??@@#158!5CAAA??@@@?AAAB!4@#229__??O??O!4?G?G?CC???CAAA?AA!4?@@@#200!12?G#190?@?@?@@?@#156!4?G#155!6?C#160A!5?A#228_?o?_O_O_O_?__?_?O?O!4?_G??Gg?OOO!6?__OO!4?oOGGK?GCGG?GG?C#221!9?OO_?GG#26?A#3??A#106A!4?A?C??C!7?@#104@#220?CC??C??C?C#157??@?@@B!4?@!8?A?A?A#179!4?B?A@!5?_!4?_!4?@!4?O#58C#110_#127@#74G!4?_#119?@#127???@?H?C?A??@#149???_#130???_#142_o#49??A#121!13?@#130!10?O?O$#191!106?CG??G?G#110!6?O!8?C#189O#177O#197_?_!7?O__G???O?WWWoWSCWSGKGEMIF@?C?CCECB@__?@???@?@!4?CG??O#206!17?_?C???O!5?G!4?@??@!5?C?D@?C?C?C!4?A?AA???AA???!4@?CCC!8?C!7?A??A#176AA???AA??A?A??BAAA@?B?A!4?@#20@#31@#193ACC??A@A!7?@@#187C#216??OO???O#192A?CA?A#28?@#164?_?A??`!5?O!4?O?A?A___#170?@!6?@#21??@#36??A#183!5?A#142???A?AG?G??O?_#52!52?C$#109!109?O???C???@#171?_???_#182??G#198O!8?A#196A??@#210!5?O!12?C#212??OO!5?G!5?O#231!4?C!6?A!4?@@#158!24?GGG?!4C?C#156!7?CCC?C!5?A?!4AB?B?@AAA??A#50!7?A#156??BEIKJDEB?BA@B@???AA??@B!11@#164!5?A?A#29?C#218!5?C#76@@!4?G!4?C#124C#213@#202@#233!7?C??C!5?!5C?C???CC#153!4?G!6?GGG?O!4?O#16??@?@!9?A@#35???C??O??_#56O#144_$#193!109?_#182??O#245!6?G#194_?_???O!8?C!8?@#161!19?CG#190?@@@?A@!5?_!5?O?O?o?OO??C??C?A#227!23?O#222!17?C#177!30?C?C!5?@?@A#231?O#154?@?@#92@#205_#248___!5?O__G?_O?_#177??@#201!11?o__OO!5?O??G??GG???A?I#163_!6?_!6?_?_O?O_?O#161???__#105!7?G#186_#202O#201_?O#193!18?O#165?A#86_#70_#145O_?O$#192!121?_???O!6?C?C#159OO??O#175O!4?_?_#200!19?G!4?_!6?A??G#176!90?G?OOA?GAC#247G!7?_???O!7?C?KCG#181!17?@HGG??G?C!8?A?A@@@#11???@??@#243?G#192!13?CGG!7?G?OOO#130!25?A#129?C#149A$#82!127?G#193??G#155O???G#201C#195C#105A???@#174!24?C?C#210?`!4?O!5?___?_C!4?CKGAGA?O@WOGKSKSA#235!64?O#15!4?@!6?A?A!7?A#227??C#153!25?A#186?_!8?O#209!9?C??C???E!5?C?CCC??CCC#11!5?C$#191!139?A?@?@#211!25?A@!7?A??_#189!97?C#238??_?_#224!10?CC#138!29?@#207_!6?O???C!6?G?@?@??G???G$#175!173?A_?A?@!7?G#109!140?@#204??A#137@#178_???___O?o_?_???oO??Oo?oO??o_O?O?OA???OOO!8?_!9?G!5?O$#159!175?A#242!154?@#216_#241BB@A#21!10?_#186???G??G$#173!346?O#124!4?@??G!6?A!6?@??@@!7?A???C?C?G-#193i?G@_C`OC_?@OcH?i?I?I@CH??Qd?GA?QH`?Do?@UCQgAPSJ`ciQctJWdYnnMlS_\aXEgDi?TgQC?AOCW?G??C??AOA?G__O??__O?OOH???CC#176o??GW??KAE?A@!5?!5_OOO!6G#178C#224C???CA?A?AAB#230?@#210??O?KCGCK?EEKBIDJCKDNFFJFBEBBA@DBDA@#206AC??@??A!4?@#199@#222@#243!6?_#249?O!4?_#223?@#232GWGW???!4GWO??K!5?___A???_?__!6?OSOS!9?G??`?``@?`@!5?C#180!12?G???O!7?O?O@?OGO?A?CCCAA???@#57A#55_?cGO!4_?C?A??E?_?C!8?C???G#62OGg__O_O?OOO?O__?__??__???OoO?OOooo___#145O!6?@@?G?_w??__#130?O???B_?O_?O???O!5?O#128_A??O?_?`?`_qAAA@GGHdOCcOKGSQDACGO@?G??G#126?O_?_?I?COI?AO??G??G?CACC#143G#115!5?O??CA?H?kP@GYdkG?GgO?_#72!13?@A?@?D?A@!9?@?@MS!4?A?EGP#131G?AQ@s??Cc?O?_$#237TiTiThUHqLYsHQChDydIpm@qlQlOlQlQcQKOiDY_H_DOdI_CGP?HA?_A#137!6?HA???O@_?I?C?qCXaHCpcXAwEGgCHcA@O!5?GW!4?@??BAA?A#104?A#197__?wOG_KG!7?CEABAFB?@?@!5?Go?gO?CCG?CE?A?A#211!4?@@CCACBBA!6?@??@#231!4?_?O??O???_??__goo?OWowoSO?G???OWO?CCAAAI???C??CC!6?A?A???A?C?B!6?C?C??O#235?A??AA?AG???A??A!8?@??@!4?A??A#173??G??G!6?C!4?_!8?C??A#54__!7?O!4?_!8?_?C?CoG??_GG__!4O?O?O#53_#133_#77__#177!4?O#69?__#180?@?@??@@@#179@???AA#55O!4?_#241CC??OO#74EIG?OO??_#52?A#149?C#116!8?!4@ESvnnYSmuEtSDUTUVCh[|wEdeQNqRJrb?@OOOP@!4?G#119!8?O!8?`CaQ?__!4?__cc!5?B#107?_???C???A?C#77A??A?I?H?@?F?iCADK?\A{?E_SgTqdEGFGECYOObtnEb\Op#134_C#93?GSHUHUJPBtJ^^$#196?T?SAOGAHQ?G??AS?@Od?Oa?Ql?GQdOl??QCOACQ_H?DG_J_OAPcXASdYdOOpQa\a\ehUYTtiRlHzcLq?CA_h?WOCGSIcCI?OgM^B?@#22_#7_!5?G??C#105?@#156CO??I??@?@_@?G?O??G??OO?_?_?g?GOoGW#222??_OoOoWGK?XSOOS?WAGO#229??_?!7_oO!6oOwgwWGGS?K?C?C?IAK_CI@MGDMEDA?I?!4ADDD@D!8@???@?@?@@?@@?@#187??OOO!5?G!5?G?KG#220??C#186??_??__?!4_?_?oOooOoOOOo!5O_?O??O??_?@#124??o???O#21_!7?C!4?A?@???@@??@?@!6?@??@!5?@??AAA?@E??!4G?GG!4?OOWOGWWIGIC?KGCCCG#12@#90CCC???O!5?O#14O#116?@!5?@#52!10?A#149???O#52!7?G#125???_?_??@?@??@!6?C?SgcIHJ_gUJONBDj`G[SCCC!6?GG#73?G!4?C#114!10?C@KCsK@?eP?Y?o_O?cO?_!5?G?G??O#53!10?A#59!4?_??_#53!5?G#40?O#100!4?O#98gvd_c??_Og?G_$#192??a?G!7?A#184!20?c???G!4?_?OC??C#105!31?BIPESB@FPa?P?YDN?OP?CB#150MMAA?DB!5?@#216?G!4?@#174?___!4?!4GCGC?C@!5?_O!9?CC#229?@#199QOA?JBJH#224???__!4?O?OO?O#236?_#197!7?CCA???AA??@@@#247!13?_???__o???OO?O?O!6?!4O?SKC??CGC??!4CAEC!4?EEE??F!4?@!4?AA#187?ACE?C?A?A!4?@@@#188!10?O!4?G?O@O???G???G#23_???G??G#63G#155?CAE?AA???AA?AA?A??A!5?@@@B???C?C#164A??CC?C!5?GG?HG#139!4?___???___#168?A?@A#14@#16GG#38O!8?@@DE@GGYKCDBkJsgOohOC??G?G???@?@!6?GG!6?O#127!10?G?C?A?GO@OCA?I@??O#112!7?`?`??@??O?_?_@QC?A#103???A@G?OQ_Gad?RCWaTGgOWSAaBg`GOPGGgOG?g?OG?_OgKWgOG_W!4_???GW#99!6?QH?gAGC?O?C$#246!5?A?c??`?_?_?O??OC?OC!8?H!6?C?QG!7?C??G#104!26?_!5?_#0_!7?_!4?_???C?A?G?@@?@#124??A#194?@@#222_?O#199??C???C??B@@?@???A?AB!4?@#195A#161???C#219_?_?__``!5_o_oo?WoGoW?WGCWKGKKKMIKILA??D!5?A!6?@#228!9?A?A!8?GC#248_?_???_?_?_!6?!5O?OO?GGWGO!5?G???G??G!5?C?CD???AA!4?@@?@A?A#187!10?@#176CAC?E??AA?A!5?@?@#15GC#92!4O?OG?_aC?E!7?GWSOOWSOW?EQYOOCs??_?GG!9?O!10?O???O!5?O#36C#25G#69__#96A???O???O#37_??__#129A??A?A??OG??G?JWmmsh@GO??@?@G?GGG??GG???A?OO#132!9?___CA_Ce?OOCCQBIAOAGC?CG#118?AAUqO__!7?@OPC~zwooAB?MO#102!4?@F@?@DLD`tSsUOo??P_O__!4?oW!5?O?_O#95!21?@_AGA?_$#184!10?C!6?C#192!17?i??`G???A???O?G#208!39?@??@???JE#2???_??O#31_?O#15O!5?CC??C#200!7?K#159A#155O?O???_??__oO??_?W?G#163C#212!25?O#222!18?@@?@#236O???_OOGO??o?_!4?_?OWW[CEKC!6?AEE??CA?ANMMMEG!8?A??@!4?@@@#216_?_?o__O?A@AAIAWO!5W@P@???KCGC?KCKCCC??CEECCACAA?AC??A?@?A!5?@!4?A???@#162?@!7?@??@?@!6?@!7?@@@??!4@???G@@@BECCMCMEE!4C?K#57!4?@#86CG!4?@O?_???_#140!4?C?A@@!4?C!9?A?a!4?_O?`G@O?A???S_?C_A?G_HG_??B#73!5?C?_??_?O?C#101!47?AA?A?G?G?E?fCaDAATaSBi@DIDA@A@F?F@IDM@GAO`C_nGFA$#239!11?ACHOA!6?G!4?A!7?@!12?A#96!41?_?O!8?C?@?@#26_??G!7?A??@#210!7?D??A#162O???O!6?G#228C!6?A???@?@@#227!36?!4_G?O?GO?CC?KACC??A!4?@!4?@@!7?AAA?A!9?GG#228??@!6?@???__?_?O??O!5?_?O#205!7?C???O!9?A!5?O!6?O?@#178!5?A?@?@?@??@?@A??@@#73!4?GGG?O?O#59G#148_!6?_!6?_#69?o?O!5?_#178AC?CACC???G?!4@?@?@!6?A#245!4?A#104@#97@???AK#142AAC@?AAGISCC?WwW??BFNFEc_O!7?CG???AAA#121!29?_?_???_@h`hrjtztMtS?@KD^JXZzV}LYJGj#114!49?O??O$#184!96?C#191@#3!4?_#182??C?A#21?O#18?G#161_!9?C?F?Qg#211A@B#177??_!7?_#223???C#212EA!4?@@?AA#174!38?AAA@?@@#247_#238!16?__!5?O??_??_?_!5?_?__!9?O???A??OGII??G???E!6?@#173!9?O#195?O??C?GC?C?G???GCKAGGAGG??G??GG?L@?ECCE?AA??B???@#176!9?@#39_!4?_???_!4?_?_#163!4?@???@A?A?AAACAAECC@!7?A?A?A#164AAA#109!6?A#183A#35@?G!4?G#128!6?@@$#237!96?_#10!8?O#198G!9?@#190!12?A?@#154???c!5?O?OO#224!51?CC?_??IAAE??AB@@A@B?@@?@?@@?@#235_!8?O!9?W??G??G?G??GG#195!4?_#221???G??GG???CCC?CCC?C??CA???A?A?A?A??A?@@@?@?@?@#223?A#26?G!5?CG?GO?GWG?G#58_#50?__!4?C_GOKO??Cc?C?CO?CAC?C!5?C??C#23!6?C#59???_!5?_#169!12?@!4?@@@#83!6?GG@G??G#136B??C#56!4?O??_?_O$#226!105?G#6O#106G??CC??A??@#160!11?O#92!6?_!5?O#228!55?GC?C?C#234!22?___#221?_!4?__?_#249!5?_??OCAA!5?A!4?A??AA???C#223O??o__?OO??G#207!7?_?_?_??_?_?_?_???_??_?o?o_O???_#28??_?_??OO#156???C!9?@#140!4?G#81?G?G#23?@?@#156@#177A?A!7?BA???C??G#161??!4@??A??AA?A#250!5?_?_#239!11?C!4?W$#214!106?C#173___?o???G#161!23?C#200?A??B@@@?@@!6?G!5?@!7?@#230!27?OOG!5?G!7?G__?C#243!8?G?O!4?CGWG!9?!4_?aG?`!4_?_???O?_!8?G?@!6?@???O@!4?GG???GI?AA!7?G??G??C?CC!4?A!6?@#121!14?_#72!28?_#40???O???_#91!11?G??CGGG??O?O??_#70@Ac?_$#164!112?GO#185!27?@!57?@#216!32?O!6?O#234!6?O??C?C?GC???AC#195!12?_???_#194!12?C!4?A!8?@?@?@?@#164!4?C??A#223!5?@?@#177_??O?G!4?C!6?@?A#39!64?_#152O!4?c??C!7?_$#4!112?C#206__oO?w?CsIQOY@SG?CC!7?AC?G??A__?CcTkWGG?AA#230!79?O??@@?@?B??@??A?@???@?@@???!6@#173?@#176@POO??G!7?!6G#248!21?@#36!8?_#79??O??G#49???_??_?OO??GCOOW?W?oCO_GgG?GgcWG?_GG???G#214!40?A#237A#63_#130@$#97!112?@#222!28?C#201!148?C!5?A??_???___??_?_@`@?@___#51!8?_??oO!4?OG!8?A??C!5?A??A?AA??C?A???C!5?G!8?OO!5?O#244!18?C$#195!112?O#189!177?@#18!42?GG$#202!112?A#164!221?CC?A!9?@???@!6?@@-#193C?A?C???A??Q?C?i?CG@O@G@A?D??H?D@c?AWcOcGcHCXCHc?QIAkta@UlId]dI\A|A|AsIPgASJSdWoJA?CAD?CE?DQ?A#24?_#28_OO#173G??C??A#219??O#197??_?A?@???A@H@C#15!4?C!8?A#197!5?@@#236O?__OG??o?OoOoWOwooOS[?C?C!5?C_??CECC?B@!5?E?AA??AA!4?@@?@#248AA???A#235??_?_!4?G#224C!4?A?A?!4A?A#195?C??C?@?@A?A@A??@#171G#192_#232?A?@?@?@?@@??@!9?@#124??__??QOOg_gS_O?WGgOGG??C??A?D?AE?@??@#92OKKEEAVMEFBCJAE??@@@?@!5?_#73?GGG#59??ooCC??_!6?@G?OOGOHDo@??A??A@GWO??OO?_!8?O!7?A#148@#39A#250?@@#73A!5?A!4?G?C!5?_#130G?@??A?@?A???G!6?@#149??@#125!5?o?gO[AboZO}Gj\DHv`[IIQ_``@A#119?GO???OWO!6?GO!4?@CBHDDSCKCCW?__??!5_#112!4?A#102GO?GKG?@aOe]CGYue|_?EEaap_Yc`pJmu}u^EOkCC#98??abD~J[gEWX{xIh{Y|$#237zItkRkJslTYcJp]@[qB{AiTuGtqkRSlQ_ZcPaHAXAPaOaOaXc@S`A?Cg??O??O?_#137!6?@ACH?O?A?D??@@@?GG?AQ???G#32C#2C#15_??G#206?_OWSKYKMMKFKDEDAQWGAKHHA???C!6?A?AAA@???@@@#231?___#227??__?_?_#235_???_#247?_O?O!6?G!9?!4ACC!5?G??BA@!9?_??A?A???@O#229?A?A?C#171???_?_?_?__#223!4?@#172?_?_?_?_#243@???@@@#205??A?EA?A?@@A???A???A#26!6?_?___???_???_#195_#173!4?OOG{[CC_?C?A?@@#51O?OAGHKG?@#140_O#39ACC@??A!6?_?@!4?pLC!5?A?LF?@@?G#102?CGK!7?_??_???A?_?`__A?a_?OO??GG?G?_@g!6?@??_??O#116A!7?OCCOO?O?okWSgGHHw_AQQUkw[!4g``WpD@[E`AC?C!5?A!5?O#121?DKKWSC`BNU|ne`fd@@fbfbebbbae?C?GGH@AGG!4?C#107!4?G!6?O?WAO???O_O?O#59!7?O_GOCG??O?_O?@??OG??_#100!4?q?o`O!5?O$#196?@?@?P?H??@???@!5?C!4?G?Ac?Q?O?HC@?@A???A?A?AHc@S@I@UhQdY`ItA|A|A|JskRsjcjWfIS@AICGC!8?@#7O#11G#156_??o!5?CA?@@??__?O!6?C?E??@?!5A?@@?@?@#247?O?_#231!15?GG?_?kWKW[K][MaMAEG@@@OOO??OO??ECCBB@@?@?@??@?@???@#232@A?A#195_#249@!6?@@#232?G!5?G??GGG!8?C#221!14?_#172?___#171_O!5?CSOOWKOSSOO#76G!5?G?G?G#164!9?O?_og?S__!4?C#55G!4?O?@WWKHO?WIA???@_?_O#119C#125C?AAS??A?A@??@#119A???A!7?C???@#99??@#103__???_?_?_!8?_!6?C!4?__oooO?H?G#132?@!4?O#136@?@#129A??A@BFDCCQ?@CD_aAF?C!5?CCDCSMAE?A#127_???G?A_A@S??WCGA!4?O??_#118WWo__!5?OS?WWOO?[[SGOxWOQQAQPrR?}XPomCYOOOoaa_?_??__#77!4?@?@?B!5?@@?@??@?BCE!5?_@`PO@d#95!5?C!4?A!5?C$#246?S?QgAoA?I_HsI_SaGsAhS_GTAG@G_??C??GCOc?sGCHCGC??G?GO#239?O!25?_GWOG#64O#246@#104A!6?@#26???G??C@A@?@#161!4?A?@A#174OO!8?C?E#154AA@@?@#230?O!5?_?___?OO!15?G!5?A#232_?_#238??OOOW?OOOG??GW?GGG?GGKCC???EEA?EAC!5?@?@@?@#186_???OOO?O???O?OG!5?CC?CKEC?C?ACAAEBAA?BA@A@?B!8?@@!5?@@???@#138?G#29AO#205?@!4?A#171!9?@#157GOWGGOsII??@@@#56?_!7?__#54??@?A!5?A?A???@?OGC?QP?C\?GU?UGO_o_#77?O!4?_?A!8?QO!6?OO?G?G_OW?KCO!7?G??C#59?O#149@!9?A?A???G#165!8?C!4?@???AA#132!12?OO!5?O__o?KADDG?OAA`?C#143!5?A#114??GG!7?GO??__?_!4?_B?AI?OGCJCA?[?QKBCA?A?CaGC!6?@??S_GOCGOcO?G??H?H??CAA#72GOiTOG#99??A@Wc???cO@_$#192?_!4?C?O#239_!6?@#192!7?_??O???_G?Q???G?@?O_?@??Q?_???G#105!26?C??OA???@?@#10c?O?A?@?A#79??@#212_?O??O!8?C?OCQ#229_?__?o_o?_o_?O_W_!5?CQCKGOW{K[KKKMCM!4EJABBB@B!5@?@?@#234GGG?GG??G#221???G!5?C#249CC??CC?C#173O#189_?_?O?G#234!4?@?@@#231H??@#194!9?_??!6_?_?o?oO_o_oWowowwWoGWWGCGG#76OOg#1O#106?GG?O#11!6?G#180!8?__?OO_oogi_?A?AA@#25O??o#15?CA#58C_?_#155?@#38_o!7?C#49CCO???A?@hgK??_C??B@#115??_#118!6?_#250???A!7?CKKCWO??@@HDECHGCG#101??A!4?C?C??G!8?cOA?c#142??@!4?@?@@!7?@@@AAACC?G?HHGPBB?@AAA#126!22?@???BA???E??@!5?Aa#73a#69!12?A#103_??_!5?CC@?@??@CB?CGOCHCD?RHS@IH?GS`HWA]aGPCHAE@GG?S@!5?A?`AA#93!7?C?BC@E@EA?A$#184??G!7?C!6?@!4?A!9?A??_?A???A???_O#96!34?_C???a?`#82O???G?G#29??C#164O#176OGWkCGA?@@??GO??_g!5?A?@@???C!8?@#249!28?___?_?__??G?O!6?O#228!6?O!4?G!4?_!4?@?@#15O#156!7?CC#201_?_?_?_o__?_?o??OOWOWOOOWOOGWGGWKWC?K?KCCCGSCCEAEC!4?ABB`AeAaB?BA@!5?B@A@?@@@B@D!4?@!4?@#169@#23C?o??A#91_?O_#128??_!6?_OoGOOO???O#250!8?G?G#92!12?@#62@_@!9?KK#121CCC#69C???C?G#53C#251??@@@!6?@#119?C???C!5?CARIGCWGCC!4?__#127!14?O#52!6?_#112!33?C!5?GAOHC???C?C?C@???C?A?C???G#101!31?B?C???@!9?A!7?_??GOGTGK#131!4?A@??A!4?@$#239!29?A?G#183!49?O#17_??_!6?G#5_?O??A??@#216??A??@!4?O#155_O#222?ADH?A#227??O?O!9?C???G!4W!28?A?A???__!4?c?cCd`@ROp@@O#243?G?G?gg?_o_?CC!6?CG!6?G!4?!4G??G#247@?@#207!8?G?C??C???C?C#220!8?O#29_???G#188E??C?C??G?C?C_?C?@SO?K??CCC?C???@#26!5?A#21?GG?sI_A??@#50!6?_O!8?A?@O!4?OC???@#114?C?A?O!4?O???E!4?AAA?A???AAOGO!6?OOAOGGG?OO??_OQQgOC]GGKK?eGO?c??c!5?_#38A@HKK?IAA!9?D???A??!4O??@?A#115!25?G!9?GG?O??G?G???@G!7?_??c@??I?Q@CAHK@XD`?a`O@cqGC??___!5?G!16?G#134!13?_?_$#14!83?__?O??G!7?A?@#188CAA#224??!5_oO???G???DC_??OGOXGWGG?CC?KG?CCE?EIACIBEACA?!4A?A#243!12?O??O??C?A#224?_!7?__@#176???___??O!5?!4GOGKWC???OAACC#228?ECMAKECAC?DCECA!4BAA@A@B@?@?@#192!14?G#181OO?C?Gg?_??G_GGKOCKAKCAE?A?C#57!14?_#177!6?G#152_#63?OO#52!7?_?O_O_?___?_#62A!4?@@!5?G?GK#103!10?G#101C!7?`!4?_#122_#72!5?A?A@?DFCEEHAAEBA?@AA!8?O#128!5?A?AA??OG?O???_???_?OOO?@?o___?C!9?wK@PM``KHCl?bC?AA?O__o_#102!32?_!9?@$#192!87?_?C??A#177!6?_#155_#243!4?@#154!6?_#223?G?G?_??O??A?G!4?CC!9?C#228!34?@?@#223__?_?_?_!7?_??O_O??O?GG!7?C?G#205!4?_?o???O??OO?O??O!4?G?GG??G???C#26!18?_?A#207_O_?_C?`!4?B?O?@@A@??ODY@AAM?EADAB??@??@#148!19?H?@!7?@???A_oAA#40!20?__o_KWQOWC??QA?AGHGAC??G!4?__?_#69?__??C???DAA#107??_#145!5?@@#152@#140?A???G???O?oG?Cg?_!6?C!8?GOcG??A$#35!87?O#0O__C@PA?@@#181?C#228!19?__?_?_??_???_O?O__O_O_?_?CGG#230!35?AAB??@?CA!10?G!5?O#221??AAA??@#227!5?G!8?@???@#231???@#5!32?_#195@@#127!62?G#132GCG??GG!4?G#115!24?G#72?W#100!4?@#111@@???_#120!5?@?@#111??_#122?_#99C#139@@@?@#121???@??@A#100?_#125!9?A?OWGCCO???_!9?O$#202!87?@#1G!7?G#162!31?@#155?A???@@#177@#216!48?C!6?_?_O?O?O__O?WO??_O_KC__oSWUmWOIA#207?_?_!9?O#11!34?G#180A@#121!64?A?C???A!7?O!4?B??OO@??D!6?C#107!9?@#115!10?_#108!5?A#98C#115!8?G!5?O???G?cW?c!5?_$#33!90?G??C_#219!36?O!4G?CC???A!6?@DB@B!11@?@#234!38?A#177!4?O#230!15?G?@@?@D@C?@??C#124!32?C#81!66?CKG?CG!7?A!8?A#119!32?O#118!15?O!7?@@???_??_?__$#6!91?G??C!5?@#54!31?@#227!77?@#138!61?_#140!68?AO???OOC#125!61?@#121!14?OG_!6?_$#3!91?_???A?C?A#69!242?C?C??@!4?__??__Og?__gkGqeP?ABA@C?A#81!51?C#127OG$#106!92?O#52!336?A-#237~Tj{Je\iSNsnYntZexQntYfxVkWbC|B~?TgBk@QDiDYDITIC_?C?ACA???C@A@#241@!7?_?C??GG??CAA#173O#176O?O?WGGCE!4?@A?C#230???G???G!8?_?@?Oc@@o?H@d?GoOOxdgH_AECA?@?APbaCC!6?A_!5?O[GIGAK?G?AI?@AK?C!6?A?@#220??_!5?O#171O#195?@#181??O#201?W??_a_ORDU^EbBRo@xghwogOO_WGwoOWCG?O_??OO?G??KCK?CCEGC?E??DC#195c??G!9?GO??C?O!4?@C@??GG??EW_CghgpSxq@C#21_?B#58@w?G!4?WOG#132?A_oOS_wECA?O@S@GO!4?C#50??G#39E??AC#54?O#115?_???G?G??C??GKY?S!8?@@?O?g?L@A@_`aHG?AwgcOiG?AO??WcCE@@?A!8?@!4?_c?g#125B@EC@?GGOS@CK?OOO?`?oOAaA`i@PP_GX_`oOR_AC???@!5?@??AC??o!4?@#119?_?@@?_G???_OWG?cKKGgkKCECM[Wo_Ooo!4?E??@@#102!5?__``aajk}Z]^^NNNLFDFFFn~FCAbE#98O???@?@???@A?C@IAD$#192?g??C??C??A?d?A?O?@O?@O?G!4?A??O_?G@!8?G?_!4?CgOGOCG_G?O!4?C#90o?O#226?OOO??G!6?@#227_??O?_??GC?CSOoW?w_C?CCKEEE?G!4@SBAGaCGg?_G??G?_??C?KKGG?IyWGIW@?G@WHGGG?GG??CCA!5?B@B@@!7?B@C#173?O#194?__?__?O_o?o_?_???_o_wwGGGggwH_XW[gLeEDEDNVNLNFFEFFEBFKKLJKEDE!5BABAB?ABB@@BAB@#173EM??!4CG??CE?C?ALCAE?AE!4?B@?A???AEC@?@???AQ#25@O#23A?@#56_GGOW@??SC??A???@#125AoO?O?Go!7?CUGUUK#114!4?Wg?O_OogGQC!4?W`cG??AA?@O?@_S??AA!4?@?EHCEQXC?tXCa?_?WhX?E@?A#122??C???C#114???A???G#128??A?@???R??C?A???A@?A@AOP`OPO__?P!4?@?@#143?O???G??C_??_#112?@!4?A??CG_?@_G_@!4?S?CA!8?_G#103!12?O@?_???ICPgS@QAOTSB#77??_???OO?WgOgg???B??X??O_O?_$#184?A?@!6?G???G!6?C?A!8?D?@!6?g?O!9?ACACG?C#240?_#150?@!5?@@?a@#14C???A??@#26??G??C#181A#224_OoGOWOO!4?QAB??AA!5?C_cCS?CGAKICE_E?G???CCG???O!6?O???G?G!6?C?C?A??A#235??_??_?_??GO???G??g?G??G!9?G!7?C??@#207S?C#187??_???_!9?__#186??_#248??_???o?Ooo__O#232_?_o_??_??_G_?O_?O!5?__??_#31ACA?A@#36@#57??@#180!7?C???B??@AG?AAA?A?gG?O#51_G?E?O@G@#140A??@#49@A?_#118G#121G!5?CCAAAMAAAcyo_`?__@@WG???@@AA#125B@#103??AG?Oc??O!6?O??O???C!9?AH?@?I@?C_@??c?O?GgE@CDE@DCF`??IOaCWO#127???@???A!6?G!5?_?_???A?A??P__P?@_?OC!5?@?@BBAA#118??@@???CC??CCC?C?Kcwo_@G_p_ZQOeC@@@pPpbFNHLHJhvaf_MCGQ@o?CEG?KGG#72!7?__??_#103?O?OO??G??O#100?@!4?@ABN^Y??@$#246??SA_XaOJo@O?O?cHAk?I_GC_QdGo?{?IGAs?yCw?O_go__O!4?@?@d?A_OoO_???C?A!7?@@#11_!4?G??C#230_#22?@#229??__?_!9?C!7?_G?O???dO?_@O?G?_ODi??Q@_!9?_?O#238???AA!4?@`!4?_??OO?O???O#188_???O!5?_???O???O!7?YUUOGGA!6?C#248???_#171C?CA#220??A!9?@!5?@A?C@#172@#171??CCC???C#220@?@@#248?C?E#243G?_??OOo??_OO_???_OwGo_G?W_GWGW@CEG@GED_!4?A#164???o@A#63G_BG@#52??__?__?O?@#81G?C!4?C!4?@??_!4?A?`@?OIAECD@?A???AA#102?oqaA@BIBC[??`eIggINIE@#119_GCA@A?uoo!4?_O#118!10?E!5?@!6?!4@A?c?wW!4?_#140?@A?@?@?@#73!5?G_?G!8?A?A#141!4?A#112O#116!4?@#73!8?_O!8?A#143!7?C#115?_??@??AO@?_??a??_?Oa??S?G?W?@q?o@Ia@?K?CC!4?C!14?oG#118G#72???m?D?C?G???GtIyCtgZ$#193!4?O??@_!8?C!8?ASH!4?A??O?gAO?CA@?@A[kWgwOgOa_@?DEEEB@@BC?C`???A#166OSOGG?CCCAA@#206!4?C???AGGG@c???A?@@@?@H@#176C#228!10?@???D@?CAA??C!4?G!7?@??@?@#206CC#176C?C?A#229?@???CA@!6?@A#205_!8?c??_GKCC?C#173GG!9?@#172!18?A???A#235!7?O#192?A?A?A?A@!5?@#207?G#235!5?O#216!4?Og??GWGOG?GwO_GG?O?GCGEK?ACAC?OCK@?GO?OC?G?CO#57@#207K#13_#18C#37O?_#55CEeACC@DA#142?C?@B@@?@@#119AA!5?SOCG@!8?c`W?CCC???C?@#77?@?@!6?q{WW?AEC#69?_OG?C_CQO!4?o#102@CA@C?AXK~^BBA_oOGC!4?AA??IA?CSW#132@@B?C??COS?k?GO_QIg_O?O!5?C?KIICAAGOG?gI??c!4?G??S?C?C?WG??`?@?AA!4?AA#103!9?@?@?Q?A#107!16?O?GC?_!9?O#119!17?oO$#196!25?@!8?C?AC@?DA@?CASG???E!4?G@OI?GGWC#97_!4?GO??G!8?@#189?G??C?A??@#236_!9?W!7?aA?QG_a_???O??!4OC??H!4?@@@bc@?`_???_oO_o?OO?O???@?@@D@@??C!7?A?A#26__???O???O!7?CG??GGCD#205?EEU@VB?A!7?W?OO!5?O_O?GG`Go!5?GGgOgW??OG?W?S???gCO?A#176O!8?C#28A??C!4?A#186!8?G_?_O#223_#212_#178??O?OK?CHE#124??K#177?C#91C?O@#50?CA?AA#116???I!7?@#140_?__!8?G#59!10?OwgO_?OogHCO_?_?GrbL?C@_?O_??@A!9?C!6?A_#101!10?oG?___gWwGc?s?G#121@?AOC_wo_g?c?g?gOcCCKkKK?CCC?GC?CCI!4C?M?CX??hS_c?g?gOGo??AbNKYYyuXXw]o^OPENZIFBC]?__!6?G#101!26?@!4?_?_?O__O_?g!6?@?_mPnYmy[so_ctIoCpGQc$#239!28?A???_?O!12?@BBB@?@??@?A!4?_??OG??A?@#237A?@#182?_!8?@#18!5?A?@#155@#231_?_!4?O_wG!7?QGAIGG?@O!5?AAa!5?AAA???@??CD?CCQAa??o__x???@_OC?A?CC??C??C#201_#194_#223@??@??!4@!6?@@#172?_??_?___#243!34?_#187??_#186!7?O??W_oO_w?oWg?OgG??__#124@!8?@#228?_?_??Oo_Oo_o_oO_O_O?O!5?_#38!9?OA_O@?_!5?C#127?_#73?CWWKGGGHOC@`@`B?M!4?@?O??!4A!5?@#107???C??C#40!5?@#101??C!4?@#121?oOoWWKKK#72!22?o_?GO#77?_?O?{?g#119??A?C#116???AA@@?A@AA@??A@AA@A@@?O??_#114!53?@?Q?A!7?E?ECAGTG?pICcICPGOBQ?O?G??@?@!5?A?A???O???cK$#242!49?O_O#105!5?O!7?AA#245O#137@#252A#35??G??C?A??@#223__?_?O?_SGG?C?CG?E?cHDC@?@??GGGC!6?O!4?A?E!9?OOO?OO?O?A???G??!4C!4?AAC?A#228!7?A?A?@A!6?!5A@A?@!5?@#209!44?@#26!24?G?@?EAABA?@?G?@?E???!4@?@A@A!7?@@#128!20?C?__P?C?QA__?_@_#49?C?_!6?O?OGG#118!9?@#101!7?@#72!12?C#118!8?@_??O?@#107!21?@A?A?@#108?AO#112!11?G#126OC!4?o???_???O?K?GGC!9?IC?C?_hJUjUYuQ[?kPNwyCC?p?`!6?A???@#102!13?OO$#96!64?_!4?c?A?_@???C#167O!8?@#156!4?AAA?@@#174@#197!4?A!5?@#234O?O#243!17?A@#247!6?__??c!7?@!4?@???OGW#248?_??_#224!12?@@#216_C??S!7?@!4?B@!6?A??@#181!58?@#180?D#11?@@?@@#5?@@#227O#157?A??A#144!39?G?G?G#69!10?A!4?G?WO?@@!4?__@?`!4?CLC?C#99!53?WWO#100GO#73!16?G#49A#129!8?@#69!71?G$#183!64?OG???G#64???C#2_#82__!8?C#228_!5?O??G!4?A#219!4?@??A#235?_#216!31?O#249?C??C!7?AA!6?GG!5?O#247!10?A!5?C#232?C??EBA??A#188!73?A#230??O???O!9?_#145!38?O?G#115!17?K$#153!64?GC#83__?O?G?G??E??A??@#234!14?_#243?A#232!6?o?_o?_#243!45?A?A??_O?G!4?G_G_GGOO?[_[OOS?G_GW@A?O?AA@ACABD?@A@?@#189!66?G?C#223??_$#244!65?O??G??C??A#214O??G?CCAAA@#249!21?o#238O?O?O#232!44?@???o!4?_O_?_?OOSc?CK#189??_#187?G#248G!5?CC!4?C#231!79?_#79A!7?@$#208!66?G#104!11?@#1@#216_??_O?G#221!74?@#180!23?O!5?O!5?G???C?G?DA$#30!79?_#207O#29GG!4?A?A@@@#186!98?G!4?G?C$#235!81?O#201!112?GG#221O?O$#192!195?_-#237~Dq}hUKrC~iTnqlyKzlUxNuj\alYftYmOLQKQ`oAS_sI?Q`???C?A?ED?a@_#226OOO?GG???@#243OOG?GEA?AC!6?A#212!4?GG#223???GCGGW!6?C!5?A??AAA#189O?_!4?_?_#243???CGA?K@IGO?K?GIGELWI??EG[CGA??CC?G?DC!4?C!5?GG???G#235O#172!8?@!5?@!7?@#188_!8?_!7?_???_!5?_!6?_??_!8?OO#26O!4?_?__!7?_?_???OGO?OOO?OOO?OOO!9?OO!6?O#25O#7_#34_#20_OOG???__#55@!9?_#132@#130??G#125?@!4?@??BAA??CG?SSC_?oO_#115@?A?ICCGAABA?@?@?@oYwASAGCGCGCaAP!7?@D?CC_??CB@@@?O?O!8?OO?GGgCcQDC?ALOAA#112@!4?G#125?AAAEDD?KAALGASP[OVB?`Dc?oG_?O?O?_o??oG__goOOCcCC??OgC#73??@#112??OC_?O?gOO!4?O#132?@#73?@#107!13?O#103GI_POPQ_AXPKhLO??@AG?A?C#100!11?_??O??_$#246?OK@AGrCX?T?OHACR?AgA_GOATQ_?Gd@jqdplIFLHB@PF?IAKC!7?@#214G??_?O?CKMEE#82CA@#247OOO!4?C??CC#223P#243!12?_???O!5?A???C!4?G??C#15?_#249???C#231CA!4?A??@??A!4?A??@?B!4@!4?@#232@J@JA@??@?@#173GG#180?C?_#247_#221@!5?@#187!12?OC?C???C?E?CA???BA@?@IAB?@B@BBPO??@@@#186!6?@_?O??G?A?GG??@??C@A?@!4?@#228A@DA@E@BB@?@@?@?@!5?@A?A?@B@?@?@!6?A#28_?_#21??C#36O#15EA#58@??_PO?O!4?g#116C??AEQ@#129!4?GC#55??O#49?@??CA?G?G?GAO#118??C#114??@@@?AB@@??@@!6?@@?B??AA@??KGKSLpRPOPWqxrHLphGwOsg@CGG#107!6?ooCIyaC#114QOG`I?LOAGOG#119?CC#73A??G!6?A??G!5?A???_!7?O#141C#143??A?C!7?@#118!18?@@?@@??p?FAaayy_LTT}{WYW]WHple_`H!4CHC#101!4?_?Sc[O?s_XoIkOmS_[hShkIID?I\?nOnPeJuJ?VgVitIt$#192?a??S???a??a??O??C??C?@?_??DOA?OC?GA???O??AC?@!4?A#83_??OOGGCC?AAA?@#188?OO?G?CCA??@#180@#236_G?SGG??AEBA!8?@??CSOO??GG!5?D!6?AAA?AAGABFACC!8?@@???A#228??C#180G!7?C#248A?@!4?@??@?B???C??___???_?o_o_?OG!5?GG??G!4?CY?GKIMWS[[]!5[IGX^YMC\]NlW[}?EIFFF@?@C!7?CC?AA!4?O??O#188??OW?G?OG??W??G#25_#15_!9?__O?o#20_#63_#51_#163@#178ACO@CA#9???O#63_??A#52C??GA?C???GGCOO_cCAA?CG???GC?G???O#121AAA!4?A?KI[K[O___cW?OWIMIoAA!9?B#77!7?C!4A!7?o!4?__??_?_@?@!8?@#121!9?@?WW{[TcGPGp?o_qoo_?_`G?A?G?SOQQHE@EIICHE?K_D?CD??HGGOPaRSHCBpMon}lzY}m}UMMKCGXHH?@?AAA?A?CC#102!9?___?Oo__`OOKHBAD@HK#59A#103!13?@#95O#99_#53??C!7?_??@?C$#193?G???@?G!7?@!9?G#239??G#193!8?CG?_??__g??AB@A@A@?_?_?@?__#171_!8?A#186C#230G??G???A??G??@!6?_???_!4?GGG??A??@D??@!7?C?@??@G?@?@NAM@?@??C?@B!5?C?@@#238A#195!7?A#171?_!4?_#187??C@!6?O#232!16?O_!5?G?O?C!4?O#221?@???A?A#205???ca?_?a__?QbA?UoCG??_??A@CA?A???@??@@!4?O??OO#124??O#79_#180G??O!8?GO??G?GG??C???KK?O???O@#19!4?GG#56__?KBAGC_C_?Oo?C??G_oo??__!6?_#81?@!7?E?G!8?OGCo?_?o?I#102!4?@??@@!7?A??G!7?A?A?@??G?IAFBNT[C}_IE@C?@@C#126!15?a_PO_OG_?O???OO??_`?g?G??G?AOEG@@BC@ABAACB!4ABPG?OkA_?WC`MO?A!9?G#107!6?C#77!20?_!7?__W_GS?PcJdAC?GC???O@@!7?LOmHC@CI??_??C$#239??@??_#184!5?G?C??_?O@?O?C!13?O??A!6?@#244o!6?_??A#137?_#14???@#106OO#205__O_#235GOG!7?CG#224__?oOOWW__GWWC???A??G#249?`b@_#247?!4G??K??C??C??M??CCC!5?O?O@CAA???C!6?GEA@FCE#207!6?G???O!29?@#186__O??O??_!4?_#232!13?C!4?A!4?@??@??G?A@?@EBDADF@A?@??A@@??G?@G#195!4?C#31_?_#13?__?_#232CBC@CC??A#173OOO!5?O??O!5?_?AB#13?@#91CC#38C??G@???_?C??o_G??GCGYQAO_cswOOOo?__#69???!5@BCA??COG!4?KAS@C?OH_E[GWuwSySyPP_@???_!4?C?_O?C?CA#118A???O!9?__??O?g?KOxoc_dLs}bb@@#132AA`G`?WIG?G???XGA?h?cUIi@LC@W@_cg_GG_K?aOWCKC?ABiH?hER_IO??@??C#114?@??@!4?C??C?Q_g!8?OAOHECOGHI?AHCCOC??A!4?A$#239!39?_!6?C!4?K?C_AE??B#209!4?O#201__#182?G?A#138?A?@#231?oOoG!5?CCC??@!8B?_?_bbA?QO?O#235?OOwWoCO?_COSG_???G?!4_O???__k_I!7?G!7?G!5?D!5?O#243!31?!5_!8?_?___?__#173!19?O??O??OOoO_!8?_??_?!4_??_#76??O#28_?_??_?_#124O#207G#21_#23_?_?__?_#195AA@?DE???CGEEA?@@#51???_#74OO@!7?K#125@#141?A#142GG?GQO??__O!5?__??_#119@?@?@???KA!4?A?G?C??K?C_??@kCC?_?c??_?_@?_!6?___??G!8?A#101???C?_@?@?@!6?@#127!18?CCC?A?D?C?A@C???C?O!4?_?_?_?O!7?OG???__#119!21?_?A@O??O!6?@@e`b_deC!4?A#107!11?@#72???_!5?OPjPbXbUjEOCOID@aXOa??OoGOtgUGPIpI$#196!41?S??G?O???G?C???@#241OOOGGKKEAA@@#181G?C???@#228GKC?`b?@@_?__?_O?Oc?ow?O??G#238???O_@o_o#221_#205_#228C#26_?o?_OO??_!5?_!8?O#232A!4?C#194!8?__?_!11?__??OGKU?@@AQE?A?@BJ@JBFA@A?!4AEB?C@AA@?@B?@?@A???@#26!22?__#189O??O???_#194??_!7?O?O#189_!4?_#227!4?C#186!5?CG?KAGAGKK?MCC@!7?KG#23_!5?G??CA@#144HGA?O?_??OO_#73???@#116!13?C!8?_#112!10?_?O!9?C#54!5?_#59@??@!4?CAgqM_?@K!5?AGQ??g?S?H#111!9?G??C#128!28?@@D?E??C#116!16?O??O?G#73???O??C#115!22?@?Q__?C??G??G??@??@A?GA?POCAA?HC?AI!4A!4?A$#202!41?G#240G?O??_???OGG#150G?O#232!12?_?__#249___?_?O?O#232!19?_!7?@@@#224???A??@??@?@#205!12?___!4?__!7?O!5?OO?W?OO??AAUA!4?O?gSSCHG_GWOC!5?___G??_??WGOW?O?O?wsoO#176!29?O??O!4?!4G??GG#29_#223C?CA?@???A@!7?@???A@??A#177?_?_??_!9?__#157??_??_OGG#24??A#37?O_CCcGWW#132!21?@?C!6?GA???O__O!6?_#103!27?CK?C?A???C?A?C??S?__OIAy?]C@I@@Sa?AR?_AAHOA_#112!19?_#116?A!5?@#128!12?O??O!8?_#69!21?_#103?_??C??C?O?_#98!30?_!9?A!4?AOc_Is?A$#153!45?C#105?C#242@??@?@#150!16?@@#109?@#216??CA?A#229A?_O!5?C??SC!7?S??C!9?@#216???!5GgOOOW!7O_???CGO@O!5?CC?A???G!6?CCAA#26??G??G#220!30?@#192@#238???G!7?C!9?CA??C?G??O?C#243!8?G!6?C!5?C!4?KCCAIC??M?GOAIA?G@A?A?@C?@B@D??A?C?C#124GG!6?O#164GGA?C@#142!4?A#128!4?@??@A?DB@?C?@???@@@\?@A?C!5?O??_?_?_#59!5?@@?A#102?@#40!27?G???G#121??O#112!77?@?@?@#135??@$#137!47?O#217?OO#96?O!8?@@@#207!12?@#173??@#238O#227G@AQAHHG_CC?_?C??SEDJB??CCGCCEEA?A??@?AAA??@@G@@_?GG@G???C??@!9?A#235!59?C???_!5?_??_?_!4?o!8?@!7?G!4?O!4?O!4?G??G?O#205!13?G#235C#216!12?C???A?AA???G??CC#140!12?ABAA!8?A@DC??MAIA?G?GGW?O__?O$#204!47?G#183?_#64_??O#188!64?_#206@#176@?@!4?_#188!9?O!6?O?O?O?O???O?OOG!4?G?GOw{!5?_!5?H#187!65?CCC__!6?_!6?O#249G#230?C??C!4?A#28!20?O#164O#207GG!6?O#212??@#145!14?O#49?@??B#73!19?@@EACCGA?KW???O?__!4?O??_???o$#208!49?G#16??_#97_?G?C?GEC!4?@#234!51?C#173!23?O#186?C??W???O?O!6?O#216!86?G!8?GW??KGC??A!7?CC?@CCCEC?@#188!12?G#201G#223A!4?@?@#54!47?@?@$#201!145?!9_??_?!4_o__o!4?DErgRAHQaaOC@UdfMwC]C[wKU\fx|GSPCAA?DGCJ_???C???@!8?@!4?O?@???_?GG@#171!4?_#207_!5?_#201?A??A??O#195A#21!34?_O$#195!145?O#238!102?A#195??G#220!4?_???O#247?G!6?G?G!7?A?A#176!17?A?@@?A?@@G??G$#181!258?_#221O?O#13!37?_$#171!259?_-#237lRKalQLAlQH`Q@e?n?cXONG`JcNGMTJm@?HADIDN@AE@b_@???IGK?@#198KC?A@@@#243O??GO?GKCA??@G#212???G#156G#176C#235O?G??G!6?A#187O#248!7?_?S[QA?B@#181!4_C!5?_c_?Ag!4?G!5?O!5?O!4?OOO?O#191???_???O!8?_?O_?_???_?_?_?_?_?_O#31A#172??GG??GC??CKA?CKCCE?CACAC?A?A??A??@?@??@#138CK#11CG#4G!4?!5_!7?_#24??O???_#55C???CCK#15?@@??@#21@#74!9?G?G#56??K!5?G?G?G!4?C??C!8?_??@??hG!6?_?@@BB??@AA@BCA?AFD@C?E#140?@??QZC_#49O_@__?_#143G#118?O?_!4?_??C_OE!8?@#72_#102G#115!5?@?C??@!5?C??G?GAGc_?OGoOA@_O_?@?AC?H??G!4?G?GA#126??K?E?@CoH`Aq?Sp?oC?C?CC??C#140!4?@?@??O_CP?`_KCG#73?A#121??G?@?E?O?HgIdJPvW^lz[jXRzXY}Ueu}SKG??OO@!5?O#107??G#102O?_?cCkidcS?B?CAc!6?AA#98?_?OAESDO@KACG#100!6?@$#246QkR\AlQ\AlQIdQHvON@cboVY?XOQpiOOENEKI#252O??GC?A?@!7?C#171O?GGC#205K??A???D#229O!7?C???O@A??A?B?A#236??C?CCA?EC#235!6?___G??A??@#218G#193G#166C#82CCG#106G!8?_#194?__aEEAABB@B?_!7?C?!4@?_!9?@???@???@H?G?!8G?C??C?CCCGEEI?CC???G?A?CI??GDADBBD???AA@A?B!6@?@#157A?A#23GGGEG?C?CAC??C!9?_??A?G??X?P@P?@@`@?_!9?_???_?A#55?OOooq`aoqKAO?_??@_#74!5?O@??A!4?Aa_CCMKGG!6?@?_#52A?A#116?CG#73???OOO???_??DDBD?A@#59?O!5?___oo_KEO[qtmc!7?R_G??_A???O???_!5?O#112@?CA#121O_!6?B!8?KNBNHJcGHo?!4@E@C?C?C!7?C#129!8?@#127!5?O!4?OACa??C_#73!4?O?_!5?A#118?CCC!6?@AQS[|d_yuRZPp@OEAGC???OO#101?G?gSGXgHYULY[o@G\SBmLlHgGH_@gP_JOGPaSiTiTiPkA$#240??_#202?O???O#252?COGC?G?OI?C??C#204_!9?__#242O#96_#241O?_?_oOYWWCM?A#194_!6?AA#106?@@#249OO#223?_?O!9?@C???C#238?_?c??gG?gg?OGW_KcCjBA?@#188GKC@???O!4?_??ACG?GN?O???WOO??GGOKG??G?GIG??KC?AMEGCCIIBH?CGINIG!6?A!4?C!4?@?C???AA??@!7?@#192???G???G??G?OG?a?A?_?OA_#105OO#0O?_#9O?OO!9?A_#76@#31??@#63GG??O?O?_!4?_?CCC!5?A???O?@??_!4?_!4?OOa!4?E!7?@?A@A??C!6?O?@?Aa_c!4?G???SOO_g_Oo_#91?_#128@@@?QTMBE?C#119?BO??G!4?O?A@GE??HPEHDIFA?@!7?@O?OA???O??C??CogCG#103?EL?BB??O!5?K?O_GM#77_#73!6?O???_??_OA!6?G#112?C#128???A?A_@GPAHAWCoWGoCI?K?CYBa_MP@#126!4?A?@???D`GsI?c_?C?Sa??_??_O#115@?@??B?A?C?G?CGIC`?AAW@WB???A@#53!5?@#72@??_Goo_g?O_?o??_GOPIECeEeCa?GCG?kAp$#218!6?_!7?O#192??_O?G!4?A?C??C@G??@?@#196I?A@#166??G#14C#203__#202_O#153_#183@#105O#207_!4?G!4?A#227?_??__?O??OA?QP???GG?C???@@@!7?A#249!6?@#205G__?_#29KL?C@RO?_CO???C???G#221?A!8?A?@#124?G#243G#106O?_??_??OO???O?_?o?cCOQ!6?O!8?O!6?GG???G???G!4?G?G?G!4?G?C?C??C?!6CK?G#207?G#79C?G#21C??G#18G??A??SAP!7?P#50CEAA?AA#56???GKC#13@#18G??`!8?_#91!4?G?C?C#20???@!4?B?A#92@@?A?A!4?C?G#148_#144C!4?G!5?@!6?A?@??A?ACG??G#55!4?AO___#132???G?HU?_!4?I?_#54G!5?_??CH?AD?@??@!5?O??O#77GG!6?@@!6?A@_#107??GLG???@?I@#101O#81!15?O#132o_SI@CEQO?}A?o@pH?_G?C??C??A?AA!11?O???k_HGCPWLhcQSA?CGA?A!4?G#119?CD@@H???___??B?@!5?a!5?G#77!5?G?GS_PO?gQd?@?@?@S@A!6?_?_PoHpGXHSaPaTAPK$#244!7?_??_#193C?G!5?A!4?S??@!6?OO_C??C?@#2???A#150@???CA??@#137@@#247?_#232___?A?ADEBB@#234_!7?o__Oo_O?OW??QW??G_?_??OG???D#187SC_#26GA??@___!4?POOOQOO??OOO#192__?_??_?_??_#172!6?!4_?o#192O#105_??_?_?___O!5?_o_?oOoO_?_OO??!4O!8?_??_!4?OO#193??_?o?o?_?OGO?OO?_#181!5?A!9?@@#188@#37S?CGGGCG??WO??_??_!6?_W_O?O_?__?_O?go!6?_?___#25@?@#86?A#155@??@#91GGGD#50A!5?G#70A?ACACD@KCG?OW?WGOO?O#20??_#58???OOO#129!5?G#149_#125??@I`[_FA_!7?K?A#114GG!11?GOAOEBLIPQm}igCs~c^fyjYcbJ??O?[G??C_o!5?ADOggOe`O_??O?_#125!6?O??oA?KkC?_GIIAqHB@IQ?IOA_cYCc_EICI?KGCO@Bpc}BTqSxgaAUQ#112!6?@?O?@!4?A??G?G?g#114@A?AGC?GccAE?@Gt?gAOA?A@???@#100!10?G???G!4?B#99QEEAC$#240!13?_#202!8?_#239???__#240??_#105?_#198O#0!4?_#83_O?GGC??A@@#246O#191_#218@#172O???C???A#228?G_!5?_?CAC?K!4?@BB?B?@#248???O#194!18?O#220?OO#172OO!9?__!4?_#248@#207?G??GGGO?C???A?I@!7?C??CAI?@!7?@A??G#173CC?!4CAA???A???AAB?@?@#26???@?@#180@#171AA??C???CAA!6?@!6?C??AA!8?@#51C!8?A?EA?A??C@??AAAC??AO!6?_???A?QQ@AD`GDZFLUIEKCWs`??A??@?G?OA??C?G#20AC??@??A#152???_#142!4?@?@???@?GH?ACBAO#121!11?G?HGF^Fb?O?GDC???GH@EI?E#40!4?_G__???G#121!4?_!6?O??OOA#73C#101?A@??A#118???EMNJKK?_BBEP?CFNBBR@@OO#127!11?G!5?G?oWoOGq__oO#143!39?_??_??_#103!7?@???G!4?g?cGO?dPDe@g@SQPAa_EAc??_?BEEC?A#53???O??_#48?O$#153!32?O#202_#214!5?O???C??C#240?O#217_#192?O#96?A#193A???@#186?GGK_C@?A@#230?GkIKI?ACEEA???@!7?D@??@?A#22!14?ACAA?B#76oOO?GK#187A??a_?@!6?@#209?_?_#198??_#187!11?G?G#186A#193_!9?_??_#201@BA??!4@??@???CG@???G??A???A?A???A@@B@?@@@?@!5?@?@??@!8?@?@@@#24?O#5_!7?_#16??_#2_#34??_#91G?G!4?O#20?__?_#38!16?G?G!7?GCG?_G?GOOC?o???C???HOooo___!7?@!7?@@???A?KH^[sKK#81!9?S??_?A?_A?@!6?O#118!19?A#102!5?@!7?AO?OAdGC?_#119??Oo?O??C??O?Wo{kc]elbo#116!21?@_@?H?H@_H?TH`PoarQ@_GC?G$#226!41?_O!4?CG?C??G#242CAA#216_o?OO!4?_#224?O?O?OO?OOGG???C!5?@#249??A#189!22?A!4?@?@@?@#124G#216@#205C???GCH@?H?CCC!6?A?A?A?C?AC!4?G?@#181C??A@?C#205???JA??A!8?@DCG??@!4?A??@!4?A??@!4?@#184???g!5?O?__???_??_#3?O???_#34??O!4?_#74?G??C?G#56??C#155???@?@!27?@#18!6?@#7?@#128??G#149G#142?G#177???@#39??K?O??O#81_#145!6?A?O!6?_C?g_???_C???G#112!20?G#69OG_O?_OSe`O?O__OOW??KO!6?@??@F@??G??C??WC???_!4?O!5?_#73??_!41?C??C!5?A$#97!41?W!6?A?@#244??@#124_#181O#26O#173O?O#201CC?C@A#231!6?@`!4?__?O???GGCGCI!5?CG@?D@BA#209!10?G#198??G#182GG#10A#79?A#11A#173?@#235?@@?P#220!6?_?_!7?_!9?O#198!4?O!8?O_OOO#195C#187G?H!4?@@!7?C#220?C!4?G!4?G#235?@#191!12?GC?G?G?GGG?G#31!4?C?G#177!4CKC?E?A!6?A??A@@@???!4@A?B?A?A?A??@!4?@?@?@#23!25?@???A#121O#86!6?C!4?G?G?O#115!34?CO??O??_WA@Eg#54!31?_#72!4@$#182!54?G#195_#176_#220A#235!5?OGCGG#236!6?_```#189???G#221?_?O?o?_o?__O?o?o?WoGOSG???R?O#30!7?A?A#137G#171!5?C?CC?A!5?O?OGO@OO?o?__Q?O!8?C?C?OA?@!7?O#28C#186?A#235A?C?C#176A!4?A#198!11?G!6?G?G!7?G!4?G??A#28!7?C!4?A!8?@!5?@#38!5?GCGG?K#54!46?CG?O#125!97?C$#206!83?C#247??C???C??A@DA@?CAA#27!18?@#138?C#201!7?AA?CC@?D???C?AEFDDDCDDHJAGI?!5@#109O?OO#26@!4?CC?C#104???O#221?G#109??O?O#207C#193_?_???_?O_?_#208!5?O#220!19?A!7?A#12???O#26AAA#207!4?@#13O???A???O#92!8?A#69!51?G#37@A?C???ADAAG?IU[CCS?CGKO?ooO?__???_$#243!87?A?A!9?@???@#32!16?C#76!44?G??G#180!5?C#243G???A???A!5?@?@??@!7?@?@#188!32?A#1__#15G???A#58??G?G?G!8?GGoCoOOOo_OWO?ACMkmM[]]]CMCCMOqUqq?OQ@S?AO_??C??CCC??@__??@!4?@G?W??`?_$#124!166?A??C#216!16?A???A!5?@?@#7!40?G??O?O!4?@!5?@#49!61?G#140_??O$#11!167?G#189!20?A#196O??__?o_OoOoooOo_O!4o__ooOo?O?o?o_?_O??o?OO_?__#35??O!9?__#19_A??o_O?_#62!57?O$#198!191?_#20!55?O???OOO$#14!247?_#26!4?@?@-#246Tii`SIgTQLqhUWVgFQBVIfQ^@J@E?ABA?@#90A@#96A#194_#207_?o!9?@#180@#221C???CC?CC#224??OO#176?O?OO?O#194_?_#216O!4?GG?G#187O#106OO#172!4O!7?G??G?G!5?ACA#246!5?O!9?O#137_GGgGGG??GG!9?C?C?C?C#208!5?COCG?C?C?GO?OGO#137@#198!5?@!4?@@?C#237?_#184?_O?CGCG??G_!4?AcOGA?AD?A?@A??OMSG?C?OS?OCa@_??Q??OC??_?C!4?_#58G#24_??_!8?AA!4?CA?C#0G!6?O#19G!8?g?GG?__???_#91??AGCOO??@GHA@??LOOOGA@??kBAAC#52GCsK?GG?O!6?G!7?_?_#125?CGBG@?@#81@@!4?A#40?_[CW#77O?G???A???CCMI!4?GG?G!4?GGG?CCKG?IK???@#121!4?_OO#54?O#103!6?@?@@#73?O??cYC[wOA`G_O#141???@#127??aBh?C?A`C@A!4?@??CA#52!9?A#127!6?@!4?H?O??_?_#112!7?AC?C?C??A@???O#115??OCQ?G_@AI@_c`aQAO!8?O?_#108@#72?GOO???AL?@#114?G!4?A??ABAA?A?A#72??@?O`O#100O$#237i@PSI`TALaLQHFgFO@CG@OL_GCC@?@#218?_?OO??G???C#228_!8?O!4?!4O?O`!9?G!4?G#188??O#181OO#198??_#196???___?___#191_!4?_??_?O?O?O???C!6?A?C#109?A??@#172@@@#194???@!6?@#191@???@!5?@??@??@??@??@?@???@??@??@?@A?@?@???@?@A#237!20?G#239??G#105!16?A??GO?@B?CICGQGOAA_oS??_!5?CO???_!5?OoO??_?o?_??__#3?O#51A#58@@#24???_???_#13!4?O#58@?@EK?O!4?_`?G?K?O??_?GAFGB?_`_!5?@?@@??A?A@@??AA#128!4?@?A!5?@!6?@#59???A???G?A?B?@A?@@?@@@B@!8?ACA!5?AC??Wh_#118!5?_CO?OQG?O?ECCC?A#121X[WCO_?N[[O??DIC?q_#128???SgCwO@cTjWRk_DDIHSQJ@AEaGwO__?Hd{AYSK?O_?_#119!20?ABBAAQ[KOC!4?__#102??QWGGGLDLt^H]Inc_??O#59_#98!4?@#53!5?@#102G?A@?KKCC?CKSKWCc$#218?C?A???_!4?_!7?C#196???O???@!5?@???@#232_!4?O???OO!6?@?@?@@#216??@#231??!5G!8?AECCE!5C???A?A#201GG?G??A!5?B#196O???o_g??wwqsoOoW__!4?C?C?OCCScaSkcS_W?WagoGwcsogsiKacmWeWkOCICa?OwsgowSwoSOKwcWsGwNC~PQra\fTJ[uJ|OGBsOlOoItWeWtM`_@qDy@m@@NQSKVmOciSiqkoKsgOK_g!6?_??gWo?o???O??_??OO???OO??_#177@#56@#90_#63A@@@?@??@@A@BFEEIGOO?_?__??_ocaq__??o?G_#142!6?_#128?G_??O__O#49_??o#51C!6?C?G?O#49??B?RQ!8?O#72??_w_???KGC?CCCG???A?GG#121CBB#101?G?G!4?G#72GG!4?Oo#81!9?_#77!10?_#81??G!6?@#125_?ABEcOOgK??XwSiQiCKQI_S_c?C?A@?H@OA!9?_?@?@AQ[cXhOo?_#118!19?CKKLbbhHUAMcOC_#101!7?G???_?_?BCACKTgdYPMTQlQDa_APCOo_Wg?g?_?_@XkxkYln$#244?OC?_S?G_O???_?O?_O?O#193???A???G?C#242O#203@?_OOOGCCA?AA#235GGG??C??CECAJC?AE?C?_`?@@@!6?AA!5?G?G?GGG?G!4?C!4?@#184_!7?_O?O?[?CCGGG_G#220@?@#96??_!4?OG???O???O?O!6?_#184!9?A@???AA??A?CA#246!56?G_#109!6?@#0!4@!9?O???C?CG?O?G#37@@???@???@?B?EB?A@@?BM?MWUKyDAA@A?@CG??GCO?__?_!6?YO!6?o_O#140!10?__!4?OoO?Oo!7?@?@H@?CC?A#63??_#69KLdC??I!4?C@?@!4?@#87O?o__oo?_?o_oO_o___Oo_#119?@???@!6?OCI?di`@BFa!5?x`abB@aAE#126!4?@??@P_KF!4?@?@#140!7?O?_??O???g?GOE?CGD?Q???_?_#121@A??CGDILomtrMB~|jnY~I~nt[{Wp`_#114??A_hSOIDOKQ?C?c@__!5?@??O?_#108!13?O#59!5?@$#240???G@?A!9?gCG_?G_?_?O?A??@#213OGKCK?C#106O!4?C??A#26CEAA???@#247G?AI!7?_!9?CSS#209?_#193_?_?_?_???_#205GGG???A???A!4@#193_?_?_??O_!6?G!4?WsOSooogcoOg??_?GgKcWcGCGE?GGKQI?_?O?aG???_O`?_???@C@i?@g`o?G`ACBOi?ICGSaGaSa@SAdQkA@QdAdGbGdAOMPICO@S?iO?G@_?O?G#1!4?@@@??A#4A#20@AEB@G!7?@!4?@AAA!4?C??ECEE???C??__?WCWSC[[WOGOOo__#55@@@BNCQ!7?ABB!8?GGCG?OGO?S!7G?wwWWwopOaE?O_??_OwSOO#114A?_?_P@A?CBA???@A@?A???CC?AB???FECFDBCC@@AE???ADQGaHD!6?EcoW@ZWrIqEC#132???_G???`?cWJicAQ@WCCA@?@?AG#129!6?O??!4_!8?A#141!7?@#132@A?ACHDYDOM@?GOo#107!21?`?O!10?A?A?A???G$#239!11?C!5?G_?_#202???COAGCC_#241?I??G?E#209O??G#240@@#212!6_?!5_?___#249G!4?GG??CC!4?C#192_???_??_???_!4?OO?O?__O?O?OGO_O#209!10?@!4?@@#104?G#183!11?_!9?_!15?O?O!4?_#104!74?AAG#9?@???G???@B??A???C!7?G#104O_???_#192O#5G!7?_#34!5?__?_??__#51?@?@@EGK?O?GOC!5?G???C#20O#152GA#116!9?O#50?_??_??_?_???__!6?CISg_C#148CAAM?_#62WG#102!5?C!4?A#99?C#93_??_??O#253O??_#84O#47_?O??O!4?_#93???o?_#102!22?O#69!7?@#116!19?O??_OG?FGBIYWOCAKcS|pLpFhTY~CYA{Cg?_#126?CA?A?OA@OIC`K??OO`?p?OG_?_#103!9?@?G@QLHAT@sAOqG_S@SO?GWOa?A?C?_?_??gCCG_Ic@A@?S@QGQCwA?A$#137!25?_?O#0oGWK#83CC#233?__???G#186_!8?O?O#243POO!7?@_@#186?@#221???_?_!4?@??@?O@@?@@!5?@#248?AAA?AB#198_!8?G?D?C@!8?C@??AA!5?@!7?@@@?@??@??@??@#192!12?A!5?@!8?G?C!6?@?_!4?O???G_?G@?@c?G?O?CO?G`??_@i?i@?c?`?AG?k?O_???C??OK#13@#34A@?O???O???@@?AA!4?C??CC#2??G#193O!6?_#38!22?AAK?XCEA??@??DKKF@!4?W[SOOOAAEEEIECCC?C???!4CHIACGo_!4?_#54???A?A??D??@?A#98_?OOWOWWW?G#103?CG!5?G!9?A???C#115@@?A?OGSQEB?@ACG?C_GC_G?G??C!4?@#142!30?_#73!26?A#77!49?_???BDI@ADI`mOg?QkQOBtKoHAO_OhO`@`@A?QCBCA$#204!26?G!5?__!5?G??A??@#238O?G?GG?G!7?GIIK!4C??CFDE@A@?BD?BB?ABAAA??@@??!5@??@#106O?GGGC??AA?BA@AAC?A?A?AIA??ABBA?A?A?A??A?A???@@?@??@??@#246!12?C?C#3!74?@@???C#19@#63C#51KC#2A#237C#137G?_?_!7?_??_O?_???__O???_#49!25?A#56??OD??LA!5?C?tOc@?BBb@@@!4?AA?A?A??A??BA?CG#39!4?O?G!5?O?AkG#73???@#48_!5?G#40!4?A@??G!8?A!4?A?A#102??G?AK_CEDA?@$#1!26?_#2_?O#97???A?A?@#244AAA@#153C#172G#188G???A!4?A#195@!6?_?_#230!9?G?GO??G#236??G??G!4?CC#247!4C#153???_#105_!4?_?_?_GOKGI??m!4?CAC_O?C?C??C?E?A?AGCA?A?!4A??A?!4AC?@B?@??@A@@@??@A?EIUIC?EMAEAAQAGPC!4?`?@!4?@#246!47?GO#52??O#14AOG?@@??C?CC???GG?G!5?G#10?GG#33G#23!38?_#144!17?@#63??!5@!4?@#92!13?GCG#121?@???@Q???A@#53O#80_??_??__?o#250???A#119C!4?A#69?@@???@@??@?@!6?O_ggWDIG@?G??C_$#105!29?_#104!6?@#239??@#217@???@#171C#124C!5?@#234?GG??G???C#227!11?W?G?G#234!10?@BBA?A@#207!8?C#220G!6?@?@#192!4?@!6?CC!6?@??!5@!9?A#55!104?A#49_#54_#35?RAC?A!4?CCC#63@#23@??@?B??@???B??G?CGQ?A?@A?A?AC?G#91!43?C??EE!5?C?O!9?_#58?_#250??O??C???G#101?C?C#54!12?C???@#42?_!7?O#41??_?_$#205!41?O?O?O?O#248?G??G??A!8?!5AaaB??@A@#243O!9?G#194???O!4?OOO?W?W!6?HB@#233!8?@@@#239!18?OGO!6?OO?O?O!4?O?W!4?_OcG?GOGk#70!81?@#56G#96??_#239G#33C?A!7?C#18@!4?@C?@???C??O???C??C#152!55?@@?@#134!28?O#115@!5?A#75!7?O#71?O#73CC#53?G?G#80O?O???o#48?O#98O$#201!42?O#198C#202?A#192A@@#194@#178_!9?_?O#220!12?_?___#188!11?G!4?C?!6CAAEA#150!33?G#140!115?O#202???O#4?AC#3?G?GG#12?G#70!4?A!8?C??O!6?O??O!5?_#88!80?__?_#81!12?C#88!7?O$#220!42?G#223_#246??@#29C???C#216A#163???_#205??@!8?_!4?A#234??C#209!17?O#171!10?C?CC??C#192!154?O#16G??G!5?G#4???G$#223!60?O!4?O?O??O?OO#1!194?O?O!6?G!8?O$#184!268?!4_$#13!268?@#19@A???A$#170!269?O-#246TIsA\bODtCQiaThcoIhoS{qzGw?O?_O?_??O?OGO?O!6?GgOgo__?_o_oo_?O?GGIGG#184???O?OOP?PG??O_?_G_??G???_?Q@GQGA#105!4?_!4?I?@WeWaWeWbWeGP?IEGAGYC]?[A[?OCOUgOCQCOTiWU?[IOK?GOK?OGCOK?[?W?K?O_?O#192_!5?_!4?O!7?_@?G???CP?I?C?H?Q?C?G?O?S?S?S?SGQcA?I`G_?A?@?P#191??@!4?A#246???C!5?A#208!4?C?CA#193?A!6?C??C!4?G?@?A?C#19@!6?@@!5?A?GG!9?G#56?O!6?CE??BADAMAA?C?CO?_?GO#125IOC?C!6?A???@#39@@#69@?@#59?@#40@#77@@@#101@#72@#87!11?L@?@BEBEABB@@FZRLIDIDEBB#48_??miGo#114B@C??CCCO@?y?PP??@@C#73_aQD[vAO@??q?G?_A?AGO?IC#140??AAAEKc?EOg[AO?@@O_CIP`IO???K_#127!5?A???GAS`C@AGG_#143!5?@#112???@?G@?_!5?A#107!5?_#102e???O?_@?@@FJP?GCW@bDEJWww!4?O_@#98?G!6?_?GOC??QA?a?ACI$#237I_A\aOLoIQhOTGCQH_OCg?HCOC_G_??!7G???G!5?G!7?_C??CI?K?A?A#183??C?!5C?CIA#193bBb@BCB@???_?g??_??Q`?_Q_?gWOWGOC?ICWeWeXeWeGQCG?@A!4?@?@_?`GOH_?GOGO@_@?`??`?`OOH?PGDOJ?T?H@GP@DF@F?GQcGQCPCgCBcIPCQ@?YCqCRcZ_AcO`Y_U_L_Z_U`Kb?J_BgB_A?GPcO?U@G?O?C??D!8?BGSKAHC#96G#191!6?O#137???ACA@C@?@A!6?GI?_??GOG#35@!6?@???CG?O#91??_@???A@???AC!5?H?C???G#52?@@B!4?AEGO!9?A@#48C??A#121!5?@?@#95O#85??CGOKKSC#98!10?__ooO_WO#75!8?A@#98?_?_???@#72PTKw!6_#102???H#121!4?GO!4?G?G@?T!4?@@!5?C?_#49!5?O#116???POKGEO_TnbAEAJ?pm]titytPMqgSPgS?_`A???O_?_#126@?A@U?o?CcS_?c??GO#114??G?gg?Hc`Q??GOGcQ?CWC_!4?O#100??Og_#107!4?_#115o#114o#100???G???O!5?O?GGCAK{uKmKGC$#244_CH??G?A?_?D??QHA@A#192!5?C!9?A!5?c???A!8?O?O!5?@@@?_`?`?_pp`o___o_OgGgGo?oG_g???G??CA??@?@#237???C???A#184!16?OGCGO?W?[?[_W_?_!4?C??G???C!6?_!20?_?_???_?_?I?C_G??CG?aCQ_!5?_!4?@_?@CA?B_BGB_B?@?GP_C?U@W_[?KaGOg?s?Og!4?O??G!5?@G@#0!17?A???@#10@#34@!4?@!4?@?@#104?G?O#58@?BWX?AWC?cC_@@AE!5?PAGS?O?C???G??G??_#69_#98_?_O??G???O#47G??CCIAAA#93OSCSiiumqBbr_`d_`???__OO???G?__WW!7?_O?O??_#99O#120C_#40A!4?G#119@?@?C??@?CAg?COGC_Q?Gg#49G_??G#116G#127!7?A!4?O@#129!4?G?__!4?Wkw`SwC#125!5?C???@CBGC_KDYPShSBIcScS_O#73!10?C!6?@#119!11?A#101!7?CG@P_EM??GoCB?BAECGSQ|vJf|mR{NeqaRpo@@@?@@B@$#218?P???C!4?C??a#239???C?A@A#202??_!5?_D!5?CC#191A!6?A#193?!5C???GMGG??AA#239CECCEAMIIIGI?A??C??A?BCABFBFDD@D??G?K?GC?G??GBCG#192!16?C?O!5?_#208!6?A!9?@#105!44?cH!49?@??@??AK_g?@U_?YgGhWdGsn\hz|izur}tr^~n~OOOY[iy_K_??k?SccowG_#17G#37@?ECCA]W_oG?PA?c??AC@IO???Gg?o??O??O?_#140@??C???GA?CD#88__?!5_?O?O_?__SO???OGG^]Y^]^~^QMNCK?G#47@!7?KAD?CA@#101!7?A#102@#59CM?G?G?GGOE??__??_#132???@!9?C?Co?`DHs?ID@?_#38!6?o!7?O#149?G#38!18?_#132???_?A_?@A?GKa_NCi?G?CGA#115?_??C?P?O??_QG?GGc_?@KCQCaO__#108C#72?@??GOO?_!11?sG?Og?OGCC_AG_??@#93???_$#240???_??aG?H??G???COCHA@C???G??O?_?O#217__?_O_O?S__s?C#173@#233A??!4A#201@@#198AA?A!5?_?_!4?@?@!5?O?O?W?!4Oo?oO?@#246_#137!11?_??C?A??C???C???AC!4?@?@!15?G!4?@??_?ACA?AC???A??AC?A#35!81?@#4A#2A#137O??@#96!25?A?@#208???S?C#3??!4A???C#4C#246_#2?O#63@?BC?`CJC?AT??@?C?E!4?S_O_#35?OO#55K@Q?C??S???G!6?@?A???@#253!30?@#48?O#41_?W_!7?_??o?Oo[#77!5?OWOOOWo__oC#81!5?K?_ROL_A#128!5?Q!4?M?O???@_?_DClTgaA@@GDAg!6?B!4?DI@IaPKRgeRHRYCcHAGGSW?O#119!14?@!4?A#103G??`?HCL?eOG@W@qHaWGOAoCG__?A@C@CCWG?x`B!8?@?@@@#99?GC??GOOoo#95O$#193!24?@?O?@?G?C#242CC?C#21@#216@@#178@!8?@#209A!5?A!7?@??@?@#244!4?A?IG?G#196?!4CG?CCGC!5?VgSc?uTg^vVBfcRdpzs`!4@?@?@Pdgr`o`pe`a_Ba@BEBbC@Vbb`baASaGqbSJAlbCrkbqjcpibsav_}iW}g^vLZVlZmZVZkPtiZdYu@qLPgHCZkZd]@^_^_]?^_Y`[gSGs?[GtkRcIDY`GudNaza\qmU~J}lV|oO??k?BodVvUaQaHO_S??S?GG?GG_?O?dccc?S??_O{{O{gWGG?OOO_#86C#90_#51???_!4?G#196???W!5?O#24?g#144@?@?@??G!6?G#116???O#93_?!4_o?O#75G#56@?@#42!34?CC?AaOc?OOg?G?KCEDB#115!6?B?C!4?A?@gI?`D?QI#125!4?_??f]~H?urNP[ioBLsOy^IgOgP?@A?@A@#121!34?@?BPGHoJSzRjYvPy]Shx__A@A!5?@@#77!11?CIa?@OC???A?BCDHAEGcA???A@CA!6?@$#90!24?A#0A@FAA#82A#137A#153AA!4?_C?c!4?C?A??A!4?O!7?OP?O?O@!4?@??@#191??O!10?GO!5?@#198!31?C#191?C!7?CG?G?CG?GC??C?G??CO#237!97?A#39@#56@#109?_#192O#104C#192!25?@#104!5?A#1A?AA!5?C!7?_#23???C#152A#38?O??Ga!6?@?A!4?C??C?I???OO_#148???A@B#80O?OGG??S?GI?OCCCEaA!6?_!7?_?_?O?I?Gc?@GCCCg?___?OOG?GHI#69!8?EAA?AFG??UCISAQg@C#140!9?c#52!22?O!5?C??C#73!29?A??C#118!12?BEA^CsCT]U?Q?OOBFcA?G_#98!7?A$#104!25?@A#196_GG?O#244O_O?O???G??OO?oOo?_#243@#242!4G#194??@@@#196G??G#241!11?C?CC#96!12?A#183A?A#237G#239!162?_#14!36?@@#86??@#20@!6?@@EA?W_!5?@A??K???@G???C!6?G!5?_#81D??@#114???O??G#42??O???KC?IC#253!41?O#121!15?@@#54?@$#105!26?C???C#233?@#209@#171@???A?A#201AA#194A?A?A#202??G#195?@#226C!6?C??C#191_?O?O?O#208!23?C#105G#109!201?A#0!6?O??_#193???_#34!8?_#55O_#244???O!7?_#17_!6?_#74O#50@!5?AIC@AC?FBA#59C#38A@#40?A#84O??___#118!58?A$#204!28?O@@#138!4?A#215_!5?_!6?O?O#186?@@#207@#218??C#244??O_g#241!30?A#16!209?A?C#0!19?g#96_??_#51!6?A?@#14_#64_#83?_#128C@I??A?@#129??G#87??O???G_?O?OO?GWgGGGI$#4!28?C#10C#173!5?@#176@!4?@@?@?@#216???@#150???CC#240??O#241??C#217O#9!242?A#70ABA!9?@!8?@GAG???G!9?__#53!15?C#58??@$#252!35?C#76A#181A#239?G??GG#183G?G_#184!6?O#14!272?G#246_??_??O#49!10?I@??@C?@C??H$#204!43?CC#212@?@#193!279?O#104O???_$#162!43?@#96?G#64!283?O#2O$#74!329?@$#239!329?_-#237i?Q@dOBg@S?I_DOA_S?gCAh?PI_U?GD@cJOaGO_?OGcGeOi?QAcOcHvGaKADOgOgSDYDgDGODgDwCX?W?W?O?S@?O?G?GOg#105??_GO?_G?C_HQ@_HQ!5?@?@?@#183!5?A#105!17?GO_?GOc?GO_CGO@g?S?g?O?g?GOCg?G??A?A@A?A@?@?@A@!7?@!10?G???G?O_?O?g?O#239!17?A?A???A?A?A?A?A!5?@#208!10?CO?cG?C#184???_#192???O#193??A??@?@O#184!8?@!7?G??C??OO#17G#96BA_#16A#23@#97A#208K?O!6?C???C#244_OG#150C?A#98O_G?_#95?g#85?CCWCA???A@?O!4?O#48!6?_?OG?A!5?g?CoSISkySK?]Kc_cs{SK{CwKWSkGCCWdXCqGSG?OG_G#133A#59CABAIQ!4O_#125???B?@GMXK@???@?GANwP[Oz^Ko#129??O?CU_?G??YdNpO??__??_!4?o?O??dW?A#125@?@?@?DKHKuvaahOE_#112??A@?gC??A#103_??_@@_d?LacI?oC@EWJIa?H?AB@CAAOH{LxzS#251GC#99!13?C??ACerQaYA$#246TjcYIdSQihTSIidSJhTPhSUjePGgSqIYPcHP_GO__OWOGg@Gk[GkWS?t[o_YiDAD?gCo?O_?o?O!4?_?_?_!6?_#198!12?A#137!5?A#192??O???G#191?A?A#137!27?C?@???@#208???C!7?A#191!10?@?@???@!4?A#239!4?O??O!8?O#198!5?O#191_!5?G#246!26?A#193!7?@#105??CGOgCgRkAcHQcIPcB@IR@JBtJbJQnoNqLpjDUaUiBAJ_O}DYeg?dcf`Rog[W!4_!4?oWK@{GiW{?KO!4?o#64?G#97S???@#61C#80CO#93S}V~zwC?C@?A!4?OC__APGOAG@C?@A?@DL!4B@@#53??O_?C__S?oOWOG?__!8?o!4?A?B??BA??CW#40?CGO!4?_#119C??G!5?_?A?w?gs#116!7?C??OG@__P`??@a^AC??AJURZAT^@zEZEBcBSZAFPOEZc???GO#73C???GW?C?GC#119???@?_??C?C#107!4?C!7?@?o??_??_!8?GC#112?_#59??@#98?O_cA?DAA@Ac@?@AdCg?GGLH@C$#244?S@cOAg?S?I_DOAh#252C?A??@#196!4?A#239?A#218?_?A#193?AC??C?M??D?D?F!8?@?O_??C?@?_?C??@?P?@@?`@_?_G?_GODA@eBAFBsLoKrKrKpNqLuHuHg?OC_ACQlOI?_?OG_S?gOG_Q?_CP?c@Gb@BB@B?B@@ED@DHE!5?_?G!8?hQHaHOdAHOIcTAsAL_DYDGdGeHcBSA?yDqChCydYCZsIlA[BkBsGaXCQKpCi@k?S?O_#191!13?_A!7?O#137!10?c#208!13?O_?P?CG@!4?A??C#104??@#96?A#193?A!9?O??C?A?@???Q!6?AGD!4?A#63A#56@#88G!5?BbZHEb??OXgghZKDKBC@C#99?@!5?I?S?G?COI?D?A#40???_#93??@??A??A!5?A#80!5?O#101!9?C#77A?HOOc__#118?A?A?A#39??G#54?O#73AO?PIDZD?}e@ODGaAC#128?BA??AA#149GGO_O?_?O#128!4?C#52!4?C??_WC?c??G?A?O!4?G#127???@!4?A#126G?EYG?O#118?@RY}WLiN]CIOGO_?@@ECA!5?D??C#77@??_?`?_!4?GAA?G???G#95!9?A???C?SCG$#218??G??G?C?A_@O?G#202??A?CA!4?C!6?GOcGO_GS@_??O!5?O#196??A?A??@?C!5?@?P?@_?C???CG??CG?cHCDGpCXsLOkIQDaKPCpIOC_GS?cFXdZD{Xk?ET|^|lS^j^VnV^l~^zm~Z}v[uk[ysmW}ugYyqawT{h{T[luV}tmxU|uUcsKskG{SkcYGsGw_FW`AdYaPSIwbKzDWCrCR?A_@C@_AO@c?wASHcYc`KqC{@}HfK@\a\zcXti\sWktYtlCyUkR|HukJtMZwmtGQswIs[SlON_LqKCIGK_@oss^n@wdWPzYYW[kDS__WW??_ogWK_oo@cCa??a?_C?_G?A#59_#69O#99O?_?O_?@#87!5?_owWow__#80??OCRGACJKAEABA@@#41!8?A?@??@?@?G@@?EA?AA@@A@BA@QBBBAA#115!13?@!4?@#121?@@DDCKO^MO?__OAcOG?Ok?Ae#127?g?__#140D}^LKO_??@?D_??C?HgC@i?ACxC`GRG_??_KcGcWG[so__#121!4?@O?`O`vtm}UGD@@A#102!7?B?SW?_?oIW_?oWWoww[}JG[EABAA??@#100_???BA_?A?BEEe`A@TxP!4?@$#240!7?@!8?O?g?Og?SG_T@hDOc#192!4?!4@??@_@?O_!5?_G??AC!4?O?O!4?OC!4?_?C!10?G!8?A#184!14?CA_A?_?OG_A?A?`??_??_#239!26?A?AA?A!6?A#192!8?A??_A@??G@?O???_!7?G`C??G?A!4?_???O?_?O??@C?_@?A?O?Q?a?@??P_?P_?P!5?@?A?@#137!30?O_?G?CG!7?AC#0!6?A@!4?G@GC!5?A??@!7?G#17@#87???_#41_???_AB#84!9?CLDKEDFA#98??__o_opwW{KCmS?qg[CCI?@A?@?@?@B?AA!6?A@A?@?@C??@GA?GO?_W?o?O#103??GCG#69@@A@E?GGOO_!6?_#126??A#132A@@O_??@@#55!7?_A#38@JSC_??IoGc_??[?_W!5?G?G_??_G_#132???!6A@GPCCbW@??G#115!4?_???P??aOH?cO@?SGA??@CCD?ACA?_!7?O#134!4?G#93!17?A??_?_o$#193!19?A#252!16?CC?G!7?O?_#184!11?Og?G??G?G??G?gCW?O?W?O?O?O_!5?_?O@??@?A#239!11?a??O!4?_!4?A#184!34?A??A@?@?@A@?@A@?G?O??O???O?_??CAGaCGQ?CGa@C!4?a@??GDODI?AD?DAGBCHaOA@GQ?H@A?@?W_]_K?CGEGC_JcRG???P!5?A?@O?_#237!42?@??C???O#33C#24@#239C!5?A???@!5?A???@@#149G#72_?W??G#94!12?A?A#120!13?_O?G#80!20?!5@#120!4?__??oGoc?_WC_G!5?_#102!4?@O?__#81??A?BBC??C???C#130!22?CG#52??W#128!19?B!4?@??Av_@?@OoG?C#114!14?_O?o@WcAQGAGA_PGHC_BO??D??C???C??O$#242!36?A??A?C!4?C#239?@?B@A!4?@G?@A@Aa??A?_EGA?A??_?CFBFFJAaIaCQ#246!23?G!46?@#192?@#246!35?O??O#137!56?A#246!54?AA#4A#63@??C#2??A?A#244@#104???@?A??A!5?@#218???C#14C#42G?A#40@#72!30?_O_o??_oOogCg_IO?IQ?_?G?G??GO?wCOCg???G??C`@CbVclFZ@dq__#114?CKKKGgOo__?___#127@#140A#142!25?A???@#55!19?CO#119!54?A#59@#101???Op?_???CCaS@JBkOWD\[XWwXWWWw$#198!37?A!4?A#244!6?@?A@#183!12?A??A#241A?A?A?!5A#86!235?@#51@#58AA#37D#74A#38??@#56@#137!5?OC?kOk!5?C#47!4?O#103C#77??C#49!100?@?C#72!113?@!6?_?SOPk_O__c??_$#233!38?A#209??A?A?A#109!271?CG#217!13?@#1?@??O#96A??Q?AAA??@$#153!41?@#20!276?@A#240!15?@#237A!7?G#65?G$#9!318?C#16!17?@!5?_#70???@$#184!336?W?gC$#35!337?@@@!5?@$#246!337?_?O$#110!337?AS$#192!337?G-#246TiCqHTI`[AiTDaYHdSIlHbUKXreCtiITtIiTSidSYiEOzLdYYuAn|iBhtcWOHqoTC_nOpg?b?D_U?AD?dGuGO??C?P?O?O!4?_??_??_#184??_!4?cGO??O?Sh?O?O?A_?A??A?C@!9?A???_#192!17?O?_???_!16?a?O??A?C???AOC_???OA??GA?Ga?C???A??A?OA?S?@???C?G?I???I??G??AC?_C?_#105@?_GA?QDG@aChQg??@gC?OfGAhQkuPV_Y`QTaSgEhV?TgDQ_RcJOiDQkOcZ`WaOdCWCC`SGoGON_AGDB#83O#93O???@?G?@?@C?GKMF~[w??oOgC]MIM@@???_#80?O#53?O?G?C??C!8?@@@GGG@IEHNLNAASC??A_QICCCAB!6?_#77!10?_`RrECCgc^_[CKWo#115AO#118G#121[YH?@N???@#49??AO#38_??GS?SKE?qqGGR_G??Fm_qNqO?CgTG@gI?Q_?C#128?@A?`VGtBC@#126O??W@CCO_#114??G?oOGH?CPcQHQ_Y??A?_?_?G?_!5?BOA??g#108H_#100A?CBCC?gO!5?o__c{KCDA#93_Wg~jv$#237iCqHSi`[AgT?aW@C?I`?ASG@aCGPI?T_I?T?I@OI`CPhC?Q?d?`OATgUGRcHqLAgQLOICQlOeOJ_\_GaGR?dItIP_CG_@?_C!17?O!6?O#105!28?@C?Od?AGP?i?OACG?@C??@!4?@#237!18?P??@??@C?@??H#246!34?_HO_?_C!4?G#191!6?A?O???_CO???C#208?D?CG#191!7?@?G#208!6?@#137@#191!9?G#137!11?A!7?O!7?@C@#244_?G??@#99O_wooOAGAX#87A!4?@?@@A??@@@?@#40!9?_O_OoG_GO?WOKOcc{{uQVA[tWuoa?hg?O_?C#101?G!7?O?O!6?_!4?_?GO_COgO?W_O?_O_#69@@@F#81@_C#125_oO_PKUBNKeE@#129_O!6?@@CA?O?@GGPKCOKciJSatIEtL?@`_?G#125?AA_FI{bmJ??BC?A#118A?GGOoJNFufbKA??_#102A?GGKWVbE`rZFzf??EkGhA!4?@#98!8?G??_!6?OGQPBB#85??OG$#218?@!6?@??G?C?Q???O#202!13?T?i@SI@COGE?Q?c??O#184!6?G??C?C?_Q??ACOCOa?H_G_?Q?@?DIPA??C?A?C_#239!17?A?@#184!54?O?O?OCO@c?H_AG_S?iCP?H?I?O_?@i??@??IOD??H_?_!4?P?aG_GO_H!5?GcQ@_A?_DOeG@SI`QsHo@Q@GQKPG@CGDO??@?A_!6?_??OgA!5?C?G!5?_??_??g!4?_??_G??GC???G!7?_?O#110_#96O#97??O?G#88_#72_!5?@??S?O?C#88!5?B?oK@F???@#72_??_OO?G_o?KACJBBB?JFE@BBHAA?@?@A?@!6?__TupR_Pqxo{W~n{_xUGicx?u@raNjFEKGg?GO??G_W#102?CGOG#73???oVM?H?B#142!9?_o?Oo?KKookNvMoO#149?OG_?G???GAS??_#73!13?GO?SE??A#112@?@C_C#115G!5?Ga?HcGK@dq@??GGG!5?GKG?ACWc#134???O?OG_!14?_#95o?G?CP?C$#244?O@C??C??D?AG@C_!20?_#192!4?@!7?@!4?S?A?@a!4?H??C?@?G?G???O?G!4?_??g??_!23?@?A!6?_??G??G??G???_?_?O???G??C#239!47?C??C!4?OC_!35?C??CH??@#237G_#137!23?C??G#193!7?@Cg#208!29?@!5?O_K??G#239_???_#0_#150G#64_C?@#41GC???C!5?@?_O?_!4?_?O!4?GAK?`#120!4?GA#102O_?_O#59O_O?g?g?Q!5?_!6?OO??!4G#120!4?AA@!4?@!6?C?G!4?O#53G???O_!6?_#119???AoaDA#132G??E#140g?_g?OH?KMCAFB??K??AC!7?A???ATO@??_P?QLAKPquL|[Go#132??O?cI`?AG#119!5?_DC!4?O#77!20?OOo!5?@?QG!8?A?G?AG?A#99!4?gCS_$#240??G?a?OA_O?_O?_?Y`SAsG`qCGPi?T_I?_!5?_??_??_#252G@?GC#239!7?AC#193??H!4?`!4?@!5?A??CG!5?A?A@SIO@iTYTiTYtITyTiTiTI?k?S?xACaHO?s@Qc?DQ_DOIO?Y??i?OAdGPaGOI?OAG`CO@c?HOaOc?HQCxASHOiCPGaTGaSHqCzCPCjC?GO_IOG_??I?CaCHsBs@s@CX_RKpKPkPcHcGbGeWdQHoFO_@O???OA_???A???HQCOa?O?_?_!5?C!45?@??Xa?G!7?AWAQ?A#203CA#35A#42A?@A#85?C!9?ACIC@I?I#99?O?OeGQc?P#103!4?_#77?G?SK?KC???CG???GC?C!8?@!5?KCCG?G?C#98??@CA?QPACP?S?GO#103!5?@?@CA?C?A???_#128!7?_O?OGSO`?HA?@#56??__!9?_?_#121!31?_Wcwpwl]rVBA!4?O#101!22?_!4?@A?AKcj?OPxU@np~v^|F^\ZBBB#131?_G?E$#193!50?G#196!12?A!4?G?A???S?AD?D?_?Q??C?TgPKg`HITiDiTIdITiDITiTiPdAuHnEhAXeNnJsLZtylTyjsN~D~nT~ntWvi\UjtnI|tUinSZnsjTnYjuLiElJeiDyIvSItTJaLP?iKqCpm`NIoDeXmiPTaWjsA[B[JuXeIkPEPeBKQeXvGvOBGkQLoNOI?fOaDOKBSJsLyvC_iDShfgIVYKzSLRzyyRrVnWfTSlQGa?ZdUli[iVXUg^iVQlVkZSnTYdRnR_[e[bYaDjBQjVFFN_[@C???@#98G_!4?I_?Q`AooP!8?O?__O?OC@JIAUHE@@?@#114???_?_??O?O!4?_#48!9?CCBBA@??@_@?@?_??AIC?@CP?AHaGT#114!7?B?@??@A?@BEKc#116!8?A!7?O@?H???@???@@!4?B??@@?@??_!7?_[AGD?_#127!9?@#107!12?_O!5?CO!6?CGS???c???F#59B#72!5?@!4?Sb_GAhU?C$#239!72?G!5?OO!6?_?GA?A?CAO#246!19?G_!4?C!75?O??O#104!118?C#237!16?S#246@#37G#48O??AC?@!4?_#80!7?sI?C#48!4?_??o??CK`EHE?DA!8?A#114!17?OG#99!17?hC?GAG??C??S#59!6?A?@??@?A#55!12?C???_!4?OA#149??G@?A#103!55?_?G??X_ADPcQDob??PUC?WCW_?@OdOc?Es@??GCA$#90!338?A#101_?gK?C?A__G!35?B#69?_#99@#250_!7?_O_?_??O_#40!39?A??A?@#52!14?_!5?O_?_?G?A?@!8?C!6?@??A!8?OAG?O#118!54?OO$#70!339?C#75C#16@#77OA#100??G?C#130!130?G#136O!7?O#119!78?G$#123!340?O#95!6?G??C?B?g!8?_??C#144!113?_$#80!347?@-#237CP?GTOI?dGaPk?Yd?aOGD?cOGDA?TgAOHCQ`CGPaCGPa?TGaT?IOdIt?tI`IsJcHoHqDGTI`M`EhBoDO@qHqHShUgU_S`OG_???O???_?O?@??@?A_GA_?@_!4?A??AO???Q?CO#239@?O@C#105!13?@??@??cH#192!22?CO?G@O?G_?@?A??_?G?O?_@???@C??D?G???C@???_???@CQG?_?G_D?a???G!4?_C???OAc??S_?G?GO?g#191!11?C??_!4?O!14?O???C?A???C??C!8?A#239!4?O_A?@@#56A#101CSO?O?G??aF@O!4?_!8?_G??a?_O?_G#53@OIGc_#250CIcX#54?eD[SSWCCoQ?@O@?_?_O?O#250A?G#72?@@^^^m^FJFB??CJCBEKE?DBC??BOA@OB@@@!4AD?DA#59???@?CO#121@A??O#52@EG@??A@#144??sO@??@???A#136@#149??O???WOk?D!4?`O?C?A#125!5?_GOkzg\QANEa#126O#112?I?D??A#115O???@?C@?QGG@C?HGI@_x?OC??B@@Eg__kA?@#72_OGCScIP?G???A#95?_?c[QmSoe#131mSyojSq$#246jCPaGDPI?TGAPc?ITGdQgQHdQg\iATxEqhKYreKXreC\iaTKivtnYOInIo]T@sYUDeGiQi_UO?oCWEgEgC?C!4?@!14?O?_?O#184!4?cHQcAhS@???A???_GQ?AGQG?O??A??A_C@gAOC?O!5?G?O??OC@O?@??AOA?OH_AG_AG_A?@A??C??AO?O?G?CA?C??CGOA!4?_?_?AD_??GaSICXc???@?C@A???OHqD@qKbKROhQc@?OIPAH?_@_???O?o?ShCQGcO@aG!7?c?gA_Ga?Ga?GA?C?`??_?O?_?_??Oc?O?gSg_Tc#96??GC#244WCA#102?G?@C!4?_#48???CICC?GOCO???k?C?O?G??C?O__?O#69!6?AE?A???CWGC@BQB?@???__?OO#114??C#77y!8?K]SGOGWO?O@G??ACG_@CG?O?GG??H?H?lQJUI___#69A??_#140@AGO??@#74!4?GGiaEqi]G#130!5?G?C@A#140O_w@M\??@Qw?PsHQPUU?j#132??A?gS?XC_!4?@#114???_o??B?EGCcbQOG?@CoAA?_OG???E?C?O??P#98??_ow!5?ACG??`A?A@#93gO_GO@aDJSjL~$#244O?aD?A_COA?C??@#202!34?G#192???d?O?@?_I?@_?O@?C?@?_C@!6?@_?O_!5?AG???A??A??A??A!14?Q?C?G?D!8?A??g??G!9?@_?G?O!9?AG_C??_C#246!20?C?_?P??@?A!4?GO_?O!5?O??O!7?O!11?CGQc@?O???AG#105!8?@??DAGADICI!4?@A?_HOAlZulJcHQDGTaHQcHQdGdAgQGdOcHQG`IPCHQdG@S??C???_CGC#41_?K#75A@#72_?@?@??Og}h_G?cC___OoO?wOsitPAH__?O[k_S#62!5?cgHwb`___qIG??GAIHJHIHg_#102!6?__??wowo!4_???_?_OO_O!4?_!4?_?W??O_!4?__CO#119@?KGO_#54_#38@FMPaOAr@@!9?__wg_{zelBN?[@?`C?@BG?@C@#55???@#73???CACg?_PA#118??WWGkwk]HRoswo@`R?GH?Ooo!9?A!6?KMI#134!4?GO`A#100?@HE[{]\n@?@#134@$#240?aGO_gC_I_Dg?YcOiTIdQlQGdQ?TgAChCQ`CGPaCGPi?TGaP#184!9?C!6?G?CO@?SG@AGA_@O@O?QGAHUgUg?_?@C?_???O#246!21?_??_???_C_??_??C#239!56?O@!4?_?G_?Ga?_??G_?gO_G_?g?_???O!14?_???G???G_#198!11?A#193!17?O!6?_#208!34?@??G?@gC#0??A#193G?@#121@A#95I?K@?C#53!5?Oow#114!15?_O!4?A!7?@?@#148???G!9?_#49??OO#48!12?@!9?@#114_#108_#98??A!4?@??OA@#100GA#108!4?O#114!9?PIIOoo#49?C#128?O?O_?@#63!4?EO#37GO#152?@?C#129!11?OAA?A?OEK?RGG#121!13?o?GL~tfaaB@B???KG#102??C!4?_aE??CC?MFbSlggwGBMM@@?OC?@#99!13?OWaC?JFHOH?C$#218?GC!4?P??O?A@!9?A??_#193!37?A???_!4?O?O?GAgCG!7?@???A?T?GD?GD?GD?GCA?K?PC@ODOGC@G@O`?OG_DQH?G@?gA@CQ_DQGaTGaPCGTAoAgAsAOChQCgPCR?xEHObSI`SAgDQG`I`U_IdAPI?gO@GAP?aDGASGD?G?@G??@C?H???@ISJcYcGDOEHQDOIOG!5?QG???O@???GPi@?S?_?_#137!57?@#104!8?`#37O#40go#88O#93GCo?O?G!8?@@?@@?@C?@!6?C?@#59C!4?@!4?A?O!4?@?A?@!6?A??@?BGIoA!5?O_#101?C??@I@CQCHQHKacJlysNKWESK]EDDLCIEIOd?G#115??@?K#132@#125@BAK??_#56I[_wKW?_?@@!5?EPCC?A#116!6?_o?MG_??c_AQCMH?A?@#119!13?SOC?@EKA???_#107??C!12?BA???o#59O#77@!4?_$#202!4?A#239!68?G#196??C???A?C@C??@??UHSgpIGDqGdAwDqGtAxNqVGQcHWAaQktQlSViTFGhSddQlExEwhVwLr[AtLizeI|E|FsJlJqEhyFkqKzChSjKaT[b\TqLtYc[`]`YtKdiELqeXGuPGvP?fOlUrKVQLUpGURkVG`@_A@IrGexQkoNonDQCgQC`CpCJCcZm|BcCgUiT]QLvTitJtjUzluXnYCf\QcHQCZQlQtITSlRSlQtIxVKrYLZelR]TizeHYf}AiTRiYVJRp?A#35C#134?_#98_?A?G?_P!4?CB@WOJYKIAIBCJ@?I?K?A#41A@#40???CaXXrsW??O??AAB@@??KK?KCC?ECECDdF|yC_#53!9?@A!4?@#73!33?AKG?__#142?C?KC?eA@!5?`r|WMBBV@#52!8?_OA!4?C??G???_#103!21?_??BGQG?OcAT_E@IXCpGG_OSC?@?O?Q?_?BB??A?CG__$#239!84?_A!4?H?ACA?TqGdAwDAGDAgCo?g!5?C?G?AG??G#237!71?C??C!8?A??A??A??A??A?S!7?_!10?@!5?A#42!85?O#99!4?@?A?PGGO?A@??AAC?A`G`OA?AD?C?A@?A@#39!15?G!4?_o??OoO_??O#103!18?O?_???_O?GO!4?_?!4_Oo__o_Oo?Gs@SI?C_#81?C??O#145!11?CSgKS#55!20?G#128_!4?!4_HSCQCP_@@#101!38?O!4?@!4?WKEB`JOc^Sqpb@$#103!339?G?c#85_#41!8?A!5?CC#77!8?O!4?E?B@?AA#250!14?C#92?__#119!168?o?C$#100!340?a?UAED!21?@#102?GKG!6?CG@#53!15?C???C$#133!370?O-#237\_SI`@CBOM`SIh?SgCOi?SigTAhSBgSBG?T_AH_SAH_SA@gCQ?OK`ITiChS`UgEpCO_HOcGqHqCiSGO@aHqGSGOGPgOaOIO?OiO?A_GO_?HO??AG#192COA_!4?Ag??Q!4?CO?@_??@O?C@?AO?AO!8?Q?H!7?G???_@C?_?@??C?H?C?a??Oa??S!4?Q?gAO?COG_AGC@G?AGCOC?_C??GCQ_CG??@?AO?A???OA?c?A?@?C??_C?g@cHAGACGAO?AO?AG#191?Q?G?A?_?G??O?A!8?A??C!6?_?A!8?C!7?CO?A#137_@#34_#37O#59_O#101_@S???s?iSgQcH?R???QCHCOCGOCOaHOAOICA@G#103O!6?O#69???C!5?AAE?AC?C?E???A@#103!4?@???S?CA??iAHCAaC?E?kQUAqA`g?GgcGcOCKQcOCCGCHC??d@T_C#69C?ECWO__#55@?C?CGG?G?G?G?G??A_#125!7?oo!5?_!6?Bl}WUWNK__H#112??_?OA|QC#115gC?_dGQHS`cO?A@AQROKED_?_?@BS!5?A#121KKA#134??hCIC@Fg?gAw?CI@CA#95?@?D?@!6?@C$#246a\_SAY@c@OI`SAh?QgCOi?SAgTAhSBgSriITkQJhsUJhsURhluaq]t_TZQjMhTPMIlJuDZQDUCx?AcGuGS@e@aC?CADGD?@A?@?`?@A@#105!56?C@A?D??D#246!24?_?S_?C!6?A!4?O!6?a???_S!5?_@G#105!43?c?@GOAC_@iCPcOAcHQDgD?IO?hQcHOAChCgQcHQdGQHOdQcGOg@ECSJ?C#53_#48G#72GA!6?S?jSDBA@?I?DLHABFGFDAF@A?cecrW[EAA?C?A?@#139???A#62???K@L?G?CG??C??C#102oOK???_A?A@?___C??O_pgSoooqQgggKC]UG_OOsOGO?GYjg_?G?OG??GIYqg?_#121@#81B?K?O?_#52?G!9?OAS?GO_??S?C??d??A??@G#55C#127!6?@#132___R[?A#143???CG#119??_yS#114OhCQ@K_JSGF?CA???aO?AL!4?K!4?wbD??C#99!4?@!4?KC[?woOyPh]cWa[YcYLidugQ$#218?A@?C?OG!6?A!6?@#240!15?_C#244!6?G#252???HC#184!11?G?@?O?G?c??HACGO??@aGOGOGOgO_OaOG??OA?C?Og?C_G!5?@??H?c???C@?GCQ`?A?G?C?GC?_O?G!6?T??S?H!4?C_?G_!4?SG??O?SGOaO!6?PG@?G@?Ag?H!4?CHa@?C?`?_?cO_@?@G@QHA@???@AOAs?G?G?OcI?G??P?_G_O?Q?@??C??O`O?`?Ch?Cg@_D??@_OGD?Ac!4?GcQ?gQ?O_O@O?G@Oa@???O?Ga?Ga??`?GA??@A?G?C#193O?@#56C#102AK_#77!9?gWs]kSLY__ooGoo_wg[SnXHP!4?H?D_#250??C_CEKGeWep_O__O?OOO?G!5?OE??G#77_?OaA?@bJD@CA@@BA@@?@@@?@?@?TC@?A?AQ`??AHU_u_V`Ys_#115??A@?G?_#132@#140@AC?GOOOoOO_OO??oGOCg?NohLQEDGVAXIIcr`Xd[O???@#73??_AT#126_DQ???D#107??@!9?G??G??C@#77??@??A??IcO_?_IBOG#125o#73A@#131!5?@!9?_??O?IcW`CP_Q?G$#240??A`G_IOe@SI`S?h?A@??A@#192!27?G???I?_C?O?A_?O???_??G_??O@?@!8?@!7?_C??G#239!97?O?G!6?_!4?G??G!9?CO?C#192!75?C#208!22?@#0?GA#96G#64A#77_#99@!5?A?@?@#103???_?_O_!4?_#48B?A!8?G@??C?A#54!15?@@A?A?A??A??@A#101!21?@??@??O@G??VA@?B@a``?@CPQ`R?A_U#119!7?@ACKOO__#128G???_???O??__?__???o??q_HG??w__TO??_ABkQ@eGFO#121?@ISyl^zfwAL#118?BjEQGc?A?A@#102?oW{hgKCaOo?WIP??A#72@@O!5?OGdQ@CG?G#103???@#93!5?_?`OB?A?ID?DAHUh$#244??G?OC_?G_!4?SA#202C@_C@_?T??OA?O@?CP_IPCOAH_SAH_CQ???@#239!12?_#193AC?A?@!6?AcGO?C??@aC?CA?G@C?@?CAOC@CIOC?aHO_Ag?\AgQGODQcG`YdQG`MOCIOcI`Y_[`CH_CH_IT_IPcHc?cHOI_GQ?cOJSAwBSIOmOJOe?OHOKrCGTgBGTi?L_@CH_@AD?P?w?EODOA@?TA@OhAh?GAPAs?wChCpKRcHcGRGdWcRGqCZ?RCIO?cO_P?_@Cg?D_@aCQ?GCa?hOI!4?aG???_??O?cG!5?_???A!6?G?C#237!11?_O#218C#80O#93C#103OOG#53!13?@A??QCG???G???_!5?CA@?D?BB?@?A@?@#39!8?@@@B?@?@@@#115!29?C?_!5?G???G#59!9?@!5?D?O_#73???BAK?O#142@@???A?AC@B!7?@#103!41?OH?Q`S_?QgF`?O?_G?`?OaP_A???W?C?O#98??_OICyoq??Fa?_???C?A!6?_??_OO$#252!16?@OI@SG??AgC?gCAg?C#193!16?@#239!24?@?@A!7?@a!5?_?K?C?CGOC?CA?C?_#237!89?_?AG_?G?A??_?_?_?G??GA!4?@!4?A#246!97?A#204G#239A#244@#130@#98?G?@??@A??A#40!6?_#99!9?@#102!8?_!7?O_?__#49!14?@?@#72!39?A???@#49!25?A?G??_#74??@#50_??_#116?O!4?P?O?K??H?AQgDCT?ICYEW_#59!36?C?@!4?D!5?C?@?C?@#100!8?wOOPR?EEJ@CGC$#196!76?_???C??@aC??A@GD?CaPi?hO`I_APhQb\UlVxE|AsVHvlQhYdU`GKrKpeZpnQ`]@MbSju\ju^_i^`mQcZuZqJsTVgvZi_B{BkJ`e@L_nO~juLaCiTaUgTA@U_JUPaSOKoRKSBMPBGFOmOa[_C?sQhEw?k@GFpErKbGPePvGeWFQKbLhCykRoJuHELiU\iQTjQ[UWhHuU`DWQDOTjmXDPHuDGViLdIbUdYeLWZUxDlRSlQTdqIYdXvnUwhrgOC@#100!4?Ab}~~GhS#59!28?_??_?G?C!6?WcWA]_[OGW?KGG?O??COGHOG_?OI@@@CG_O?Q??G???G#100!11?A#125!29?K?Oo?_???_??_#149???@@#119!62?GG!6?G!6?AP#251!8?_$#95!334?C#114!36?__OWOc??C??_!9?C!6?C?C??FOISCWL_?GOWOS?k?GS?GKGC?C???O??_!4?GC??C!7?G?G?A??H@]Wo_#38!4?A?EAEEKCK?KCKFLAGAFM?A#101!61?CCW_@aE_?G???GfO!4?E!5?@@$#40!371?O?G_?WhYIXWRo@B@!5?!5_oOgwGg___dBOF_CGSI#56!55?@A?@@@?A?AA?B#129???C!4?@A#118!65?O!6?_$#121!397?A??AA#63!75?@@@#69!78?G!4?_$#77!398?_#53!161?C-#237aG?BgD?aSGA`LOg?RKAPCAXCAP?i?SjgU@Ga?T?i?PG?AHCq?@QChQdWDA_QDWdAGbC`IPAShS`QcZcI?J_HaPeWaHA@AOeOdO?P?G@?C@?`C??@#192!4?OAG_A?C?H??@CO?@??C??_?O@C?H?O?G??C?_C???S???@CO?@?G???H???G_C?H?O@?O?D_?AT?AO_@?AC?IO?I`?A_??_??S??@GCOD???_?OC?A?`?O_?cG?S`G??AO??S@?_A???G@ACA@Oa?_?G!4?O??O??A???O!4?C?G??C???O?G??G?A??_C?c#191?A??A?G???OA#246?_#96_WC#77_oWC_?b???C?QCGTID@?A@L???B!4?DFKJEUAEkguIEEA@@@Aa_oooOWOO!5?GCC@CI?EDA@`???@@@O?`KL?qJJCOKO?G!4?_#115?@`_O_@_@`??_#114!18?C?C???@@?ACKog#125AGCD?@@?A@?DEGQC\CGpSkS?_DKq_IWCysG?eQLzdcDA#126G?L#118?owoq}zdFLCW#102AAKACcwYpG!5?@@@?AB@!7?@G#107?@#99??_O?@???_~LvJaHA?IPIqlRkdOGMdcuQR$#246TaGSBgTGaTGAoDAgCPkAXcAXcAT?i?SBgUtLiiTTiAt\SqXLuudyUkIby\LlifYhu[Y[tklhAAYCH?P_X_UCWCG@?O_Gc???GAC?C??I!5?_!75?_???G???@A!5?_@!4?OC@Q?A?A?A?_!4?_?O?G??`?O??C!8?S??C#105!23?_GA???@A??IO_@S?i?S?H?A?T_A?AGQ@cG@A?A?Ah?SdGPA_I?C?WK??@#98O!6?A#114!9?OgUP_aosICWd??_!4?G!4?G??OOG?C??GAAAaCB?i?Q_??O!4?O_?KKWSI_YiedBA_O?GoC?gO@_?OG??@!4?@!8?A?A#59!17?A@G@??B?W_GO_#140D@!4?@??@?@AC@??A?@??LJA@HO?BG?B@W#73?G???QqGT#112???GA@K@#115C?O?Q?C__OPA#77?C?EP?A@A?CA!4?a??B?B#100___g_?_O???_#131!4?oGSDQ_T?aDG?kRGdO?G@?c$#244G?T_?OAO@?_S?A?T#202gA?_A?cA?_?S?h?S@gAOD?i?D_A_HCa???G@!5?_#184!5?C??@??A?AO`?`QcI???H_?aOEGA@AO?GcO_@!6?c?Q!4?TI_I!4?O?O??C!4?GCO_O?HAC??_??C?C?D_?P?O@I?@?IO_??GC_ACOC_?c?A@??_C??CGA?W???_GCGS?p?P!6?G?GCHS@?H_S???_AXEGE?bGOGCGAH?@A???C?_G?H_??G?GOc?u?w@oGCGTGV?eP?BGCgCI_W_T???_O@_A@?A@?aGDAD?_A?_?GCO@O??_???_CPcaG?@#237G#0_G#73G?@#102W[C?Sw!4?_?_?_O_?[???C?AG~^IOoo__wwOO?TG@??C__!4?G?`__?Og?KOAG_O?GOG??A!7?G??a`@!4?_EFFfvwEYmUIMEJSMUKG|Ldx{i\z@P@?!4c?CC??@@AFUEe{{_O#81@?C???S?KO#54?_#128???DHA?ITMiPG_O?A?BPCRDGseX_ACO#121??o_~o~FDM@#103??Qg?_B?DQ@iGD`IO?wO??MG?@K!6?QSTW?A??A#134?Ia[@zSH?A#93?_GcXaTGo@Q!9?@$#240?PA?SA_CG_DGAgOA#252?_PK_X?_XKi@SA!6?O!7?_???H!9?O#193!4?O#196!9?GC!4?P?C?A?G@?O_G?@eOBADOCXCiTHIPCj\vAg@SPeXvIdm@nOrluXeRgJDIvcSxjSJ\aZ`ZaYDYeLakPsItc@MrKrAXShaHUXA\_]_^?ZdYr?T_DAtGFO_@aAK@iSa\dWv?Rc?O?sGS?IDqL?K?_?P_GQCb?Rc?uG_\bGrGBSb?UHudQdIBW@IDIDQbPaAgtGiPs_RSiOTDV?jJy@lCZGuSlGm?TgxOvLsZTmpRhmHExHYtm@Z?RHdfQDF?@#72CC???G!9?@#59??GC!5?G?Q??O???O!4?A@?PG@Ca??OOGG???CBDBC@A@!7?O!6?cOWIc[B?Q???OBA?G_??AO#107!5?G?GO??O#115!29?@A?C#49@?AI!4?A?AAAGO?W?O???A_??G#55??C#114!25?G?qH_XG@_?PA!4?A!7?@!5?C#121C!4?@#95!15?O?CG_C?C???A!7?G$#218?C_G??G@?AO???D#193!13?@#240!11?OG#244?A#193!5?G#192???@OC??A?O???@?_A??O?C!6?CA???@??_?C???@!5?G?P#239!84?GA_?AO??O?G??C?G??A!9?_???G?Q@??@!9?O??S??S!5?O#191!23?C???@!7?C?A!5?_?O#198!5?_!5?O#192!16?O#239??O#24?OC#16@#101_??`C@@DJ^LJVACA#115??_!4?OOc??_?_#72??@???@@!9?@@#54??C#250???C?C?A#103_?_?O?_???_??@_T!4?O?O?G?COjC@gOOG?DHCPgSP_Sa@gOcAQWE?Ta?wG_h@@A?C@QC`I?g??O#54???@#121@?A?O???Go_?OO_???_#132__!4?@??o???___!5?Do?AHGDA?A#119!11?C#107_O?K#101!4?C`mDluKOqGe_keTIFO`?ACQOACD!5?C#98!17?OIfpQYHGc$#218!41?C#193!33?G!4?_O?OC???@?OcG??G?Ga?a?C_Q?i?OAGsAsJcHc?TGPiOeGQGaHcQcY`GQHACiOaS_M_T_Y`GQHQcJ_IPmOGbCwE`QLq?eXaT?Z_U_IcGfGQ?\?_G@ACGs?g?@CaOCGdGQhEHA`AT_O@aGoAXAGD?`?OGcHAHQ@aGA?vG`KaHaGQLOdWf?s?oGcGCGT?APCI?DgA@cG_G_C?CGAO?`?AO_PGA?C!7?CG?O?OCA???S?cG!4?A?A#97A#53G#41A@#48A#115A??A#40!14?I@#119_#69_#101!5?GBC?@?@?C#69??_??_?O[G!5?A#72!10?C@C@#101!16?C!12?_!10?A!8?CAAQCQG?Y?_!7?_#119!5?A?CG_!6?_?_#116!6?@!5?OC??CGC!4?A@!4?G#72!31?Go??o?O?GGdG!4?A??CH?D@??W?hC$#239!80?C!7?C?CO?G@???Ga?aO?_OCG???G#237!80?cG??@?Q!12?_G??G?A!4?C?C_AOCGCA#125!94?_#56?A#103?_?W?gCyo__O_GoGE@GAODI@?@!7?G?C?A??_??CA#121O!4?CC#77!58?A!4?@???CcKQGQX@zYhzYswSoGgW#69!4?A?O#73?oYiuAK[KKWo__???_???A???o#108!46?@#98_??G?OO??o_?_??CCWqWIc\aE?AQ$#121!330?A#69@#122?O#53!30?@#115!6?_?OG#53?@#118!62?@#128!34?@#132??_#50@???@!7?A#129!6?A#100!52?C#134O!4?O#108?G#118G?G#115?@$#40!372?G??A??A@@@H?GGOg@[PeHrIiPeHaPqCiTI?C!7?C?_#112!142?G$#119!372?_??G?CC???C-#237GaC@IU`SGAc?hAGP?aOD_?D_?T?i?DIi?dOI?DOI?OI`CQH?a?SOdQcBG`ICR??pEO`SgDq@w@iTITITiSg@ATiSgSgUgPAO`O`GdIO?ITG??K`C#239!73?I?O??H!7?OA!4?@??@?a?GAO?a???@!4?P_???A?O?@C?@C?OC!7?@C?@?_???_!4?_??_#198!4?C#105@!8?D??G?ACG?A?D?I??iCO?CO_?GA!4?AC??HACI@MG@??@#72G@#103GmJEAW?O_@JfPF`SE_??O!4?O???A?C??@A???C!7?C!5?AC???C?@?E?A?@?C???@O@O!5?OC???_??@?YCgC?hCQ??T@K?BAG`AI?S@HSAL?DGBGEpGGG?SBShAS`!6?_O_#115@G?AO!6?GC?GSG!7?_?_O??O_O#126?C!6?O!4?@#118_gop\Q@@Q#102??WSg?G]DFFIFC#77@A?@?O_??_??O#108???G#251C#100SWKXEV[}}ko?Q#93_?_gQHuhqt[aWaH_???O#134??c??_O$#246TGaS`GI`SGBSOdAgT?i?Ti?Ti?T?Y_TDYIdtyiDtidSYjcu^TaimYLX{REtxk^VIwnMjRYKmASS_O__?@ADySg?A?B?@C?_?AGCO!6?aS!77?_??A_??O???S@??K?O?OCi?G?O?_?G???_GO?G?C??`C_?C?O_O?O?@??Pc?@C??O!9?_#191!11?G!9?G?A!4?@!10?A!4?@#153!15?A#208_A#35OC#118OC#101C@CG@A@#111??C?G?G#107?G#118!4?AA?O#72!9?O#77???@@@!5?E?BAAB?@@!6?C!4?O!7?G!9?A?G?G@GIC!7?G?G??A#118!7?G#77!11?AACECJ{jUljM~PNYs_O#40_#59O?ETG#119A?O??A?`?@B?ACO_??_?Ko?kSG?O_oo?O!9?_?CME#114_dO?_J?A@?@?@#122?O#100oO_?_o_#114!7?B#107A#98!7?COEPGB@@ADYKJM@!16?DpmJhdP_$#244a?OG!4?A@OGC?_C!6?O#252!19?@!4?_G@#192???_A!4?A??_?@?O?C_@O??@??G@?O!5?@?O??_???C!8?O???G???H!4?@C!5?@??@?G@?A??A!7?A???C?G??A??@?G?C?A?C?A?@?C???G@C??G?C?G@AC???D??@!4?oCP??AG???Ca?GAPC`?G?@?_DO?g?SG?@?G`C??c?OC_I???_??C??C?Q?DgT?DGDOChA?`?O??@Q?@?A?_!21?G!4?C!15?G#56_#115O?OO!6?K?o??_OO??GG@`SP?Ag`_WSaWOE?_???GC?C@??g??GC?C??C#69!18?A!5?H_#72!4?G#69!11?C#101?G?G?C!20?CA?A!4?O?O?mOdGO#114???APisk_#125@Oo#118!4?_!4?_#125?@?A!4@???@???@?BELL@AN@#112_?O?A@!5?@#59!6?C#101!6?W]@@op?GWfOkOc_tPRHjbb?_?_??O#72?@#131??OKV`cGQCGaPc?sQSjS_#100???AG$#240?CHAS`SI?cG`AGPA_O?o?O_?O__O_?_O_O???O_?OI_#193!6?G@!5?C#184G#252???_G#193!9?CA??_??_??ACg???A?@?@CG?GA?C??D_???aP??Q_SrKqGqHqLqSiOcWaSaSgDwDoCxA|AsHsIpIoFoLoHuGqDqPgDwBgTgEwBgTaSaOiPeOjOeOgPOnOGQsGOAsJ?I?Ps?@IoDG?T?c?GAS@aWe?G?TA?@?i?SAOIOJOI@I?PcI@M?jOi`Ao@GA?AGQ?aGA?OCWA@o?G?CG_GC@GOIC`?I?AH?AG?C?@?C?B?C@A??HA?C?GA?C!7?A#49_A#102__OopCCMbFACOM?MBhRVo!7?EB???A?gGLMIABG??C!7?O?GHI???g_?`@?C@?BHCA?O??O?O???@^VUT]c??@AOBO?@`p_caOGCdA?_@??O?`ojifkFhK@`pp_#72!8?_#102?B!4N{_#69?@?W???GNErYsico?O_!5?O?gO_!4?_?_#140A#115!9?O??AG?o?c@?_CA#72!9?KGA?E?AG!6?acQ#99!4?G!7?_O_A?GQ@?@??GAXALjSjIMPOSQMN$#218?P?_!4?`O?A?OC!5?G??G!5?O#184!42?@g?IDACICgO?@ASgCgSGQ?P?O`?@IcA?DG?@?_Q???CAG???GADGC?G?C?C??G@??G?CAG@?HC?@A?@?G?GC?A@?@???@??G??@AC!4?A?A?@!4?H?G??IcIsJ?A??aG`C_BO?P?_???O?eOCOA??a?R?AOCi???I?A@A_???OIOIOa@Io@G_???A???A???GCGA@?c?GcW_HSA`O_Gt?SG_SGaSAh?Ag??DAGO_Q?lQGaSHaHO_AOdC@#237C#96A#40C#114G@???_?o?O?o??_?_?C_MKgg_oCIPC_@`hGC??_?Oo@pAwW?GKO_MG_@OcJOlA[G[GmA{q{Aice_FZCIlAG@k__@?_Od@o@IoCPgOC?QOGCPQ?wPSAW?aW!5?_O?OO?G#81!20?@???E?o!4?@?B!5?O?G#118???_#128!7?@?A?@#69!8?G#103??_?C?K`ABkb_ygGdWb!4?A_O_OFOlJ^IK#95!17?O?C??CGA@C@C$#252!16?IHD?AD?AD?I?D#196!49?O??@!6?@?A??i?b?CWaOPgY?aTGCBKhUjGpDuHuDoGbOnReXbWjTqEwNrEx?tIsApMoLoMqDu@qLoKiUwFwUgVoFwUgXb[jTkPlOmPmT?e?dQc@?@??_K`K?AGQCG?aCGFPKbCH?HA?LOfG?CgC@O?`M_@cG_K?ZcI@c?`CG?S?M?VgVGtGvWDxULrAtkIuQlrQFTqIoEdPUGpbsSjoT`xUSxB|waXuc\huOlpXbsSojT{`OYC#239@#140G#70@#77AA!4?@#69!15?@?NHA!4?[???AOo???GCA??_OooC???C#115!21?___??c@o!4?_!6?_CAg?E?A?@@O??GDCi`eeHC?C??OO#59??_#121!24?C_?HD?OGC??PGKM[wS_O?KABCKMMG?WgO_?o_ow]|M^@#107!4?MMGOqCGOOO#134!9?CCCHCC?G!7?_???_?_???@Ic@C@$#202!17?C?I??I??I?D?I??D?I?D?I?D??COH???S?@!4?_O!5?C#239!23?@!6?CGC?A!4?D_???aO#237!82?AcH!4?_?@C_???O!8?OC???a???GAO?G@!7?_!5?O?O!4?G?C?O#217!66?O#240G#132?_#59!5?O_??G!7?O!9?SG?@?AC`ODAOs_?oG{?@@??_O_aWqaPsIO?@_?o?w???sOG@K?CJTAOEIO???A?AO_IS@G?A!7?__?O#73!41?BEN?_!8?B@AE?G?C?@?AA@@FIEC??_IG#98!30?QGG?B@$#218!322?_#108!8?G!4?G#119!12?E?C@??_G#121!11?A#40??A?C!4?O!6?`AOAPAC@?AH??@O??G#118??_#119!21?A#107???_?G?C!8?AOOO#132!30?G#49_?O#132!11?@GEAAA??@!5?@?GOOCC?E@A$#119!371?@!5?G#49!116?@$#101!373?A?@??@$#53!376?@-#237aGOCgQCKQHCaGeQhCG_SA?HcOA@OC_I?aS?T?I`OH_SAcPKAG@OhCh?I_S@IaH@?i@QdGtAShEW_Y`GCHUGRKOaSbS`WaXaHe@eWaC?AC_IOI@CA!18?C??C??C??C??C!18?G_??_??_??_#184!13?Q?`C?A?gO?A@E_F_AgDOGc?I_??h?O?_O@?AD?_OcG@aKB?_PaWcP_S_EG?aI`A?H?C_?_?A?_OGDOG?Q?_C??OCXEHQC`EGHcIPe?`IS_TI_TGQhCaPCHAhCQHcQHcQHcQHcQH#246_@#56OOA#115C[?}K_OgLdBGhPPGCcbW_bSCAMrGo?[`Qk?IS!4?o?CAG@?a?S_?_!4?_S_#77!4?OOG??O??OG#115PhGGgAO_GGO?LG?G??_OhGOTcaOSAgE???G?aOsOCCC_?qAOQOP?_#77CGK?G@?@?B?F@NYUlsWEr__OC#119@AG??_?I?p?_@!6?__??_O???GEI@H@#112??@#107!5?_!4?@?O?A@#101?!4_WsB@!4?swNI?gA[PKJCISVIZa]dQoA#98??_#99?~nAOCO???gOG??O?H?iS`QPoOG$#246TaGPCgR?cQHCPGCObSJ_HuOALoM`IT_\?jiiTSIeOJh\Iep|VyjUZU~TJisT[umfTukYRIlhAPdNdYuhQ_dc`n?@WAKAC??O?W!6?GOC`CO#239!21?P??P??P??P??@!18?A?GA?GA?GA?GAO#237!9?Ga?G!6?D?@C?A_?O!4?_??@C?GA?G??CG?PcG?_GA??P_?CO_?a???G?D??@C!6?@AOG!8?O??G#239!9?c#193!14?g#192??G??O#208!17?@#97_#20C#121A?a#103bD?A??@?A?@?C??_AG?AS?a?@#69?cEXBOl?wC_oOowK{Ylvun\[gCgWkcks[_?_!6?_!4?_?_?O`???O!5?@G!4?_?_G#102?A@H@H?Pp`?_?OD???OqATKCCCLMKLJbBvu}y}}wcww_???AB@!6?_!8?GC?KCM{kW??GG?C{E!5?__o_?o!4_!5?O__GcI?A??C#113C#100IkUkVfZBA#77O?C?g??_?G???_#134???A?A!4?T#131?OK@G`I_T?cqOdIcqTPi]c??_$#244G?@gA@?_??AP#218!24?a???C#244???P#252???_C!5?_!6?O#193O?G!7?_???C?Q_!5?@??G?C?C??O!4?@_GOA??`?OG`]`]`]`]`]`]`]`YcR_Ga@gA`Ga@gA`Wa\a\a\a\a\a\a\a\aD?HQCHQDGRCGRcGfWfWfWfWvdPKrdLiOiO?AoA_H?BGDOI_CI_?O`?O?_A@_A???@CAC`C`?GPaGCX?TGACP_I_O?I_CpI_G??_`I?tAGrC@A??@?GA??A?d???a#237!35?O#110O#63g#38C@#102O?I@@?@!7?G?B???@#118!8?C?A#59??B??IF@??A!7?B?B??A?@AI?Z@|WKJCFTJhCJE???C???C??C_???aDGC??C!9?G?`?@??A??A#107??A?G@#101!6?C!8?@?A?`#59!4?_??B?@??o!6?KCGE?GO?A!7?A#107?A#121?@!4?@@?@#77!8?_#111!5?_!4?G#98??Og?_G_G#72D!7?@?@DI?@C@?GD#93!8?pepMt^iVJDnYdZCiC@#98?HmIDb{Rg$#240?PcAOCGQHC_Ge?hEWbSJsHeXaLoMpITa\?T?G`SHaSA_?GA#193???C#192?_#202???S@I_@??G#192??@?c?O!4?O!6?AG??S??@!5?C???@?O??@??G???_#239!77?A?@!9?GC??c?I@O?g?O?_S@_O@?A??A!4?G?CAG?@!6?a???G???Q?C??c!5?G!6?C_#217!50?C#83A#73@#69G!4?_W_O#59!9?@??C?G#40!17?@#118??_???O!6?O?O#102!8?__#119_!6?_?O`?P_!5?O???O!4?O!5?_#107??@?A#40?A#69???_??G#118!5?O#108!9?G#40!16?GCGAgO#69C?O_@@PM?pA__?@???C!4?_??@@?C?A#122!22?O??A#95???O?OC#100!13?@???C@?GL|~~^i#95???GA#134!18?DASBg$#218?CA?@?_@?_O??P#184!57?ACG!6?CHO?Q??aC_O_XaHa@a?cG?A?_??A?A#246!80?O?C!7?O@?AG@O??CA???@!4?A?_!4?PCP!8?I?G?PC??O???_!4?O??G?A?_A?c?GA??@#239!50?G#125?_#72_#100G#118?_!5?O?cO?A?OG#54!34?O#40??@!9?@???G??AG#118!5?O??@@O?G??OO!7?_#119!16?_#114!34?@OD?EW?_!8?WAQ_A?B@LRUE?@@So!4OGGCW?CKQG@SbOL?HG#99!13?G#251!17?O?G#100!33?G??CV$#196!72?O?A???@!8?G??A???O?GCXASaKTAKpCOKjD]`]`]`]`]`]`]`]dZkZe\yE|Ye\yE|Ye\a\a\a\a\a\a\a\a\q\udXudWvcXvcXfWfWfWfWfG?KQ?W_SADiWsGXOCO?_A?@O?@SA?ECHACGcGOgEHO?O?O_Y?C??A?C@I_P?G?S@mOdGRGCZ?tIDUOdAXdCXiP]dYepSlr[hQ?ZtKP~]tj^it^ivDUzTmze|UzluZluZluZluZluM?@#144G#101O#132@#107?O!7?O#121!44?W?G#103!10?O??O!10?GA??@?A??A?@G??C?GO?A_UGC??@a???IQ?@G_@@I???aO?OO?@?D?@CI?COChQHcWCYCgQg#73@?DUSK#115?PAAP?P`?@@_QQ_@XG?ggEG@I?A??C?I?GDSIGDA?E??OC$#239!86?G!4?@??C!5?@GP_?@???_?O#192!80?@?D_G??G?CO?_A?DO?HSAGaCHASGO?TGA?aG??OCI?C@??A???_PC??S?AO@GA@CO?D!10?g?A_??_?G?O?Q???G#240!35?A#128??C#119!4?O???_G???_!5?_!6?KRHa?K?O!4?_!5?O?G??_?GO#102!31?CACA#81!67?CAGA?_#77!9?O#103CG?C??A!8?O?W_GOOCOI`SiOmO@uHO~\N^R`@??B!5?_tzVTbmQsqo_gC_O_O_$#114!330?EKEAOGeUGefOWSFWGbX|o!4?_??BCpJDGMEB@@!5?B?BCFA@BA@@^C}AeBCR?icCrCPMEEAE\mAdr`IocfDwvYFERBiPKEgS?_?][U[LIHD`hGTG?__ha_PAo?_!7?O#125!16?B#121G@?qC_#118!13?_?@?O!4?CCCEAAE@B@A!7?E@$#59!330?@A#49!151?G#77!23?_?_$#101!508?_-#246TGaDOi@S_ICPI_DI`k@iSAXDgU`QKbCXaHSqhDyDOdKqFQyH\uQJmx\VTWtmDioInIoYnIdSRLaDIO?_BH?OCWLY@?@?`A`G`Go?pGPC???A@?_?OG!5?O#237!9?CP??P??@??@??@#239!18?AG?aG?aG?Q?CO?C#137???_??_??_???_#184??AP?_HQC@?dGO???h!4?ITAPATg?O???PA?T??E@aS_DO@C@??O_ADGO_?TAS?cA?_???_@OcG?S?GOC_PaU@]@[`^?E_H_R_DGcI?kAoBgR?KaDgR_GoAgOaGoA_C#105hA#218g#64E#114G!8?{XH???CB?_OIdFPpGQJCAV`Go{??@#121EAE?AC_!5?OH_xGS?CGO?@O#102?_aOOOWG^GD!4?C!8?A?@#103@!8?@???Q_?QP?P??OA?_?O???OQQ@QEG@OGI?OCC_G_GOGOkOfOG?I?@A??@#53???WGO#115??A?A!4?@GIG??C?A?@#77OGQDBCA?BCBCHSo?WO???_!6?_#100_?_gw{|MFB#102?D?C!6?A?E@ICG_#77?O#100?O_suU~#99~i?~dgT?OG?aPI?PGDQ_EGaO??_OC$#237Ga?OiCSaITpI_DY_SAOC@gC_Q@GC`OGa?SaHCQ??i?Q@OgDSa?HcPCA?AdIPiTIt?tIdOdY`KqCgTiTIs?zChA_CoKoMOKOEOE?E?A_IpKPcGSHE?a?A_G#239!14?C??CO?CO?CO#237!18?_!11?@!18?@??@!4?DO?G!6?_?DA??PA???A?PA?`I?cHaS_D?_?O???AOd??G??A!7?S?_??dG?C?O??O!6?G?O#208!38?S#237@#70_#72_A#118_kR!6?_S_Cb_oWID?G!6?O!7?_??_I??OC?G??@C?C#114@!5?C??E?OAAIaS?oAGB?IACEA!4@BPB???HDCFBB@OYMr@Rh_GQ?}niwOYVbYAIM?HOKH`w?_?G#72!8?@!10?w?wswso_O__#102??C?WOOo_o@??_OoOGKCA#72?_WGWSg_G_#102??FAFBLntIVoM?J?@#98??O???A#95@#107?_o?_G??GO?O!4?_#72!7?O#134G?@#131??S`?WA_ydaT[CtiCqglZwTKb#134?HA`Oc$#244a?DG?@?G!4?C?_#218!28?G#202!5?Hc??A??_#192A??O?D?O?D??O?G_?G?_??C?Q?@A_!4?A!9?C!8?A!4?_G?A!76?C!4?GQ??@COC??PAT_???g?@ICOdI?_I?cH?S?@O_CO?g?A?DGO?CAG!4?H?O?AgC?I??PA??A??I??G??_???_H?Q?C?O?@O?@?C??C?P???C?@C?@C?@C?H#239???E#83O#56@#115oC@GrGc?AcS??b?S@AcOI?i?@dOQlGU`M?t?AO?O!5?_A@!8?_??@?EOT?L?d?__?gSGEOG?`CAQAAO?SAALA?@?COi?D@KGCCDEK???D?L?gCDDC@KCA@oO?@O#101?C??_?O?AD_A!4?_?Oc#114!9?@?EG??CCG?G?@O?GOGAHA?@#98!4?_??O#53??O#107!11?A@#122?_#72!4?G?C#113!4?C#108??C!8?A?ACGC?S#98!6?g#93??@M?ATIDITi@i?TiDQ?C@A#100???_OK$#240?CO_DOi?T_Ic@Y?TIPmPiTaYDgUhQKrC\aHCQgDyDY`CgD?a#252???O??_G#184!15?A???O?DIO?_Cg???_CoGOKOCOE?E?A?A_IPCO_G?GA?A#239!83?@!7?G???@IO!4?g?SG_G???C!8?O?C!7?G???O!4?Q?_???GCO?A?PA??C???O?C!5?C??_#244!34?O#97G#81C#59HA!5?O#103!4?@#102!11?o#103GC@#54!12?_!5?C#81A__oO?o?BA??_#59C?_A?_??CB?FOB?@@?A#121?o??C?GGG?!4_??OG#102???O???Q?_?A!8?_oo!5_??EkC`rJZZJFF@??@@??FB@#59!11?AA?SC?G??G?W?_#103oOG_GctAID!7?@???j?@?CaOIDgLo~S^E!7?owONwJalUfDeNt|x[Orr]hBSI?A#95!5?O#98!18?_PK~ULAjZ$#218?PGA???@!4?O#193!42?_G!17?@A!9?CO?A@???`A_?`GO?pG@??AG???_HTHPK@tLa\a\a\a\a?G_I?cQGcQGcQGcYdYdYdYdYdYdYdYdY@SaHSaHSAhCOgEOJSb[BSJSb[ATiDY`[AOGQLOA?Gd?aH_Ci?G??GtAC?S`_G???T!7?I?I?I@C@Og??AT_Od?\?u?cJ!4?P!4?_G@Cg@??@_A@?@C?A???@?@?C??C?O??P???C?P??O??O??O?_#104!5?@#125A#102C#107@Q_!6?AJ]#59!14?G#54!29?C#103!8?_#118!10?@???_??_#59!7?GA!8?_!5?_?O??_#119!7?@#59!4?E?A@O?_??C#48!23?_#69@@B@A??CC??A???@#101!4?o_olYcQdjCYsJu?G{_gO??O!5?_W^~FVBB!5?A?@A???@!5?@??@AkjdN@H$#239!74?O!6?C?A!5?A!8?@G?C!12?C???A#246!83?A??A@Q?C!4?GC!4?@???cGO?PAO?H?I?J?iASh!4?a@???_H???CH?@A!6?_!5?C??_??A???O?C?G#133!34?O#112?G?C!7?_#118!84?_?C!4?G?G??G!5?D?G?G@???K#77!5?AC?C_?O_WsiUkQnWgS}dZ}D~FIFJNFCKW_wwo___#107!5?_#108!11?@#122!32?G#115??O#112O???g#115!5?_$#196!78?_@G???O@A@G?C`A?G@GO?`G?COCag@U`UPc?OcRsGa\a\a\a\a\ze^pmZheZheZheZdYdYdYdYdYdYdYdYd[b\Sb\Sb|CzjExjsj[B{jSj[B|iTYd]_kjUc_isgAOeXcQ?TiS_?_?g??A?ADQcG??_IO_G!5?_?OiCDIO_?ALAg?aH?X?UhUPIcIPeG@mpBiTiK@W_U_I_X_^?]_]irYdzQlJ{Eg~aXyEg^eJ|Ej\eJ\UzUh#121!4?O??G?G#112!93?_#107!6?`C#118!55?@!4?D!4?CEBD#114!46?O#118gO?W_G$#119!327?CR?C@!4?WGGE@?_OoCMA?__?_G?@A?dG???O_?@OC?cG!5?_CHAc?_G?G!9?_Og_OX?HCkWCc__{?QSAoG?COg#81!66?@@#121B@??CCEA#77!50?@?A$#69!328?cRj?A!4?O?GC@!5?C!6?U?@IYSh|HD\zMjZpWVMANAEJwOpJYY`H?L?L?@!5?cOC__W?W?_W?C??[??OGog?CA_??C!6?@??DA#119!52?A?AAE??@@-#237}?dOIcT?iC@QC`GAGCAgDO?COAgD?OAG?T_AS?AhCOHcOI@S_Ah?C?_GBc@Y`UGe@gQ?QkQcHOiCH?VgOhO@E@Q?OGoKOD?D?OaSIs?GAG?gQL?QC?A?GA[?GO?_G?O??@??@??@??@??@?AG?C!5?C#137!7?_???_!8?_?OcQG?QcGT_I_TGaGP_?O?G?O?G?O!5?_G?_#246A?@?A???ACGOA??BO`GAd?ACA??A_CP?_OG@??C?c??G!7?A?@?OC??C?@?A!7?A??_G?_???G#237!6?_#105!10?C?O!4?E#153O#83_#69CO!7?@AC?O?G?G?O?_O?@_CO@_GwkrOwNLTIwqMVHF@@P??_cEcyOYLH\DTa_?AKa@C?BCAD?B@???C?`?cW?GCOHC?C@A?@@O!4?G??G!5?OG@??O?G??O#59!11?_#72!6?OOO???cGdkZK~~N{bF?BCIAYRRaO?_O!7?[?I?IDSiOJoNqLOgS?A_???Os!5?Gs?G?C#118_OW__oogC!5?_o?@#111?G#108Ac#100?g{}}~n`j#131?@[Q?@ADA?LAEIHtMU\BI@A#100???_Bq@$#246@Y?dOIgT?yChQCPsBWTAwFwBkPAWbKpEgATgB{SAxeOJdsiJ\sUzjLTu{Jmc]htP]Ulnl@HRun?rSr_CBABaOgChE`E@IOIOID?@?@AdOdA@??_@??GCO!5?G#237!46?@#105!22?C??C??C#192?@!6?A!6?A!5?@!4?EO?C?`G?DO?HS_G???D?@cOG@O?GOc?@cA?C?OcWA_K_WaG_???C@??O???CA???O!4?@O?@OCHC?D?OdG?@??@?_?GO?C#96G#115G_yDAZ_PK{Cpc?W_\?{D{IhSqLomOXc?BKBA?Q??@???A?a#73??C#118!8?O?A#115G?DB?@B?E@A?B?A???@!4?C???_!5?J__?AQO_PSEWAhBTGccHD`?G@X@H@I?`OQA??oO#53!12?_!9?_???B!4?@#101?C@G?WAgQkUiIuKq\b^cZtWiPnSJoLqKSGjS\oKpMGQ`iPfVALaC#119?O#115GcK?E?@???o__G?O?a#101??AtE@@#72@#134?O[?S???OkOgOg?__?_!5?_?gCgVGKGC$#240?`A?@OA?S@yChYcHsBgTAgFwBkTa[bKPVgITgAhSAHeOI@S_#202A@???_?@#192??O@??A?_??O?Q?G??C??C!4?GC!7?_?_!8?G!14?@#184!75?A???A!4?A@?@A??@?@!5?@I@O?A@g?H?i?E?O?G_?A@CPI_OI?A?c?I_B?BO??OGpA@??_K@ODGpC]s|gwUkjms\oh[v?LA{Bs?M_KA_?q?wA??AOgA?GAKBCE#137O#97?O#103O??_C_S#107ko#59!13?C!9?O???o_?sCGOGC#132O#54O??Q???O@?@_?A!4?GO!7?_#118??G#73O#112A#118!8?EA??C?O??KC?C?@_???O?_?@??O??OO?A?QOOA?_#48!31?_?[?jSA_W??_#103!6?!5@#100!6?A@C!8?_#102!4?A#114??A#251???_??G#100o?BBA#114_?OG???A?@?@#102OC!4?C`#99!8?A?j}alnQdQgTaSXcSIOhagTu$#244?COI?@?i!6?A#218!16?_!5?@#252!11?G?COAG??O#184!5?G?@!4?c???OG??GPgO??@A?O?OGOC?D??_OIc!5?GOcAG?QC???G_G?_#237!84?@#239!10?G!7?@C!8?O?GCOG??I???c?I???G!10?_GA???P!6?C@??O??G?A???G?_!9?O#246!14?_?g#241C#101_???W#59??A#102!22?A#121C!7?@A@_!4?_i@jURG???C_O?O!4?OoW_GoOWWGdCSyzyY]ArA_O?`_OG?G#103!4?_??A??D?C?A!6?A??_?C?@GB?`G?AG_??c??AO@ODACA@?G?@#99!6?O!5?G???_#102CCC!4@#53!11?_#103!9?A!4?A@G?@l[SKG!4?owLF??S?HE?BKJK!4B_XQKXIPA#98!5?S!6?G?C?OG?O??_??S?GTzVgVoDy$#218??G?c???@!8?_#193!35?OA!19?@?_??AC???_OGCGA@A?GOa?GH!4?A_OC?@_?G@iDPa?@bCBcBCBCj?gCQgCQgCQgCQG_O`A@aPA`a@aPA@AxU@IOcZ?[bKoKPm?Xc@HQcHQ@GACPACPAcGlIHcPIHcQLQd[_KSaSIpKOkHuSIcYCmPGA_@O?CAO_I??Q?EpI_OG?AAc?J?E??o??OG_A?@CO?B?C?@?A???_???G??O@?D?C@S?C?C_!4?G!5?COC?C?A#208???G#244?B#116A#119G!4?@!4?AO_?D?C?g@SAhCQA@g!5?GC??A???@!4?W?gS??`Y@i@AC??gWSig?@?_Dc?d_A_?CCD``WKX?KSOHc`s@?GL!6G???G?SG?cWKDCK?G???O#77CC?CC!6?A?G?KYfiLJL}hVYeYBCB!9?@@CCG@HUKAgSsGqKa?_Pc!5?_C???b?BShALoE`??A@A#134O_#98@ATG#107???BBBH?Op{oCOKOKK]C`O#93!12?@!5?@A?@?@A?@$#196!76?A!5?cOGC`A`C??@A?GTAC_PItOLA`EGOVc_@OiDSASRKR[r{jSzEzhEzhEzhEzHuVlU\yTMp]TyTMxu|Eh]tlZC|b[rMrmO^cJYcdZcHua\pMgrKtIROdqRk`uQl_kYa[pJSjSKrkRs?_cG@o?CO_S?GO`GaC@S_G_??C?@cPG@O`CO_GdMYdDASkXEO@aGa?AY_@?BAGR??B?BC??yApAGBy`ZQlZUHfA|nYtjExzqlP{rH`B#136?@#118C@??C!4?wGHDAOaO!8?H?E?O???_???G#81!4?_ogKEC??HG??CC??___!7?WOGG??OOGg!8?@?`#112G!6?@#102???AA#59!9?A???A#102?_!9?G?vLDN^}X^v|__!6?C#98!12?gSgoS__???_#108!25?@#112!26?E???A?A???_$#239!77?G???C?G!8?_?_?_!9?O!5?GO_??_??_!7?CO?CO?CO?CO?c?G??_?G_K?G?G_CG!5?A??A!6?@?A#237!43?@O?_@??_?G?E?O?G@?_@?@!4?CA??O??O?@OA?@Ga?H!12?G?O???C@?_#72!38?@#121C#114G??A?BA@?AGcA?bBAA@?AG!4?E@B???@??_??C!19?A???DC?C?A#73!17?@#114!4A??QQoo_ECC`pf_UOa_RXAaA__QcEcadgAGhOrG?aO_!5?A#120!20?O#108!64?G$#77!322?A#112?A@!8?A@#54!19?C#59!27?A!30?A#101!30?C??C!7?@!4?@CGO_?_?Q_@O?O_O$#102!324?O_?G-#237|PwEgTAhS?hAG?i?d?AGD_A@OC?i?DOCA`G?SBOCiP?cGCaHOCO_KQ?iHS_WcHqL?QcPIPiCpAShSGqKrKRcRkQkOcGdGDWdOaWaGcQgAg@?@A?GPaGP?AG!6?Q?@??`??@??@GA???_#137!15?_?IOdGQcHSAO_DgQcHUhShQcZcYdYcZcXeOdY`SHcxAXaSHOaSG`IS?H?Q_#192!4?@??_?PA_A?O?@CH?D??@?PCH_?@!4?A@?I?OAGC_GQH?IOjCQk!5?@O_??G?Q??@!5?@GA??C!5?C!7?D#246?b!4?@#72_O#115R_G_HGOA~tSIhSu\IhcZdQNoNshVOn?_G#59s]N@@@#39??@#73@G?A@!6?_?C@??@?G_?aOOOGGcQOSOaeDIOAc?C?_O?O!5?G???G#114O??O!5?GgGGxZK@cOQHSUhu_@E??_oDGg??g??G#72??O[KZO\Lnz^jJmDVFPNug??_?O!4?@@AAC??IS?H??_O@JS`ITiDoDiDOfGZ_ItA_W@K@#107?_???c!6?GLC!5?B@??BAK#101Kh#251A??A#134??C@RisOhA~aXCbQH`IdYCbsY@ID?CQE$#246Ac@WAgTAhUOcRS@Y?lDqILOm?jS@Y_IpKQcJ_kJPCmXRcXSejxlUolvSqjL`ZUCqzlHmsCPQM|aCJqD!4?G??@?B?R?Qa?AGC?@?O?COCOiO??_???_?O_?OA#239!101?A???@?C?_??@C?G???@aOA!8?A?C??@!5?A!4?G!6?A_?O???G_A!8?@GA!7?GA#237!8?CO#150?_#202OA#83B#114BCP!8?I`SaG??OQ!9?G!7?A!6?A#115!8?@#132!26?C!4?_O#119_!5?P?EAf`_cd`bkctL@fAA`???_??__?_???OO??O#101???C??AO?QObK?pCi_AO?_?C@A??I#41!6?A??A?c#95c#101?@@?BMTA~uJ[VI]sj]tIDYFYTOjGRCNOAHP??AsB?@#108A#115C@??@???S_HDpCAO??B`CGO#100?A\n~Xv^z}kO!5?GCiWks]sW_oG??coOwr?`ib$#240?G?_?A_OAhEXcjSdYAwDoQlOnOjSdYdIpKRsJOciP?eGPaHO#202C??GA?G@C??C#184!9?A!5?O_CGQKBCRcQk?c?cGC?DO`OaW_?h?g???C@O??@OA??A!4?@!100?AG??G?K?IoA_O_YcIOC_?ASgUgS_WcW_D?_@q@A?CaC`COh?ODQcLQK@Y?T@HCPEWfWdWA_TGVoIpIPi@?ODy_\q?QG#105AO?A#24_#86C#77_??A#107GOcJt#118?I_!5?@!5?OA??C?B!4?A?_!4?@_??_O#69!47?O?C?C@??C?@G?o??@CA#103?CPGA!4?@??@C!4?DO_?Cg?DGC?G#53???_CA_#99?C??O?G?O??GA_??cAO?O@OakGG#100???g!5?_!6?O#103?G!8?C!7?w][lrY?A?OOm?A?q?AOK?A???TarS_O?C#99!5?DJiU|?O!8?@BOG?GC???@$#218?A?@!13?O!26?A#252!4?A?@!6?A#196!12?G#193???A?@?@!4?G??@?A?Q??a??@C?P??@?OC?gS_@??C?I_@SaHcQG@gCOIOCIOcIO?_TGPCQgTiGtI_y?{@y@{@i?DQ?G@Q?dGDQ?H?C??A??A??@??@!4?I??AG_A?C?HACAHAOC_HQcHcJOjEwEyDWAk?SH_M`?OAgO?WCi?A_GACgAHS_Gc??`CA??@_?C_!4?@??CQ_!4?A?_?Gc???@?C??_@???A_G@Q`Go?OAG??OGGCK#97O#99O#41G#102GGtSERcG#119??@S?@?aSAH?GD_COJ?gCO@!6?_?_?C?@??AoaUtICA_?CXCiSAG?CiC_SO#81!24?@!9?A?A#102!7?AA@D@A@?Q@EAHMJF?AVRqV@g@@#98!8?O???O??o?g?_?PKrNX`n|bAI[Osq{o_#134???_???_!4?_?_?_?_CO__O_?oG?KpA?@#118_OG?|CuNF@B?QGI`kbKKKY_#102?@#113!5?_G_#131!5?D#98???DaPC@A?@ACGCAdQ@iFGCGPK$#244??E?T?GC#193!42?A?@!6?A#239!21?_!7?G!9?C?@??@??C?gC!8?@C?HC???g?S?OC?OC_??_C?H?A??A?C@!4?C#246!73?O?@C???A???OC???S???@AH!4?_G?C!4?_O?CO`?A??H?O???D?A???G_???A?c??_?@?C?_#208!12?C#218??_#240K#144G#122C#103_??@_#69!7?AG@!4?cQG?H_?Q?_?o^vH`?KQGBoW{sRG_!4?@?@??O!5?P!6?@#112!24?O???C!5?@#59!10?C!11?@??A_??G#77?SAu_nSbbA?@#48!5?C_O?g?cO@CRKO?K#93??KW#77!4?@?@?@??SBGD#98!11?I??C!7?O#114!8?A@?_G???_??O!6?O_#131!30?@#101!6?GO?O$#192!58?O??_H?C?Q?@gC`??H!4?_?O_!5?G!4?G!7?A???@!5?C#237!121?I_???dA??G??@gQ?S_?CO@OA?O_HQC???@!6?_???G???_!6?AG?O!5?G?O#101!23?E?A#59!12?_C#112???_#121!8?E!4?O??OG!4?C_OFHG?sWK@wIaQS@TCTGC?DbAGcjhdWGqtj|Z|z^NN~n~~~mn_x?IAJII?A?A?A#69!19?O#107C#103!54?_#77!19?@!9?A#119!4?wG???_!9?_#72!40?_?C$#196!82?G??@?Q?P??`O?GEG@?EGCQCAiPA?JQm[bKtLSiHsQgvkVQn`MjpmJpMv\IrmQlTiTtIp]D~B}@}B]TtiGvdYcjWfYgVcZqhUhUlXcZcYdYcZeXdYd[bUXExeShqlShfYTalQuHSnSxFwDwDtA{B_R?OCGODA?@_??HS?@?@??A@?A@WEGO?KoLOHOI?ACOnY_H?CbM_\_UCpAWdOeGbWU?S_IdGTES_[fIDN_Dyl?`fZ@#54!33?G!7?_???A??@??S`I?a!4?Cg?I!8?_#118!26?O?O??OK?O??o?OPOC???O?G??G??O???_#100!75?GCEaa?G#102!10?_O#121?O!6?oo$#81!358?oCESM???GCKG!5?O]B_?@?__AiP@jI?CRHCAIDPG!4?A#132!13?G#115O??O??O?G?KOC_CA__OGiCSi?CGGg__OGGG??@#251!72?D???C#112!15?CG@???OCG$#49!359?G#132???A-#237xOCbXcRGePGC`?S?OI`OCgAPGC@gA_I@Ga?TAOAPC_HSA`OI@SA@?Og@SHQlGt_TAh?OaTgF_I?SGPiPmPa?dI?I_I_I?I?G?WDQdYcYcQcIcG_I_S?OaCgTGS_G??IS?AOG?_??_??_??O#105???gOcGO_CGOgC?oC#193!37?c???@_P?`O@GAOChQCQ@GaDGRcHC`IT_OI_KOl?IoMP?S`Q?GcZcGCO?DOH??IT@Qe?Q?e???_?@GcOIOCAHSAGO?G?OGA@O?_!8?@iO?c!7?cv@#59__A_??C#102B#118O_OO_X!4?GAAAC@@?_OG??A?A?O?G??_!6?@!4?O?G#73???G?A@??_`POOWKKeAbtG]KgRbGBP_hSSciEMAG@!7?@@@#114!6?WEdkeO]OGApIcWa`_`OGLKET@A_#101??A@AO@yDqlcGSk?OIC#120!10?CA#101OG#95@?@#100?_o??GE@ecEF@@!5?K???@@HCQYGGC???@#98?CA#118OA??CCBA???@BB???@!4?OBdC#107@#101_Dac!9?O?_#98?@AC#113!8?GOG_G#101{m{SmYkv$#246AhOCaHCRGepISj@idOMgRTgcRgQDWDOu@Si?k`KaXUahSMdsyj[UfdS}jucQRINiwU^nLGRO\tQbdm?C?GOO?OdODODOdODQ`A_G??@?@G@O@A@O?@??G???_@???O_?_??A#137!18?CHO_C?QgCHQgAhQChQlQlqLqkRkRkRkRkRkRkRkRkRkRkRGQc~?MOM`KAKPcHQ?dG?S`GQ_CO#105??O#184?GA?@??g?@?APC?AC?ACJ?QcW_CG???IT?Ac@c?e?qC`Og?@Q?PGACO@cP?O?OGu@SHqGeHWCydApI!4?gdVyc#105B#96?BG#150_#0A#72A@#114@o!7?A_@?NF!9?_!5?CB?A??G#121!10?C?@DDFE`?C?aGOBS?ed_OPW@GAt_QDkSfkm^EJ?POwPlR}n~v~n~}]AAbaB`#102!7?c_cSKK?G?GMFCBQ?@Gg[\]}NG__GG#53???A??G#48A?@??S?AOCHC?H_?@#134!9?o?oGO?G_!5?A@?VDICA?hC@E@BADAWSj#119?G?@G??K!7?A#128_#119!9?o#103?Ai\AkOA#113CY`O??_#99?@A?O#77!15?O?_O_OG$#218CAG?C#240Q__PGEpISiTIdOFgATIcRkQdYdGuHTiPMpKaHSAhOI@#202C?@?OG@#192???H?c?O?@?_?O?C_A?CG!5?C?D#196?d?`?C?`O?A@O_I_?@?_G@O?ADW`[?OISiT_BgLqMhO_USbSyUdxUdxUd{jRkRCBGRAAgBaD_RHAhQ|EgZSdQlQLqLRkRkRkRkRkRkRkRkRkRkRkvHZ?~oN_]QlqeXehUGrliUTgVgJuzMta\isLoFOmoL_iShY_[`O??@A@Q_I_?_?_G?W?H?X??GADgQ@IcdOxCaXCbmDjA?sGe@SHqDqDGtIcSjmY@Y_DWc{O#202?G#14C#48C#119_S??o!8?w???WC?q?ACA@?TG_S_!4?GA?@!6?A@ABCAOOHSAGSWfISGA@?BA??O#132!9?O??O?_GC?_Oc?O#126?G?O#81?@!4?@#103!11?G???S?CO?GAC@Q_OA_???_cOGC#98!6?Q?@OIC@GtCjRCXKcX_WHFC?ypSH~Nv@EHA#103??Og]kY!8?_!4?_?_oOE??WA@!6?AA@#73C??C??g?GA#77!6?O#251O#100?HRmTzd]n~oNgSGsHyT~y|~^~~unv^vB@@B@@@$#244?CbW??GC#252!42?_G?A#184!10?C!4?a?G!4?O?PiPa?_I?I?I_I?I?G?G?ODQcYCAcAcG_??A_C_???GS?O???DI?@G#192!98?C?Q@?AOC???h??H_!5?@I_?CAt???O??H?H?HQCDQC!5?_!5?C@_C@!4?C@??A???G!4?@?Q?G??OA#37???G#77O#115CIJxGwiLKh\C}F?GrcH_HqkyTItIuTjH!6?C?GCO?@g?C?_#81??A???CB`!4?AgGGC_a@gSGA@`Q?G#119!6?BA@@#118!11?_O!5?X[COG!5?B!8?O#101_#77?_!7?OPIT_sDg#99!8?_O_AWC__A_QCR_EoizCMJE???G#101??HoGMU`RC\aOgO_YcO?_?o?gSGc_B?c@#121cGOHh_SCKaaK[?AAONDh~N#102!4?K#108??O?@g#134!5?N?VItIc@i?DA?_??@#72!6?AG?CA$#193!51?_G?A!19?`?A?C???G?O?OCO@OC?dOcA@??G??@??G@O?A?@A`C!5?A?@oA?@G_C@DGQCHQCHQ@CgRkRkRchSBSHQHCAoCD?OD_AG#237!61?@!6?@???A??C?A???Q_CG!4?T??_!11?O??@??@?_??_??A!9?C?G?Q!4?C!9?G?U#128O#133G#81G#69?CA#103@?C!4?A#69??oOC@OD?CO@GCA_@G?O{gKP@sQ}FJD^aU{gw[gw__o?Po!6?C?A#125!4?C!8?O!4?_G#119!15?kSSWsIa`?`OAPA@??@??@#107!9?@#72!9?BA?QLOZdbOncPiBG`?GQ_R?AGC_?OC!8?o?O@O_???`?KB?IT?GEOHC@U?HAH?gO@#107c!6?@#114@!6?@!7?oI@}@$#239!74?G!7?DI!10?_?C#192C!6?O!5?C??G??@OA!4?C!7?_#239!100?A!11?@#246O?cH???@Q`O??_ICG?QcO?CgQG??_Gc?A??AG!8?Ga???O?_@???C!9?AG@#140!4?@#121O#107??CAC@AbE#121!5?_??_G?G#59!11?F@_o?G?ooi_[??O#114!8?_#115!46?_GCG?C?bGAPGH?A_o?`Qa@OO?GC?A??A_@#251!53?_O_?_?_O???_??O#126!8?WO@_AOG?_??_#115?@?@!5?_KOI$#239!109?O?C??I@?@?A??A?@C??@G???@GA?GA?GA?C!111?CI!4?@!6?@???AC!4?G!4?AG?O?c@???GA!8?O@?O@C!9?@#112!8?O!11?O#54!14?O?C?@!7?@A@?A??G?I??GCOdG!5?@#69!34?G???S?A!7?@!5?@???G#98!71?A#127!14?a?A#125O?__?GW??_Sc?_o$#153!312?@#121!41?_C#59!84?A???C!4?_?O_!4?@??C#141!73?C#116eO#132???WOO?O_WGWEO?S$#81!355?AA@#102!183?@#112C!8?A-#237~?~?~?~@|A|@YdY`CAOCH?QGd?OGcAOHc_OH_OH_?GS@_I?S?HCQ`OI?tATIPkAtAG@GuHQhU_UhCYcHOeG@QcXeGeGUGUGQGQCY?ISgOACQ?EoDoC?SGO?AGQ#137!24?O?g?QGqCxAS@I@gh?pOI_AO??GCo?i?@c@OHAPGB?bGf??@?bGBKaCXfWfWfWfWfWfWfWfGQHQcHaT?_S?g???_??_??_#239?@??@!6?_?@?SG?Q???C!4?A_!4?G?GC?@O?GAOC???_G!5?G!4?O??@??@C??iSd??O?@#1A#119_?C!4?C?GE@?@cQ@O?O_PcA_GCOICT?I?c?E!7?@!4?C?@?AGC??CA?@O@C?CDGDYPM_?Ly@?A?_`_!11?pWOw[GKCCcSKU@K@@`w__c?G_??CC???_#107!8?C#101!7?ACPi?ZuHqOgO_G#48C?G?S@C!4?A?OC#100!5?@???@CAA#103?WOq___?U[Qkit}TsismvmC]?@#132_G!4?`@[a?Cr?_???C#115_#114?o?O#103?sg\WtMxyxppNQsycYCi?_???CGO??_?_OcX?tGqLylJEX$#246?~?~?~?}A|A}@YdYxljQUldQYldRXleQXKeoN_uH|biUTtiISqhC]dt^I|gteR\G|v]RHsdUhLhUZ_BcBPdYcH?O?O@_@_@?@?@?`?@A@G`G`G???p?a?A!4?c#105!33?g?s?U?AKAdOHcJsBOJCPUGQIcaS_AsGS?O?Si[?S_O#193!18?PC_G@CO?dI?l?JsJSb[BTITb[aOIOgSBK`I`A@Ad??c!4?c?K?CI?A??O?@?C!4?C#237??H!4?Q!6?C!9?_@!7?A#24_#69@@!9?A?AHCQC!4?@GC_GCogITtIQlWE_@oCIAa`WOIBCADsRHMX?LcmhOgGGWOW???WKo#81?GC_O???_#69!11?_??_O?G?G_O?Q?IA?@???_?G_!7?_#77!15?CAIPmc?o?_#99@DAC_RcOAGaGPMA?pKA?A?@#77???O_?O_W?E??ACOI#134??@!5?@#251?@???@#121?W?CoWD__E???ea?@?_oo?GM@@#108!5?fGoC?CI?_@G#100CACIDJBnNFXvJ^F@ABmZc@#77??C_??COe$#244!12?c??C!4?_#252!5?AC!7?C?C?CA#244???G??@#192!10?A?G?_A???_?AG??Q!4?GOcG???A?@_!5?C??cG?C?_C?OA?CO@I!8?O@??@G#96!33?_??O?G??O???C??G??c??G??G#105!42?@?A#184!11?AO_?gOIC@K@M_?`AGdQK_?C?K?CI?M?IOHPiDIAO@LgPLQk@_YcZ?aShCjCiOcA@^eP!5?A@_#203?_#35W#40C#118A?EFFFBNFG?Q_Q_G?QJLI?OPO?G?@#59!6?_?CI?@_??G?C?_WOO!4?_?O#73!6?@!6?@!4?WDjFEJDrBqM@fIBCB?E@#115???_?O???@?POgAAGH@G_AGg?ACC_AQO???_??_aO#72!9?@?HCLBSiT_Y_?_?_GpMol_KaHA{BwPi?C@CA?@!8?@A?@??@?A!4?@#125??_?A!4?@W[bOX@??WX@DAB#107??_GeI@a#101?A@ADACMOkB@P__Oo[Ooo_??_o[{[???]IvHQDA?H$#202!16?A?Ch?Q?d?QG_AOHcAPGAOH?O?S@gA?T_B?Qh?I?_#252!10?_#202C#184!8?_C!4?A?@OcGEGEGU?QGQ?A?Q?GO!7?_C?CGOG?C?G!5?_#150!34?C???C!4?_!7?O!4?C#192!57?D??@?_??O??SG?QG@ODiOAPAp?P_T_C?C??O?gAO?A???OC@???G!4?O??H?_?G#208!7?s?Q#217O#83C#59Y#39_#115@@!6?@?D??@?`??QcYdIEAAD?_A?dGQ@W@_GQCD?Q`gT?BCaHcQOEG?XO?_O?O??_??_?O#132!7?G???_?_O?@#81!4?@#112!8?G#118a__aCC[!4?@!4?I?A!4?_#53!21?A#98?GA?GR@KRNhUPE_@OLA@oL?CA??A???@#108?_??C!5?g_???G?G???OG?W#119?C!5?A#73G?A?K???o!4?GC#112??O?W@U#113!13?G?P?C???GA?c?GA@?@?A#108_!6?O_$#240!17?O!4?G#244!10?A#240@??A?A!8?gC#193!27?@?A??Oc!6?O@_?_@c@O@Gt?@E_W@G`G???G@?dGhDcGZkRuZcZcZeWfYcZeWfXeXeHilFVhdDHAl@U@U@AH?dOH_JsJ?HCPCHQ@cBOhAPGU?UGvJSAS_S_OO#237!45?A!4?C?G_??@?G?O!9?G#193!23?aO@?A?_?CA??AGS?@#153???G#240?G#96@#81?[#121wOg_gwo_o{g[?GcIhC!6?O_???_?O@!6?G!14?@?@?A?EK@FAAFADE@EBADubWCWOOWK[LPgWs{z{M?mFBfRrjRB@?K!5?CC?!5C#100!31?C#101!15?O???o@wCmS|j]yg\C~@BDLZNT?@kOSA?AGPI@??A@A#128_???A???_???O?G???A@?@#251!20?@#102!24?O_$#239!78?O?G!5?A?@!6?c??_!13?II@?@?c#246!129?Q!4?A??c??A??@G_?G?C???B_A?O_C!5?_??A!4?c@?AO??@C?OC?O!6?wAE?C#112???AGOGO??O!8?C_!6?_??O?G#102!7?C#81!18?A!4?AA#54!6?G#125!11?CA!4?E#81!17?G#114??_O?CROIQP?A@_WgICCCFoaPA`?@?e`???@O#102!42?_gGO??_#100???A@!4?C#102???O#98??@#118M@?`gWC#140!5?GCA??C#126G#118OOoMMd@$#196!84?G???O@_??H???G?c??A?gD?cQ?EO@?q?e?ROa?RcQcHCZcZcXfWdZcXfWeXeXuDQOgCQGqCOAg?G?S_A??AC???Oa?a?_?G??C?C_?`G`?G_?`GBGBLjeWfWfWfWfWfWfWfWehUdYqLiYTiQTsJsJ[b[itI[_LIsFC`W_Q?OSG?O???`IPiPAp?P_P_T_E_Oi?hFs_BgQcRKRcHcZS@CiOhCJQgW_?gViTiYDG@l#126!5?_#73?O#114!19?@@@?A!7?`YOF_Pw[CEB_W_gG??__?o_!5?o___?__O?_#103!40?AO?A?P?O??_AO@?ITG@?_?O@?A?@O?@CCO#107!52?_!6?__???@#115?OCA#142!7?C#49@?G#119?_!4?A$#102!437?@??@`PPXHGG??a[]^YLG]|}}mhw_#112!64?OG#116AE!9?G?A?A$#107!437?O#59?Q!8?DGC!8?@#126!70?O!4?O#52!8?CE$#129!531?C#127??@!4?@-#237~?~?~?~?~?~?vGrM_@cX?C@cAg@SAg@CQ?gGcAH_S@I_S@GdOAHcOGDAoHAPi?HA?`OHU`Y@m?Z?lA|?PACHQDQ?tGtGTgSGSGpE?DAG`?g?_?_?GC?AgS_O#105!5?O#137!15?_?OcHSaShUhE@??CAh?S?a??A?OB_TC?Q_CQ@G?_G@_G?bG?G_??_??@??@A@EHUhUhUhUhUhUhCHQdOIcHQ?hA?i@?GQ_?@??A#192@?_CQ?c???O@S???C@Sa?Q?d?h?Pe?AgOC?O?C@!5?C??_@??_??OC???A??_#208!12?b#240Z#2O#81G!4?C???C#112??_GOG?S_OA@A?G!4?c#114??G?C?@oC??_P?GE`@aTGSCEB_CACAB??A@?@cBXHDpHOo_?!4O?kOGsWguOWoOO__oOG_?_OG__a??_??_OOWWWMGLEcCEwi?DGQgebQXP?DCCCGA#72!7?IDQ`JeWsJ?haKRLgeSrWMhTZah?C#103??_kWsWsjSJg@?@FBBB@??@@A@?G#125?OMgOsqWG__`@??AA#107???_wwWsMS@!5?`#111!6?_#101!5?B?@FG@?GOoGx?@@!5?BGA#107??_#102HA$#246?~?~?~?~?~?~?vKp]mHezYMHtUihTUyhlVTpX{UJisTJisRGlsUHnqYLFukeTxulNIbqhMcu@l?vAW?iEwB_GoHeGA?A?A@a@???_O_CQCBSI@ICB?_???AC@A#105!20?G!9?OgUhQGSAhITCxcDgSGag@kBGhSaRMOQEPKOCrC@ITITiSiSgSgO_#193!12?H_C?h?Q?cIOcGDOjCGQLoLQkQGQ?h?QHQcI_G@U_I_G?Hc?G?AG???G@??@??_?O??Q??@???OA?C@??_G!4?A???GQA#16!8?C#128_??_#73g?O#135??A#118!5?ca?C!4?O@?W?@??G#59!4?O!4?@??OG?C@?_?G?OD@COC?A???@IP_A!8?_#81???@#73B??@#69!6?DG?C@??AG?A?@?G?HCOAC@A?@!6?O?@#102?GOEKOGG?eeqyx`ppxZ~YQO#53!4?G#98??@A?SZ??p?Q?H?C@OA_#77??CO?iCG@A#108A!6?C#112?O!4?O@L?o??QDO@#132_T??CA?C@O?O??@#103!5?CAI_JKzmn{v]h^~Vn|J}j^j}W~}or{zsLAtAV]S}Y|^~sr|zzRqx$#244!12?G#202???@?A?C@?AG@SAg@CA?g?CA@_S@I_S@IcQ?H_Q?D??G?OG!4?_OGC#192?O@G?Q???@!4?GA!5?_?S_?G??c?@CAG@?G!5?O!4?@!7?@?_!9?C#150!17?_O?@!4?GO?G!13?C??C?A@#184!55?Q?@???QGBC???@U`W?HS?d?I?S_GWdCAhQc`AOiDYdCPitMWePCHaGaXeHgSYDIvlP!5?d?K#35??B#49O}#121B?A?ITjPlxNvnR\jQHoi[cCkBdKO!4?o?C#102??C?A_o_?E??_OgOWKWgHgw{[{{}]CGC_O!8?__!9?_??_#103!19?A!5?O??@!4?OaG@?AO?G?GD??G?E?c?dl_@#48!8?@???O#100!7?_!6?@#102!4?OcHcJSbOBOB???C#119_?G???__#128???_O?kG?_S#115???C!5?O?E??C#114@#108?_O?OOB??U_?gOAS@S_S@c??GC???_???g?_@_?_?G???CGC$#252!17?O???_O!8?O??A#193A#240!12?A#252!5?_O!5?C?O?C#239!6?O!6?@??OC!7?_!5?A??G!11?oRGD?@#96!37?C?_?C?_??A?OA?O??Q??Q?G?_?@_G?_#246!55?C???@!7?aG??A@??H?O?SAK??O?C?G@IOgCO_GQ_!5?GAOC@???O?`CO?GQc!5?W]o#83??G#54@#132@C[SWcgOg#115!8?HAGS_?a@_?A?YDASAj_BwgSOIDC`OoCAE?b?_?QoB@?@?@?_??GC?yGu??SG??GGS?CsGCQGAAIACY?IcPKQGDQGO?q?OcGOi@a?a@QoGBhWED?_O`D?O@!6?G#100!17?_#99_CLAK?D?A#115!19?G?CG?kG_OC!6?C__#126?G#116@!5?_#126???O??G#102!7?_?O?_#100!23?A?BADAC?_A?@#77!4?C?C?C?C$#192!18?O???_#193O#192!31?_??@#184??A#193??O?C!7?c?O??Cg?_?_G?G??A???A?a@CgP_OoCRSBTYSB??@o?AGHewVhUhUnWfWfWfWfWb[bsZOJGQaXHA@O_CHA?SAh?T?aCPaCgAGPc@S`CaPGPaGPCOCrCPMtGTaSiCiSGSgO_#237!37?@#239?C??C@??A!7?S!11?AgO!5?@?@???C??c@!5?OC??C???`???G?ATa#97!5?_#69C#125?g??_#119!13?cC??AOA?W?@_O@g?SGCA@_C?I!4?O#101!12?_#107!4?O#119!7?F?B?K@EAGO!6?@CDGADA?IeODVG`SKTDuAJDG?_D??__AoO?@??C?_#101???C!5?A!8?ISjSidYSGdI??Q??__QOhGE`SIc\QmzTzVA@?B#107???COa{A?KG!4?ACL?@O#73!6?GC?W???@A??@#113!34?C??G!4?G?CA$#184!75?G?cAO?@?ODACO?TG@GS?S?OIO!5?_?_?_???GAGS_O?O!5?G#237!128?@O!6?A??_?Od!4?c???A??C???OI!10?@??G??C!4?_G!6?c#119?A#127?O#143@?@?AC?QAO#69!7?@?@H?OCAoIDasBH?AG@QHGC?B??G?G@@?@!8?@!7?C?A?GFGA?G?C_#59!45?OA!5?_??G??O??C#111!45?_#118!4?oO_WMCA?IOYK?FA??A@@@??KC???oO??gHDA@?@$#196!81?C!4?_@A???A@_@G???AGDAG??G?C@gC_S?AGDaGDgUgE@OfWfWfWfWb[b[JCfcRcHCaSgEHQ??h??OA??H??G@?D?AG?G???C??C??_AG?GaO?a?G@?P@A`A@EHUhUhUhUhUhUqUhYEtHuHtEXvOmSrdLqMqlPk`Ky?}H_cW`[b[_G?Ca?a?Y?t?@A@A?O@A?ISHC?i??hI??PAGcXaWeHAOePA`GO??Ad\ti\A`B[#126!5?A@A@!4?C#107!28?A#103!4?OG!6?_?A!6?A???_AO?a?C?_??_???_??_??_???_??_#77!40?C!5?AA!6?DiS`O?C_O???C#121!37?_oo{!5?gC?A@A??BBQIiG\DKcJF?A$#77!365?A#118G??A!23?G?O!6?G??AC?K???@?W!4?_?_?AB???G?o?CK?eD?D??GA_??@!4?@#114!66?A!6?A#112!13?a??_GcOO!6?AC@??G$#121!395?DBE@@??BBA@@@?@!4?@C@?@???C???G?@??@#119!107?C_??Q!4?@$#132!400?A-#237~?~?~?~?~_nOLa\qCGaA@?h?_WC@GaWDOAGgC?PCAg@cQG@c?I@S?`G@SAH?C?`?@Qg@ISJODgFgR_EgTgDgTgFg?cA\a[`GO@O_@[?HCPeOcO?Cg@OC_I_A_@#105???G#137!13?gACHU_DI_??_c?A?Ga`SCaF?iAP?gCP?KE@CCaS@?GC@GC@?O?C?OAO?@?P?PCO?@O@?@UHUhUhUhCxAS`IS`IdGPiChAHAS?hAC#184???c?Q?C???O_PG@A`Q_@cApC?cAC@U?AGDJEDJsC`CEH??IC\AGOdQHOcA\AHQ_HCLA!4?_G#105O???@#49_!4?A#112?_??A_GF!8?@??C??@??_AO#102O!6?O?C?_sQMVHVvbZJN?NMKCJNv|KL^^MEAACFAEBBBAAB??!4@BFV{A??@_BGWqg#118!5?CO?_AMcQ\sYP?o_O_?@_A!4?O__???OO#107???_O_#77??@A?aBGeOkO???_?oO?gCOg??OoG?`AK`S#107??O??sWlUP#121?EAEKMFzUvwO}K?NG???_!4?ABLBDD#103?e?_OK]JmTG`M~MnDbHKpD??cY@TGrPIVjeDzFnNk||NV|RaPDnRNDrVdZ$#246?~?~?~?~?^?nOLaLzt\keRQnD`yuTLayltRPxmiXTUyHduYHtsijVQrihsUZhKUrmdV}t`sm_ToTGVwR?UOR?QOCI?W_OASRCQcGOA_O?G?G@?_?@K!9?_#105!21?O??ITI@GsDqCGAXOGoD?kEPAkAP_WQH?I_VaPIaPiCj?z?hChEwEgEgAhEgEgUg?_#192!36?_?H?A?C?_CG@I?H?I_AG@AG@?CA???O??GA?O?Gd!4?_A?_?A!4?_?C_Q?_???O???_#183A#217?O#37K#121K???_oSzSlUVGD???@?A@AG??@???AOs#114??oSoS?q@Ca??I?@#77?_??G?__S__bXc!4?_?_?OgS@GCGCC?C??_CaKqK!5?O???O#119!14?@H??@??DA?@A!4?@!4?O#101!16?`OKRHdQKdYcXqKItEhiU?}`MpfM|r]`#115!4?G??OgAR!9?AG??D#125_Of_PNTa??dWO#118_GwYHA#102?_O_?O??AO?_?OO??A??Q@!5?C!4?O?O?O???O_??G#115_O?_oICgA$#240!10?O??O#202???A?@?_???C@GAOD?AG!4?CaG@CAG@CAG@S?_??SAH?C?`???G#192???I?@GA??_???_???_C?P?A??G@?_???@c?@CA??A???A??a!4?P?C!5?C#96!23?OA?G?@O?a!4?P??C@??A???AO@??C??C??O?C#246!64?A!5?CO???H?SgC_Y_PgO_G?A@?G@CA??Q_OT?G?S_HO_OCHQ?HAC!5?F?L#218??G#38O#81b!5?G#126C@O#119?_?o???A@??C?A?CA?_[!8?G?G#101!5?C!8?OIOPOAO???_O_?ogSgQ_W?W?k?KsGyKqC_?__?O?O#69!19?H??@!8?@#102?CA?D?G?@?GD??POYn\F{YcWC__#72?A@AYdYELBdIPQD@^?M@EW#102O!4?@gaK`IdA@#118kkxpxpOO!4?@??A#127?a!7?_?_#112A[??dOL#111??_?C#108??BC@?@O?GCB?Gyd??sGaCIdGCPiCgO_Q?A_GAGDC#111I$#244!12?a#252!6?OGC?OI???_!5?CA?P#240!5?O#218???O#252!4?GC!4?_?Q?GCO#239!7?Q#184?GA???CG@gCG@G?_?dAC_G?G!5?G?@_P?OC?GO?@OCO#150!35?@!7?O!4?G!4?_?_?_???G#237!75?@O_O??O?O???@A!4?A?@?S?O!13?@!4?A!8?G??C!6?A#56@#119O#125GrLLA#73@?A#115!9?O`AgQS@yco]??G_JM`FGfLCoOVN?@?G???CC!9?GA@#59A??@#114?@@G??@!7?@!9?c@_RGDEH@YAtTGjfJH[OAcAGciOLIcLeUOKiHCaGACQkDA_HKi@!8?O#98!4?@??@!9?_#100@#103!8?I}VLrU@#111A#112!5?C?A??Ch?Ca??G#128?@G???GP_@W#126C??AA#112!17?C#111?oCA??Y@?A?G!4?G#101!5?@A#114!4?_??_O??o??Oc$#193!20?O?C??A#244!8?_!5?_!5?_?A#192!4?G#193C!4?_?Q?G!12?CG@???A!5?CO!5?CBKICA?Q_OAG@IHDP?OG_Q?O?[QgVGvIxB{b[b[b{bslROo_?XiONtI@IsGqDGAh?H_D?gAPAgAT?GAH?G_U_PIs@iOjCz?nChEoEgEgAhEoEgU_Eg?_!5?I?_AG_AG?Q?CO@CO_T?hQcHs@IPcHQ@SAcGPiPK?A?C?AC?@C?_O?GcP??_G???_?_?Q??OG?C??O???O??H!6?H_Q__!5?O#240C#63A#128?vKA#118!4?_???oI~~~{m[{O_HO!5?@!4?A?A#72!8?G#122!4?G!4?@#108???_#72!12?_O_o_OOwOGS?O???_#107OGAK!6?_?O_#59!27?H?A!6?A#134!17?_#119!35?G??`_???@C@B#73_???XM!4?A#107!4?_???_^F@@O?gSW!4?i?q?GoDG?cI_T?_O_O!12?COI??K??G?G$#192!21?G??O!10?C#193A#196!43?A???A??A?G!4?A??_@OG@C?GC?c?_Q_?_C?HdJkBgVGv?tA{B[b[b[B[JQClJUhE?dO?_S?@???OC??C?IOC?_?O?g?PC_OD?G??_?O?C!4?OAO?H?P?PCO?HO@?HO@UHUhUhUpE\hUThUtGviDyQlUgjUCXqJ}tIZclYjsZdM?cQw?K?y?G?IOPG?_?@G_O?O_?HAWPG_tQ_`AhALAKaLAl?cQCHQ?_OUlTIV?a?he#244_#132!4?_OLA#143?G?H#69!11?D?I?HE@`M@N?@??@!5?G?@#100!32?_#115?@!8?O???@?IKCCA??ECSGIfOG_U@_O??A?Ci?TAOPgI`O?_W_DQK@QgKCA@C??_#143!50?G#126??G???O#116!8?GUG#115!4?O???O?GA?_@A_?_?O$#239!86?_?P@??@???_??A?_?A_!4?AG?EA?J??C!137?C?@??`C?_A??O???C?C?A_??CA_??GD!4?_!9?_?C_O?@?I@G???CH#127!5?O#114!19?_#107_??G!5?C!7?A@!6?A#98!31?_#59!12?G!8?@#132!101?_OOCOE_Oa??C??_$#153!312?o?Q#103!30?O!6?_??G_??_?G_O?_o_Og?O_O?_!5?o??Q!4?@!4?@??G??@?B???GQKG?@_BcQG_o@C??hA_O??S?_???_!6?G?G?CO?sQ?D?H_Q_?@q_C??AWBcXEH?COG#140!57?C@O$#208!313?L?O#59!38?G??O?AH!7?C!4?C#52!160?G-#237~?~?~?~A{agQPGvGQc??h@C?_GS@A_O??HS?aS@HS_CiOD?gCA?HCQ?gDcAW@QG_HcAIpCiTaSJOLQcYDgU_TISIo?hOeO_L?^_V?I?J?T_UgQ?@AcH_I??Q?GA#137!13?AcGCHQ@a?_GA@A?_IA?DOI_cOOR?IA`O?GCaG@T?Y?O?SAG?GCG?c?H?aOAOHOA?Ca??ID??cPC@e@MPmPcHOdItAShAS`SHAOd?Q#184!5?gAOC_G?_?SH_O??A@A`EGCH?@??O?C?D?Wo!5?`a?oIWcI_TQgJScXcRidCY`KO???G?YAk@#203O#63O#48_#115WoG?SAHC?GC!6?`WeIXTpXGmCGUAG?a@?TPGk?aoGG#122??@#101A???[`U@oKagQtaTeHyBCHs?Bg?AHSBmPJsLq@]R?Wg_c_?OO#107!4?@I?A_?A?C!5?GG!5?_!13?O?_???C??_?GCG?K#101@?DG@A`A@CI?B@A@KB?b?BC?@NA@?AC#111???O#118!5?J^fN~{???B#126?S@#127GSh!7?G??@#112IP??@#108!5?@!9?C@CA?CA!4?@!4?@!6?CA???@#114cAPGAOCKQDcaO$#246?~?~?~?|B\BkaRGvlZ|SUyjLTri}SFjxUqj\KiuqJ\xDmyVPj[UqhlUQyHle}dRZqX|SMYPiLhsfqlHdOR`LIo`TCZSeHH@Oa??G_S@S_A?H??c?O!4?P#105!18?O??_?_GOKR?_GSHU@SgQ?dPIDgC_T?KAtAX?U_I_D`I`G`?Q`Q`QHOeOL?l?e?lOHOL_?OiPI?iOGO_#192!34?A!4?A?C_?G!4?O??O?C?h?g???CGCAOC??C??@C??C!4?A?C??_!7?Qd?OA#217?_#83G#59@#119aG#118okapoXuAzV^Fb~}A`X_AGA_?PZt!4?C??AC!5?O#77!4?C???_]@kGqKQcITIPqD?@#99!4?CG_#53??C???G#103!4?CCAAI@HLE`bIO_??CgDq?h?AGCO`A?dAGPABO@AOHAG?G?SIG@GOK@c?e?KRAQ_t?WA?AkOKGy_`KGcGA`s?CSgYSU?WuxCJBSjC??O_O#114??Wo#119?B~??K#125??GujOeW_@BAE@GF_#118oA#102?gSAHOaHO??@?IRCgPAc#112???o?W?SgKOG?gOGSG?gO?O#115?O?O?W?A@H_?CQ?HB$#240!10?O??C#252!4?AG?COAG?@?g?CA`??A#218!5?A!5?A#202O`GCQ?hC?A?@?G_?CA?`#192?_C?OA?G??Q?_C?O??I_!4?OAC???@!13?C?O?C?AG?a?G#96!26?_G??@?G??O?A?G??O?G?a?@O?G!8?C!7?O??G!4?a!6?C#239!48?A?C!6?O??O???g?G???CGC?AC?I!4?C!6?CAGD??`GOdI!8?@#97C#72[#69C#125@@#114OGCA_Gs?g!4?@[A?T_?CAO!4?C??@???ieR{?C?O#100???@#59!7?A#72!6?_???{iQJtSRd[ahWPms?OG[__#102G?COQQQ_I[sl^}pr#118??G?O?hA@KA??O_CG?CGCCgog_AUb?_Ca?CA?O_?G#59!4?O?O#77??ADQlQdCHCBCADKQ?A?aC@BG?D#108???O#121!16?~Zo~j#132u@!9?CD?Q#103?_T?AlubDOac???_CzDiOGpCw@WaS@C_GOhQgOJDHVhPHPnQmYdmPkaO@_G@#107C$#244!10?C@G_#202!5?`???_?C???O!6?@#252!13?@!4?@?O!4?C#193C!5?@#184!10?I?GA_D??G_?H?_??H?S?A?A?H?S?Q???@?A?_#150!38?_!9?_?CA@!7?C?A!8?A#237!70?@Q?DG?@!4?S?D?O_GO???`O?_?PCG???H?C!4?_!8?O!8?@#77A#81@#112C#121EB@!4?@???_#107!4?C???_?C!6?@#59!8?@#107?GC??@??{#98!18?Oc?Ig?Q@SA_!9?_#114C??G#59??H!9?A#102!35?AA@??GCHFIbe|wo???O?QOooWo_??{WGO??_?_GEx?[AOgRKAC#112!9?c#128!6?EX_T?_sg??g#107??CiU_??GGCKOZE~T!5?OIpEIdDIgRAFeEDEb_qu?EI_k?K$#218!12?C#193!6?A???OA!4?G?C#244G??_?@G!5?@?g???_#192!7?O#193!29?@CA!5?O???G`O?S?A?@CGQ_H?UOch@k@S`VgVkP~~~nv~zHPrQoKSLRCrKsHS@sGQ?DOI@aC_T?GAg?S?T_I_D_GdG`SRkQ`SHOeOl?lOe?lOl?KqLoITI?iOIOgO_??I?CO??S@?S@GAOcHQcGRcZ?dQGdQGcPGcHuGdGP?Q??H??C_?H?a!4?D?C?@?O??@I?_A???_??_?O_@??I?C?@I?LjCO!5?A#132??A#107???GC#103A@#119???_W[#103!6?CAG?b???g?qG!8?PB_cIU}?AAGB?gQD@PCG?G?GC#77!16?BaDa@GR_PD?C_#115?C?@A??C?TGDSAhCOgAOdQGDQaSGeOhE?DQP`G_Da?DBOWHGWF@_o#108!19?O#114?G!5?_?O#116!31?DGI[?O_OO#115??G?@???CO_?JcG??g?AChA#118!6?_??O_?O!8?_???_!4?cOCJqH_YOk$#192!28?@#240!4?C??O??C_?AO???C#196!40?A!5?WaC_I_S?K_A_H_CgRcGQcH@IOcRShUgVgRm???OG?CcICHE@a?_GCPA_A??`CGa?C?G@GA_T?@?_?G?C?Q?Q?SAGc@?GAc?H?A?A?@OA?AO@?QD_?_PC@c@E@MPmPujItIhiUhiUheXeGZdkZc~YDtIhVRmTZa?VGvg\gsKoQpaISaCH?Q?Q_A@IoAhEGOC@C@?O@I?T?HA?G?O?P??A?taS`I@_OY#240C#116_#102!26?C!4?wCv!7?AK?BBtg?w@|v!7?@@#134!28?@#114!13?G?O?hCQOdQ`KOdAW`ChO@iO@EODk?SJOPKqG`e?P?oQC@_#72!21?@#53?@#115?_!8?_@C@?A_GaS_#140!15?AAs?G?O#142_#111!6?GO???A!8?O!4?G@???@A???@???C#102!6?CA?@?@$#239!93?CA!5?@?_??G???@?G!6?C#246!143?_A?CiCj?j?Q?ADA`Ap?G?GP??_Q`Y?_AOaH?O??OI?U_!6?_G@_A#121!29?_!6?oc#59!139?G#107?_!4?_?g?AkpLRL_#73!20?@#121@?A??D#118!12?o$#105!312?C??C#244G#119!30?A!4?GMHg?P#126!176?A??K$#153!313?C#112!34?@#69@??O?Q$#191!313?@-#237~?~?~?~?{QdYdYdY`SHSGc?J_AK@aPOGbSHQcHQdGTaSHQdGCPCA?gAOD??QGd?WdItAtIPiSbYDgUk@sATGRK@iOiUHe?e?R_Qc?JSHu?jOdAHAgAC!5?@C?@#137!10?g?O?gC?C_CQG?WCrOIGcQ@PGi_??A@P@cCAOHCc?O??`?GC@??_K_ICH???ICgA??O_?O???c?Q_IPcOcHQlOdIOdY`IcHQcHaPC_I?d?G#105Pa#184?O??ShAc?DA?CHO?GO@_A?G?GCh?DA?G@GAK_GOgPaPA@?As?^?l?QgTqLOIOd?S?C???IGC#204_C#114OH!4?A@?K??F#69!4?O#114!8?@G???Q!4?oOwsA?doE`X?A#101G???oChS?AGskJqKrMPhqUBCB?OGSGcq`i@xCyCyU`UHUGE?A#115?O?G?CK?AJ?AF`qgOEWOOPpGOAGGCoCAOc@OI_GCPGF?cQ@ohDO?IKQsIaWOI?gO?_??[GcA?kEA?CAAD@?OC??I?OGASUCIE@??@#119_}~#121~jhUDo???_!9?CGO#115A???QoXAHFO?`GO!4?P?G#119!6?_Gs?O#115!18?@C?@CG@#119?o$#246?~?~?~?|BlQdYdYd]juavX{SNdq]Kebp[julZulYvi\julYvxmX[UTliyVLcQYnbYOIlGteThKcyR?@qAkGrcQoCLP?sPlXTkZCHQc?a?HOCGOcO#105!22?@AC?@QhQH??dI`H?C`PAGkaCPCJsGcICQhODaOHbCjOKQ`QgUHQ@??_?Ql?_?@OcI@IC@cHQ?H?C???A#192!30?A!5?G?O?_??A_?A?G??_A??A?OA?AO?O@?@C?C??Gc?A!4?g?AG???_?O!6?_#153?@@#240OB#35A#69O#119E?PG??_@?__o{{]Kmb?E_?_?_!6?_??CI??GCAG#103G??\Pc_xPK@?iSD_A#98!7?C?@_W?C@_?_Q?K??CA?@#102???@?__owkLFrqqaq`?oO?W!7?C#119!13?A?OG?A#102!15?@?@C@??ACAR}BAA?G!5?@@???@?@A???CB#114!7?OHC#126!5?AhY?o?OO!9?A#118BC{!6?O_WfWA_!9?Y?HWcX_IWdO_W_IOc?_?IDgSqHgS_PcypUi~N$#239!7?A#244??G#193!8?@!5?O!5?C#202!16?A?A@_A?D???Hc?OC#193!13?@!4?_??_!7?O?G?CH?G!4?O???G?_OS`iTgiSsAhmOnOnOn~}vjETJlQhQHQhdQc??C`OAGCQCP?I_?cA?Q?ODAOHOC_OGQdQGUHSHOPtQsHQlOROlYdITJcZuHZCL?@CAHA!4?G@c??CP?c@GAOcHQcHQGbG?Sh?ShExAtAhEHSGC?GOD_QDG?@Sg???C?c@??c??A???AO!11?A!9?G@O#105?_#17?_#40_#77A#121h?_owO!6?B@_??[?O#103!5?B???C@#69?_???B??G#107!7?@AE#72_!9?OLRKogAH_[aKrkRgVHKQTUAhDyDG[GC?A#114!4?_??G??KO?DG?E@CGoAKbGEo@gOaOMPgDQGd?C@OgAoM@gCDQ?M_T_L?sC?__Q?i?G??_?Gs?O@gE_?COG#121??_OG#111???C#73!15?S??G?_G??_#116?AThAYQ#141O#112CG!6?_??_GFO!7?OaC`C_AQCB?bGAD?T_HODYC_O?@$#192!19?G??A!5?@?G#252!19?_?H?O??gQ?@#184!16?GQ?G?AC??G?a?gAG??_??_???GO?_?`A@???_A?_??_#150!27?A??G??@!6?SAOG?G??_???A?ICA!5?_??A#237!70?@O?@!6?C_?@?DO@G?GaG?GOgPAP!6?G???O??O!7?A@?A#208??O#244?G#49G#101C#112OO???_!7?A?_O#102!13?A@???_!8?__kQ[?MBA??gW#108?@#99!12?oGA?B!5?G#103!8?_?OGCPqGK@DH@Ok?iT_WKPEGcA?e?E_?eCa??@g@S?d@C`Cd?_O@oGCW?I?B_I?WAM@LP@|?@K?cR@jAO@@A?@??aM?@@o[J?D??A???A#132!9?_FC[e?oO!7?@o#107B@j]{kGCKC??_GDIsgWsmKPG?YU@G?C@CADYeGSaIw?x?IAg?O??G?A$#252!21?A@?O??_?GC#193!20?_#192!6?_!6?d?OA?G?AO@?C_?C?P??G@AO?C@??A?A!6?@C?A!6?D?G??A?@?O#96!25?C_???C???GA!4?@??_?A?G?_?O!5?C!4?C#239!73?C?_Q?G???I?CA??A?AO??@?@C!4?Ac?A!4?g?AG???_?O_KokOG_???O#63C#132_#115?A?@!4?G!6?A??U??dHaCSHChHoGE?GC?HpA?D_KA???@#77???wU@B_VGRc?_?@EOCG?@#48???C#100???@!8?@#107!11?C?O?A@??_!8?G?G!7?AO???G!7?OA?G!4?C_O??@?@??_C??C?o!4?S!9?O@ICA@b??OJHHD@#125!13?J@@MILy?gCG?G#119??_#103?S?A?B?_Q!4?QdAD???BCRC@?C@!7?@A@C@ADAD?TAHASBS?O$#202!23?_?G@?O??A#239!47?G@!5?C@#196!11?Qd?a?H?CGOcQKAH?TI?TAIhEOnOnOnO?@GSOg_QC?C_CQG?P?QGAC_O`??_CP?H?Oc?H?G_CA?G@?d?G?`??a?_M?HAc?QDgE?@Oc?oI??c?q_ZsiXcXulQnQsJYdYcZQkRsLIqLPuGvSe\jE|jAOCXAwCxQaehReCGPC_U`OA?OgDo!4?Q?A??GcGsH?H?_?Q?D!4?_D?I?@aHQfS@CIF#96?@#118??kMEDM^qv^WN??@@@?hh^YU\Y_uzU_?O?_??CACpWAPQCA#77!35?_?O???_A_QHD@B#118!10?C!5?A`@@`???@MT@PH@gCAG_A?QqGAOG@GCAA?a`P!6?_?O!8?O!4?gSwW{wiuK_O?oC?_og?_Oog}luy^@#127!8?A?@C!8?G#102!4?`?@CA!8?HQdI$#239!101?O???C?A???@??O??T?G??O#246!137?G?C`Q@O??Og?g?s@c@CQcA??Gc??X?|?v?V?D_D_NON?nIP!4?Cq?G#107!4?@#59!28?C?@#73?@#59!121?C#101!7?@#77@#59???@#112!11?gC!5?_?_?O!8?S#128!8?@AD{AQtcC_#111!5?@#108???@#114!4?C!7?_?_?_?_?AO???g!9?O_??CcBgAiHCI`S$#107!348?GE#121G]A@#140!177?@???@_#111!20?A#108@$#112!350?O@#129!184?@-#237~ONwVg^_~Wf{IlqMohE|IsloOgSylOy?O`QDoDqChQK`IT_TiPiDgFWbGD?I@?CaSHu?uHQLOeXaLoEXaG_HQC@U_ITIPkAtISjQhQgRA@AS_DWAC_S?A_G@C?OC#137!10?i?TGQ_???G??A@_?cSOAGGCGA??PgAPH?cAG@@_GCA`?_Og???gCGQcGQCO??Q?GO??_A?@a?@QcHQcIOdItGaHQcJOiChAS`SASgDO?c@G!6?C#184@!5?A?@???_CQ@OI?@??_A_Qc@KBCRK@JO@?_?IDGDY?OdOcBcJuHO??@skOOA#208?@#203U#35@#40A#73@O?G#118!6?@!9?G_O?o?OGAABJI`?_??G_C???A#77_WG?C?@A@?oMOdKoFXaTG!5?_#53!10?G#77?C?A@AXOJdAkQCASG#114aO?_O??OE?@@A@?_OHgPGEPaH_SBgQI?cOC_Qc??{BoGCAr_KaWAsKdHGcAOdA`GC@?C@??A?A#126??_#103!6?A#73??_#114??D!4?A#126!6?_??gQDoHQ_GS!8?EO#118GYskyT?gDAP?o??G?Ok_qXws{x}l|ULIKV{mWdW_Wi@zcrC?XUmlUhnUDnF#121C$#246?FoF_V?V?bGA@QCPJEwAPJAJdPaCAjDzjEdyNiLzUDr]ta^ITeSYRweSvy\SmjX\jqHlHucqjHeSQIgeSV\ucz{hHPi_eAXG`@?C?C@CgSgB?A?@??@#105!24?DQlQ@QcGSJAH@gDsBOdOlEcAOcASHOdQKQ@qGSIDA@SiTAP_??@?`AcH?cA@ISHSGSGSG!33?A!5?O#239!9?G@!5?AT_GC_?GA?@???Q???O??_?I???O!5?@?G_???gGA@A???OG#217@#37A#59O#125u__O#115!14?A@??A???BCH???`[{BQGdCQJ?A@!6?_#72!7?A@!4?qJuPlRKIxUSJexNRu`hPXckcA?C#102?O?@@h_@CIEC`_O_o{KSCEI#107!9?A!8?_!7?G@!10?OG?@G???DA@#112!9?_!4?G?_DA?OA?O@A??A?@!7?D#125C??oG???C?DJS@A?OK#115??CD??@?iDOOGeG?GecL?S??C#119!4?OAhQDBGAOcY_Y_Oo?OG_??_?O_?O?gOwz$#192?G??G?_??CO?c??_??@?c?O???G@O!4?O???O???G!5?_?G@_C?@G!9?C?Q??H?CO?H_?P?G_??G?A?AC?@G?_ASGOG?gO#239!5?G?_?O!9?@#150!19?_!5?O?A???@?`?_OG?C@!15?CA@#192!62?@?A!4?@!4?G?AG@???C_?S_AGOC@?A??g??O??c?I???O!5?@?GO???_!6?G#240???g#38O#77@#128G#112B!8?A??A?H?g?Q?D?A@!5?S#114??A?WdQQH`SJS?A??O?K?_C#98!11?C?Ga?g@?A`GO??_G?A?A?O?GC#103_?YG@?gS@uPdHBEP@KGAAIHGTAb?AGTGC@?H?C??OCAAOE_AcP?s?o?CCA?@A?@??AO??A!5?A#107!17?@#73!19?@???@O??@_#116__@sXAG@#112??B!6?A#102!7?@??A#112??_AGBC!4?_O_?@?@?BCBC?C??IS_#103?@?@$#193?_#184!5?G!6?G#193?CO!5?C?A???C??C?G#184!6?_???G#202!12?A@??a#184!14?C??@???@???O_?S?PC??AC`A?A?@A!6?A!4?A!5?@#96!22?@_??O?A??C?A??@???G?_A???_?C?@??O!5?C#246!72?_!5?_???A?H?D?GOgPg??Qc?cQHOcPa@a@eHAgA?@??aDBQC??C_?B#52??_#102G#121?KA@JbNtN^K}n[~u{S{gpQc{M[Caogg#102???A??@!4?__GCDA?OQGGwKA@#99!12?O??C#115!29?_OGEAB@@_?oo_LCQDa?pIWCAHO@k?I?G_GCP?e@?E@o?GDaC`GA?O?A@H???CA@?B???@!8?@!4?@?C???C#132!13?AG?CAG?_?A!6?o_#107???@B?A@O?GA@ADB?@A@BKC@???@A!8?A!4?@I?J?@?AHO??O$#239!11?@O?@#252!9?IC@!4?C?G!24?_?OC#239!15?@#193!4?A#239!5?C#193!8?_??C@C?SgTgDoAsGRAiXSDqgZcIpMpMpM~~~i?TGalQlQDQlQcICh?gDOAOA?HA_A?gAcHOdQKODqGSIdI@OiTIPaT_JS`YdZclQdItJShcISheG??DO?DO???H_CO?DOA?S@Ga?HAOdIOIcHsIsGs`[b[cYdWf?T???_CQ@?I?@???@??O_O!4?cA?O@Oc???cGCG!6?CG!5?_#56!5?G#103_#119??@!8?@?@??BB?CAG@??b?PC@?S#107??@??_#101!6?oO?CMB@A@A`KoNY`IOc\i@s@KACQpCGbcXEOcHSUgeHQP_No?dQkQ?I?G!5?_#102!26?CA#119?@#77?A#121!24?_!6?CwoOowWwo{NaosM[Og___os__{?o{_{^yyTdIAcd^QJ!8?Xno_#103I?C???A@cG@Io?Q???@#121!10?_O_$#193!59?_?O#196!38?O??g!4?QGDG`CgTcHqKRcIoMpMpMp???TTiaT?G??Gc?HO??S?A?g?_GOC?OGPC?OA?G?_AG?@_?O?gC??_?GALOaK?G?Q?HOc?_A?R_@AOdZugJtiItIvSUhJsiDxUhiUH|aTiItJsRsJtIvHIa[bYdYdWuA{f[RgK_?T_YCT?G?G!5?_???GAC@?Oa??@a?AGO!4?AScWA@IDtKu#142?C#114C#126??[aSS?IO_O?O_#69!4?@?C?G@??g??S?_S#103??CGC?QG_SHCHap_g_SS?Q@?_?OCgA#107!39?OG!6?O_#119!51?OOo__ckgC?GGCEEB???CG__??OOO??GO?_GBRB#128!12?WOiIC@?A#114!5?O?gS?gc?OCoCOG_OG?A?B?A!9?@??C@C?C??COjC??AGE?hQ$#192!113?G#237!145?OAG@?G!4?OA_OcACAC@k@I?H?C???GCG?O?OCOcASHO???_GO@AG_#132!7?C_Go?_?_#122!37?@#118!56?GK!8?OGcOCa?_CoSagU@dpX@HPGGXGA?GEJx?WPWCtGbAscQslYwWCiK[ZYRQ@NDFB@@CAOWH??@JFMGJNHVKB^F?K#127!14?C!4?_$#183!305?@#38!228?_#129CF$#74!535?O$#142!535?G$#145!535?_-#237^snQ|bLJuLrKXvILvIp^pnWvwfwNyfKrGqHQHQk@iShSHQhU_UHcHEPiS`QgQHC?DaCJ_LQdIpKQ`ShQHC?dQH_ISbSGO_@ASaAH?H?pAp?xA|?TG_I_???G?c?O#137!9?_I?TIPCOG@G?_??@C_CQI@DCCACP?WAAHA?W?D_H?C?cOA?C_X???P!4?O???A?HO??O_A?_A@iChAS`IOdIT_DiOIPcIOdIOdI?iD?I?D!7?D#184!8?@A??C?AC?_?GE@EPAP_PiOk@c?COi?C?GOgWcGCG?OgO?TgC?CgS`GsG#96?O#203G#50o#59A#121o?g_A???GpItaLq~Q~j\~ni^t{On~T~_O_o#103!4?XC@D_AH?Da?SaIoCQ{PZOD?Q_O?_!6?G#53?@!5?C!6?C#103?GA???RGG@CF_Ad@hCGQ@_s?eDWCG?MGCAHCAGCAO@?C?GC?E@C?COAK?CPA@?@#119!5?_oO]IG@@?N#143!5?C???C#73??A??A???A?C!6?A#119!6?A#116???o??OgIOfdC@Bg[MEg#121A@No_#112_#114IHaK?dOIoT@i?O#112?GCA_GaHOk@CHQDI?O!8?C@#107@!5?A$#193_!4?GO_?O?a???_#184!4?A?@#193!6?O#184!8?A!16?@#202@?G?@C??_?O_#184@!7?A_?_!4?_O???C???O?@_C?A??@?O#239!11?C?A?@#105!18?_ACaCPCJcIOJh?cOiOHoI?e@cWcPcB_Y?U_Z?J?LoJ?E_ZcICOdI?iChOc?AhAC@ODG#192!50?CO?H??O?G?A?O?_?c?I!5?G?i???G!4?A?A_?_C?D_?AO!4?CA?@#105?I#240@#52@#114x#132H_?UPGGgdGd??O#143@?G??a!9?i#112?C#114??@@GAtCAg??GoDQO?iD!6?_#72!5?DAN?Oh?ABa_SyDQIhQGFpKHyO??_GC#59??@#102!4?DDYuUqv`{Q?OWW?G?O#119_o_?O??O#107!9?@#119!4?G#121!17?__sQ}{oO~r~l~bLqnJUpKPcWjREGBHAi|LBcG}B?J?D|Gp??OP?@?C#140O??C?Oa#130_#52G#127O#132_KO#118L\^To??_QAdCGiOun|vz\VBTAA!7?@@ADADIQlQhSaXsHUItHVGQ$#192?AO!4?C??G??G?A?@?_G?_G?O?_D???_G?@?G?_??S??H??Q???C??O???O!6?A?G?C?`G??O??H??C?@?G?AOG!5?AO@?G???@?O!6?O@#184?_#150!30?O!8?_??_??A!5?C!15?C#239!72?c?O?_G??@?A@?OC?c!7?G?G!8?A??_??C!5?TaS??C?A@#244?E#55C#115C#73A!4?@!6?G#112???_#118!4?OD?I@lO???P?T?iutGA_?_?oC_gG_#101!5?@?A?CGQGFIT?}hUhTsDZGDOhTUhfWCrcDjyDWpAl?ePuGO?O#107?G???GAD!6?O#112!44?c!7?Q#132??o?OO_GOcY`OKo`GA?T???W!5?Ca!5?@?A??I#38?G???C??O#126?@Q#119?AA?_#103CGaK?D?A!5?A#119??_GS?S@A?O??G?eIdYtiTlQlOiSaHug`Gcgt`x$#246?@?L?SaOGaCPe?dOGoM?COE?FGFO?GrKVDukudP]TjAjucUhLhuZqxmCi]dFkqznI\hSUqhYSErlKJUCuzjYKeVthGbulJuKH@KoEoEGCGE!5?A#96!36?_?Q?@???A?@?G??@??G!7?_!5?O#237!77?A?@??O?G?_C@AP?PiOGOc?COa?G?G?GOcGCG??gO?T_Ta?G?g??G?G?o#116A#125?C^@GcuuRA#115!13?O_!7?AhAAS@GA_XSOOCAY?@^@Oo!4?_#98!9?@!7?_?iC!5?A?O#114!4?@!6?GO!6?@!4?@I@?EO?I?DAGCAGC`OL_E?iC@cPK?CQ?kBSGA?CQcWDGaE??A?@#126!4?_?K???WAL?_HE`I@CC??SC?D?AqKAC?C@CJO?D?O@KA@#142!5?GW???O#73??O#115!6?ASORGg?HAOCH#121!6?_G_kP}JelQdWcW_GO_#114???A?GCA?@#121S?Q?AKE$#184?G??A???@#196!5?O??C#252!45?O#193O!17?O!8?@ACGO?GoCpEWEgCHES?eI_FOSJyTdQIXFiTiTiTn~~Y?ta`cYdaSrKRcJ_IS?dOiOH_HOcPcOcOgQ_Z?U_Z?Z?LoJoE?Z_IcZdYdiTjSlOelQlJSlYTKy???T?G@c?O?AOC?PC?PC?PC?ODOaGTaWaTgF{@u?~?~?~?~PaH??_K?AD?_DGAG!5?C@A?A@??CPa?c?A??O?T?@A!12?_?c#128?G#126???U@G?@?OEOITaK?D?S#119!6?A!5?GAGC#102!6?AIC!7?GDNzk???Aq_#100!30?C#99G#108!8?G#115???G?C?GId?a@AD_OAGSaGCAWc?QG@C?IG_AI@@DO_J?K?A?A_IC??A#125!26?_G?ooG???O?P?G]oOG?AMlMakKQ`@??@!5?@@K__#107!5?@@???O?_C@#126!13?_O?_O$#196???_#239!91?_#196!6?_??A_?hAX_TGcJODgQkPegTiTiTiO??DtIGSI@GPG?aGO?S@??G?C?AOC?I??H?AC@?C_H?C_COa?C?H_C?P?_I?OD?OA?JO?CO_I?_ApCTzUgjUsJYdi\iPnciZcjYcjYdyDWv_\a\iVwB}Hy?~?~?~?mW?~cZQdx_YTo?o?_G?C!4?O?O?@???PA@C@?@A?A???A??@iPA@Y_BS?@#127!10?C#69!18?A!5?C?G#77!8?A@#119???C#77!7?BKCh?LdW_gO?E?UgGOCA???_??O_G?A??DqCApQkOe?bgY_#118!12?_`aD@?P`?pp`AHaKpyProQGopy_i@O_r_|wlWFor\x\NL@?@?AN#112!19?@!8?@?@#129!12?_!4?O!6?_$#246!264?AC???G?G?I?C@e@IPa@CPePePe@?P_PA\A@iGI?G??@A?P??u#101!47?@#127!145?o!5?_?o_?_??O?A#136!9?o_?A$#107!360?G#128!149?_!9?_!6?CS_GAAA{?@@?E$#145!535?@-#237jYsJStgRelOvG~?Ud]h^cZb{BKzNsJYdXcZ?ZcHqHqChQLQcYd?Ag@UGUgDq@GQ@OGaS?IPcHeGrKPiTAg?eOjCOCgODG@UhQcZ_HYdQ?ADQdGrCa?O?h???aG?O#137!9?S`?TIOcI@?G?c@??`O!5?GAGcG@O@OH?@OH?C?H?HAO@OAGO?BO?cO??O?H?cG?_?@?C@OAc?IT_TAShAS`IOdIOdIOdIOdIOaCG@S#184!19?hO?`??_AH_DAhUgEK?C@?qCq?k?V?D?g?G?d?@?B?R?t?B?D??AOBkAO#240?W#0O#125@_?w???@W??A#112!7?iCAG#143???G??QG?CGo#112??G#115CG???@?@??GC_CCaO?o?_#101!5?_T?CZkqDgQ|@SIGtItLqM@fgU`eYkTIEGZegPAo__#107???C@G!4?GC#119O??_???O!7?E!7?_!8?BB??WwCA?A`C?G#126?C??OiS`ACPHa@!4?A?C@A?@#116???_??g}?o?|w?s_wOG?NKK?N@]@!8?G#121Gw_D~Zm[O#103?QCOg#119!4?AF?OD#126!5?_U|MtkU~gcg!4?_O_O$#193S?A_GACGOAG???Tg!8?g!4?_#252!21?G!8?G??C#193C#240???A#192???C?aG?a!4?c?AC??GO??@C???Q_HOdO??@#239!9?C#105!22?@??Oc@Q?GuHCIdQhSaS`O@QcIcAcQkAcQhQcQc?kAk@cBcGcJ?@cHAc?Q?APICgQ_G#192!53?A?C?@C#237@C?A?S`CHAC@?O?q?c?e?T?G???h?D?@?B?p?d?P?C??A???g?_A#81oC#126?ADOkC?Gc?E@_It#118???_?`S!4?_!8?BrCE@y}Ea`^rhH_GD#59???A#77!7?IdYcQLqDlA!8?@?A?@???@B?CHAcXUAt?O?_#118!8?@A@?AOC_[SMCG]C_RMhRvdEFabP|Wy[zXNV{kbUfCrpRpOGG#143!5?D??C#125?OG?OWggc]gKhUkQMpD{AWgB?TLg?D~@YCIBv_@A???_#136?{g@??_C#126??_?W??cO#118AcwcrESh}i~\W^NG#143!8?OA@G#132?O#119@A\qlOMBEHUjUPMNnnNfBBB$#246?C@O_GAcGOFGr?i@W`A_P?[@Sq?o@OcGaZCucZQLcLzUCqlHdQ~TV}ht`VYGevkybTHjttmZqXTCr?T?|VYPl?znaDnyuQ_C?G?Uc??GdW_G!5?GA#96!34?O!5?G??C!5?G???G!7?O!6?@#239!74?i??A#192!11?@?O!5?A?_?g?@?`?G?i?S?c???S?g???_??G#90???_#49K#121ANDAm@O??Rgpi]tI~~TBPAAx~v~^hu|zvN~~s??ww??_#103!5?C@@WAuA_?a?PkPI_Y`???GQ#98???I?c!6?_!4?O???_O#103D???K?FATP`QP?`U_S_?oHK`A??_`?o?AP_!4?O_???G???A#121!10?GKKKIrvr~jz~iTBITj?s@CADA@?@!10?E!4?B!5?@#140_!7?A!5?@!4?O#125RD#132Ey#119??@#115@AD???@Q?@??_#121_?_ZtivWNhA`GQ_?FYTaLQmPkWcgS_K_O?O_Ws{{$#184?_GC??O?@?_!7?O?G??A?@??G!5?_???C?A???_!4?G!9?C#202??@?GaS?G#184!8?G?i!5?O!8?HQg@C???A???A!6?_?OC#150!33?CGCA?@#246!104?O??O??O!5?o?yCjCH?Z?W?I?V?}?U?q?S?g?I?Y?i?AOl?[Bs@?E#96G#140A#132G???@AieRGTGS@#119!5?Gc?gA#132!4?C@A#119!6?Go?EC?W[[_#107???O!5?GDG#72!9?@!5?}`tQItAaKp[WQh]HC?iP_O??@_#102GGHGK]kg{EG!9?@@@#107!5?G!7?OGO#103!17?_#112?C??C?OC#73???g!4?AG!7?A#112!9?@#126!4?C!4?@A#129?o??OoCOG?O???AN@?@_#73C#127A@#112!4?_G!12?_QcITGfO!5?@!7?@!6?G_!6?G$#196?@#192??@!7?C???A?C?A_!4?C?A?@OC??H??_?O???H??Q!7?AG?_@O#239!16?C#193!4?@G!4?@A???_??D???A??CYcWdGQCXGTdiQUdYTCrNcZcZcZc~UAG]I`eHokRu@YcHUG`O@SiS`[@QcIcQcQkQcQhQcQdQcBk@sBkQcJOJeXelQuHQtITiUgZaMgPZ_?GA_H?OAG`CO@CO@CO@CO@cHQ`SIPmONoMPkRcXeHsJsJsJSg@OI_W?aPG_AG?O?g?ACH?C?P?G?A?S?S?A?O???G?I???A???G?O?A??C#73?Oo???O??c#115!10?O??@#114!15?@??@?@?A?CQQIo?l?CO#100!20?@#53??GO!4?C???_O#99???_#114!6?C?A???A???aIsAC`IHC_G?yD@XC?O?KGIHGTKAAd@`CaOg?OK`?B#132!15?Og?e?CADQP?DA??@@???A@F!4?AO!4?C#149!5?_#142?x_C?kAO?W?ABM#114!9?@AHGhAC@S?_#118!26?@A@?@AP_O?O$#239!4?A?@!14?C!7?C?A#202!19?_#239!36?O!4?G#196!8?G`!4?QdGaTAG@?hYdGrK_ZcZcZcZ?hhU`_SGQDAG?k@Q?_A?Ag?@?A?aG@O@G@?@?@?C?H?G?H?OAGO?GO?cOGAO?H?cH?c?P?D?S`TIcTiVg\aUlhUSjIsjIsjIsjIsJShUi`mPnoNpmRkZeXuJsJsJsADSId[BkOM_\??R_@Q?g???H!5?O?A?A?O?C?g!5?g?O?D?D??@Cw@#244@#69?@#119??w#127???@#69!12?GS?C#103!14?A#107@#102!11?A??HHDYT~mRmT#115!39?A??@A?O`^HS@GaOC?IAA?@A__AK`O???O_??C?AC??C_???OG#127!23?_O???OO?GOc?I_@C?O!5?A??I??DCG??@#130A?_!6?O$#239!282?@?_?_?@???G?i?S?C???C?xiO?_???F#121!122?OO!11?_#141!45?G???O#38!29?O?A@??C#165_??O$#128!495?_?_?_?GoCY?W_?S@i???A!7?OA!4?@!9?F$#152!532?FG_?[__$#144!533?E???O$#145!533?o???G-#237lReXfI|Vg~SzkVylUj[ujLvi[a[ax]`]`GqLQcHU_UhCQdIoISbWChU`Y@YcBGAD_H?_GPiSHe?G@?XATIPMOeXAPAPk@kRcPgRkPhQlAl?U_EGUGTaGC@GAc?A#137!10?i?ChQd?@?@O@S@??_cAI?A?a?QGOGD?_?A?H??I?R?QE?D_C??OG?CGO!4?@?CG?cGAc??c?CHQdGcP?Ga?Ch?Q?CO@c?I?S@gA?HOA#192!19?A!5?A!5?c??C_?@C_I?S@G?I_?_G?A???O?G?A?C???Q_@Ci?AG#105?@#204C#14C#59A#128_O!4?O#112!7?D?SJKBO?G?O!4?OID?AO?dO??GA#115??_?CQ?g?S@HTAA@#101_?W??}GoGvYh~^q\u?b|NYH@gxTIC?GEhEW`CPKADYAtOKpOh_WoGoGog?__#107???_??C@??A???@#119A?O!4?C???EA?_G?KaAAAaD??_O#73O???AG#127!7?@?_@CCOBG???C#140!6?oCOGC??AA?@@?@A!4?@!9?C#73g?G??QE?I#118?@NSqhJVJ^g[B?W#126??I_?CpItAK`W?sJadGV?~?~@yDqC#119?R?gOC$#193Q?G?O#184???@?_??_?O#193??@??_!4?@C#184!9?O!5?G#193!7?@#202!10?@?G???@!8?O#193!10?cG!5?GAC??AC!6?P???PaGDqicPWJwTiTiTiTi~j@SrQDWeYcIcYaSjCH?cOl?l?l?dG_ITISlQcHu?m?l?GAWBwB{bUhRcjTiTiUgRu@ZoDYtIXeXq??_QChQ@Si?TGdQHcPI`SHaSHaSGdIpMpMpNoNoNoLa\a\a\`?i?T?G_?cG!5?@G!8?_??S?A@O_G?C?C`O_??Q`??G?O!4?A#217H#16@#69`#49Rc??O#119!11?AS_WACB??O#73?@???A#119!5?CC??GI!6?@#59!6?_#102WS\B^s?@?B#100??C!5?HO???!4C???aA#48!4?A#77!6?@?IOMIOH?GOGoGOG#118!14?Cacskm}}ZwJum}h|vPs}r!5@G?@?GK@@#128!11?@?_?@_GRICTiBOj`SlA@?E_??@@@#142W!5?xwgo@v??O??`GA#121?V?o`GhRDJ]o_!8?o@?N~t^jzMtIcPAD???TIVg~?~?}DyLz~kzUnz~~$#246?GOeGoAgA?BCP?D?hOA@COG@b[aHE@]`]VDolJqh\HUrlWTFthKezQhMcudX{v[IFuZXsmDjqX~vYJe|gteplHe{IsmRYRGQkBcAkALO??Q`GP_@#239!5?O#105!21?GcYcI??iSJCHOcOLOL?d?dAoITGOc?u@s?k?h?wAWBwAC@Q_A?i@iCgQ_@Q?@O?IP?H_#208?_#239!48?@?g?C!7?c!8?G???G?I_??G@!4?O??@!5?@O??C???GG#240o#35w#114[#50G#126@?C??@A@WaBLQgt#118?_R?DA???n}???_!6?I???ct?[~GCRAg?Q_#77!5?__?G@uGcGdQ?_D!5?O!5?A#103!20?CA!5?@??OI@W`HSgSoAgQcIW@OH???@!9?G#121???[s[kWqyALeB[u|??nSiCBBC_O#116???A???cPi@ShOSiOGymoZrrKCAAA??D@!4?A!7?_?@#126gsGQC?C?C#114??GC??_???A#119K}fo???S#132!4?OAC_??SG?_#112!12?C@$#196?c#192@??D??S?G?AG?A?C_G?A?S???O?_???_GA??C?A_???A_G?AO??C?O@G?A???_!6?O?C!7?A?G?AO?@!4?c!6?O!4?h?C???A?_??O#96!32?_?A???_???G??C???A!4?G?@!4?@_#237!78?S???O@AG@A?O?A?S_O@S`A_S@C@?@G_C?E@Q`A?G?I?K?C?E_@#244!6?A#83A#140?C#132AUoMleTIdHS_#114!6?C#115?@!4?@#126?@!10?`#107!6?A???C??C!5?A#108?_#72!10?GaHS?A_DAQ@?gtZTDXUheWiApLyd[Idb?`?O_?_!4?_#112!36?G_OC??_O??AG#73!15?G#129!18?GK?o?_[@IW!5?G!7?O#125oU?BFK_?_o_#115??AHAO??_#125!14?G_WA~J_?O$#239!20?O#252!4?@!36?_O??cA!8?c#184!12?@!4?c@?OG@?O_AC!6?GCG?A?C#150!32?O?@???O???A!15?_#184!85?OH?I@qGYdQ?S_O@?`?_C@C@I@C_K@U`I`A?G@W@K?C@U_@CxDQ#125!5?G???O?G_#132!19?A#114!17?pgCCRgCAgDGC@#98!16?aK??_oGQA??_GO_?O@CPKA_??_#59!5?C#114A??A@?AAA@!9?@D@@@CG??@@?cAo@P?O?GE@@#132!7?CCA!5?gc?bCXOc@YKGAH?C!7?C#38!9?C?_?kC_]s_]??FM_G#74}CAkE?A#127G#132!5?@OG?O_#103?@??CGO#73!15?@$#193!64?O??CA!8?c#239!26?O?G#246!157?t?sHA@W`I@M_I?S@I_Q_S?U@Q_W_K?K`U_S`Q`Y_G?Y?zCqd#121!6?@A?A??C?SgQlQIh??_gws~n??}{nTw~|n~Y`z]vP?~B#103??@gO?BgOAwTaI?C?B??FO#99!14?_!6?_!6?_?O#102!9?CFDDE!4CS]e]uJVJJ[OGWO#125!28?G!7?O??@_?WWCaV[q_JscPi?OgACI@AD?@@#52???OG#130O??_??_#152A!6?w?OGQ?@#112!14?S_?c?V`$#196!105?Q`GEgT_A?T_H?RkBsDiTiTiTiT?SSjGCgAP?@O@cH??OQ?H?AOA?Q?Q?P?_?`?HQ??@O?QCPC?C?C@G_CGPC?S?P?DG?k?Eg@?cAOACLYVHiUd[jPUidYheYItSja[Bs\afWtMpMpMoNoNoNq\a\a\a[iTVijcSAO?C@??G?A?I?S?I?Q?O???O!7?O?C?A_??G!8?s#127!5?_?_#115!104?A??A@@???@!4?_?_E_?caWA?R!4?D?G?@!4?A!8?@#126O?@__?ATBOGOAk?a!5?O#136!29?C@!5?Bk???C$#141!318?G#73G??G_OA#119!105?@#56!94?EO#52?S#144?@#145?@BpK@$#143!319?@#81@-#237TiSjSjuhLuKR}D}jU~DyUwT}H}HQuhZcItAShUHQcJoDYdQcZOiPeWEgRcRcGdIt?s?GBCHQkAhO_SHQlAlOdYcHQkAkPITi@i@iTiDQHsIWCG@_T_?HODGSAGC#137!11?@GQ?_?CI?A???CG@_CGQdI?GC?cE?@GGCA@?C?H?c?OAG@c@??Qc!4?@?cG?_?O?`?C?OCh??_?HAO@??a???@?AC_G?T?I?S?h??@#237!20?g??S_O?_???G??_?GCQ_IP?PaGCP_L_O_!4?@A??O?@ASgDI?A!4?G#204G#14@#73C!9?A@A[?G#119??B!6?A???_TD?oWg_oo?g#114??O?kBGCqHgAQdOA#101??ACBg?[bSHA]lvY~vkT}Y??aUslAPI???cOID_A!7?@!4?@ADAKIKtIPA?A??A#118???@?@?@??@?DqhgV~ZwCdBarrOSS_KL?cc_???C#125_?AAFcoW?_YxMIhYDySHG`a_PID@i?oOo_G??_#52?c#142!5?BB?~AwGE_K#132_!8?@@Bp?aDa#112H_O???Ja???O#126?_SIdY`CxCjCA?A?Ti?tIPIdYdGBCSg#112?C?O$#193i?`?GC!4?_!10?A!4?cH?C#252!35?A??_!7?A#184!8?@?_!4?_?A@?@?@gOA???S?G???_!4?A#105!20?I@O`?hChQ`AOI@_@??Pa@QH?kaCbOk?iPa?Q@G@c?Q?QcH?HODQcGQ?AOI@AC?I?HA??CHA#246!49?O`G@CGA?Gd?v?QLQ`KTCCiKSTqGCOIDITiTiSgDiCiSg@A?_@cHuGu@#217E#16C#125G?o?I?GjHOsCc_O#112!6?C??Ag?O?T???GDA?I?AC#103!4?O_Q?C?@cGQLhOAGpGQI_?gQ_`#72??@??RG@cQ??HAOlePe@YIDsITHAHE@I@A?B@@DI@i@@P@GO#114??C?GCC`???_CPGHa?J?DQ@G?cBA!5?_#132!5?A?W??C??U@H?_?J?iSDCoOSC_??OsO?C__?G???_#38???A@!4?BsHDGk]???C??O#125Om|^???BAC???B@#118??AFJy||SHK_GB#132???O??G`??C!6?SG?C#119!9?@A?J$#246?@A?@???q?Pk@o@?g?OChDA@a@QcHAcZT?|jAgudXSNi_YlHceTmHdpVkIgZVYoInH|t[YudP\UjLjudQWQnI_ZUdQxRMt_S]SiS?DwlsA`CpASI?IC?C_#96!34?A!7?A!4?C#150!9?A?@#239!80?CA!5?T?A??GC!13?A!10?O?@!6?O?O???@#240?p#64G#55_A#132?B@O??CBHYW@a`A#118!8?DB?_?Iyo?_!4?OOW~n~BOC_@?CP#102??_SN|s?_@@A#98!11?A?@kCS_HAO?cPQcPI@oA_gs_oD_`W_SEq?KOCo?_#103A?ccxK_J_[@AUIw?aQWaOI??O!5?A!5?_#73!7?A@!8?O?@#128!5?@?@W?B?B?@B?@?ACSIIDKs_oO??O#56!6?@?xC#74BOAB#128G#116@A#121_^~}_{wmcKwKiTsO_!5?aGokz]jdYdAGA??@!5?@VIpmtYdYv{zjU|zsn~$#196?S?S_??O#184?G???G!4?G???_?O!4?O???G!5?G!9?@!4?G???C#193!7?A??_!5?C!13?@!8?S!8?`?P_CIChUa?qH_dQkVsNcZkjV}}keCnTYhOlSjShQtISgPcGpmPqLOgQObOjOmPiSqLWdkOvGQkZcHQdYdYuHQtITMDi]OjuHaCZuLJ?OiCxATKQdWa[`GQdGQ`SI`Sa\_\a[b[b[b[b[b[b[b[b]_DAG@I?A?G_!4?@A_?@???C!8?ADGPaCG?gC?Cg!5?_!7?_#50O#128@N{_nQS__#126??@AGCOcW_V_W@#115!6?_!4?O???_?_!4?K_RGcQGdGA#77???@ISCs@[Bc\?QGc?G?_#100??@j!5?G#48??G@!6?C!5?O???_#100?C??W?_O#102?_???PROW?}[G?AAO??O#121!4?C!5?OGWCCKGJXbq`WAW{R~HGUsXG??e@I???_!5?_??OGC?_O#116@jCDIOB\?CoY_#130!6?_#136?CBo@O#127??O#119??_#126?@[@?OG?COOG#119?G!4?_OPVF?C@#125!4?SQCrOy\vl~i$#192??G?AO@C??A??A?S@?a???G?C!7?_A??S@??A_?OD??Q?G??OA???P??_?D?O!4?@?GA_??O??G?d??OC??G?C???G?_???A!4?G!8?O??G??H#150!41?@G#184!95?CAO_??_?GUGRG_?I_APIPA@aGCPaDgOa?G@?D??GOADaSGDI?UHu#83???A#54A#38_#127??C???AG#121!4?DQlZc^gZf}|O{n^I??NFAD^DNLBF#107!5?@G?Q!6?_#99!22?OH!6?Gc??_??GSPAXMo]Ke[iWGoo?_#77ACA?DIXA!4?A#119!7?C?C?o!7?wGcD?GBB?C??[A@D#126A_?Q@g?cO?C?S@!8?_??GCO#140!6?@??B??KGK?Is??O_!8?_#73!9?A??A#107!6?C?A??C#73!13?G!8?_$#239!6?GA?@!9?@#202!47?A#196!36?A@??ACIP?PA?HODASQgR_JoRcBSg@@QPhO?cACQ?OACG?c@QCGQC?CG_?P?CO??@OC?HC_AOAG?cH??Qc?I_G@?cH?d?ogP?dO?cXQ_?OsulDyE|GrlYe\`YVdYalSj`]A\a]a\b[b[b[b[b[b[b[b[`^QhO_CJtGAT?`???O@!4?_!4?@!7?C?O_?A?a??O?@_!6?Gu#97?O#121@#52W#116??O#49?d?OC?_#115!109?_C?@??@_T?GC_DGc?GCA_??C@???G???_#127!16?B!4?_A@CA_ADGE?A??ISIcO#129!7?AA@@DGJsIS!9?C#81!10?O#115!8?C?A#127!18?_GO$#239!107?A?_!5?_???_??@?G??G?O#192!134?T?AO??c??CO?G_??_G??aG?O!6?AO?P?@??G?Q?SH_?@#140!5?C#107!121?_???_???c#112!15?O!6?AO??@???G?_!5?G#73!15?CG???O#149!10?@A!4?A_?O#152!5?GC?B#103!19?@$#144!532?_@$#145!533?G-#237DYTitI|Iv[b}Piv|a^tjuHzc~A|UkzcVgU`YdGtIPiSbShEgRKPeWbKpEWbKPMOeHQk@A_BcHu@YcHu@sHeSIOiTaShEgRKaTaWa\a\AXeHqCwAXEGACi@m?IOD?CG_CP?A#137!4?HACO_D???_?ACg?CGQ?G??_@?C@?SgAO??ACO?_?_Q_HQCAC?QC?HO_HOC_?CGP?i?@!4?@OCG@aG!5?@??G??AG@C?H?A?C#237!22?_A??CY?S?aC_?o?S@G@Cg@??O?I?`OG?C_CGOg?PaGa@QgCG_G!6?G__#35G#125G!4?G@ATANTJMUO?G#112?O?_@??_#114?CAM@?_O??_?O_APSOII@dKG@e_I?O?G?_#101??dGA?@SgEJdJUn\j^hQ`LYcO?G#48?I??C???OA?G#93?G?_KOC_?K?KGO#101?@??AAIYcC#115@hA@?_PqSOHCQ`?Z??_!4?_?G??OO#126G!4?_??CGC??OooG?P?__?G??CAC?A?F??@?A??A#127??@!4?C#81?_#38_?PAWvJ[_?GC@#132OCCA!8?AC#126?ACGC@AG!8?_OkbCSIUG@??A!4?@?FGQD?mD[HQ???FOS_$#193y?AS?P?c??O?CO!7?C???G?@??@#184!28?_?O???@!8?A!8?_#193!14?D!9?@A?CP`WhO?OaSD_YR_VGaKxc^nLsoxINYtytItgRU`Z_lQTiTIuhYkhI?Ti[dHiDYDZCl?U_ZgZchQsAlAU_jUXj`Cm?Ts{Nn{[EQpcXCrkP}pysjspvGPcQHsAhSqCzCqLqLqLq\qlqLqLqLqLqL?O?B?@???O!6?a???C?@!4?C?A?@?@A?A?C!6?@?OAO?O#240!5?U#37A#128CrJe~r{ti\??C#73?@IDAC#118??G]E?M^J[pSvVn~oW{nVtMjN?osWADoP#102??ID@?HNuJG??oO#72!6?@??O_UgQ_`OkQd?OtJ?z@m@k#41???C#95KC!6?GOO???C#103@!5?hoUhCgOaCAGA?G!5?G!5?_O#125!6?C?AOC!4?_?GG?CKCJI?_@@?Q_?A?g_O`EQ@@DCy@gGoKH?Q?O!9?_O?MAB#119GCKL]?eQ??G!5?_!5?@IG@GD#132??O`?_?A?__oO???GC_@gO!4?s#112?@O_!4?@$#196?D_?I??O!20?A#239?G#202!35?@??@#184!29?OAO???H??g?OAGA#239!6?_??_#105!17?I?IDGO?@Q_@?cAPICGQ_QA?@?DaGo?i@YCH?C??_O_H?hA_AC?A?HA#184!61?O_??ODY??C_DcAoJS@?@?_@!4?I?@O??E?CHSGAPa?A@QgCG?@?@IdG#244??H#70C#140A??G??AG#49?_OA_#126???yc`II#119?_WB@_o_??GG??ND??GG#103??_T???oAK?Tt?iSPeOHs?Al?m?QgOGO#98!6?@?QCH?kOKcI_GCC?kORfvarAR?bT?RC`?aIgOgcO#77??YO#59??O#107_?@?G@?C???C#121!4?_Oo?OGAemJje{gF??gvBVZ?ZEEBa@__OCGCSK?LG[HFOCG?GK?a_!7?_#52!4?_?C#142?_BQF?A#121_?oWSA@A@BPlR\R~LZPbMtUw_O_?v{vYnRGQ`S`C#127oKO?GAtGS_#73?A!4?G#119!4?C!4?A$#239?_???_#246A??`K@iCGAG_GCGQCH?T?_P?AgRhMcYRIseThKiQXTcqiHdSQIhdSRi`lXucQ}lUsZQHkdZQGmJqXHtfTgLjQXTcr\gLaL_GateOO@Q@c?_O`O?O#96!29?_!8?_!7?A#246!92?OdA_??@?OHOHCJ_iSyqDW{wNttTYedzQXq@E@SgCPSg?@QpE?aTitWtcW#97?O#38_#52Co#50??C#127!4?_?O_#121???@YdtV?`{O#115??@?a!5?A!4?_??_DGA@oAGI?o?geO#77???Qt?N?jCPcQcgOaC#100??CK??A@@#72!23?O?@??A@C?Ksc#118!13?@CIH?ZFU\LH@BR?XOcCPBA??G!5?@#143!7?O#128@?@???@O!6?O???W?GCGUpKPUQ?K??G#129@?G???O?GA#73?G??@!6?C!6?GO#143?_#73!11?C???G#128!8?_#121!4?Di~Pq`Al}j^wnJ\}$#184??G!4?@G!7?C?A!8?G#193!40?O?G#239!35?CG#196?CH_?C?ACi@S@iQDgVGrKrCZ_OqALAdO_?D?OADG?K?U?H?C?P?C@?S`Sg?@QCP?c?_Q?Z_L?D?QC?HS?X_LO?cOUiPTiIBoOBahhEYCrKRm@MCJSBMGteYhuA|SjHzCzLqLqLqLaLQLqLqLqLqLADIdG_CITHAG?H!9?C!8?G!8?CG?G??A?_Cg!4?R??_#55P#56G#116CP#132!7?G?@Gd?O#103!12?G#69!6?@#107!8?A!7?D?A#108!7?O???@#99!15?A?Ar@?Sr?yPA@kOGP?X_nWI~_bAeLtSgOG_#119!15?A@O_!4?AAEMKC??@!5?OG@@#116???_!10?@#73C??A??A?_!7?_OO!6?_#56!6?O!4?DGC@#127O#128?@#115?_??O#114_#112!7?O?AO?G@FOG?d?A#125!5?GI@?pMRNLf|IVaZWs!5?A!7?_$#192???@?C???A???@??P??O@_?Q?_A??CO?C?O@?c?@G?AO@C_AG@COAG`COAG?C?A??G!6?c?O??c@O?C?A?G?AO?C_AG??AO???D?G??aC!6?C?@C?H??G#150!31?_#239!102?G?O???_!4?A!8?A?A!11?_??A!5?C!4?P!5?A?F#144?@#141!11?_?O_#121!22?A#100!77?A#102A?!4@AM??WUMK??@!7?_#132??_#112?o!9?OG@???O??G!4?@_???O#118OO#119!11?O#116?O?G??e?E@A??@@Av?Cb!4?_O!5?@#118wq_?{G?g__?___!5?Nf]O$#252!69?G#192!189?G??_?i??AO?C???CGQ?A?_I?_?G?C_?GO_?`?G?@S_C??@CGAC?A#114!122?@!7?CA@??@geow?CQccW@!6?@!6?@#132_SE?GG??QC`@K?QACCGAAI?G?p`SOGjEgd_E?@@O???_??_#130!7?S?G#136?@#126_?_?_#81!14?C$#48!433?O#69!17?_#73!12?c!8?_?A?_#140!36?A??HKQLGEg!8?K@$#127!475?O??_?C_???O?G??A?__p_#144!31?_??A-#193~?iDGO_G?CH?H?g???@#184??A???A#252!5?G#184!6?O!10?_!24?C!16?A!8?_@!4?C?S?A?@?G??_A??A??C#137!12?@?AOdGA?H?D_AGOC??CO?GCa?@?C@Qc@Q?G??GO?_??O_??AO@i??`?O?`AOD_IO!6?T?A?O?_?D#246!30?GA#237!8?iCGS?Pg@G?_?G?CA?TGC?AO?GQ`GOcGQC?@g?gT?G_AH?C`OlYdID!5?@#96G#38KOC??_#125??A`?OG??{E_?_#119?@@???@FBADW[KKG?GG!5?k{w?G}o#103@A!4?`ISDrcCClGCRCHaDi?G?o_#98?@A@G??ACJ?_CW_LY@[IzfWsjSiwdZ@YUhFq?CA@C@?CO?_??_#115??G??@?aPg_H_???A?G?IC!9?c_?_AO_!5?_??_#128G?GA?CCAE#115??A#116!8?OO???GAG@?D!4?@#98O#115GG???_?oGCBg_?_#112@?O?g?C`?_@?@cO?ICP#125!4?EOOGA}Z@nDrHTidB@\w_??___?O$#237?T@ybM\bmRsjSjUlwVg}VH}oN|rMzcVqHQkAkPK`Y@YcRcXEhQLQcYdGtIPKPeXaLqcRcHeGRk@iT_TaSb[_LqcRcHu@sHQLOe?cHq?tAShSjODRCJcG_Qk?iSgCQ_CO?G?_#105!11?Oc?Q?G?_A?G?@?c@O?SGQ_G??G?D?Ta@AGA@I?AC@G!4?AGAC?G#184!61?TiSgTgPg@g@???AS?a@G!6?A!5?OC?@g?iD??_Q?H?_?cI@I@#208???@#240__#56B?G#128KBBF^|Yoco???_#126EEGo??wk#69???C#115@AC!4?G!5?Dg???HA??GDBA@SC_GWC?_?O#101?@!5?@IDyDEIsgAPNOgo?I?_?G_#93!6?A??@?A?_!4?G?fOLwywo__#103@???GDWBG@__Sg?T_???A`??G?A#132??_?C??@?G?@G!6?K??GC??c?O@G???A_?c???B?EH@?@OC!7?C!6?B@#107??C?A#119???B?CwG_#126A?A???GGO!8?DiX?E`S_#127?cQ?GCaIOICA#121??F[B[ALANvnyt}N$#239?iS?S_?O?GA?A!9?@#193!75?HQ?C!8?G?G_PcRC@Y@@ApHCRidTqMTiTiTkyWLGqlQUhYD{ALyDXadZsITiUgZ_LY?latiTaleXMtILZktKeDQ|ULImSWL_Y@dn~?~~T?ih{BkZV_yy~~nzv~?PkRcZcRkRkRkRkRkRkRl}bsLqLqLqLq?PA@aC?OAOA???@g#202!7?G#193!12?A???A???_!6?O!5?A?P#37_#52nr_[O?_#49?CI@#121???A@?hAI}}FB^{oww__?ooo#107!19?SI??A???GO?_#77A?@?@ACTqCGXo#100??O#99???@??COB?B??cA`CWdJSiTDYC}dhUoLWA_C@A?WG??_#108G#59!4?@A??G?C#118GAI]P_?wscoX\]E!7?CA!4?OA!4@`_!4?_!5?O???__#115!7?_#103_!4?_O?O!4?_?_GGoCGIS_w?O#119!15?B#73_!6?DA??C_#128???GO_?O_D???_#143???G$#196!5?@ACP_?S_S@Q!4?_!8?G?C#239!74?A??A_#196cO?A?G?Oc?gSA?RgDWaKPiTiTiQDdaQD?H??_A@O??_AG???_G@_D?U_@u?WA?GS?PCo?dO_Q?bWOl??o`PAdaYDsIO?~??iiTSBkRCgYDD??OCG?~mRkZcZkRkRkRkRkRkRkQ@SHqLqLqLqL!6?AC???S@g#239!26?O?S?G?CA!5?_???gM#97C#144O#116??R?Gw#132???@?E~~@?X?OD!4?_#118!4?GAB@BFtvt~|YqDRBFot@MoWsg_?O?_#59A???G#108!9?_#72?@A?DITkeonSIspNWfOAcY`#100!18?_!7?O#114@!4?@?ACAE@ERACC?AO???OC???G!8?_#103A#125!8?KCOKSGSGEAJL@@?_???Q?B`CIIEA@A!5?C??A??C#126A??A#132!33?hgA@\@?c?QGC??OwKAFO?o?XQG_$#246!16?FgA@?s?FO?COCPG?udP\Rib]cudXkJaxUCqlHdYRIseriHeSQLHkYQXtcRYSiNi\hKbZQLHkYQHkJucqjXUHUGnI|h?j?KOG_O?RC@?@#239??@??G??A?@#150!14?_??O?@_?Qc?I??@#246!98?@A?ACAsBWBS@g@}?qr|hnvbKSfIRdhjyUUTB?idJ?cRqGC??O_O]~~~?O#142!5?_#140C#127!4?CI@???W#73?O!5?O#114!6?@?A??A?A?AdGQ???E??@E_GTI`IT?_GO?_?O#48!20?@!5?CO@??S#41!17?H?A?C#77@??G?ICC???_#119??@!5?@?G!6?_a??K?C!6?OO??_?A!6?_!9?ACB!8?_!4?O!6?GGKG#126!54?_??GbCBC?t?GODI@o$#192!18?S?G??G_?G`?A_@?GA_?C??@G?A?OC??H??Q??c?@G?CO?H_?Q?@c?AG?_@?O??AO?C_?Q?@c?O??H?C?_???O??AO??`??AC???G??S??G_#96!21?C???C?@??O??A#239!99?_?G!5?C?_AO#196!33?Q@!7?S?A#112!19?@!6?AG?CO?_#102!26?@??JRBAFwkyu[wO#95!43?O???K??_#121!15?OO`cGCA@A@??`PPRGMaf@YKDliXN|{aqOABOBB@?gO?_G?[HGYDlGKW??@??O!5?G???C?ABD?A@@!7?@BARN|V|z]~Vun}WN~tzm~yOcO@GA#73!12?O$#192!265?C?gAS??@GC?AS??S`GOdGQC?@g??S?O?SH?C?QH???C_#143!26?C#72!101?AACC??_#112!16?CGD!7?A_??C???O???A#116!10?O?C#112O???o_??O?O?C??O_#141?O#49G#101__!6?_?_???O$!438?@AA]SQO__o?_#107!10?@O#126?A@!7?Q`??A!4?@!6?A??B??A@??OO?G?O??G?_O#118!7?O?O???G!7?CC?A`@??CBK]WCc$#102!439?@??@@BYECSW[W#73!18?_G!9?CC???OK?OG???_??@???C@??DA!4?A???@!5?G???C??@$#125!472?`OG?O@#127!19?__!9?O_?_CCGCI#128DDEI!7?C$!474?O#116O#140!42?G@?B???B#59OO$#127!475?G#72!42?__#77O??_?_?_?O$#142!520?CC#52A@#114WO???_?O?C?A?`Z?S?_$#102!521?_o!8?_oGWOC$#38!523?A@?@#81A$#129!524?A-#193~?~?Sg?iO@Q??`G?ACG?Q!6?G#196!14?@#193??_#202!15?_??C?A_?GcO??_#184!4?G@#196?S#184!12?C?A!5?@???G?G?a?O???C?C!5?C?O#137!11?@?I?COA_@I??eGDa@?_??O?A?c?OC@A?G@AC@?Q?dG???HQ@C@I?T?G??H#246!45?OC_HQH_?O_?O???C??GcWeXA`cdxQ[gVWgiiwSVzy{xy|xYSdLZRtTk@smsRcl?iTgX^~~r}#244?F#14A#128_S!4?FFFB@?nXSIU@c#132R?VGDQKa[O_?_O_#118?@GC?B@??B@???@BE@@FEYL\]og?}z_O??_#101!7?A@?A@]`ZsIsHU@qK?e?G_!5?O?_?_#93!8?_QGVDnJ\inmCKGGOg_#100G??OOO#114?@?C???@?@_BGOG??GAC?OG?AA?EB!6?C#93__?_?_O?__GoW_GcGOGQGC_C?_#72@??@E?OcG?CGG?K#121!8?AAABHYYzWopqbff{y^umzFhUyHa?@?TG#128??@_GQcZ?OdOCO#126@CR?WA[`IoD_$#237?T?iATjSjSlxnYt^OjcYDzeXvkYbtLr[QhCxAXaTI`QcYCYcItAXa\_LQcZc@?gQGSGAs@GdO?@_MPIpEwB?TaSjOLQcY`MpIT_TaSJOlA[?XAk@uGuHuHcOi?QgCAOc?P_CG_C_#105!7?@??C??S?@!4?QGCa?dGP?HA_G?d?CO?g#192!78?_?OG@C!4?_GQ??C`AO_DOC?@g?C@AC@AC`IO_CGA?OC@?G_A!5?_#64!7?C#49U_#38?QO_?_??C#125@?A@CHUHgw_oo__O_#112??A!4?Q??G?C#73?@#143_#132??g#114???@???@CA?@CQg?CICS??gGU#77!4?@?ADI@[_?SG_#98?_K?a@Go?WPcnO@lAt\_\btePiSDD??_!8?BAC?KCOW?G_#121!4?OQQOAA?C?CA?@!6?@G!5?@C?A@@GE?G?@A?D@??@???@#118?@#101?@!4?@?A@A@ZCWoCw?sKOKGs?O#112!7?A???a?A???G@??HO#143??AG#125??GaQ`_CiviDrKRcZdQlOM{o?Gf|a$#239?i?Tg!4?A?A??A_C!8?@C!4?@#252!29?G!11?GC#193!31?@Ac???GA???AGbDO`CaXdIPiEI`VPYHnl[m_tqn{ZstiLOugDqHCqHfWtIXEhZ_|QuWdwUmGlOAuvlE`kqy_TAjbuXEwVy~~^v~nv~^v^v}]nv~z\mvz]~?nOnOnOnOnOnOnOntZehZUce\id]TiLU?Q???GaOA@#239!11?C#184!13?A?_?GA_G?@?GO???AC???C#70???@#125H#116Ad?@A??_W_cOCGP?GO#73C???G#115!11?C#119BBB?A@??A@!5?EMGG?O__#103@CA???j?Z?A`G|?Oq_i`GC#72?ACJ`BUh]@q\GvASDi??C?O#95!13?`?YOo_???AAC??O?___#107BA?CCU#118?A?DCO[?w??C?AA??AGB?@?G!4?@CGKGE!4?C#100?GG???C???AA?C?A@A???@?O!7?C#118@?@?@?@@C?CsT{CoccC???C[G#73!14?G??A#116!8?c#121!6?BGc??@]tNy^~$#196!4?@AS@Cg?COC??@O@_#193!54?G#239!31?_??@AG!9?C?@!7?O#96!13?@?G?@A!5?_??O#237!95?_??G_Q@???cGQGAC`AGaDO@A@g?C@AC?AC`IO_CGa?Y?@?GOAT?ACA???G@KGO#52?@Y`eKWOW?W#127!7?A#121?A?BADQCANZd^b^jgsws{g]m[c]B~U{woOoo_#107!10?G?D@???G#100!17?@?O!7?g#85!19?CASOOw?_O_#77?@#102?@@?CCOQGG???_?_??@?_!4?P!5?CO?CIA#81?A#98_#95__??!4O???G???[CGckAgCG#134???A!5?C_#114?@!8?@AG?GG?_#126???@??@!6?AC_??CoC`CO@OCIA#127O?GSIC`G??IGAh_#73???A$#192!16?_!5?@_GA_??_??G?_?G?@?@??O?A?G_AO?H?C??Q?@!5?G!9?C??@?OA!4?a?G??Q?G`?O???OA?G?c!4?@C?c@SH_??O@G!7?O#150!19?O?@?OGCQHC#239!95?G?_Q@!5?O#193!30?@??OAC??g@gP#150!8?G#132?G#142?GGO_#140G??AY?_a___#126??DGC?G@H@_CW?K?S!5?O_O?W_S?g#112??G_???_#102!10?C!4?AFNL[S[oo_#99!13?DBACZ?BmA\IA^a[IXmTjYgUg!4?@?@@??CGCOOG?__#115A@_?Qhd??C?G?aG?OOP?GGD?Q??F??@CGOC?A#73@?AA#112@ADD??BA?@@??@#131??__GO_??_#103!4?A@A`A??AAaA?KAgo?G#73!5?@!9?@$#184!16?G!4?C!6?A!4?A!5?_C!4?GC!6?_!5?G#196!50?O???Ga?O@??iCQH?A?e?H`UGiDuOQaPTIG???A??_G?QGC?@??GA?cAoC?U?G@aGB?PdQItHGQoKQHCTigSSHeoFgD??_G?OG?_G_G@`OG?CaPGC`?~OnOnOnOnOnOnOnOIcHQC_HOATI@iDQ@l@CGC?CH???@!30?A???@?AC!8?@#56!5?C#55?@???c#115!45?@?A?I@T@?T?b_WSU`?__#48!21?G_??O#88!26?o?_#103!5?A?@@a?``C?_?@?@?O_PLC?\?T?SGOo_G?C?qG?O?O???IG!4?CC???A???@#77!12?@A?Q?oAo_OsGo_O#132!11?@?@!7?@?GO?@eSL_SG`T??O!8?A@AGcP$#246!18?QDg?WE?O@SGQKadSZEte[Io]kJdP`RTGleSAZqlHcQ}VVlrbt\JuRInvQZpmsEgDg~i\HSfqlHdUOIdg^iLhseQXAtAs?O@@!4?QG!4?O_G@GC#184!126?A?_Q`Q@?C?CGQ?G?D??A@OCA#239!25?O???_!4?qo_#59!68?A!4?O#72!53?@#87O#101@BBABECK?GGG!6?_!4?@??__?__?_?_!7?_!4?O!4?G#119!4?@?A?@#99O?_?OOSgGGoO#119!8?@!9?@BB@?@WC???CIK??OO$!461?!4G?S??A??G!4?A???@?@!4?@@A#126??GG!4?AAA??A#98?OO??C?A@A@VSMK}kw_G?CG#115?@?@?@???CACo?G?_!5?C?G$#132!463?A!4?C??A#107???A!7?_WOw??O?O!9?C!4?A#102!22?A!5?A$#112!466?A#77!4?_?C_??_?c#108C#112G??__#125!7?@CD#88_??O$#111!483?O#85!10?_???__OOoG_?_???O$#116!494?@#111?C-#193~?~?Ti?GP?DA!4?S?SAS`GO???_A??@!10?A#184!8?@#202!12?`?I_S?G!4?_#184!17?A#193??CO_?g???G!7?C?DO`W??G?UPGRkACBPKHQCjYDuhUvvnZf^Y}lzt]}ltIlS[kqY_DmTZcFLY?i@TBgEOHj~Bjj~~zn^zx|Z{|]~m~^BhYb~}NZ^L]VZ^`iZjRjRjShUhulYTMtYLuLYtEbCAt@AQ@AAH_F?L??CG??C!10?O??O#202???A?A?A@?A??_#184!10?GA#196??@?A#153?G#239!4?B{#150A#140@??_!8?A@?A?@A#127?@?A@?A?GC_??_#73A#143???OG???G!6?G?C???S?_#118@??@G??E@Kq?hC?G#102???AI\u~|ko#53!5?@#98!5?@A@?HA?GQ_WDKPROMiTOfEc?W`?OA#85???B?EA@??BCBGC?g!4?_OgWWWwo?woSwWwWks[u[s[snXk{U|XgSbATiAcB@?A?@@?@#98?Gg[oGw}{jq~{DNUjQ@CG?C??O#115?@@GMO@??G#121Ad^{s\|tO]jTlV}JsD?B#125odrZHd[A^_I@PCiChEYdQlTdONrOs?@OK$#237?T?i?TiTmTytm\zViTHsB[AflQ|JSxNwEOlOLaHcJS`WaKhS`ShEgQKPeCIcHEGQK`?J_SAGQC@?bCjSgOLaTgTAsBsHeOdW`ADISBkRc@iTaTi@y@iCADYcRk?iC?@gO_IOcGOC?G#208!6?C#137???@!6?AP?_A@C@IO@_?GO_?T?i?S@gAS??S!8?A??A#237!35?_??_??_??G?G???K_S_S?O_Q_Q?O`Oa?s@YcAgTGcGDGCGCWCOCgCOcGCA?@???Q_IOACHa?_V?A@!5?hO@#193@#38E!4?@B#129??_O#132?CC!6?I@?ADCA?HUx?Z_Xa_?__[__PacY`S_#73?O_G#112???AS?G?O?K?_#103A???J?SI_TKoAH?AOG_#100!10?A???_csO?A??_g_#93@!6?@?AANcCxJRClPk}nzkw[qX{So___WK?___??[CIGC#103!4?@?@@@#100@#93@?C??_A_@`SlgTkR{[{{Ra{huPdS`Dd?@?CC#100???_#102??_!9?CC#108?_#118AYnDP\G???AA#73?I_!8?gOC?G#127_QG`[_J??A?@?O@?GCAGGdOK#126B?aa?P$#239?i?Ti!4?G??@??_?_!4?O#192??G??G??C??OC?@_?C@O?G_C?O?C_?G?C?A??C??G!7?A!5?@C_?G?@?S??AO@C??O?WdGSACPc???AO???@g?A??CH_A??@_?O?G?_??@#105!14?ACG@??G?AH?O?_???AC@?A#239!69?o!4?O!10?G?G???@#240!52?AS#56G#128CJ^[c!5?ApwIK|[{iCws{_o{_O#126@C[CTeXS??]@]OMKXC[iC\_YcY_#119??ABEKFB?GO_#107?C??_!6?_#101???BCHUkB|QdjStKoKa\QH?cGO_W#48O#95!6?A!4?@C_JWAogwOgO?OCO?_@_!4?O#103?@#108??C??C#84?_#41A#95C!6?AA#84??AA???A!4?A#95!5?@??_@@kSAAGa#134!7?A???AA?@#77!6?B?@aCW__#119?G?Oqa_O?AB#132!4?@!6?@?RCGICCcQA`#128?StQkaOZEWdAhO_O?_?_#121AHSlA$#196!6?Ta?a?GOaCG@A?G??C#252!50?`?G!21?GO_#184!6?@???@!5?C!4?OGC!6?C?O??O#150!17?@!4?A#96@#246!81?C`SGa@?I@GaL?K?C`ACJCWAkcPxEibZrirzbzbrlzPZlIrx|}[~~jKTdLxqST|Jg{|{~v~~~Uk#218?G#70_#116@??_GSgEHaT?ATpAa@#121!11?A@?G?CJjT@A@F_PA`A@RaJDRdJ~\g{oo_wo_#72!18?@A?BS?_ISbIrKp[aCOI@_D?a?C!4?A??G#88!11?A?@!4?A?C!8?_O!4?G!5?CCC?G_GaG_IOaPB@?ESIGOA?OG??A#131??G???G?!5A?@?@#103!12?BA@BAGU?d#112!5?A_@G_?Id???A#143G?C#116!15?k?XC_?_?O#132??AAI??KHSGA_$#184!17?G!6?A!5?O#193!43?_?G???@A#196!29?A?O?G?A@QC@_?_C?@gO_A?dg?DqHUhGGO_W_d?O?A_?Q?cO?_AHCTiOG_QgOdiTSigUPlaS?gSS??CO_CCAc@A`?P?_{Ud[?@oc_q`gc_]TcSkSkSjUhUHQdIpIDqHQdI@GQhAK_H?G`CAG@?`U_ACW?G#244!52?_#74O#52Ao?@OgVxUKg??_#112!22?CA#115!21?@A??APKO?hCOJ_TI_PC#77!5?AShOgAKO?G#99!8?@?DGF?BAKmpTglWpY~cWO?`CCC#80!8?@#99??A@?CO?GC???B?@A#94???_?_?_O#107?@#94!9?G#99!11?A!5?S?CQ@?GOD!5?@#114!15?A@P?c?GC#126!10?SiO_@oIyCgBO$#246!18?a@gA`GOdAS`E_AxnAjq[UZoiKfTRQjMjQWVdriXxtZqxvdQ]tSJjttlY]VSyOJUdq[iBi|HkIqXlIfA?A@@wAGR}SgLiS{?EO`W__???@?OGACB??@A#184!108?O!4?OC_S?O?O_Q???O_?A@?@GC??O!8?G#55!38?wC?A!5?@#125?G!6?ToEH?YH@VaG?a!8?_#69!22?C#114@?A@LQQ_SB_TI_@#95!24?A#72!36?A??A!4?AA?A?@?@!6?A#101!40?O???OO_CGqP`ZgSgCw_O$#239!124?A?O??C!4?A?_#192!120?G@??@_?Q?A?P?C?C?C?C?C???C_?OC??@A??S`IOaCHa??S?A#142!16?A#101!135?@B?D?AA@!5?@??@?@?@#72!42?G??g?GODKiUcOgSG$#102!458?A#131G??O#118!4?C#112C#77!6?@?@?@$#98!460?KAA???@?@ACA?@!5A$#77!460?@?@?@$#100!461?GC??C-#193~?~?Ti?i!6?OI@A?@??O?_!4?C#202!27?IC?QCH_COAOCH_??O#184!18?@#193???i?VcGPC#184!5?O#193!4?@?@??A?AD?eGD?GRCHe?JCD`LUpHKYShBXElQ|pN~zu|JEJOy@T_iCT_iCTaIPdGY`twyN_yy~~mvz|MnflmNjlM~?~?~NnOnWfXlZcZcZcZcZcZcZsZM`sB[`ehcJG_O@C??GQG?GaC_!6?A?_#202!5?O#252!9?O#202!11?Q?`???_!5?_!4?@#240???Q?Oy?P#14@#52@?FKgkVAJ?R_g???_WO?oW_O_#127!5?@?G?@G??AGOCIC??OOgW#143!4?A?CPAh??I#118??K_ANwC_iO?o?O#102@AB}JulJukO#72??A?GFOJgQHCO?I?sA?cQH?e?AG?_#95!4?@?ETgYDaD?f?C?O?O#88?DRYM~o@??c?wGGG?{oL_Cqoz{zox|zWZxarrGHB???CG#95oAGe@_@CA@#98cySYv[zu}V|Z\vI{AAC_#103!5?AH@IKbDG?W?O#119@E???Wg#126?PA@UKp?BGS??o?g#128??GPUPSKApKYDJccZgESPa[A#132?j{S$#237?T?i?TiTzvm\zVitiSxUlYfG]vkR]`yVhQKPeGV_TiSATiPiSbShEhQL?OIC_OAHHCC_OCH_G_T?HaKPeGrKHShQhQcZ?YcH!4?A?OjWfKQcHU_TiSyCz?|_YdObWcAgAoHs?wAOa?CQ_@AOc?O#105!7?HAC#137O_D?i?T?i?T?i?T_IOd?I?D??D#239!44?_!9?C??_O?O??KA?AG!6?C???G#184!32?G!6?C@#252?A#193A!8?A#244eO#38M~w??OgsCGc??TO??__??_#132!9?A@?OB@GD?G@@JEFfABB}xCp?o#112!4?CO?hQ?C#119l#114?BOTCiC@g_S?_#101!4?_@ADUHCZeWfOVlsyj}dtIOwOGcoOO__#48?@#93!5?`?AEDqTg~O~r}l}jtygC`!4?G?G?Aq_!4?OO?C???C!5?CGCGSokylvytF\vXqLUjLSZ@iDG@??@#72_??_?SA@taZShghO_#114?G??G?QI?QKG_#121FVDAQ~mt]GrKn{t#125@PKMG@U~`K`I`?GA`???A??RGbKXaTVS?i$#239?i?Ti!8?_C#246?CHE_OdGq@?@K`ICGUcriHt_^i?j|gTEThKjQXUcq~dpZKisUQjXLjqU\sIi~UTriXTCqqjUCUlHcudZu?G??cibCAOplJqh^i?@CPCSA???GC?OOCPC?A?@?K?G#237!90?OAG_AGOAO_OJ??`Id?_@s@?PGRGV?jODGBSH_ACaP?Q?T?T_@a@WAc@gQCH???A?`GC@AC@AC@?{?sG_G!7?G#20_#116??ADA?@?v?OS?D_GC?oG?S_O`#141!5?@?A!6?A#140_#121!5?@!4?PChEXaLUzltUlrIOo#103?g?P?iCPI_KW@SHQSGO_G__#53!4?C#100??A@???I?DA@_O??G!7?ACA#85!4?GG!5?@A@CI?C`O?NyzrWuEd?V]BMaNJLJCBCJEACfcATGCaEODQG@AG#131_??G?_??a#101!10?Ac?G@@kGXCjSRSmS_s?_#115?AD_`g?O#112???A@C???_#132!5?AamQ@vAh#116!4?cIBdCQDgc@Q_CpG_#121!5?A#73@$#196!6?T?CGPaCG@?O!6?@#239???_#252!31?_@???_?_A???A@C??_!20?T_?PC#196!18?H?G??AGD??A?@cAg?O`IcRchEWehQlAMo?C??ohSiDSiITPiITPiGTcIQdSIADoYDD??PGCApOWQPoSQp?~?~?oOnOfWeQcZcZcZcZcZcZcJC`[B[`UHSJOFCIcI?QD???C??AC?g??G!52?O??_#64?A#63O#56??o!4?_#125!10?@!4?@??O@!4?@c?Ea?D`A?OgGGGCC#135!11?A#115!4?P??C?I?@PIEDIoC#77!6?@I`UXcP_G_#98!4?C@O?@g@GC?AH`WTOYT@jDQ?hgP#131???A#75!15?C#84C?@?@?C#117!22?@#99!11?CQGOoG?C@_?aCH?G#100??A?_#77?O!4?ACA@HU?s#107??O_#118DEDbeXwgwc#73@!4?`!5?G?_??S#140!7?_OG?_?OOG#126!10?@$#184!17?_??A!4?G!7?@??O?G??@#193!19?@!10?A#192@???G?C?aG@C??h??Q?G???T_?P???OdGA??C???Si?i?h?S_O?O?A_?_???O?O#184!103?_O@??dG_@c@O@G@?B?R?@?@?@#239!48?_N?\#96?C#55???@A#128@!5?N@?INV@FMFAINM[~n}~}{q{IswSGaCWo_O_???_#107!20?B??C!5?@??_#99!24?CA@AL?EDAnCi}Swg[O??_??O?G?G#94!13?CA@??@?@?@#102!63?A@RSg?O#143!12?G???AO#127!4?@!5?UaG??O!4?Q?G@C???AC@gg$#192!19?G???C??Q??O@_?G?C?A???S??A?g?AO?C_?H#242!42?AGG#184!22?A@?_???G?OG???A#246!104?CI???Q?OG_SaS_s?gOawuOau^|xLm}lniyi^]Kmf|X]Vdxu}~l|[]Rq[xy{xyYuBXHuVv~lN_D?G_#140!4?O!7?A??O?AG??D@??A#49!6?C!6?O??C??O?_O#117!103?O??_??O?_$#202!99?A??G#239!23?@#192!116?O!5?A!4?G??C?C??CG???A??@?O?D??_@O??A_?GA?@???A?c@AC@AC@?G?c??G#142!16?GO?G??i_#126!22?@!6?@!5?@CaISHaKo$#116!356?o#73!8?C???AG-#193~?~?Ti?i!4?OI@A??C!5?I@O??@#184!19?P???A#252???G@C!7?G!5?_?A#192!5?C_?H?_C?Q??H??AS_C?CO@???h?C???cHaGQcG@GC?ODAS_T_??HcP!11?G#239C???_#137!12?@???@??A?C@i?S#237!49?gC@G?_?GQD?APAKOC_COCPaXaOcPA?CGC`?QGAgA?G?V_@cHQ?TGc@iODGAS`O?C@??G?A_?_A???~TuHU?g!5?c#217AO#38F~?E@F^?ACCNCH?GC@g@?wQi?_?_!5?_???o#125?D??@I`MpKqHcCO_O#121@kAXcXnZLYmtBo_#114AOL_JOIgOiCP??_???AOG#101@AD?BTIVK~i^yVxjS|Q??HueXO#95!4?B?RiSxDiA@A@@C@A?DA?_???__GOG!7?__?_O??O?_O_??O?O??GOMSAD??D?O???@?@#101???A???G??P?gRgAtIeHUhUiCBG?@???C#118?@``FfE]TB@A?CE__?Oow_#132?@AD?qG#127FgG?G#140???s?AGQ?_?Si#127!5?G$#237?T?i?TiTm\zViti[jtIhV}hVSojExMydYcRcHU`YDgU`Y@YcRK_LQHShA_AO@?iP?cP?AOFg?CH?gCCqChSjOjChU_UHQLQc?C?CQD?DOhQlOLQcHuHuHYdYDJchYdiTiTcWeXePA?CGcO_@GQ_O?O!4?_#239!72?A?O??C?@!7?_A?G?I!6?C#202!4?_?O!5?P?A!19?C@?_G?A_?GAO?C#193??g#184??@#240?@?U?NG?D#2A#58G?_#52@!4?H?B?O?FA??B??FD@{R]A{WsG_OG??G#132!9?A@CR@?EN{?w_#112!4?QD?I#118cBFsLq^Sg_S!4?__#59?G_#77!5?@?BKATGR?S_?_#100?C?AGlvC?G?_go#93???CGC@A?@@SHKWBY`^Q\vZv{]U]umsckORxTxY[u[N]~M^]N]~~k]kM~Vn`BHAHfI\eHb@CBKCG?G@#100!4?O?a@!5?@#77EGEgSJWAP??A?AC#107?O#119!5?G{u[MIHK?__G?Oo#73???H?O#128?TaLUtHsA?@C@cIT@?SfWHqcGo$#239?i?Ti!6?_C?C@O!6?_?C#202!32?O??kP?i@GAOD_?C??_C?a#193!17?i@Qh?AgOA#184!4?O#193!10?O_GA??@G?APA???CXcXaRGVgU`DJiLiTmTYTjZeVnnmlkmmlmMyxtry?SBjj~~?y~~z]j~u~?}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}jDPacTQLu?GySg?_@?H?B_GC?C@??GO@#252!10?C#196!44?E???O#35@#14_#56?Hw}W_qoW_O_???_}O}w??O#128???H@BBFUB@FF?FYEf]d]pMpKq?O_O#143??A?CIAOc?_#119@?WKW#115Ha??_AT@IDOgGWO??Oo#108!8?_#72???@?DGEOj?dQ??H?aCO#131!12?A_ACG_C#85???GCGB_H???A?BBG?GA?A?B?@?@?@?@??A??@#98!6?_O!6?Wo?OXrnTm\~D~fMKUgEp!7?@#103oCOiQdgOGhICK?W?_#121??G`@_oB]VL@FFKqlQc#125DfwATa??A!6?@??A?@?DaLRvN$#196!6?T?PaCG@?O_C?O#193!39?G?C#240???CO#193!8?_?A#252!19?@O_??_O#184!17?A?@?_??A?G?c???A???CG_?O@#192!84?G!8?@???A_??G!6?OA???C!4?AG!4?C?@_?C@O?C?_@G?C?AO@??C@??G??_??A???A?C#239!5?O_BRg#104C#70O#142?A??_?DCbW_JuwsR?C?F?gC#129!5?_!4?o#127!15?G_CG_#103!20?D?AD?hCSDKoQb@kagOAS_G?__#98!11?Gq?PCGAHkFob_PgCySG??_#88!11?@?!5@?CCCA?C@@#98!7?_#88???@@B#100!17?o#113_#72???_?a?O?G_P?CPCItOo`O@???@#59??A#115?_OO_?Q_?O@_!6?O#126@!5?BKOgQG#116!4?O`IsJH~{rkYTigTiWaS$#246!17?A_Ug?AG@I?xEO@IdPKYqhMcyRhMcudXkaZqlsbU|VciyRCmPIetliWVzZU\PzXLzQJSeSZQhLhucqlX?G??gGEidUCQjalZQ?S@c@Qc_OQC?O!4?I@???GcXaP?AGC_C!84?A!5?_?gC_@?HOB_@cGCHEJGtlyrZ]nlttV|mrxg]]ZqknirZ]Sfyr|hMmzyy]vvt\^V\l|z~??Hqg~U~hhOc#193G?G#144??S!4?G#116!7?@!8?BK`SACGoGGC?oCO?`O#73!9?A@!4?@#107!20?_OA!4?C?CG#99!27?BDERwKWC?A???sgSOaoCW_g_!10?GOG_?_!6?_?_!7?_?O?_??_OGaW_aHUKeGC?aCO?O??a#134!7?G#53??G#102!6?_cCkWTL@ACG#112!9?_P???G?E?G$#192!17?G???@S?_!4?_CO?A_@C?O@?C?O@G?A??C???G!4?@#202!37?A?Q@???G#196!20?G!6?OAG_?A???D?A?GQ_TaTIPiDiScXgOOPQQPPQOpDCIGCTjgSS??~D??C`S?H?~@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@SOiCPiHq?dOD?ATAKOAo!6?G???A#244!58?O#203??_#130!16?G#132!15?@#140CAwGBg_WG_O#141!7?G#126A@?APCAPc??_?O#102!15?ABABBLGCBTUkwgO_#131!53?O?_!8?_???_!8?_???OGcOC?O??_O?AGA#108!31?A#114_?OA?W?h?A#69???O#143!5?A$#184!18?@!7?C!6?G#242!64?H#184!136?GA???GO??C?COAPaO_?_#49!116?G#117!97?A???A?C@?G-#193~?~?Ti?_DO?D??a!4?O!6?C#239?A#196??P#252!17?CO!6?_!4?C!11?C??CO?A_#192_???_C?AG@?C?OAS`CHQCOcGQ`G`IOaCGPaCHOcG@aCg?_AcI?QCa??aO???C_O?G??_??A#239!51?_#237G???_?_?_?_?_?_?_O?GOCP?IDgOaS`A@qHOGo?QcBG?KOA_QG@c?AH_OA@GcA@OC`GC??T?gA?gQk@APcGC???G?A_G???O??@OcWC@IOc@W??K?S?_#56[BArrWe?@EW[pNNV~N?B^|Mw~ksovSW_#116?DgAOF{Ho#132!4?@UHCPI?@Bh{{ocwOgY#112??@?Q?Oc?O???_#114AAGP`CCAQg`S?oG_O#101@!4?oCQ@KiXe`HUhA]kiB@gWOCj_@_??_O?_#93??@?BACC??@AFRGBCICJ?C??@C@A@D@E?A?AO?AD??CB?@?@#77!5?_#103_#99@??A??SI@S?EKAA@C?C?AA#103!5?ORecAWCQ?@A@_?A#121!7?OGo_!8?GFTaKh_#127AD#116@QICjTn^I^LzUxlup}`[_gs$#239?~?Ti?@A?_???@???G#202!32?AG?C??A?PM_POAGdOAHcOAl?O!4?C??C#184!8?_#202!11?@#193@??C!11?A??O??@ACGO?C?_GCJ?G?\@I@C_DYDOiD?W`UiFsJKZSYLYuhe\It\b]eXeXeYdYdYeWeXeWeXe!4~?~?~TyVdQtmTYLuLYTMTYLuLIdR?G?i?O?HC?AGS??aC@C!5?A#202?_?G@c?AHcOI@GcA@OC`GCaGT?gA?g#192?gA?@?OC!5?G?A_G???O???OC??@G!6?C#239@#105@#38@!7?GO_??A!8?A@C?QBE?AcUlWOSh#128?@?N!4~{hCP?sgO_#126C?BCG?e?CCgO#119@??A?ED[WKW_#115D?C?A@G@SKATK_OG_#108A#72!7?B@EX]ahUh?OCgA@_GO?CI?OG?_??_???_???_#95@??GCfKrDxCy@AgAa?`AA?@?DGC?DH?A@@G#72G?_O??O?G?OG_?G?tiTSaUWRsDCJCIFcP??CAG#102?_???cp@?_#69?A!7?A?OI?CA#107!4?CZ_D#126??I??U[o#128AKdSIC_!7?AOHE@M@]PI$#237???i?Ti\qL~Yj}T~gVuJd}R|jSza|P~GeGdItAsHeSIOjSbWA_?RGgEOCI_PG?`S?GdOAHcOAH_SH_@OCG?sAhChEWbYdGTaSjUhUlQeWehQpMpMPiTiTjShWeCDySgPdIdYcZCq_TaOAS_Y`Y_?gD?gDAG@OG?O_?_?_??O?_#239!54?cB?_?o???@??C?C?C??@#252!13?O#202!32?aG?A_G?C?OA?@O!8?O??W?@#204?K#74AB#58WcGC!9?O_?O?_!8?G#129!5?A#140!4?A#141!5?A#125?QIc@Q_S?A#143?B?A?D#118!6?@?B@IBFBF\wti]wyogBOG_#102@BAEESy]bK??G#98!5?S??C@A@CGO@cJOR_DKaTJsQDiSiO[@hHUGo?_Oo?o?o?y[EGWCKGWOO`wTGBWoI\i?OeM\m^mN^EIFUK~TnI@_I@h??@_A?A??@?A#114!7?Ac?AggAT_URhgU@g@#112???O!6?I???@???O#125?BLWqG`#140pOIO?D_QCHCA?G?O_$#196!6?S?GA?_#246S???B_G_Y?C?Cj?K?E?aXvYPIkJqXHtfSiGf|ZhcvRxnxTM_RKIhtQIlsQJlOuJjuZijxTZJ|UZQxdSCYriLh?GQ_?hGAPCGEOC`KPaCGOaCBPiW@ADIO@O@@?PHCG?L_g@??C?DQ?O?O_S_C_#192!68?_#246IC@?QCW?GOg?a?bKilX{vupj\\duYZLsQNd{uRX{mjYUrXviiVT|VVDP}{mJrz~\vvt\TVr~nln}mnJbz}sfZmfNcRqIO#70C#37_#144cX#136CG!5?__??_#144G??~[_?o#52@?@G@?@BHAADHEwAs#127!7?__I?DIGO#121@??RDHQ`zVm}l}lWw___o#103???A??@?@??A`IASL_W_C`[A`GcO#100!7?O_@OOsEE?_??O#88!18?@#100!10?_O_?oO___???_!4?_??g_O!5?_#134??C#77!15?OO?o?O??G??O?`CXOH#115A?CUGgWHCS@gUOs@??A#114!6?@C@#132!9?_#52!7?_O#38?_#55?_#127!6?A@E@$#184!14?G!4?C??_A!5?_!7?@???_!4?C#193???C#244!9?C???A#193!13?C??A#184!44?O!5?G???O!4?AO?I@?_??C!4?G!72?O?g?_?a??A@OGO!8?C#196!63?O@?G_a#83G#142!5?f@RcGFAKo???_!5?A???G?g??O_?_#49!16?C#73?A??G#107!26?CC!9?G#99!23?B?CG?YbTICJLYTiTK`yQUguKoG??G?A?D?@@S@I?S?Mg]?ApkaCO_SQC#131@?A??@??@@??B#103!14?_#100!4?cpB?C#108!6?@#59G?@#119S!7?GFG[MCdBH?}Oc_???CW_\b#129!12?_$#192!16?S?@??@G?O??P?G?C???c?O?C?A?G?@O#240!14?a#196!69?_!6?Da!6?A??I@OgDA?@OJcRcJdQdHEXAtIa[`XeXeXdYdYdXfXeXfXeX!4?~?~?iDGQlIPIdQHQdIpIdQHQdY?kRC@CADA?HS`?G?@?A!5?@#193!65?_A#240_#96???O#165!6?WcIP#52?@#77!81?@?@@??@YdQ_S_#95!17?C#101!52?o??_O?_oOG_O?_O???_G?`_GGgOHpgWGC{zhvMG?HO#107!6?C#118?g?U@_??a``?GS~@nZO_OAq_$#239!143?C??O!4?A#192!87?C???O?A??G???A!4?_#103!308?Mw-#193~?~?TgO?AG???A?O???_??A??@??_A!6?O???G!4?_?O!5?OC?@#240???@#244???G!7?@#240G#252!5?_#193_#192?OC?AG?C??A??@g@QcGO?S_ChAGQcHQc@O?O`AcG`IOaCgAGQcG_G?i?IOAS@??GCHO?C?O?O?PG?A_@?CAG?C!7?G!22?_!7?_#246??O_O?OCO!4?C_GOGC_CI?`_QoloeP}tRKwtsUNjX]ypX^ji]BlcQNTuyJltuYJLtuYXkmvtlnJby{mNjz|\TVt|lnjyymjiy{ZVes}jNldv[Tf`W#239_O#56A_RFdiT_?@BADKd^V_Q`OOO`AGS]PA@Q#116???OhQDyJ?GO@?gC#127@AP?Q_GSGG#126A_PI?DcOgS_Q_!4?_#119@B@???ozo#103?A?GBGEOKBGoAIc?G@_C?O#100???@??@@??C@@OWAA?_?@?OO??O??GCQWKc_O@KSOG?S{YZWTRh?@?HDO?@?ABH?A@@???A??A#53!12?O?G#99!4?A#102???GG???O?OceACDD@DJHWCOg??_#112!4?G?_???_!5?@?G???A#125??O^ic#38!4?A@?O?A?OC?GS_$#237?S?i?TjUkR~tk\zekVyLTylO~g]tI\o^?j?@AcQ@?aTAGACB_SGB?_?gA?CAGDOA`OCQGCQG?QC_JOAGDOdWEhQl?lQ?I@y@yDYcgSiShUhUgZclRc`W`AdItItJSjShUlQsGsJSiTIsJS@HSJSHU@U?oCPiPIcA_LAkQcGTiOAGs?CG?GOG?GOG?GO??_?_?_?O_?g?_?O_COcGAC@Ga?H_AG`OA?a@oHO`K?K_COLOk@ICpEGBG?OC_CGE_?S@_?QH?_G@cOAG@CoAG@cAP?GAOcWDAP_S??A_G?A?O?C@?OC@AcGPI@S_OOG`IOKc#240L_#38C???O??T?K?_#144?A???BDCCDA??A#38??AGsGBsJgQ?g#128?c^vn}~Vx}Ti|CW_#73@!4?A!4?_#112?@???CO@G?AG?_#114?@!4?H_EoCPGAc_?_#59C#101?@QCAHQLQlSmz[mynyhsmaDWsSGgs`?ApK?q_O??_OOGgO!5_??!4_??}WUoiCy[wWOoSgwAXShOElOjOZhPzAKDCZPalUhSIDgDHAPprba`b`@#114?G@?oCQ?sA?A@??B??A@A#119?@?BwNYdAGKO_@ADYcXg#132F_#128TQXq#55??O!5?@#149?G!5?_$#239?j?Ti??@!7?@???A#184!5?O#252!9?O???G_???_?O!4?_OCA@?O?_#184!26?_#202!6?_!7?A#193!11?GA?C?O!7?@???@A@AO?C_@G_ASa?Oa?h?gAJ`AC_SGPGQ_P?HQ_?EXdBX`UdUDEtEdEtEdI|UH]hUZJJZCTYlJEXIHadWie@WeQL`EIHsLSAC_?A?@?B???A#202??_!5?OC_@?A_?S@_[AHcOA@COAG@COAG@cAP?GAO!9?A_G?A?O?C@?OC@#193!9?A!6?@#203A#14A_#58H_G#142GD_I\Ok\ioG_?Cg?h_?A`?i`ktId{Js@#129C#140!4?_#125!5?A?gCAhCSa@DO!4?_#143!9?G#118!5?N^}NCN~s]pGA??_#102?DNH`Z}cwWo_#98!6?A???@?A?D?c@GATG?EhGQc?Z?Q`?AB?DKQBGDSHA@?DAGS@A?A?AD??@?CI@???@?C@???A!5?@?B??G!4?@#107!9?GK?GG???AG???A_OgSgkKxSc_?G!9?@AGO_o#73!4?g#116??@A?KrkEB@@DEd_??BJFE`$#196!5?ACgPc?IO_C#192?A?D?G??g?C?G??G?@!4?A!4?A???A!5?_??A#193!43?@A?@#242!12?C#252?O#196!10?@!6?@!14?@!6?@?CA?G?CQ?GC`?A?CA@Y@iPIPIPIPITAHu@UHccSCRiDQcXaDQTGB?PKB?D_UG`SB??H?JC`?Q?G?A@#252!8?_??A?@#240!7?O??_G#252!6?_#192_!11?OC?@?O?C??A_G?A?O?C@?OC@?_G@??O!4?_G#184O#218?O#2G#144HOK#136?AO???A???@Q?gO?Q?IgSGt#52!9?E?lQDO#132!12?BB?Eal^gtGQHA#115!21?@?CPgePWO?O#77???@ADAK_kOgOC_O#99!10?A@AACH?C@@@CAhCA@GFA?@GFQJA@CCAGCA??@??@??ACCA@?EC#134?A#103?_!4?C?CACOao_!7?O_?o?gC?K[O?SCQ?di_Ag?O?DICADO??g??O#121!4?COdYkSO_!5?@EB#140???GcLrK@?OgUgOAO?T?C?HU$#246!12?@??GPg?OaDOF?A`AT_F_}S~mLHluVLg|V\hKNjt[NJpSkjXSqilSAjXcrhluK`ZTcntUYnIbxSDQzQl|t]CUCg@QDh?JQ?S`D?Q?GQKbIKGPAS?cHOAS_?G@U@_?@?_@?_iSa_?a?w?lCIk?C_PGS_O?@?@???c!4?_?_?_?_?_?_?_#184!22?C??_?G!7?a?O???C!9?G?@#202!71?I!4?A#24??@#20O#74A?o#165??I?__O?O#58!4?G?GA?DGS?@#49!28?G?O#121??C?vGQLVi^l^znuv^{s}O_#107!9?_?@??A?CO#72!6?@A@AB??@?COCQGOGa@G`S??Y_CA_IC?d?GD_?O?_!5?_!5?_??cGCOg?aC?g?_S?GaGE@GQLC@?Q??@??GCKDO`ABCADAA@#115!4?C?G??W?OG?Qgc??`@?Q?OE@WC_?O#126!6?O__!8?C#129!9?OgCgO_GA^agOoOG$#252!12?A#202!23?_O???O!5?_O?A???G?OCaHCOAhSCaHCQ?@qC_IO?G@#184!54?C?O?C??G??@??C?A!6?A!5?@?_?_APG?OG_#239!42?O!8?A??OQ?H?A#196!81?A???A#83?C#37?C#129!6?A#141!47?o#95!77?G!9?A#77!15?_!6?_!5?oC_OGo?_Ogc?k?kOIO_a?A?Sg_WOGsSaE??@A?A?@#118O?O!10?B??A@YDvM~{B???@BAKOe\IdW_O#52!9?gCA??G?@_???G$#239!173?AO#192!43?O!8?O?G?C???G!4?A?AG@_!4?C#95!237?@#103!79?B$#114!568?C-#193~_~_TI?AT?@?_G@C?O!9?O!4?G!4?G#218?O#192??GA@#193!6?@#218!9?@#240??I@!7?H#192!8?C?@??C?@???G??AC?DG@I?ACHAC?@AS@CHQGAGQchAGQcHO??GOCI?@?@AcGO?@OCGPAcg??AGAdG?GA?@A?g?@_??I!8?GA?CG??I!5?@?C!4?G@?ACGDA?OCP?GCA!4?A?I??C?A!4?@#252?G#240!7?O??G!6?G?CGA?O#252!5?G#193G#192!22?G!20?O?I?A!4?A#239?Ca#37AP#136@?Oko!6?@!4?@JA?@DI#52!4?_!4?ho_SHQG#140!4?O!6?_#132!4?@HNGEhco`gDqDOOo_??wC?o?O?_#115!4?DGA?C@GHcbHCq_G?O#101?@?A?A@NANCNANEAN|jNH|mA^jMJTNZKkykveqnZLf\FIMTjlRFQLAdA@Q@??LI?HAKJ?dQG?GOQ?A?@!9?@?BIDAT?JPCK!4?@#118O_oO???A?A_!9?Oioo_[ug!8?@ADJ{h#81C#116??@???@O`_o_?OQ@#130???O?O$#237?D?I_TYtit}lZdMitelqzkvjSjcjcjSb_qw`Q?dCA?qkaX_uG?CGQc_I?T?i_CPC_i??@IQH?QHC?HQ?icidahciDQ`S@OlacjdiTITicjcLQDQdiUHUlQKRkRSLRkRShOHShYdjAPaDYSgPadWTiTISGa_UlYDXALaadISH?R?ISI`?gQODYshewsgPSIP__Q?LodO?grgaTitiDAKPCZSicQG_aSISjSHE?JO?JCPAG?T?I??C@AO?I?C??S?A?G?@S??CA??D?CAg?PC?AGDOAG?QGCA?G?G!4?@!8?caOGAOcQcICI@?Q?FI?o#58Ka@#142E??@msJaucmun|icwhsi?Ti^~CqnqC#116ACZ`UlADyC_hqO_w_?OO#141???G#121???GQHCOBGDifIF^{pFHvNjMnWwgO!7?O#102!4?O??@JDM}iKAogO?O_OO??o_??oo??_??_#99!6?@#103!9?O!5?G?G_O?K?K?{o?OQCOo?o??O@@??@?A?@o`?aOJEQAKS_gsgQsgPpdB?ys@]A?l?G_OG?O?o_y_hO???@#114?@#119?@UDIH!4?@ACGCBU#140???C?G~sjOCITiD$#239?Y?TI!8?A!5?C#184???C#252??O??O?G!4?G_??_W?@!6?@???A!6?O!5?S!24?G#193??O!13?G???_???__!4?_!4?Ac_A!4?g?CG?`ACGA_a?g?@aGT_??__o_SGO`AcaChc`_GTE`di_B??A@Rc_`gCJcgaGAdiAC?L!4?w_aga_`?H?@CH?@#202!6?O?G?O??OS?IOOS@IOCI?S?IS@AG@SPCI?TAO?T?OAG?PC?AG@OAG?QGCA?GQ??S?OHOCHAPCY@CAOGA?CA!4?O?O#240???@G#35C#74AKk#56GRK???_??I@@?ACO@EIOtiT_??H#165?G#129?O#128???_?tyDz^ELnTEXfGfruCOC_?O#73???A!5?_!5?_???_#118OA??HRqt{yq{_o!4?CO#77!6?@?@A?D?I?D?GC?AS?A?OK_S?oao_o!4?OC?_oW_g?ogSQcocALY@M_qBCADLqGAsNYdFG?``?@@AA@!5?@@?B?DQHAL?Ei?O__#115?GC?CAADRG``P_O?I?@?_OJ?A@?A#121?@YtegA?@AC?Oo??y_#128?Y@E#52?ICI@???__A$#196!5?_dG?I?QC#246OoPIHO@CPGOjSJCZCjSFDE]dRIh\fDOKeZHvziclZLtiitTIieXTOnisdkuxcqjuclvTZPY[UZPyk]jufQLXOYOas_TXOQohqkW@Gq_?DPc@GAOc@GaCJQ`E_OOCkGo@ADiSGB???PAPTG@???ECOHSGO@QSGSP?PSiPCGO???O@ACA??CISGSOAGITS?SOgO?O?W@AG??@?hsZShs`Ciqx|cnvsimtfjitdnjislbttjysja|pu`mi`~ixlvaynxtVmiz|tuiltvldrx|vdvvj~numzu|mzd}zXLft|jHlPtpd}nl|woC#38@#20_#144O?_#129!5?CG#38@O#130O#144!5?C#38!8?ZCODzCJCI#125!10?I?CODG?HpeoOV_?QGCO_G#112??@!8?S@?C?O#114???A@DGACAGCQHG?q!5?_#72!6?@???@!5?CA@!4?CG?CBOCOGH?OCA?A?D?A!4?@!5?@??@!4?@@#114!6?A!5?G???`!4?C??G#108!8?AGO#107G??A!4?O!4?KNnJSDYSNNcSKKM_#126!4?OFL\AK?G#107A#149!12?CG!6?S?G?G$#192!18?AG?A#202!10?OG@??COA!4?O?C??COA??O?T?I?T?Ga?CO@IO@?E?COHQ?G!50?C!5?O?O#184!9?C!7?O?A?@!4?C!4?A!7?A?D#239!6?G?O???@#184???O!11?C???CAO!8?O@#252!24?@#193@#184!62?G#0!7?@#83G#145??Q#165@?B}PJOTG??GO?O??O#127!27?@AGA?K?I?A?_!6?O#119!15?@FFekG!8?O#107?A???C?O#108!9?O#100!4?H!7?@!8?B?@??H!7?@#114!6?O!8?o_#59!12?GA!5?G#111!20?C#114??_??cOicSMCA#112!8?_?@?AO@G?_#73??Oo_?_!6?@\#38!8?OCGSILsgqtiti{$#240!51?O#184!81?@#196?C?A!14?C!5?O!9?G!4?CA??G!4?SH!4?@CAP??A?@???@?A??@A??@!7?CA!103?O#126!61?@C?BGCA?OGCG?BM?QG#103!13?@?BCRGc_@NCoi`?TO|KS_w_?_goo?O!6?O??O#102!17?o!5?G??_?_o?K?G??_?c!4?G_usMC{{ss{EEMLNswg{o_O???_!4?AKRDAG@HH!9?C@?CA#125!15?A{?wo!5?A~_}p#129!4?A@A@??GBLADADB$#202!216?O#98!237?@!7?A#108!20?O#134!4?A#115!17?G??G??O#69!28?@#119?O#132!25?O??_$#107!510?OO?_#103!57?@\ \ No newline at end of file diff --git a/lib/libsixel.rb b/lib/libsixel.rb new file mode 100644 index 00000000..b12955e0 --- /dev/null +++ b/lib/libsixel.rb @@ -0,0 +1,6 @@ +require "libsixel/version" +require "libsixel/libsixel" + +module Libsixel + # Your code goes here... +end diff --git a/lib/libsixel/version.rb b/lib/libsixel/version.rb new file mode 100644 index 00000000..2d45aab6 --- /dev/null +++ b/lib/libsixel/version.rb @@ -0,0 +1,3 @@ +module Libsixel + VERSION = "0.0.1" +end diff --git a/libsixel-ruby.gemspec b/libsixel-ruby.gemspec new file mode 100644 index 00000000..7b62d4f4 --- /dev/null +++ b/libsixel-ruby.gemspec @@ -0,0 +1,26 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'libsixel/version' + +Gem::Specification.new do |spec| + spec.name = "libsixel-ruby" + spec.version = Libsixel::VERSION + spec.authors = ["Hayaki Saito"] + spec.email = ["saitoha@me.com"] + spec.extensions = ["ext/libsixel/extconf.rb"] + spec.summary = %q{A ruby interface to libsixel} + spec.description = %q{libsixel is a lightweight, fast implementation of DEC SIXEL graphics codec} + spec.homepage = "http://saitoha.github.com/libsixel" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 1.7" + spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "rake-compiler" + spec.add_development_dependency "minitest" +end diff --git a/test/minitest_helper.rb b/test/minitest_helper.rb new file mode 100644 index 00000000..4a2c9964 --- /dev/null +++ b/test/minitest_helper.rb @@ -0,0 +1,4 @@ +$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) +require 'libsixel' + +require 'minitest/autorun' diff --git a/test/test_libsixel.rb b/test/test_libsixel.rb new file mode 100644 index 00000000..be8c6b47 --- /dev/null +++ b/test/test_libsixel.rb @@ -0,0 +1,21 @@ +require 'minitest_helper' + +class TestLibsixel < MiniTest::Unit::TestCase + + def setup + @encoder = Encoder.new + end + + def test_that_it_has_a_version_number + refute_nil ::Libsixel::VERSION + end + + def test_throws_runtime_error_when_invalid_option_detected + begin + @encoder.setopt('X', '16') + assert false + rescue RuntimeError + assert true + end + end +end From b88fafb91c1aa9b2a83ee5ecfc89a4c1f1ff8fa8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 22 Jun 2015 23:46:26 +0900 Subject: [PATCH 337/451] Drop Ruby interface --- ruby/README | 8 -- ruby/images/egret.jpg | Bin 18986 -> 0 bytes ruby/images/egret.six | 7 -- ruby/setup.rb | 6 -- ruby/sixel.c | 187 ------------------------------------------ 5 files changed, 208 deletions(-) delete mode 100644 ruby/README delete mode 100644 ruby/images/egret.jpg delete mode 100644 ruby/images/egret.six delete mode 100644 ruby/setup.rb delete mode 100644 ruby/sixel.c diff --git a/ruby/README b/ruby/README deleted file mode 100644 index 93b02609..00000000 --- a/ruby/README +++ /dev/null @@ -1,8 +0,0 @@ -Build and Install -================= - -``` -$ ruby setup.rb -$ make install -``` - diff --git a/ruby/images/egret.jpg b/ruby/images/egret.jpg deleted file mode 100644 index cb87c099057f832f99042efdab612676fdfa6704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18986 zcmb5VWmH?;6E_+PrIZ3K#l5AtYbf3p4M9q932wpNrHac#kYELhdvJFP5Zv9pw73Pk z{NH!obwA&8KAfDj&zhONXOCp|{2pc>RspY+-m$Q{(oN&?Eqpttj;I8*jS8!C&XCT#8?mA09pV5 z`%&2c$@~9aSWmDY<$Z?tI4b)J@Z<^B6C7;Z$NL#J4mJRQ^@JE3=k3$i{2$d#U2sVl zzsCN4CQw28?h~YAOmOXpOvcRh8~m8uJWEJJv(vq@>X8c7|7Gz1arhsVM;?zu{KQy~ z901t3Palc@-wz&#h;iQXKYdLi@KK$V(bVPlr`U?GV~?Z-Asr9%0D{Nw9%Uc~NCR$N zKICFMs-Mu(>7F=^l1fB1JR2Yj4~bP`Y0hOE!?k7ZWeI0y`_C#i+^!U;kOb?tnBM7NN`Ut zbHPu`{#Dw%eevhr1U_?TH0zdgqr%AyvsC>MmYL{Ys_am2>? zqRGMYQ^r)sRQ*%tk2VzPJNKuVvz=zePDj32qT-!eo9|DXLdC zsDmgB;_PzR60-)>xn)x|+2XToVnJ9bGFw8KTiC+H1u0BIU-SI4)Pb2>Pe?z?))40q zGQS;z5q+z&?UAqMz!t+7`tAA^|6M5>`F18#Q;R5Ki`wXel3b2ZxH=c1lryTffuSh=1eJ*zVB8OM0&%xTjRcY+}7LG|A<0=T2jiMrW#}XD8 zTt_hu@Pu>qB2*CX)E)n5-CcV!!FDe#=U#&&gc1V7y=%AwT#i zm4J#xsEJj-%~+QHEC*#1h3qJaY~^kuj(|RQ)~B~{bS!Uv(yK9U@-c3#H)8l$Pw*+R zUv)ph3d{UI)`q7cYe4`txyiGM}>AIoLcJ3_N8rS%Uw&4f#MS^nEmk@U=nw ze~-(PHU9dPomhoCLNTF25jSy*Q2`dKaz-}u`GE0@vRL@-hfgN6sj~&Lmy}7LY*g%l zZ%AZ?448j_WrZ!_@pznOTn-0NFz_AE&veSP(|~ zB}aJ6EKCuX6gvw?to-GZ;4fldgm9VozIrgY00=(L6aWIhlZ7~EX32l?G9bgig`P6T zzH9k1Mr!RBA6l%ObGiSC?%?U$x#!V+`KD$S0wHF&tlO`?wgDQM}z)T#SP6d-%GN&7^s zS#dxKE`iZIEc{+f=##GcZtrFlqD)LQcjuIO_yF2saOdu9- z^Xs){F|U&P*d(5sp5o>7s*Da$>V5%uGWD2z)&r8i>cHcSpU|I^gub4lup<0mC5ab`{UO;j0t z3r{-x$|2aY;)0N4a|qrvhBWqU7b7w;f` zg&y~J`$Cr45^a^M9~x$r2EUC~q5sXMva}Zy1Ie-NRl+;I@R{us;DF8T5sfb@Ed-JY zaQYqZa4~UyUy=#q`>>w3bcAA;BTe~Co?uCS;nLZDizOo)RZeqC7T(!TgZxZlLMZuy zE*VJM@wO&JYzHntsg?9Z$CBpMcdEB3@B?ZPWEE1e41SFduTg;z(J}X7<`-DpxnedzSg$rc@@z9$xk}HkBUc~u4 zG=!uK$9979G(iKUcQIvaD_?z|Ku11(y|fBCh5<*U zXKN0IVdnV4U@n(BrmC5~?Veuxz&vAi#nR0|+WI}%_-HSiVYKa~#c}rBZ3NSdm5g-J zIYV$@&pur%cJRvwfHjYDP)-c1-j(1%de&X%y1vc>pr&XWyv2n2>TOKTFhr0Tcv^b< zY@*dGbK`pb&suagm@2?f|L$e%2E%vyDVw;&XfYnx zM%Ql{LXZ4o7|2I$t2OrYj^DHHE|2W{+|}kas|R0_jE1p&026=0k0omTh9_kLcv5ac z@Rkqo#3y9Xd}y1tH+jL)1R|hp`_XeD$yT02j-A+ZNfHg=QyZ-BgO^Tl3zDLhIV~_` zR-oukq3zNTD{Z0n@m;Qn7f%jELz{5hi%l(zI?IKWRbo9BwV%#5gjM`+mn^2T+*o*HAj-$cO6%)oAnKmtc*Vw9K?gxvO^sV7IK;4QX?*l?df64` zt%u>Qd;olF76dV8%u5^A?RK-gtjuv^#B#c|pdqD}(snTAfuxdkI5FIbk z#OnB7W^GR}KCvBhfm0^XlbVMr9f`J1SVlAlYN6^zJMpD+vGk z-GTen(Ox-zp z`2AMw^bnIZ*T98U7V#X{e+M&@y&4ANvzv)oiQ|0f`GIYGWe))F=5RemALHtpMj8F& zwgJRwqe8)nmSgL;%jyd_hCZkT=I_|t6kqjq<#6RRGaBYS|31-RPtlGwiSC+}c6OO- zELhp8gq4h~Elx^2=AOony?1dZF1SmfAo2c2_HME@Vl7B!Z$n5w%~<=6I5|g6D{Mw# zEq&}B&(8Vd=7nFV`84u=IIm*3Ij1(r{FF%i-~m9ks%Ip{pE;5Pn*l1`@{U6pChxnp zW5THJmi^Vpy=8#x9M1h@O!vwg_Qbn;hPBbi^*qp>nd7XfpkL7HDAR2rNU9~ z?dmzJ36lE?VxJ1HOweGHKa{!UXJhM61Ir~>f7p)g))w8&ul|Pa*3C2Yd z8B(oXS6F`kfhh7zx~6oW)0q^De8Pl_Lo$o?W&Hi2bIafXuba&rpYlL&GI5bRBsNkH zlvx@dMZ%|C-^T_14R*K5aqE@qN!H$*os85B-^O1^BCX|z(EV^2r0vzFZMPfR<}nv} z3&c(97_>Iq#@6A*5~VtQkwi%QW7FEqshd;P)Qw8ik+y?c_d3$&D|nD+;n6+%gm2^h z&%S7T*q_?xKw`heDt&Mmn)P3xT;ABmU2wx6L-1XP3T;0|UD_V`#f3AR|Km|>#SiQ{ z>jUc|>?(HajSxVjPTa|Q7d=cT;>gI!{Ne#%67-B8Mk>5Kd(%9peYAFz0epYG3BMh= zC##FFDhAcbJJ=v~w$l4may8On(V$RJj222x1e(nZUp7GQF-CTZ*UU#|_ zdk^DvHr%;HH{HBhhd|$3o^rLp6pxv*$D65Efhdq^i?vO4_iTbd zC#~Lq2|eFm7_N1lj6w+4xdn#NOF<1&=G9{m+HPBuCvp;T*Lw4`%UzR@dZywg0UyIu z*eSUCD8HNcq*~!d{{8-@`d=_td|{>lrBBMmjdHqzVtw;S#eJw`&WVV>`7}(a{x%rQ1oC z093W~&*f=n`(&E6WZ`-5ma5%0@08;$gkHtK%YU&0X6D5? z`pluvv}*tKV3BQ}zDz zKt$sQBAffl5_q=Q(*`tk_z4?DzbfwRoU*H#IJEJ(QM$#X(frSdIBZ0});4!o8Fp^t z&Yxn(BKRfR7aYxeA{%~etrJ#1CM!IqZrBbDUqML?go=dm!8xXb;w%57aUH1{oP+zw zQT};+4q+YSF~2cgNdnF!aiNn$OCo9)JBAt(uIT(ZL-w!A+Q=h9O!_ml5++TbP7Jli z#zgqNt+pIeS^)9v?9%t$Q@FHB#^56L`aA1A_2XS_Nqk)8E`z07qcvO9N-s2yZhqbf zcUNQ51q)FmHSV-R21ZxH6IwdG38>fyT;zdWu$w6_%1@lDY34XGANa>zqxfR)I4LJ0nBF5 zk+S?_-DS1W;1jTo)NVn^kuiil0L*FqooG{1``>>uPS9{PW>i)D-o#tkUwQ@q76+Y& z5>(n|A~ROEmbaL#`?fEtz&{O-hh5r&c?|3J?PBI>sl!U(W9#u-m0O0B&9NB_w1L@8 zyg6NEzG-EYiF&z94y5i}#p&@AWz{1HLmm1+8*OEsCRJ6=?I`j_z8H>pm^U4xnNO!w zp5Aef*20l;%mU-ecd0Lc#yD~UsTc^FT zTg!HKJp)AV+7U#Z&Cy%9wXN0dO8dbvyb6;qt*Ep-c$a;uefZJBI?qn5inZ7pBi~W1 zPL)ea`+#p=Z)5UYP(r!>{Y+AR|L&FTy<|AG+C~@XWd}vwKKP| zLJIk~^ji(6T;iW;LoaG}`zDn{kLzts31*jvMa}Xu`se!cpXqn>*^8KLfAn`EL#6L=IA5L ze<{|yDf`J7AML@7hA{qZ{O|gbU)jH#hMiEchd+<7cAG&uIVyw?xR53~=o4ZJoJkXn zECGy-n7TR2g?H36yxx@Y`)&bjHQ5#{FK>bkiVLV>aB{K@hj?{lWQ?qIfIWLc`YmQH z^l@4RIyxZ)+sLVRE2B5h|4LPKEgkt^ne(ns4!nmv02)?icl;;w)5jQm9IIQJE9ypA zAl5534*>kD_{?17dYZK2p?8m(ASMT~c;Vg_+)VMJ#hPShzqvx5@-ZW>k`VPX{@ycv zEbV|EQ++0h(Yn@zqD&$u;NfuBfVjFdX}3{7k%O{tWJH8{LmVqSWso7>dsW2fdG)Oh zIO~VYuF#dxF!_4*?C+Q}g>*kRf(O71iFAnXg_YWrSRh5ts-d;+%t0D!s8!29G1$yh zk>nEZ+Ddi98kNO3?5qOu0EjF6L4B??hvBK3Pvg--K(;fqJP-HfiFi(GkIaS-vt3}c ztTiViO5F<6(2Xh>JuKNj5pmR}zZm4WKF`HbTJnA;5&UPMb!Xz}0no)@^)?J_(BpBv za|`itS&bQE4=g#`h|^2wadU3J_EfQNZBaFxe}99LXzc5O8ve=tH|+V>J|QXnOgTVQ zn3kN|Zpu60zl(PSDwN9q#%nM55ABpLkQWmQ`w3 zhDYAscjo+-_)oRg86la#E%mjaYZ+wWS3hraYO!&$+?eWgBv0U;uAX0cm7c+4u|{h+ z;>E_XGRO=k?#mnhV`ttyguqP)FZO_#rwyF;y_;o1Evm=+63(D6xt;u$J%$5MhH746 zN}3J8;m{$t_8L6n@v;`MhDM^(&VjkknuH zE8pJdqt?EuIR9{}x9Ss}0G@d!vd1_w)Q$yBw(n0+*3M@0DCpA`iwZ+>DCFieqDD-S&@=`w4EbXQcKNU5~> z_;CvZu`7y8u%kF+yNlBUs()-`tsMvD271eoF6Iku;Z6;-#{27#I6bSOe(6=c<&xT3 z0b9y&Ihf3rNHWamqILCbrdgQy-Aa8Cp#x2h#g6jjqOj8OUV!Iz(F&TYQOg#|r&5v^HZtQBDiRYk32qEDI)4PNIjK z(Frs$3Pz66QjUuYn2KJlY1cN9JHWq4P3t#zyIacaR2B7N}Vn06a(D`$pgE-AI;1yk(7G9n)%}z z#KlSg@;%AB->JyD@R|!?y`p^y7BS9{FoFf0It09=cbw`7_p53^Wc|uWJZ_kj#(`+S zBlY9c7b}+Ti2oiPTHO6!heWy?QW#6w7J^@(7;f?v?*?eqRJyX!`91k#>rExLlsaQf zKJzhlLa`Y=B`7%TFC}Q`E{3eh_EZcNgIKwdnJ^lR@}Iu@eU!q`87P_JQ99+^@*3(> z)m*7I{v6qGMs3{jmjh&bHH-wxHBYC4X`PMFRoV*o)#jH1?Xpc4@6O{O;U0bYcblmUhLEyLL03xWl@x4)_igdiF`X5-^ z+2sot1mWtfIIdz5q$@An?!J(f^Hj=KEbwhCZ$Js^sh95Y%Kn(k>eb1}<@_&sJ&}oD za?)@KDsctjd)>NIUg&!Xt)2YQKP}~PJ^xN@^}j8#a@rgTOHFh7C-dI<&?tP{UBBn1 z-9F6Tu{IQ%J?bsr-H7HaX_=_%@OMk}S58g#<+Pm^*7X*=KxiaR6X;cf&Pp7TH-=Ec za0l2q-B7eTgP`_q(}|-e>k%+O7Y6e( zEr?bf6?UrZ+#xmEj$DyVQs04w_1DbbHDbhV=Og3wF%c?-Qx@Ba{(>Epr8~(p_p0gS z&`Uee%FV&x=Axr@+;+wOiSsq@TtLdymYpMPQ}w=U@&^2uHft^O0=5>XH56NCtaPVV ziY}Ni{lUzw>L0Ds%Ep#+D^lyS|Ni^7(FTv9Q`JzSMCnCK?M-^jyxY zktA!}+Uc%j-Flp!z~)F^gcmxP{~M;sY2W59?jl2-$ne%!1FyBvLj3`N$=(zAa~0R- zyM{Zx()QhH7ent^9O}a3T_T8zYwJjtl*-##XAIPr4N`mnNDuVt-#h@AyWSHagKdJW z`g@AF?|q!4Wk+&QAs=%(DA8JRK$yn1>%!RIODPSBEiNKe*Fj{i6W*J*-)=)`1A441-0AZd8q;ahJ&o!mb zKBBpHiR?atr;E#@dqTeHTE!7*bW#d-!_oH3vo`#e8eMT3u}lr=;wr6o{sox#?_Vgp zmgSzhZbhAM-q9Fz9V_v!>M>6#y;jd%A3JGwlR=PKOl(EkS>-YZ?YT=CsQ>k>W3uFa z_V<*W!fvC8yqbZn>75gy0QVA)%Ufo}< zhGC$U@UrxfY;uD48yY-1H9KQtF?w)Yy|>}z(|?v~s7sd~02(SpRTl-tDVH&pj{k-w zwGB@v&}u&ibPWoXC~Y-PmRe$@ye;#G&~ZYUi6^S!lBG;-Eicwlj_N!vz-XkO3>|r} zekm9K`q1x5>E+#%CY`08Hu{>4@zAv^Z{8gN+;eK@ zA&80*YV%AKWmiz6n8%2=hP^wNdY;vlGcKx9<^x%HJUZn3=e>-wxsq@}0VVxC^h_(` zqPPN5J_jLo1MGz`_LcSf*1~hD2E1~k7+NVhwZLJW+BrF{m`hljtV4`)W51M>V4=k& z7?CK{=o-tdV=;d&IqZ=AjB*jO(DwB;;#4rjH!(qBJ&-#I)F2)0v3+<$nBqRd!dzLm zS<6Vp%z|KS?N2Uo`9pK+p)Iec#BaMpw#D>JxzevTegm(KASNh_d7lR1-kk6*SllD8 z>7To){|bC&j2K!kFh36o%s12#I8tEYMrhxrikaNnXB(*dwPiB5^b-0Ws0sNSj}|oU zA}60gnv|qv6qUff@0J~=ShwUp*4=`>jy+r4{c#(2B5Ic5K9rfdcZrRpO`NjUmPlA! zkAS%wS*0yatguPzzCFlp-jYQDf9s~EoMLd*I8sMsC= zIk>U698#OJMmu3k+BmZlPfB2MCdp*5#K;Mb_UZxUA1IIAk6AXbf7%jMt_mr9whSX2 zk%35aB>4AbC1_}LDrT;S(G@ElzF?>l)OGNmx;4a2dLYtb_Xh-oF zX41B_X9CA4+%O1d%sX(xP|EpGdVhG|3OavwJ8)_fW%S4PAcF(LA(2>OJOZ~0TB(*4 z&Y3|ghD?k^*@}1{?Qd`08m1xl_tJbkn!%E2@(dNcBEz{;17jxtRwvl0sw2cj6$%S_ z3?F{t4*8tcFU-zLl<$_qr>)b_f6VVk`{0OI!O~om(#3E0-o`E$LyJ=aS}u9#7^o1@ z`xY683`6IltUWca9}VRJ@K5ll!FonDgGp*@&s&v>9gNG4zOM8SDx8W4hdFnkaJkgO zq402NkvpV%EHFDA+)L~irp7A(R!dPiQx(3fyd}*4Rnp2FkdfWWpZ%?*aq#`ErV~?Z zgi}LL>OA-B)Gc%>lb=7n$hrMhsOj_;;$QUuyU}0dsbG5C=Y^gAa89QomIr`LwX^P> z;SQJVc|f|F9e?jMH&E2z0pQ2VTba#%1*{oDfV3mph1=#ekZ#c$z2fUBnH;ecMS^dB z%r{BfZy_<1U@(loboA2Ij3*(>FTEb}+ghl0rJ&r9v0g;W7&9heXQLBv%xz*9njA0&Q|C*HF(M0QC=mibPecblb{5?u)JXTNjda(gcah{^R{) zj&U`o*14Ihx>XkNbdb`e76-_??(uJ{W`qLBwT+k_`Kza0s6KUPQr@Gpvght@^SQedA_ zUg7%CvygV1fS;(sZ;Afi8-t}>a37kRu~vqzA?j2$aIlIu@6g2@LjY|(GukP!iFa?+ zF`sS?Pd{MC(<2(cf;u^4Y1lhLS`2;VmFZ&GNGq7|_f}-47(YWS8CAds`DGry~+>P?dH>ekaNz&A#E+b(BVr zw*E0OaaAoYVLI#DPv7cQH%C#9eUOhPPC5e<9H$o8Dw*((ub z6}@$J?1-=V>lKrqB;b)*)58KP((-n3(jvzqtLZ4;3+eALbLrV?-LnaVo>|SE=NVtd zvuN($aT4>#QR&e(YdZ)*s01eUlY=|rl3WF-C>GDm0AzkHXTLu4qn3+M@}P0)?g5~F z+F*Rh`R8u%(epGmC~T(SHOIh&9{>)d#+-8tZL(3vg+9n%aWQlr$nl|U!XiZW;tSO} z2VQw6f~a$cyFpX7o}4}Z=o0UVWr4^x&8PC}$4HsPEYvWV$eCo>}SH%+zE72h4 zDIfAeo>ss4_O4%^0aDYV*-WUoz8}cZe$dn&f`~NG$OpyiSNoBysf0 zxZKbz6`wT9YG!S9P4a+*dg9{{%ZCHttn$$dBkvUyMhzh>08Q}y~KtUrIRYfZ}+ zaks5%eOq65b9Seuppe@y%IgwLIkAuqP6uya7&AF!k15bGl_E(dx9*fYfL{ z@(Nw7_lJt)#m1BPu{1B;VckR{q#Ro)&aH`5e81aL>p*?~nbll3z*e`RX}{D%JNP*z z=9^kYDOsAOdt}c<=nAg|%icin=EL{QZg(h8suOWaUR0V8qPGss1 zo^^|hCR+_|=`6l7`4q3eYZzU37%lcswt@@AqS=WQdo24_0(Bk!Gz|T-$R?9$w2|kv z3=J{~cCy?k+DWAKuEg*>dyF1?pa$HjEjtEJDK(GYk|6bC{@Mtn;-8s?g{W-}bP9>XskuAij@6MSxP^DQ@6-})AYXLm0_HmISq-Kz;waebiDq}RW2TJ* zJNEPL`w#oa{a68VwR+Hl&x@<_Uy}9=v>c>(fa(;cOS&a0G4?*?8;133q$}UFJ$N%}3UY%Q>l0&7cTuiKeD=?k;i4_W!D z)8&G@6Id|sybD>|jJjt(YebJnoFDTDlx|g|x+a{uAA^4z_H!SmP851Zy?x4_FQPc_ z(#3!d5~OuQu`OCk-hi~ItokNzqdIw|Bp^}m^8=qDQsoO7` znla9QjnwNIaoBnM;2cEacDPecTHD{Mbb*+Y+9-2)8#l&Hmo)uOgGc--e^aG502oL} z_LK?3iLHoibGLh;+7M@iqY&2&yRP#0EXuxo;~XBq6ya@=IB;*SH6^$5on7R%ln`$M z#oRxnV-cmf;wK!gN@jbfYzS*Y7W%%E;}dMb*aLz{Uz&Pi_w8HF9w~ixOVvH*-9QAX zk&tBR7lKKGmA!WYm^PXN#EH%K(ezmYeHFXTXrR$Jysb{wS4{PJw=jHXQh}E@P*GIm zRDmZo)J~}0^0B^yjv)P2->I40c4HTA-!@NOo!HM+%6uYfSqs~WQNL-N=!*6XL$u|t zUb_!SZG>3GBlIjHg3OUXdgd7*k=A(5q|Su-MsCTJ+UdR!uE=0tb1$<6MR-bts%@cXW4mP&B_$Pi z2S)mT^U6H!wp5EZ#mRqTX&6FO$k-M<5kTo|s z4*LP1vqyTJJHm8vWwv0f;V(5~! zToQ8ZZc19v>yq0LBEuxhp%A8HbT3hxOg;n2^hPUGRWrkmgzc_Qp@&>YBhC2dFTI-9 zZ2@%N5HmaXctYOY%ii}v)hR7PYa@CljWb=m8i(E@loKvc-sY|ZFq3q57k5rGowrX) zn3d^Sj21ysew;*nKKJs<=yp#CuJ`HCN7k_#g`wjz=@_-nt)jI#_c=oWHp__}Rl%|- z*K-x=1YdgXn1x7}?hOQ3!a<3f>ADmO@)4>t5|*#~mlF7up5mLjD)B5&OffC#45g%WIvUZwm#P6ZbiU}! z3%*j#hO6rS*^coexAS5t?jVy?v&ph0JGtfqtB$7xh)E6`#u+0j&U|P6cK_8Pe{X{2 z>jL^~TtBThXw+XQqt$uzz_tN1=J`NTg(>FK_ox3b24G~EXNqa^>ESrIir)_@D^YmU zgZ3*n{^X&KjLU)M-iwx1VGELFK`_{Nuy5&HL%$5qYgvkIkr$c6n`ykl2c2Y8+NwcpGQkcA!?(&{B92qSoc2q-Zkc$pDshJ<`%t{*9%p)>{@^e?OEYXP1h#ryKq{EVCV@1qC5a>viB6BrO zoZ{u0zP&G$OZwZ3Q|axvKkPn_rH4j3X~I$1nHT|IM{Wlhf%nEZdmyqYV8MR(2mDw6 z%1`>nadsj%abMlytJdI3w0g1K=xVer6mqtR=CNx+a6t81D)-Z^{p{VWhM<@HK9;;k zGaUEUQ;&TX2m!cC{%OFlXDvdt(3bnL_&o>~K2y7)x3FfKcXmB(2{~M=16pOA6r}C2 z%ulBmr4|R3zV+LMva|crySsJ<(B}RjDI&>rEUEbg-@hzuqq!lR@Ehwtj0=>x9H?~~ zqhqAf_UF*X=yk=ZI2Lbv`t?p9I_X!^Zj8B~@VfgnRC^3u&Tb6C7bY)RCbOY2tkB#V zmueLopDH-K8k6hkyt9>;y34Iu1>2sCbMY)qS4CyQC!$9kkd?q8x_Yv| zEG6Y4-NjXQ-Mim(#7jxqF)HXlC#FoVVK}D{ipNRyb z{FSoTn`lg(2?Dk zjuk8G$9_kw^kRc3g;2ZsekRODH==`Lrz!4SVaxc(;!~Fq+X}QgkpoK@*R_U$NDzT> z@eNCm!T{7@fB4D{lT?in3)o%|q=@rs$dKwK>04iN3K+gHov&ir!}k2A;y=s=>fxRd z6xLWso)>sLEn4~{ElR>ZAf4iVuOM}LJH8nc;vC-H#^jR`A#VkwZS$F$O@zPnjI~ud zv=E7NEE#d1*Jh46ft;JG9=gxHPGAKgA-_H9hNEP07mITN?FnQ1a#UH{=nLT!Oo^7bFX*`ia zF?nVWPMdGR``|}bR%EN(?|Of^%b+3>awi@Dk02m?=TmDI2WifQ@~<8JO-6)S75XV^ z4YSpy9rO2`k3cxwl!JkgpE|0M2Pm4NUANVc?!R8*6*87k^#U5Rhyb3Ol#QRY%BGEW zR_9DSR;sMt8; z0%~`CRriE9Mn?!p-x-`-iC7i7)j(em=fu)_ae`Rv%lL~c*Qi;n+H>oP{k}ds8toSB zJOBW`UQn}^kCM$QzUoZE@Dl=VqMrK@eEW|li;`4GiBbcL;0*wfDFgVyxXZ@DCO0Nr z@dT@;{tLzDS6I+?8LZ!MA>t1|a7fADV0{Up&kWqUdYg4AH8P@6saJ_+S~(3O(CL?J zOU5Wy>YW$|i}}FrzOGil*e$zH#f*noX69oGZ;J;nw1tU@T*tt7-Z;OC_brgc9K2Kg z7e^eV22F`u4d;iflVR>o4bQy|1UXvm{Qiae7!4#x=C*L7Xqxs{G(S#|FAscoY(`HH zZfG{7oGA)e>}f->Q&zSu-5?7|9h)mwh|I~&8xT^71L(R^2wGmC?CEcrI8&U+52`Q$ z-f9u;IoKghF^@W+zf2S8roWJOjM2>INeP*Yw^puSbp7!YK1V^gz;M zG+YV(&mBcB+Snvs1&c4z3S{M~ZZ2D&KV#w)rqtJNobCp{l$o;Bha{dMm z>^+MS5OXx@Ev6sJ@f>E?`I)RFY}Z$iB(t{X?y-S_iO-@*z3BbZ_sQ06v0|51lH@_& zdIKlm8q%DL){@Xakw`nSYINUvH?nXkY*NZ9(_P=j&TsDNKG0{5 z5Hv-%lj1y~492E@)tN&5n)*%VKRiI@C!D9B#~vX?=C3IM(}SW|wdwi&bb1l4IaD&8? zhB|hS#7$A2k_(I|LhTJ%?QVeBf6Rtuka>2hVMmp7^_w=vtz#d#z-;GSC;=zij80u9 zyHp`l2wPh$H^lP~28YP0CwE^aajARdr1Vx#dVhdN@SHQlje;rh;;`;xuj&o&r|jPr zF_vxd5gJaG6h?W(u6`_IC1Qu1Y}0&@Wdk1yx{NMhSfqmo%$GEq%yYpAV3S(ox-vLU zS0~RQbYWPqLW7h}qG5wN$j3%Wzc#rzzE0h^A$);?L)K$^bSCHGf6|p7{#{A!Dnr)i zj}8c!mTw@2EQiy<>d%X5nUDWn-VssRt_Uh2Ja2wcYc7dQE2rv|5@tn*ihoz&GU_c) zP#>qV8b{aH<|=b7(J1qzhEzQOW(Q}%@ki}VdH zw$#W`81J1&PCR0(D+SztqH}KDlf5rZP<0dIaOGsYEc$q=&`2=l+X==nTh>B;UA}h) z^&Nbhz3?!trsL&PLAyd)bD1_ynWElR=1!fRQ0sV1G`)`EzBvzM3742o?039m3HC2i zb4<5rHXLGh_h55}^7iGyqq}5&t|4V;W0w&!W0#Ilu`t+#ALkLZLVVWpScAwCwE_v) zeQYmqczh`tO{?xMN-7ay;IVX}X@C3xC}NG}%*0u`hw;+IX1Nz_u~=k$lk1()3e2=k z*;7SF_lseY^TwAjqkoN6+V@es+8*W^p3a?`PSHx27*cm7g9F*EwR08?=ISxo0S7&V zq=9R@|^*e|GfiM`m1<|A1$kDuLxfrM4oH=sxWKBxdwPGo*khOzPns}S56gWi%ry_ z<6wiwng*XMtp$uuVyWMCc36M~lF6gyEZ};I{qAZM+Dq!a6pGs|2jIht{rSu}FZgXH zC8h%F(Tq7W$K*(V1cw%}GpgJDmVwGQe|3MvSYq*Ed0~Y-;t8Sc;{V}PgyOIO8F9wA z@>pJlSX@$LWxjeP_!z?R+>u&;FTQ2Fbj1K+KFm=)(j~FSA%7UY%qy0pSsSgFagwLJ z?EL3?$LJW_^hx<7u;DunzkK>ZkvfdgJXWghO_O6&I!Z(qLTgfK;nf&p&Nh%SSZ1}l zL0=MHpfaG+Mv_fpM8n%K)IR`^k@4rNZ#x|QBpiI)deCa{$6iY_HplMd>*sH_E3TV` z_OGBTMtwBLE2G)$EQf8ek#R>zmDn-XIV7Af)hP>`ox52%_w2Db#fduwYiY`-%e6=c1@9Q-*_l)`Enx1I&G1wxp=j-m!NofMp`+He) zQBlSTThh-WpCI;Oio*hnO$tg$n|~?U<8wgRaoV_Uj}X}V4_FZmo1SkD`2Gi~e|w1w z5YU1A2k4o#E5w%h)Y2P)UoFHuX@f79#i&b2pa?Jn07w`<@&U?8u)e=~1!z}(x+p_} z^*o+M_QNx0tnhX~_Jvaiv(canI}g&Z?E&z3Htu#DA#Hz4qTGqxU?o~{l`?Ef6!cTst5|g%6bg6hUuVbDvwPnV4&?8AbfQIM@ zKarS=WS&QGF2fGMAOIi%fB+!w9l!=1zyM_;I~5Qu6uJ;npsR^!&LyBJ0DuO-FU&wT zAO->eVz3(!F?tX%U?u_v0s!(PeZ{{5>D8 z{ts$-y`RzGnO= znxvPJP>rQ;uI7@8UqCZk$?e$bf~c=9hEYj+oA;y!xT9wAOX$pC>W!1wqgZuDiFJE< zBN)G_v|Yg>fkxxhZF4U&()fO5V@snT=AJn{m8IlkEHUr*XQbmu&n7P~L80e3^7g+& zDW$&Bze9Yuq_>iaeg-nOt))a9^5(wv=1-pOBT4n7l3%He{OuqnZS!?9x^~^S(|(B2 z$}6*v`tUMxSHCiTf6${BC4P6YmP)^itLsM6X)WD+xBmbmB&92KytfGFnzlsTlG#=G z9jY9Q&(FD*SjLw(t#@E~`6VRfPj+FM$*A4!D?8;Ix>ea(%b8WW>(I=r&DFIzx8%O3 z(D2PaxY4C8q}|E+o@R$m^J)`+mK)cJ^my?&<4N`E#3ZK{UQCMaj@P=i)Z=U9ywSWQ z+&s~!5kAbqZ+(q&y^eXk{X#1n>{>8`rf+Fb8a>bnY})Jqem<5W!qyim)?ENS3a%ny*6)oSoZa?>KerkR1;O0iS{<{_YGtxI+ zYH_dCo2Qv2`vwW8x!H>`-UZtgyBAJj|FH+m>H5*u^T_sdB}SEMJeH z(mrxfbrZE74lz&yE4tsRPoDwlDAfSu+e9p z(8DI5@p95%Ql-FhG4-CDDBa`-`u^?@p04V$q(G%lm7sx`-&VFHcj&?zN#+Y)cbj3jdV$RocVDk z{{Sj}R!OP1&*}Jb#Fg?wE3$X@H_MOV_tcsHYUA z`C`eHCaE>#6&Y6B9N8a6Z$9hjVJC5*h+E5Jc*#6!*~;GLxaG4<4y)!#_yIWNxljau zD6&d@Nj$FN#0(h#03rZZF)$9}M4^DjA%KPe7Ea0_U|K0XwlhU028oo6;>t`40a()j z5HJ82Z~zMc5CafCqF@3BOClR&SU0%4fb0Y?1TscIA7A)csr{eY>{0&!?_tT0?4|zz z>U@Ff`zxwiFKIY-qD@9I&lM*8CGfx0)N+)U^c3WsJL+1UzPl)+g=OvF{{X3LCwuKj zrX`o6@^0(E)){MK%Ey(rzmd}%o2%ThCZ3DUYCc0#T}~L}P5P#730f}E-Hu(&;U{R} z$34J#iXqk5z!aFT4Q))l2LN%jFkO74ROnDpU9}c+3>0JJb3y1 zR8{>=5{l@IUSAb!$T`=Ilx<>fw#Gj9%pOgtlVYXO(UYdwr9J79Ii&tBo**f7*|Qv% z;{JWhlk-pYGLzqC{S1tx+Vk`|Go>r+{F&1x*JVZ-C4Fj$uQx0mZ@qaKO+AkMsXxmv zlR0LWHtMJ=mnFE_&n}jCJXaYblQe1}9F5eOQJJ1cS46372W}~KObl^M0RCT*52kIvtXR1tv7E-20VwZGoaMoyDmnzQ474YmIOv~U<;llb)0c)#g;$Mt_h?Be;OYr0+ zOb)dF0LaoZ-^}HVi&NPYbt&(@%%zib*3ZQpt0!hYdt2Dc0VD(rso^ta^6vC{JGxhpl=mfoi;n_i!x4r;cf$+J$!HFfqPQ<8h7 z3wP$ql8*Z{{F#)SPrLOJB3InTcAttmZ=0!<(snc> z43{-Cn?5&EUSW~AJ6%z#oN~g~Ug)UtGsc@nDV=(#)TQKcy{yL7aF`f#Q`?{yYW{AK z52wrk^Gm5Qb^st!=m-D%?>`G0_uNHZ)sOX&`fe_tFayzx z%FMKpEAxOGlx>atOzMy2Ucb-)K)Cc?jNc#S05r>g_iN;8zmL!W3QuqKcan(...) - ok 3 - output file exists - 1..3 -ok 3 - decoder -1..3 -;31;25;22#11;2;31;25;19#12;2;28;28;19#13;2;44;38;31#14;2;31;30;27#15;2;47;38;31#16;2;28;28;22#17;2;25;25;20#18;2;47;38;35#19;2;41;38;31#20;2;44;42;36#21;2;47;49;28#22;2;35;25;22#23;2;49;47;38#24;2;41;35;31#25;2;42;41;28#26;2;38;27;17#27;2;41;31;28#28;2;44;35;28#29;2;31;22;19#30;2;38;28;25#31;2;41;31;25#32;2;35;28;25#33;2;38;31;28#34;2;38;35;28#35;2;35;33;30#36;2;38;35;22#37;2;44;44;41#38;2;53;53;53#39;2;63;66;63#40;2;74;74;69#41;2;78;82;78#42;2;82;82;85#43;2;93;93;91#44;2;97;97;94#45;2;93;96;96#46;2;89;89;89#47;2;85;85;88#48;2;78;77;77#49;2;63;63;60#50;2;61;58;56#51;2;56;55;49#52;2;56;55;55#53;2;75;75;75#54;2;71;66;63#55;2;58;60;55#56;2;50;50;50#57;2;33;31;17#58;2;50;49;45#59;2;69;69;69#60;2;94;94;97#61;2;91;94;97#62;2;69;72;66#63;2;49;49;44#64;2;22;20;17#65;2;88;91;94#66;2;89;85;74#67;2;88;91;97#68;2;91;89;97#69;2;66;69;66#70;2;39;38;35#71;2;83;88;89#72;2;72;75;75#73;2;63;63;63#74;2;47;47;47#75;2;85;88;91#76;2;28;22;16#77;2;72;72;72#78;2;88;88;94#79;2;35;31;22#80;2;78;82;82#81;2;66;66;66#82;2;25;19;16#83;2;24;25;25#84;2;85;85;91#85;2;82;82;88#86;2;35;41;35#87;2;82;85;88#88;2;80;83;86#89;2;85;88;94#90;2;20;25;20#91;2;52;55;50#92;2;64;64;55#93;2;78;82;85#94;2;82;85;91#95;2;78;78;85#96;2;16;19;16#97;2;17;19;17#98;2;75;78;82#99;2;75;75;82#100;2;72;75;78#101;2;72;72;78#102;2;69;72;72#103;2;69;72;75#104;2;19;19;13#105;2;19;16;9#106;2;24;14;8#107;2;66;69;72#108;2;66;71;75#109;2;22;19;13#110;2;19;19;9#111;2;69;67;75#112;2;66;66;72#113;2;69;72;78#114;2;66;69;69#115;2;69;69;72#116;2;53;56;60#117;2;78;78;88#118;2;66;66;69#119;2;63;66;69#120;2;75;78;78#121;2;63;66;66#122;2;72;72;75#123;2;78;78;82#124;2;31;28;14#125;2;60;63;63#126;2;60;63;66#127;2;56;60;63#128;2;56;56;60#129;2;53;53;56#130;2;50;53;56#131;2;75;78;85#132;2;60;60;63#133;2;75;75;78#134;2;72;75;82#135;2;61;64;69#136;2;47;49;53#137;2;19;16;13#138;2;25;19;13#139;2;75;78;75#140;2;56;60;60#141;2;58;60;66#142;2;50;53;53#143;2;63;63;66#144;2;47;47;50#145;2;44;47;47#146;2;75;75;85#147;2;72;69;78#148;2;60;63;60#149;2;53;56;56#150;2;17;14;13#151;2;69;67;69#152;2;47;50;50#153;2;13;9;0#154;2;83;60;44#155;2;67;55;44#156;2;66;50;30#157;2;39;36;20#158;2;89;72;49#159;2;78;63;22#160;2;85;71;35#161;2;69;56;19#162;2;60;53;22#163;2;60;52;11#164;2;44;42;19#165;2;50;50;53#166;2;25;17;20#167;2;31;22;22#168;2;25;25;11#169;2;28;27;8#170;2;24;25;16#171;2;25;17;5#172;2;25;13;6#173;2;42;33;17#174;2;82;56;30#175;2;80;60;9#176;2;56;42;19#177;2;56;49;38#178;2;44;41;8#179;2;17;22;6#180;2;35;30;8#181;2;28;19;13#182;2;22;16;14#183;2;11;16;8#184;2;16;16;6#185;2;86;61;20#186;2;39;25;3#187;2;33;16;5#188;2;35;20;9#189;2;44;28;25#190;2;88;58;8#191;2;17;17;3#192;2;16;13;3#193;2;16;13;9#194;2;25;13;0#195;2;44;33;6#196;2;16;16;9#197;2;78;50;20#198;2;19;13;6#199;2;77;50;11#200;2;71;52;8#201;2;30;17;3#202;2;13;9;3#203;2;3;3;2#204;2;9;6;2#205;2;35;17;5#206;2;67;44;17#207;2;31;25;8#208;2;16;19;6#209;2;19;6;3#210;2;78;45;5#211;2;78;52;6#212;2;61;42;6#213;2;5;5;14#214;2;19;16;17#215;2;13;13;3#216;2;49;31;13#217;2;8;11;2#218;2;11;6;8#219;2;66;33;3#220;2;25;6;2#221;2;33;8;3#222;2;71;44;8#223;2;53;31;9#224;2;58;31;6#225;2;50;56;56#226;2;14;13;14#227;2;53;24;6#228;2;49;28;2#229;2;55;22;2#230;2;49;22;3#231;2;47;17;2#232;2;42;20;0#233;2;16;6;3#234;2;39;14;3#235;2;39;19;8#236;2;49;20;3#237;2;11;9;9#238;2;41;14;0#239;2;13;13;9#240;2;9;9;3#241;2;11;13;14#242;2;13;9;6#243;2;42;25;5#244;2;8;11;6#245;2;16;19;9#246;2;13;13;6#247;2;45;20;3#248;2;35;16;3#249;2;44;17;0#250;2;69;72;69#251;2;69;75;78#252;2;9;9;6#253;2;78;85;85#1_O_W?WcGcWCYcQcAc?O_?OC???O?g?IScE{A}A|A^_NOfGRDHVHeHRCBGBC@!4?BCJ?BC@A#5!6?_#4???_?_?o?o?o?o?o?oKocWcW_}_}guxukNNNDNNDNNDFfBBP`@f!6v!11FBBP?C!8@!11?BB!5?@BB@#6!34?_?o?_O_?o?sgsgSgug}h}i|y~}~}~}~}!4~^n^b^J~B~@J?V?@?@A@#8?__GocWcY_wcYsIsGmWeOmGvGuHuKzCyDKa?i?a?cC?GCOGS?kQGSIOKaCYCQcgC#6!29?@?@?@?@O@Q`HQdIT@Ul@~DzVj~j~V!14~}!7~}z}z}!12~|z|~}~}n}~}|y}}[B_?O_?O#4!20?BFLFXFJ\v^~~t~~t~~t~z~v\z|v|~V~~V~~V~tkS[SKSSGOgW_wgO{~vV~nz}juzmzuzmjV~Tj~|zVlzTlJPhntZntz[tzlv|j|vlv~^v~^v~z^z~z~z^~^~V~nz~$#0^n^F~FZFZFjDJDJT@RdJRDR@JRdJPBD@JPBD@@A@?@?@#3!6?_?o?OgOcWewuxm{zs~{z}|!6~^~~~N~NvJ~B~JvJnJvNrNZfZf^@^@VHEHR#5oO_Oo?oO_WgOkomYkW!6G!11w{{m~z!8}!11~{{!5~}{{}!34~^~N~^n^~N~JVJVjVHV@U@TAD?@?@?@?@#7!4?_O_[_s?{?}s~g~}~}|}~^^vNZfZd^FZDJDJV@F@NPFGVHEHBCJDIR@^@VHVJRnVjNfJnRLvJtNrLZDZLZVZn^~F~VjVnRnVn^vn^~n~^!8~}~}~}~}n}l]ulYti}hQ}?yCgS?S?g#5!14?@!7?@C@C@!12?ACA?@?@O@?@AD@@BSJTATj?jTjTnZvJ~n~^!8~{wqwewsaG_#11??I??I??I?C?GaCAGA?g??g??G#5??@a@_`ahAdADADAD#11???g?OC?SGCOCGCOCG?iS?ACgQCgQCgCOIcOICaGCQGASAGQG?_G?_G?C_C?C?C_???g?OC$#2???_?_?o?_O_OgOgYkISkig}skIsE{oiOg?w?{?{_]omWvkyugUXEkjSfWbWFHEP#12!18?O?OGC?K?CGCOCG#10!17?_Oi?oI_OaOGOK?C#3Q#13!154?_?o?_O_W_?o?_?o?o?o?o_[_SgSgOgO_O_O_O?_?_?_?O!4_??_O_?w?gSgOkOgO_GO_?O?_#9!91?_gSilISnSiSiOcGs?O?_#10!43?_?IQHaJQHAOIOaWAOi??G!24?A?_AQ#3!6?@A#5!25?_$#3!520?d?D?D?D?B!6?@?@?@?@?@O_#5!11?OC-#2s~s~s~t}|zu|v|z~z~z~z}zv~]~n~U~nU~F~VnZm^vMrNRDRCIOBC@A?@A?@#12!7?_O??_?O_??C?GA#5!18?__?oO_o_OoGoKvxmzs~y\vy^t~m^j!10~}~~}!4~^~n^vZVlZf\bNPnRnRnRnVhVJVjVjTnVxVkVzNrNrNrNrnVz^vJ~B~B~B^bZBZd]B[BUhFGQL_HAHACABABAA#7!8?_?_W_SgSiSgvWv}t~{~|}!6~nVNfZB\ASJ??A?@#15!11?o?_#7!9?A?@A??@!9?@??@A??@A?CHAHA?FOBS@U?CJ?jAJQdJsBkZd]`^lv\z^!13~}~}|zulQlQlOjCqHqLOiC?cO!7?_O#5!34?@A?DGODgAGS`IsJ{B{Js^lvz!9~|!4~n{{AOeGQcQKOdOCG_OGC!9?g?bB_B_B@A@#11!9?A???cHCODGAG`?GAOC_GQdGCPAG@QCI_CGCOA?@??T?G@??A???@??CP?H_SG?c?Q?@$#1I?H?H?I@ACHAGAC?C?C?C@CG?@???@??@!6?@??@!6?@#5!18?_OC?aG?P_GC`C_#12!22?O?O#10!5?GA??A??A#4!18?@??@#9!4?_?O_GcgQcWa[omOkOkOkOgUgsgSgSiOgEgRgCoKoKoKoKOgC_Gs?{?{?{_[c{#6cY`{b{hUwvlq^u|u|z|{|{||!8~^~^f^jVjTjVGfG@I?B?A@#8!6?OgO?CSalJ_VlPmOMPeGTAHQDA@?@?@I@IPEHeH?CG??A??D?D?D?DGQdI_H_JOcZ?QcOCX?C#6!40?@?@ACHQlQlQnSzLuLqnTz~Zn!7~^n!34~}|vGqDgQ`SBGC#4!20?A!4?OBB|nXvlZlrnYnzv^mvz~tZ~|v}z~T~[{[{[{{{u|~u|n~~|~|~~~Zuznyv|v[~u|nz^vlYvhAs@Slzt^zvzn|~m~~i~v}^n|~n~]n~zm~u^jv~Z~l~}~$#0@?A?A#3!20?_?O?g?Og?w?gOcO_GoKokiKzsn{z]|^m|N}VjVl^nVNJfZFHFHAJ?BA`CBCHAGA@A?A@A?A@?@A?@A@?@!5?@#14!7?_??_??O_O#13!140?_W_g?O_SgQkPmpmXvi|uly|}N}^}t}tmxuXu|zu|~|}~y~y~y~yvkYt]s^smXczcXexewj{j}h~zs~S|slYsJ{RcY`]_QGaC_#9!82?GqDiQD[bgUpJsB{BsJ_QGC#11!31?@???Ic?AG@C#10?A???B?B?A?GA?HAO??A#3!13?A?@#10!8?QG?cA#5!10?O!6?_O??O?_O$#10!46?O!6?_?_O?o?gSgQ_OgOCG_GS_U_CRGOG#3!440?@#5!34?cHQg$#16!47?_#4!23?O???KO_oCOZ{zu|v|}|~|}|~|}~}\^}LmNMNnNvNq?CPCH?D?GD?I?@?C-#3osgQSwQWESRoQDQQcATaORcbSBSB_R?VcZcv[rczQtJpWeOlRkRKbLQdID?@I@?A`I@IP???@#9!28?_O_?O?OgOcO_#6?G_?COCG??CA?iC#9o_WcycZsjSjsjSzSzSi\yD}JuLuF|Juj@MPlPidLpIuOdIpEhIrEhUPvCjSfKrElQDM@IJ@NCRKJ@ECL#7!21?_?O_SgUgTiSzkV{j}l~~}!6~^n~F~JVlRIDITA@?@#15!6?_G?Gs?kQcY_VCRCJOFoFGeGQcO_Wc?SA??o_O?o_O#8!9?@???@?@!8?O?O?O_O_#19!18?_O?_O!4?oO_?O#9!64?zCrSjcWfGUpUgvGv?SaGPG#4!13?T??~~TMDJE|yVn\j^vl]nznVzlZulZulZulZuj\uj\uZt^n~^~^~^~^}^~]~^|v}~t~z~}z^xsYpj~Yn~v]nz^u~Ynl~u\vz|m~\vz^u~\~zu~^~V|Z~~$#2NJVLjFLfXbKJDy@lBXaLJcJOJoJgVGvGBCB?BCJ?@??CA?@A#5??_??_??o??o?o?o?sAPgS?ACHasYpmo|!5{}{~~z~~z~|b[ju[Je^SjkfQlZlV}dZuXeztztyTyTrJ^dZDZcJSjSJSjCjCJTADI@CHAH?A?@?C@?ACP?Q?D?HQCGPAT?HQ@I?JSBGRCHQDiPaDOc?BGB?CG@A?@?@!4?@A#8!38?_O?W?cGAC`Q_?GCQcITaH?A?@#18!7?_?g?k_cG_G_O?_??_?_?O_gw!4?_??_#7!28?@A?I?AChAk@lAlJuLzEZl^Fn~Nn!4~NnN^ne\zUlYtilYdzeHsHUgDiPCaOH_S??_?O?G_#5!34?PA?S`MhVGvG~j\vmv!13~i~~??ipysxADgOaS_GQ`OCOgCQcHQcHQcHQcHSaGSaGcG_O?_?_?_?_?_?_?_!10?_CIdIS?cO?G_OC_H?dO???aGCAP?aGC_??_!4?_?_$#16???_??_?_G?C_?g?O_?O_?O?_??O?_G??_!7?GC???C??A!8?AG??I#12?C!5?A!33?_#14!7?G?QCHaH?ACI@gD?GC?A#6!14?_?_?o?o?o?w?sGSyomOiCY_MoHeGpEgS_KoCgcGo?gO_Go?gO_[ocYowcosypyo~}~}!4~}|!11~^~n^jVhViTjCRgBS@Q??@#13!9?_?O_OgSgTitylYti\u~|^u~vJ~RlZD^?z?ZOfWFWfXVlZN^FZnJTF~N^n^N^N!9~}~~~}~}!8~n~n~m\nT~|zU|R}Q|QsHqCxcQ_W??O#6!7?O_?XaChQdITQdYCXuJuhVyTmz\nu^j~~^~n~v^!29~CzKjSIdWbG#11!64?@??@?A!10?@??@??AG@?I?C?@C?A!5?@???@!7?Q?H!10?H?A?CH???GAc$#10!10?_?G???G?G?CG?G?G_CGC?_W?OG_GO?k?oIcPiOkPKr[QlIDyLEdITL??C?CA@C!4?@!479?@?C$#17!14?C??C!5?C?C!8?G!4?C?A??@G#4!9?O??o?OC_?Y@wcAh{xyu\JcMPNA!5B@B??C??C?A[bSHbSH?JCRGDA?A?@-#3~Oq@ugRokRg?vgQgRsApQcX_Z_X_Qs@titjSjDa@a?`?@?@?JQDI@?@?AC?@A!4?@#9!11?_?O?_?OgCgQgSgSgSgSiSgVg]isJ{RkYlyT}sj[yUxuGokOi}Wv]|^}^~N}\~]|^~N~ExEhUHATAT?TASAS`SHATASBSjCjSjCjSjCjU`MPm@mPm@mP#5A???@#7!12?_!8?_O??O?OKoDyCxExe|i\v}t~|~}!9~^vnPKaLOBGQ??@#15!7?OgCgTa[`]?n?PAD?ADA?oC?S?C?H?O`CO_CAgACOC@G?O@??C!19?C#8?dG`I_ITi#7???i?IOAS?tItItItlAQx\Kmzx|GidOIut~z}tmxfzexehV`]hUwDiWa\?i?PGCa@OCO#9!28?~?~?iU?lJoESqeOjS`KPI_H#4!13?H?~~T!4?~~~`^uXf}hVylVylZulZulZulZulZulZuZe|jUzuLyVyVi\uj]j|^uz|m^zmvz\}nvz]nv|zn|vZn}v^l~uv|mzv]zn|vZ}nz\}vz^l~Z~~$#10?i?sGQgCQgOeGOcPkAxGcXcQcXcYcHqGSISjSYL]PMYjUxIz_C_@sAY?H?CG?DA@#4!32?@?A#6!22?A!6?_?_?_?o?_?_?_?o?wExUhu|i|i~i|j|j]ju|i|i{jSzSjSzSjSzSh]pmP}PmP}Pm|~~~}!12~^!8~^n~~n~nrNyDzExEXATaG@I?A?@#8!9?_GOe@OA_C_D?Qc?C@A??@#18!8?_?OgCgy|[wx^Nz^j~Z]u~M]zN^z\V|Znz]U~m]oqhsAxCq@GC@gAPGA!5?G#19!26?AOlCAaPCCAvOIdPG#5!67?T_HQ_CXaLOnSj]rmt^u!13~u~??i!4~???]_HeW@UgDQgDQcHQcHQcHQcHQcHQcHcXAShCHqDgDgTaHS`SA_HCAP_CPGCa@OGC`OGACOAGcO@G_???GAPCG`COAGc@OCa@GC_Q#11?c$#16?DGA@C?H?C@G?BGA?GCAGA?L?E?DGAKA@!8?@?C??C#5?ShYsIx?|siyU|q|Yv}T}}u~z~~~|~^~m~^~nVzVlVjVjVjVjSjTgV`TJsBkRdQDi@JSbDhEHvLQnT@fG@A?@???@A?@A!4?@!21?@#13!89?GqLoNwVg~lY~z}|~~}nVzVi\b]@~?ViT?A@?C!7?`??@#21!11?_#13`?@?NLQJ|EzL}vz}V|mv|!5~r~Yv]t^tiT~~~T~tn|j~ItItItIOl?A_P??A#6??DOIc@I?C@IPEWCXEXUg]`UhFyTf\a~T~mvz\}nzn!28~?~?~?Hu?SJ_H?H#11!111?Q?H$#2??DG?@C?@?CP??@C???C??A???A?@#4!8?_O_KoCOGEOC!5?CcA?P@_?G?CG?i@@H?C???A???@#14!42?@#20!167?_A?_??_!6?_??_??_??_!6?_$#17!7?A??A??C???@??@#12!23?_?_#14!16?_#21!235?_-#3yDiOMOlQcRkPmObChUGQlOLQKOHA?AS?P?DGDGCG??A!5?A#9!9?_?_?_?o?kOiSiSiTiti|j|j[ZuLynYTi|YsnWviLuLrJuHv@~@lJTiVgViTiTjTmRlUhVkRiDYbEHAJTaDIPADGA?A_O??CG?CO?cO?C?_CO?CO?OG?O?G?O?G?O@GAHAGAD?D#7_GCOGC_S?s?s?s?cWasGqGsGqLSiLyTmXvi\u~|zu|y~~}~}!4~^~^nnZdZcHaGQDOD#15!11?OkPM?NOBGCI@!8?A@???@??@!6?@?A@?A@@??P??PI_COG_O#13?bNY~Vj~ny^uz|n}j~~lZ~~ze!4~y~yvm|j~iTmTzT?i?T?G?A#6!4?Ag???@?@??DG@QdIcJOfGVgTipEhU|Yd]b\uZl~v\nvz~V!20~?~?~?TgDQ?C#4!23?S@?S??~~jvNxvI|Ze|jUlzUlzUlzUlZulZulZulZulZulZulZulZuZe|jVkZvi~V|u|}~m^~U|}~\lvz~U|nuzlZulZtmtN}i^uxnyt~V|nuz\~mvz|n~~$#10DIDm@nALBkBE@NSJU`ELAfQdBjCTjDiFCB_?A?B?AC?C@E#6!35?_??_???_??_??_?O_GoGsGs?{?{QsiTgVgTiTiSiOkQgUgQkOyc[xu|si\ytm|yv|~|NnvRrVzjnZJfRr^ZjnZjn~fv^nvv^nvv^nuv|u|v|y~y^vznvz^j~J~J~J~Zf\JvLvJvLqjTqDiPeGTaH?ACHAD??@?@#8!4?_?_OOcYCRCPD?gA?Q?A?@??@#18!6?_O_Gsapcw^}vnn|~v[}n|vm~z}l~~l|v}|t}|tumvmin~mt^jnvNn^[od?gS?OD_HCAO@S#8??Qc??CX#7!4?D?DGPAS?TiPiCGiTTiifrp||~CTR~~~}~}~~yv}lYtZsnWvgViTMxUhAdY`[aHcQ?GaOGC?g#9!20?~?~?TiEWhcZ_]`UkPaLOd?QGCA#11!77?P??HA@?A!18?@$#5?_O!5?O???O??_???_!4?O??_?O?O???E?DGCLACAC?Da?Q_ggw{{~u\~Z}^~N~RnTjTjTiTITASASBcHQDOdITADJOFGDQ@AC?@AGA?A!13?@??@??@?D?@#19!16?O?GcG_CO?cOGcG_CO?cO??G?_?G?_?G?_?G#13!68?_GqKqlQlyl~|~}~~}~~~nRmPnOfGTIPE?@??O!8?O!7?A!7?GO?P#19!53?aT?i?TOKKAA?zgC#5!68?i?PaCZ_^`]hRm\qnY~lvz|!8~j}~j~~??SGoEGtAcXAShQChQChQChQcHQcHQcHQcHQcHQcHQcHQcHcXASgRcGT?gAHA@??_?_???_QGC?hAOHCQcHQcIPIo?T_HEODI?gAOHCa?PGCAO$#12?O??_???G!5?GO??_???_?_?_GOg?gA?A??A?@!4?A#5!106?G!8?G#21!122?_??O?A?G`?OAG!4?Q??Q?G??G??G??G?C$#16???@#4O?O_??Og?_???GO?OG?G?CQ?C???g{Wpwooqoxxxwxy\|l^VVFBB?HA?C@#20!223?G!12?C!8?A??A!6?O!4?O??O?_$#16!18?@!11?@-#4O?PAGqSApG_ADgS_@??GJ!4?_AO??AGn~~}~~^N^KFBbB?G??G!6?@#6!13?_O?_W_Cy@QGdAGtAhSiT_ItK}hUxulyd~kZu|}~\NelV|]ned~~EvmlvT^nmz^Znzmh^evZp|KyViVlSe\rFYfTjTnTjRmRlTiUjSkXeYn\tM{TmYjqMt[C^mQlQlQlRmOnQlQLQeGRcAHA?A@A?@A!4?@A#13!13?Ok?gSgSgSgti\y|}hVzmznzv~~~^tf\js@?A@#20?_?GA_C_C?O!9?@!18?C???_G@c?@?_?O??G#8!13?A???@A#7!8?@?@ChAGAtAY@laUZHl|RZW||RrnbVJb^BjBbf@JePzuLyc\sJSjQdI_ShU_SIP_COAhOCg#9!18?~?~?Zc?ZcgN_~?|A{@}@{?Qk@W@G?G#4!4?@?C@G?BbALZulZulZulZulZulZulZlrm\rmTzUlzUlzA@BA@BA@B}tZe|J|Rmt[vj^vYf|J}RntmZtnYvj\vZe\ze\ju\e[tYvjuNzUzVlZvi^bLRiRHv^$#3i@G@aDGTA??@ADGPcHODOdG@?CGAGQCO#11???@#9!20?hAgRCrCz?~?~OnYTjlYfIz?}hfYxvI|UjTiZtIr@UhEHQDY?RcHA@?A_HQgA`?@I??PG@Q?I_?PC?cOC@Q?PG??AA@!4?A@!15?A?@?A?A?@??A??A?@??@??@??@#8!47?A?@A?B?B?B??A@A@SgCPCOCG#18???_?W_SI{}|}^^Vvx^z\z~nunz~^z~\~u}l~u|n|~u~z]~|v~\~z|n}^v{Yz{}U^Nf~E?PegcQ@OD?@#19!16?_??_??_O?G@cAOH_cQAGcfAAkCOK_SG_S?[?WcOGC#5!51?cHQcHU_^?~A|B}@}B~lR}f}v~v!4~}~z}v~{[|qcHQcHQcHQcHQcHQcHQcQKPaKPiChQChQC|}{|}{|}{@IcXAsAkPIbGS_GcWAs@kOIPcIOdGSaGcXaCXaSHaXbIdGSHoChCgQcGT_[qkTGuG_$#10DOeG?Ga?GCIS_?ACGACa?AOEgBO`C_HA#19!78?_O!5?OGO??g?O?G_?O??_???OC_G?cI?@??D_A@?A??D?A?A?A??@?A?@?C@A?@??A?@A?@??@?I@A?@#15!76?I?A?@A@??_?g?C!7?O!8?@???A!16?@??A@???G_?W???G#6!50?G?OG_S?gS_[?YcPiCHqDZaJsjSlYt^jUh^jtm^zn|UnzV!18~?~?~?Ql?Q@O#11!90?@#10!46?C$#5?i?_T?@gCaP_GQ`GQshOcWdgTWcKqLocO!5?_o_rw{[{~v~~v!5~U{VkzKzC~?~?nOdICQD?T?D?CO?C!7?C!20?O!5?O!23?C#7?oCgOGOgW_Kw_WgSgOgSkOkOgSgOgOcWcO_Go?gOcSKo?_w_OkQlQlQkPnOlQlqlXvkZ|u|~|}|~}|!4~}|!13~lR}TjSjSjSIT_C??A#21!27?A???H?C?_C?a?G?Q?H?OA?H?C`?AG?a??AO#13!5?CA@@?_??p~eXVZl}ny~}~~|~~~}|!8~]~}ZU|VlItcYOL_CQ??c#11!216?_$#12?C?S!5?PCGO??A??A???AOA?@?@??@#5!140?@!7?@!7?A-hQCOIO`QcGqCxCOdZeWvGvi\a\itYlYtOwk}v~n|!5~v^jvZvlRmPmPnPmPeXAl?dI?AC@?@#19!18?G??O??_???O?G?cAPCgAS?IOCO?gS`IsApCgQcHSaGT_DWaChSaHO!19?@???@#13!59?_OGOgCOoSiPiTiTiTi~y|u~|!4~|~}~~~^nZdYlUHF?@???C@@#21_???O!4?C@?A?GA_G@?AG@c#15!5?OOG!5?_?Gc!5?CG?CG??G??O#19!23?I??aGC@_?C@_QGDO?iAPH__O?Nd?IdSHcQ@kRCiPC_O#9!46?~?~?Zc?zChIShRItITITaKpCRk?T_P?O?G#4!8?O??C_p~mP~UhvmXvYf{jV{juZu\zUlJELJM???O??T?_NNzsnTyvLyvI|Ze\ze|Zt}tz|u\julZulZtm\rmTzlUzlUzUlZulZlr]tjSJoiSHun$QcxjskYcZuLxEylY?ODGaG?AS?OAcOc?nFR@G?OA#9!5?G_SGcGQkPmPmOmPmXe|QNY`TkXa]_^_NOjCZdITaDIPEHQ@Oi?HQ?@o@?@Q?G?c?PC_?O?A?@Q@G??GCA@!4?@?A?@!5?@#7??CiTj}jU|A|iTzuhU|q~syS~SwU|qnYt]tI|iTyTi\mZuLydZu\qnYti~ytMzv}l^}!19~^nvnVznNjTmTiTiTiT?DAH?A#8!4?A?@#18???_OcWdQhuw~]~~Pym}^n|vl~i^~j]NT~v\^vM~|V}Z~ululjfR}h^r^E\QH~m^|nyvvzvzZVEeABP?Oc#7!22?A?CHaGAL?qIdTTkeU^Nn~OYytOjcQHsQ?gPCiXfLzsj]hvH}hUhUGvGqDwDoGaPCI`SA?gA_C?GC#5!13?cHQCOAS`AK`ITiTi\rMzkR~i^m~n~v!8~n~~j^M?Pm?hUGPeGdWBSgBSHcHaChQsxqsp~~~n~~i~^ooCJOiDGqDGtAcXaCXAcI@ICAHaSHQcHQcIPaKPiCQhCQhChQcHQcQK`ISjsNPHcHO$#10CGAC@ACG?@?A?@A?cHa?T?T_HaDG@A@I#6!33?o?SiPa[`]_^onSzcYti\ytmxul}fT~el~]N}~mlvvZXkiR\jntlzmlUb]sBxKyVlZui\ti]yf\zUi\ujTiS@ShA|ATiCHUhAL?JCj?jEhALOdI`ItATiDiTaPcHqDYcHaLOdIT?DIpCG@Q_@#15!56?A!9?I#23!13?_?_!5?_!9?O?G??C?G_O_c#21??O#13!9?C_pXh[k~nZ!18~t~~\tzyU\r{QlDoIi?PG_?O??_#6?D?I?QHcI@kRCiPEGqCJS`UGu@UhUhvGvLyFyNv\mzt]j|~V|^z~vz!9~?~?~?Ql?jS`IS_S?_?_#3!26?O#22!101?C?A$#3?@!5?@#5!100?A!13?@#20!149?_??c@O??OAGA?T_?O?OG??_??O??_???HQHAC?c@Q_C?HA@Q?@_AO@?G??C_?G?C_A#11!258?a#10O$#12!5?@#15!284?_-#5iT?TIPcQcHQlQlQ?~@}DyLqnO~Y|^l~y~~y~~}~~^~n^vlZvItITiDIPATAOD?A?A#7!14?_???_O?gOcGS?OcGq_g#19CODGQ_HOCgAWaSHcPKPaKOjSIpEPiTAcHeOTAYDqDoJOm@O#13!69?_OGCaGCQGCQgA|?}PiSjszl]zulZulz!12~nZtJuLRKB#20!4?Ga?GAODOc?A_RG@I?@G?C?A@?_???O?CA?H?P_H?GCA?Q?C?CAO?GAO@c?H?C??_G?C_OA#19!23?c@GaOCA_OC@C?I_CBOK_QHCQ?g@bOsRIodKAp#9!48?dIPeHuIYcHrCiTGqTdIjShEOi@}@M_O?Og?_?_#4!6?A!19?FDAFDAFD??OC?OD?OD?Q?CO?~}Tze\julZulZtmZEDJVynVzluLzUlZulYvmXvmXvmXvmXvluLzUlZulQHqLQ_ny$Ti~itmZlZulQlQl~?S@QC_H?i?dA?A?D??D??@#9??_?O_GQcGtItiTytm|i\niVxnOnOfGVGbCHQdGA?@_@???@!4?@!5?DOh?O@?A?H?C#7!17?G??_W?OG?g?_G?GC_?Omlz}|~|~T}T}z}|!6~tn\zV}T~tn\z~}|~|~|~|~|z}|z~~}|z}!4~^!4~^!6~^nvz\vzlvzlV|A~@mTjSJCQ`CHQcHQC#18!12?OcIsHqkr{!4~v\^b|nynZ~t^Kdkdh{fljFly_TXqYN]q|ne|kXsncIlrH^j}z|nzv|n}Y^uuzz^VFvqQJHp?C@#7!22?GAoCHaGQ@T?Z_KbRLdQhlVV}KlJGtDIQpM}~~~}|z}lZu|zmXeXuH}hUh}?y@}?yDWaGcQHOdO#5!14?@?PaCGPAcH?Y`SjUxnT}@}p^n~nV~^~^!6~|!19~wy|wy|wy~~nz~ny~ny~l~zn~?@iCXaSHQcHQcIPcxysgDOgCQHqChQcHQdGPeGPeGPeGPeGQHqChQcHQluLOdIOD$#10!17?i?g@QCOD#14???_O#6!28?_?OgCOlOnWvgv[zulYv|~]^}~^n}VnZvi~nZvLYFQniul\uezR|f\juZmrm\rnSjtMxeTi\BuHfiTdYDyFoNPm@QC@A?A?i@i@C@A!6?IOaCg@i?IOaC?@A?A?A?A?AC@AC??@AC@!4?_!4?_#15!64?_S!8?_?Q?SA??O_O?UGAC@_?@??O?ACA?Q`OGC_?@!8?@_?H?C_GO#6!56?A?c?IO`K?@???@AC@QcHACPeXeHu@UhU@~D}@~Dyf\vZlunYn!8~YtmXuHsdISGrCgRCi?S#10!128?_GT$#21!280?G!7?O!27?O!4?C#13!12?_GHLcsM~z}!19~Z}vTlJxULrkyitCZoK_QGcQ?g??O#11!204?A$#23!283?Q?OA??Q?W?CHAcHc?`G?O?A?A?O@O?C_-#5{k{k{k{s~zl}Z|v\~~|~~|~~|!9~nVj\e\jQlRm?I?CG@A#19!14?_?GS??G_CO?aT#7?iSHcYCiCy@{RsiTypiXeXuh}lzu{sm{Z_G?S?_?G?gOOi_OGO`GS__Og?QHcAC`IOOiOsGOtkaTga[Sa!45~^nvP\nhdU}RJkUVgIdOn?^dYdIDOdIPAC@A#8cG`I#18!6?o?GsAsGdys~]~~V~\tm|Z~U~n}zNVIfJmh@csPPlWlZK|v]Qv[IIty\wl\kYNxyh\zv^}vMnz}fz~fyz\\vXZ~G?_yNA@OG!5?G#7!15?@I!4?@AC@cIDoEIjTCqHlSURjNffuyxsq!12~}|~|ZulYtiTytiTydWfGqDgQHeOISpCo#9!17?@!8?@??@#22!6?G??cA??O#4!14?OE?gA?gAOC!17?DO?d?Q?@@@?@@?@N^ItnWwOnvZluZlugQdYdYdJoEWaTIS`]_?iTrEGrHU`]`UWBOGpm\i}$BRBRBRBJ?CQ@cAGa??A??A??A#14!9?OGCA@#6!8?oIsA{a\qlqlYtm|z~Yv\~fbznuVRj~XG}TjuZdzTzD}BkJTiDITeXeHU@QCHBIPBcITeHuDZcjU@iCPNOfGUbKRM@UHsA[`YC@m@CJ?fGAPGAT?bG#13!45?_OGa?OAG_?cO@g?ToIdO~_YdYtynYtm|z}|Zv]t!6~N~vJ|JvYDJ?@#21!4?_?O?C?H?O@C??@!36?G_@G#13_!13?c?ez^D_x{nv!5~v!15~}t~~~zm|ymPsiLoS?iXCq?h_CO?G#6??@CA@!12?@A?AcHQdITiDITiDYfWvLyVluXntjMzN!17~}~~mXvGrMw~?}?vGQcH??cIP?O??_#3!12?@#22!57?@!7?C!9?t!7?_???G#26!5?PAC$#9!35?_O_WaSlQkP~tNpB{@\aLQLQdIPAC?dGA?O?CO@GgC?C_@#19!16?C!11?@???TaXaHYcRS@mDPM_fGU`GRK`UhcAX`YCpm@Sj?vGAPKaTGbGT!48?Ka?SQG@GcQ@gADOI#20!37?_??g?AG@A_?_!4?OGC?C?A?@??A!6?G_C??O??@_@O_OCOA@O_C!4?P?C@OC?OD?a??c??OC??OCA#19!28?CO?@OI@OAH`S?aHCQAHgCoOWHCAHK#5!64?PeGvKpE?~?~GvlZuv~ZPk~nn~^!12~mx~V|~V|nz!17~yn~Y~l~}}}~}}~}o_tIOfFnOGcQHcQHUlYdYdYoJxf\itj]`^ITiCXvGS@]`U@f[jTI???@$!69?G!8?A#24!134?@#15!53?A#23!9?_?oGO@SiOJcGQdQcR??@g?bCPICA?A?@_?C?A#25!22?@#11!230?C#10!13?G_?C!5?_?_$#15!278?_?O_O?SI?Ic?A??_A??@G?`c???E?AA@_?CCA!6?O??G??G?C?aGA#11!251?aG??G???CaC?_P-#5~~~}~~}!15~^~n~N~vJnj]tMzDYdYCXaHC@#7!9?_O?Og?sGQk?wCyCwcYoWskYskynynynyry|~}|~~}~|~}|~}!8~|agTQkaXTRKtRGicT}{|\[Nfvu~~mfrYMFbzz~vrz{keut||kv~V~n~^n~~n~^n~~n^~^~n~^~n~^n~~n~v\rf\z~Tnv\uj\uLrKuGza[bHUhAGQ`ChAHQ?@?AC#8!6?a??@#18O?o?ShCRkr{~}m~|^|j~|zn\vyl|ny~mz}lxXbQ[LI{l}|ftJIyzk]vYvrn|fk\l|Z~m\[h{v~z^z~U~L|m}v\t^mVr@@@_?EA?APG!4?@?@?C#19!17?OC`?C?A_DOI_Ca@OAtOGK?gCEA`_??C#6!13?CG??@aKPA?cHQcHqDjTItJuHuHulZ}V!17~ZulYtn[zExExEgTiCWaHQH?cPAOA#14?A#4!12?Sk???k#22!16?_?_?_?_???c?c?CG#10!17?A#22!5?@?_!8?A?O???@@?O#26!8?A$#4???@??@#9!15?_?O?o?GsOS`IPCYDYDZELQRGUH?@?@?@?@???@!5?@!5?@#19!40?\AgdPKagcRGcVPIg@AAA`oOGH??POGD_wWCC?GGCBPPGIAAP!52?@??@!5?@#25!35?O#20?A_AO??COaGDQ??@!4?A?_???O!5?G!5?O_GC?CO?G@_O???@_@?@???_C?h?Q?@??AG?O?C?A?@?_C@#7!31?CGOdGAgDOJwCidGIdrr^Rxx[]Nvzz!13~zv~~}\rm|~ZulZuLySitIsHuHuHQc@g#5!17?cHQdIObCxExExViTxfLsluvZm|n|~|~~^~^~^~^~~^jRj^nRV!15~^~]~^~^~||X|XlXdzjvkqmXui\qmXui|iTyTjUzUHUHvGvITiThEhCzEwEgDiShSJs@gP_$#6!34?_?__?___Ocguhu~}~}~}~]n~nU~JvlR}FyDzEYdJfIRdJQDODODODGDA?@A??@?A?@A?@!8?A?TAGAPCAG_AG_CPA?@??A!10?@!9?A?@???A#8!57?_??_?_#21!39?C?A!7?OC?PC?O!8?O!15?A!5?c?O??O?G?C#13!15?G{{}]~Xx}|mv!4~}~}~z!17~nzYvjYt\QidSBXSIt?IC?_CA?`??GC#22!78?A?OA??G!9?_?_?_?_??_??S_O?g#4!17?@!5?!5AQaQCSGRLPeHTaLPeHTATgDiShCgUHuGVGtiDiShExChEwFiPISbSHuEGVl~$#19!67?@??@??C?@???@!7?C#13!43?_??G!5?GC_O?C!4?C???G!5?G?g?O?_O??O?_O??O_?_?O?_?O?_O??O?GaKWaC?iOGaHSaHqKrHuC\a[UhU\uL]zU|ul~}~|z!6~\~~}n~N~jUzkRKB?@@#23!13?A!7?ACShA_PA?@AOIs@C?B??_G???OA?A!4?A?A#24!84?O#11!168?_#10???_???O!4?A?O!4?C_AG???OC$#15!277?@?CAGC`Ac@A!5?s@C?@?@?G???OA?A!4?aCA!8?_AO@G_A_@g?A#11!243?O!6?O??@??_AG@_GQ-#5~tJ}Tj]dZ}TzmtZ|nVj\jUj[b]`]pExEpCZ_JSaT?O?O#7!6?_?Ga[AlA\aLyTj[jsZ}T}zn^~]~~}!33~mMM~}mevp|srT[QqX|[]n~vrrXx\{UuRz~hlsunSqZh{mRxWm~nV|m^jv]j|nV|U~^unnZv~Ti\vlYtmrmT~n^qlRkZdYdZsJ{ALiDiTIDQGpI_ACOd?T#15!13?O??O?_?O?O???_??G?_??G!8?_!7?A@?A?A!4?Q??A?A@A@@??GGC!6?GDA?@?G??O?OA???G!4?A#19!38?OA_CQ?_G?c@?I?CIHCCA?L@GCFB#6!24?@I?OcHqChUgQdITiTiTiTi^t~v!8~n~n~n~n~ZulZulZvkRkRkRkRgQDY?D?WaG_#14?_#22???CH?AS_Di?iO_NOJOI?o?o!5?o?o???I?I?ACG@iSgDA!4CA?OOGCCA?OOGCCA??__O??@???A??C??_@!4?C?@???A??CA$#9?Is@iS`Yc@iCPIcAOGCASHCBK@M@MHEHA__OO`O_O_O_Oo?o#19!64?PpO?@POGEAHKA`lCCAB`??GGKCEAA@HGC?CQAH?AHCCA@GCE@#8!41?_?_?_??@sQCYCa@WdQCODW_?O?_?o?o?o?O?O_?@#18?GcBOHqCxas~~^~vt^Zn~q^un|uj^I^yn~Y~l~{un{v[zm~xcY|xm[ukYuzUtQztn~tzvRw|}}vvivf~n|FJP_f~r~|`_O?CaOGCA@G?D??@??_?_#7!17?O?h?QC`I?ID?iPSqJxlQq]bXW{^n~n~~^~~~^!13~}t~nZuLzUhVlYtiTiTiTiT_I?G#5!8?O?O?O?O?cHQcHQcGRkRkRkRkVlWcVi^f\v^~^~~~zu~|j^yT~TlZoNsdd^N~N~n~n^N~N~n~d~d~lzf]TjVi|hZypkZedrjWxVmDrYpkZuHNitj[qlOl?Z_zCISiDyPiOmOLsHSjGl?ISA$#6!17?_O_?_O_O_O_?o?oKZCNcILInNnNnN~N~~^~v\b|Q|a\qDiSbSJc@i@CO_?`??@!35?`???@?G?A?GA?H#20!129?GA_C??D?HOAGS_T??O!6?G!4?C??A@_??P_GOCGC`A`!4?IC?CA?@?G?@?G!5?A!6?A#9!148?_?_O_#4!19?AC?_?IO_!4?O?O_!4?O?O?O?O?O_???O?Q_@GPcH?CO`Cg@_C`GPcHU?DISADAL?n?ICRCi@ICI@M?fAHcBS`OmP`kT~$#13!118?G!5?_???a?_?O??C?a?_@g?c??Q?H?OhC_Q@OcA`O?OgAP_SG`SAOgAh?_HOOcG?iTaGQdIPKPi?O_LQkRCYDYCJsAH_P_PGsaGdIdYdZnI~I~N~N~N~n~n^~}nvZknULjELJ#21!8?O??_???@!4?D??d?Q???O?G_?O!17?AO!4?_!6?C#25!5?GC?@??C#22!151?A@G#11!59?A???G??A???G??A!4?O!6?A?Oc??_P??O?C?@??_A!6?_$#23!271?_!8?@??@?@?@?CGDAC?@?@_??G?C!6?G#13!7?OG!4?ookUW?G??[^n~z\nvz|}v~y~~}~~^~^!16~nl^QllZUtZsytTi`CoAOl?_Sa_?_O?O??_???_#10!139?A!6?A!11?_GO_O??P?G??S_@_O_OGO?Og?Q?PCIPi$#13!305?G-#5~A\aLQdIPiDqDwBsAdGRcHQDODQcIPaCjT??A?CHO?O_#7!5?`GCaGTa?hU?zUhvlY|vlZ~~vnv~u~u!30~^~n!4~v\nz]v|nvzz\n~znv|nzUlZulZul~u^z\ujSjSze\juHu\ivYlvYlvYluZlZu|Vm^nq|VlylR}d]tYvlYvi|A|aLqDYdRkJyszkRIcH_GOID?Qc@S#15!12?CHcAOG?O_O??GAOcPI_?G_!7?@??OC#20!15?G???_?G???GO!6?A#15!5?_G@CO?dI`?G?@_OG?DAo?G?A#7!25?O_CGQ???g@QcH?sOCPi@UgRkRkYtj]dYdYntvz|]nv|^u~~z!13~}|~|zulZtiVkZtI~?|AsAH?G#5!16?cHQcHQcHQk@}@}DY|j}tZ]lzTM~ZN~~~j^juLzdZM|ULxJyPvl?~TiU|vl?lZci~aRqnUprl?~QU|rh{h[YVepjzEHjPe\_^a[aXcXeHwSBwDqMGel_EhUlQHeXaTgPC?A@?G@$#9?|a\qLIteTiDyFsB!10?@!6?A?@#8!73?_?O#13!4?GaOC`GAOGC?aO?COGAOChQcHQcHQ?H_CaHSjSjCXaSHuHaTGdQGdQGdQHcQcHAgP?OLA??@A?@??A@!4?DA@?@O@G_OgA_C@?A?sJcZCJs_ZcJsJuhVlyd^u\vl~zuIxNa\aD#20!12?A?G?C!4?CO?A#13!17?G#15??A@G@?O?O#13?G!4?C??B!9?G[SNA@___o{M~V^|V~^}^}!19~n^zvl~~^QmlZuJJdYeTihVkRkRdIS`YdYdOI?CA`OGA_H??C#6!13?@A?ACHQcITgRcIt?~A|J|u~v!16~ZulZulZulR}@}@ydAS@Ic@QCiP?cO#4!9?O_??@_A_@aGQ!4?hAGQ!4?T?T_HO`AGQ???hAGO@S_CGPAOCOC?G@?C??AHA@COA@gCAG@OA?QH?Q??dO?CG_CAqHgScASIv$#6!5?_O?G?OG??GG|YvkZulynykZtm\zSg~}|~zun~n^!5~]vz\vi\~Uh~ChUGQdAGQc??GOG?H?H#19!47?C#8!53?_???gQCOk?Y`GcGQdGO?{A[aKqDICPS@ICPk@OQCrc@YcHOI_HUgQDY_HaGQ#18???PC_TaLIn~~v|nZmt^~v\~v~z~}t}znnxnz~~v}z^}v~~l~}vzv}^{uvy~dnnzu~~~|y~~{~^v}zn~YtQbbo{]NVNI@@?_??G??@?@#19!26?_DO???s?I`G?S!16?G#22!85?_???_??_???S_SHqCICpAgQCSCK??~?iT!4?~QcZ??GGC?GGC?~?l??CCAAA@_GGC??_?C??A??@?C?A??CA!5?`P??O#26!9?A?G$#20!249?O#21!18?@G!5?OC??G@C_@G??Q?@?C?@!4?C?A??C@!4?@#20!12?C#25!7?O#8!5?_?_?_?_#11!186?C???C!8?A??@_??C??_OS??A??@?C?A??CA@wCAG`O??UH???GcOASG???qDgItIp$#13!269?A#23!25?@#10!256?HA?aW_X_[_O_W_Ho???@oC?CG??_ChQ?AH_@APk@COAP?_CG-#5S@QCHQcHQDODQCPe?CHAC@CHQdI?HA?ACG@A#7!10?_??OiDgQdYdYdYtJ{jUlY|V!43~\vmZ|n^~nZ}Vl~U~~v~}Z|nu\jtmZtmZsnTyVmxVlYvi\juZ{z]tnZnvLyvLyvLzu\zu\zu\ju|nz]tj]jsZvkZuj[vlYehUhSjcZScZAkRGcRGb?IODODODO_!5?O#15O@C?A?APG?aG?T?`CO_??I_CPG?C?OCaWaS?O_O?O_!4?_!13?_G??G_?I?OAcG@g?dA`?@C_A?OG??_I@O?c#8!5?QCOdGPGPGPGP#7!5?O?OdGPAS@S`CHQcHQcHaHsBGjT?~?zUlZulZulZtmZun|V~\~~~vn!9~u~un~~~i~i~iTmTzUhUhUoDyChAHD#5!16?cHQcHQcJShA|ItiTzA\Ge^Hc}Lmurzn~lZulZulQnydtn|bRqnYvmLbcWMJmjmBaxPIXR?}d]FLzmraXGi}IpGCKbOhSRcjCQhUgR_IpB}?[BsJTS`iSAPMpAx?_O?I?dRGc$#9jShQcHQccIjgcJiH#8!96?aGO_?O_?O_?_O?_!51?CGaCHaSHAOC`IS`SJcGRcHSbGQ`WE`QHSJ_JPcXAcRGcPKOd?iAgAgALOaSgDi??OcGO_#18A??CO@_FMjBA~~t^zmuzzunx\f[j~f[nvmN~z~]^n|~}n~\~m~v~~^v~~R^ut~n|Zu}V~Y|]xoo[W^NV^C?_?C#19!43?OCAG_S?i#6!35?H?HO???T?T?TiPiChUhUhNyDzU|uy!16~ZulZulZsjU|AtITiCxAtG_QH?Q@GC#4!14?IOAS_HOD?PaCPcOC@S@cPAgCAg?@Y@Ga?PCOa?S?TAPGaCbOHCP?hCO@?GT?GC?A`GA?i@S?@G??G?CODI?_OAKbGZ?Tn$#6?iChQcHQHoCQHoCO~zu|z}zulYt~u|~|zv}|!10~^~~nTyVlYdYdYdIsBShQdAg#13!45?@CA!4?C@GA?H??G?@cAOHaSIPcIPcJOiDgPEgQdGTaSHcBC`IOcOGqDGqDGqCHa?@!24?C@OGCa?OC_I?cPGcRGeOnOnOlQlQlQn\jVyDn}jZtn\kv~Xf}IwOOg[#21!18?@??@??C?@??A?@??A?@#13!23?CMIBd!4_z^T}j~Z!5~lznYvmvmvmvm!5~n~nYvm|j}j]zulZulZuLqHsV?iT?~ChQcHQcHQcIPcHOAg?a???GO#22!71?C_AP?cQ@_O@GCO?QcHQcHQlODY???GGC!4?OOIA@_O??WGCC?_C~??__O??GGCv@@?GCaPOGCA_G?O#10?AgU?AcAw?W?S@s???@iSaPE_ALQ_PCIO?O?Ci?O$#20!257?C!7?@C?H?A??@??G??G?O???_?O???O?_?O?G!6?c?H!5?@!8?@#11!189?C!6?G?@_O??O?C?A_C!5?O!4?C!5?CaP?GCA_GASAhC?@_GP??@cA_G??i?S?@K_?\?_?DMPdG_CR_Ti$#25!258?@#13!18?A#25!41?A#10!194?_G!14?P!8?C??@!4?_#26!16?C??C#22??@!6?I#26??_!5?AG?_-#6om|{}{|}|}|}|}|}!8~z~z~z~z!11~|~u|ZmtnTyVlyTmPnOdY`ICPA?A#8!11?O??O??O???_QGCQG!16?OCQ?L_JShATgATgA_O??_!7?_!14?O!28?@A@?QGDa?HaODAOHeOdIOiCRGCRgCQdOGj?Hs?TgAgAGacICOdG_DQcOdW`Y`IOh?O_#25!13?G!9?_#13!35?_???__owM}Jtw~Nvz~|~|~i~h~j^zvm\zV{V{VkZsJ~j^yvm|j^}n]zUlZe\rlSzd\qMXsIt[c^c\aSIPCA@?aPAK`GA?A!5?A#6!4?CG???A?A_???T?T?TiSATgVgVkPmP~iV}!17~n}l~m|m~iTmPmPiTIPeHAS@a@?O@#4!13?S_L?T?cAo?HCGA?A_@G?aGQ??hOCGPA@S?@?GA?K`Q?D_AC@C?QHCOA?C?POG_[?OCW@Ca@O?gAH?C?A@__P?@oD@GaCPmP$#9A@AA@@A?A@A@A@A@#5!8?C?C?C?C#7!11?A?HAcPIOiDgQDiPmOnYd]tzm|~l!11~n~~n~~n~~~^lvzlv!16~nzl~q^sjU|iV|iV|Vj^tZf|Uj\uj\uj\u~luz\}vLzuLzUlzlRn\qn\qnYlr]tjU~lv}Zlv~}|}~lvy\~u\ny|nuXnYtnSzktzkTylQlbSjsI|iToDOdO@O`EGQCG?HA#15!8?C@G?PK?O@G_G?C?S@AG`C?hAsBGRGaDOLaSGdQChC?QC?T?AOC?T?Cg@?g?PcIOI?HC?C?o?SA??OGC?A?A?@?A#7!9?A?A?A?A_?S_DGPAS_@O`ChQcXaKOiCWaKpcItGaZ_Za\jtmz|}~\m|r]v|~|!5~|!4~zv~~~|~|^~~~i~i~iTj|iVgVgRmPm?Tg@#5!17?O@Q?PAP?TiPmPmTidkXSsji\[}NkzmZulR}TjUxVkj[QV_kItBXSgU`^hUYDePqKVlEljcMLajZujUhZ_M`NoKPb[_YDcPId\a\aCB?B_B_?cGWCjAT?sAhQlSM@M?M?I_C?G??G$LO?@?A?@#27!60?O#13!59?GC_ICWAhSaHSAHSaH?QHCa@GqCHaChQCQkOaLOaLOdQK`ISh?QG@cQG!22?@??A??A@?GAS?SA@A?ALQlQLYdYhQdZqlQlYf]d]tnUzmU~krulye\So_??o_#20!5?_A!4?C?G_??_??_??_??_??_??`??_!4?@??_??@???G??@#8!12?S?S?S_CGPaCg@g@gPcHS#19!19?A@?A?@?A@?A@#22!97?OA?aH?S?a@_QCPcHQk@iShEgR?B?_IAP?GCaA@???@?_OGC@_?O??R?_O!6?CBO???B???A@??A#26!6?G_C???G@??@!12?O?_O!4?O$#18!250?@?A?HACPAbNZ~jE\v]z~U\H{VkvXyfQ\jVYlZUz^lz^i~\nz]i~ZV}~V}mZTNt]uJ^BE@?_GF?_#11!182?_G?P??Ca?@?W???_OGC@_?O??O?_O??C???C?O??oA?_GAHC_QGcOAG??@?O_\_ACOaCo?X?kAhOC?A@??C?J_SbGbIP$#25!312?_?O??@#10!194?G???O_C_SGCA@???GA?A!4?K?_GS`O_??K?GOKO_O_G?_@G_PaKaSJ?AKPaIP?ICcAP?SAhOgOM_Z?COIODOc?e$#3!590?_-#6~~v|z!39~^|vZ}tj]tj]d^_^_ITgT?T?O_#8!19?AHC??A!23?aP_K@IcPIC`ICQHCaHc?GaO?CO?_?GAO??_?O@cOGA!24?`???@GAC?HC_QG@C?QGCA?CPGA?aO@CQ@OgPaSHaKOcRCaODyA_]?Si?TCxEpcISgTiShQcOCg?_?_#18S?G??@BEDBA@@ADJ\ANADBIDBALBEBMDAFIBEDANAFHFDA@??_?OGA_?_?O??A#7!21?O?OCOd?IOAs@ShAcGtAkPmA[`ITgTATgVkZkZc~gvwt^y~l~vY~v|~}!6~^~n~~n~n~N~~~Zv]tjUn^i^i^itInYdYdIdYdGTaGaG??_#5!13?dIT_TItOdYcZCjTiJuqZ]}~v!4~u|zulYdZmxflQt]tIdQzaLBohEpIUGf_XSGuKPkOSGon]lbItA{@mIDI@MPC?I@_PGD?@OA`??OC@ADGCIH?GC@AS@CQH?EOH?A?@_O$??GAC#7!39?_AGc@IS`IS`Y_^_^tiVi|i^nYn~~v~~n!12~|uz~~l~v!21~\m^r}tZmtz]tzluz\uZ~v\m~zl~Z}v\j^uZ|n}Znv|mztzU|iv|]vz|n]znv|^u~Z|]~~~}v|z~uz^lv}z~lvz|~zmv|~\n}zl}nVm\ju\rmZkzSLy?l[@uhCwaG??G?O_#15!7?@?AOCAPAGCA_?G`A?O_G_QCAL?DAcDacDAc@C`AD_DC@AD?D?E?aP_GCQ?CAo@SAO#8G!4?CG@IO?O_DGPASg@iOIOaCi@i?IOd#6!53?_?O??O?O?o???cG`IShO_T_T_TItOdYdYtYdYvi\v\v~~^!13~Yti^itInYdZcZCiT_HC_@#4!13?O_???O_I_I`?c?W?cBOGC`GA?R_HC?RC?i@CA?@?S?G@A?P?_CO_?I`?S?C?AgAC?GChA?_G_AP_CC@Q?g?Ag?C`G?a@?GS?A?D?QH$#27!64?A?_?DO??G??O#28!17?O?G#13!43?@??A?C@?_C_HCA!6?PCIChATGA`GCAO`COGA_H?cA!41?@???Ha?DOB_HAPFGrExEZdJViTjUlZmzTnZ|Mhvr|^}sWwwl]u\go__oowWoOWwoOwwOowWoowwwoowooWg[uzL~jtL]j\nf~~|~zv}tn~n^yvm|jV}Tntn\jTmPnOnOn|J}jU|ZvI|RmP|b]tiVi|iVgRcRcZ?VGFI_D?Q?Gd?GA?@#22!77?_O??S?HC_@?G!4?HACHQdICPEWAL?@?OOG?C_OGC!4?`OGCAa@?_A@?a@???G#26!7?O?_??_???A!4?C??C!11?A??g??_$#25!270?C!7?O?G???G???G???G!8?G!5?A#10!200?CA@?@A???@AS?C!4?OG?G?C?OGO_Q?`As?[?SIpI@cOCOALAp?TGhSAXA_HS@Q_GCApAgS@iS@_AW?c?WdA?HChOi?c$#20!296?G!7?G?C?@#11!200?G?C?OGCAoG?`OGCA_@?_AP?i@C!4?S?G@a?`??COI@YdgOgEwAoAhOaSLqIsGTaPoGs@AS@GQLoEpJSeWtiUhUiTlQ-#6!41~nz]v|j~uzmTzmPmTiTiTiCj?hAGQ???OcGqCO??O_#8!38?C@OC_Q@G_DOA`GC?Q@GCaP?A?@??AG@a??@#13!5?@??C??@???@??C??@???@#8!12?@!8?C!4?@??C?@?@?A?C?A@?CA?@I?QDGQC`Y?CY?lQMqOlAkQdISHuGtIPi_Ip?PCOCOCOcG_?_?_?_?cG!4?Oc?_?_?_?_!8?_?_?_?_?_?_?_?_?S?S?S?S?diCQDgDQdODoD_HAgQcG`IOA#6!53?cHQ??dGPASj??QcGPeGtASiT?TiTiTjSntYtJsnTyn~|}!14~ZulZc~?~?~?}@IsASH_CQ#4!13?Qc???IOACG?QC@cQ_L?aH?A?@GAOb??@?A??@S@SGC?Oa??GCQDG@aOD_?@_O?CAP?G?Ca??GACa?OCH_?Xa?D?c?Q_G?QC???@$#7!41?OC`GAS?HCPiCPmPiTiTiTzSnU|Vl~Z}fZuLzn~~n^~^!36~z}nz^l}v^yn|]vz~l}vz\m~|~}~~|v}\~~}!5~}~~z~~}~~~}~~z~~}~~~}!12~}!8~z!4~}~~z~}~}~|~z~|}~z|~}t~lyulzYd}zc~OkpChAO@cGO_!4?_#15!7?A?@??A@?CPGAOD?H?A`ICa??S@C?S?GAPGCa?GaOHCA?GC?T?GC?QG@#7!9?O?O_?O?_GAgAGQcODG@QCOd?TiSzcXeGtASiT?TiTydYtiTyt]zl~uz}|~}v!17~Zul~~Yvm|jS~~lZvmXvI|jTi~iTiTiSjOIdIsJOiDO?A@#5!14?cHQcZ?~?~?~@mtBxhuUZhl~~iVi~iVmTzUlZSzUtn\Hc}LJkA_ZQSGSa[BkRCICXfGVgEXeH?A`OHCHSaP_G_O?K??I?S?D?PG?cAO@G?C?O?G??_?SA?CO?Q?H?C?@$#27!64?O??_??c@G?@!8?_#13!147?@??C?@?@?A@?HEOlQHQdJuHvITmT^tM~mxnynzlYvZmV|Ny^uZt]tz\nZj]z]j]v\mvz\~v\nUz\~Uz^i^uZ~Lv]~j~j~j~j~ITjLyFyLQlQLqLQlQdYdYdI|iTjCZeXvI|jTi~iTiDYdITiDI`CQ?HC@A?@G#22!88?O?GCA?H_CQ??TgT?TgPiCh??jCh??_aQ@__QOHC?a@??@!4?@!6?@#26!4?G?A!6?A??A_??_!17?@??@!4?G_$#18!291?@?@!14?@!4?@#11!192?O@??O?HC?_H?aH?_O?H?Oa?O_@O_O?u_Og?iSaHcG`W?KODY@]_^_|ITeY`LiTmXaKyCycJsA@COJilHudYdYdyTmtY~tM$#10!517?S?S_[AcOcGCWeGSgEGaG@E@u@?HSAPCAdQ@i?S`I?IA__G@SaO?PaT_@PCJOAHsAHcO?Q?G@QcG@iPIc?Ip$#26!524?_-#6kzul!4~}~}~}~}!30~}z|}~t~]z|~iTylQ|itIOtIxAX_IsAgQcGOdIc!4?T!16?`!4?O?s#8!24?A!95?C@?CA@?ACxFy?EwFgAtIt?ZCjIsI?vGVGrKrKpMoItIoIoAcGt?TgPIOiOIOiOIS_S?S_Cg?Y_Y?Y_Y?Y_Y_ISg@yTiXATAPc#6!72?O?OcGPiCOcPcHuGRk@iTiTiSjOeXfWvgVwfXuhuxU|yvy|v!8~i^yV}Ti\jsnOnOnONQL@BOCgOAO#4!10?O_G`I?AS@CHOCHA`C@AC?Q?I@?O_SA?D_C?GAXCI@QC@AO?H?cOC@AO?`GQ@_?O@?O!11?hAC?`O?GAS?G?S??@??C?@aG@QC@AB$#5RCHQ!4?@?@?@?@#7!30?@CA@?I?`CA?TiDQlATItnAtE|A^tJtVlZvnWTZ|~u~i!16~]!4~n~J!24~|!95~z}~z|}~|zEwD}xFwAtItIoCw?t?Tg?O_#15!15?A!11?A!5?A@??A!6?@#7!15?_G_GQgQcHQgAgQcWbSiXa\aXa\_\a\itYluz]tzmztZmr}tZmtzu!25~n~nZvmTznZmZuHvkR}TiTiTjSnXeWfGVgFWeHUHEhADGDA#27G#5!8?T_Dg@iTaSJONOmOnoLay{niRf|Mn!4~lZuLzd]t]tn|JMjugZeTShIx?zCitSiD?BgTIPI`S?_?O_?gO?Ca?Q???_?C?C!9?@!14?GA?@!10?A#3???OB?@`Ahs$#27!66?G???c???G!5?A_?A?H#13!158?@???TG???N_BS?J_VGfGvKrKrMpNtItNtN|XvI~iVmtnTntlTntj^h}j^xV~d^d~c^d~d^d^tjV}DiTe\a\eHVlZulV|VlZf[jTe\a\e\a^a\aTIdQHC`ICPCIcPK@IcPICH#22!91?_?@???_OC??PCG?`O!4?QcHqCI@A!4?__O?F!4?A?C???@#26!4?G!8?@C?@C?@!7?A$#10!498?O!6?_?g?Oo?x?gC?_SITG@gOAOI`SAhCIdAG`HCc?I?JSGbGQ@_CY@iCgASaSHQcIPiCQCOhQCHaS_HaT_I@UgCO`IS??cG?G$#11!501?O!4?O?I?C?AC@O?I@_A_SA_K`SAg?Q_OGOe[aXQlPloItGvGuLyD}DyVli\julZtmTzlQlQlQc\a\a\a^`}hUzlYtiLsYcYsSG-#6Vn^j]r]tn|n\v\vl!4~j^zV|V|V|~|~n^!5~n!9~}!5~}~~|~~u~|yT}ju\ytmXukPiTiPaCGO_?`CGO_!4?S?S?S_CgA`A_?_?a?a!46?_?_?_?_?O_O?_C?C_?_?_?_?_?O?S?TiO?O?O?O_!5?O?S_?_?_?_?_?_!5?o?o?O???_#8!8?A@A?C@QHCAGTArCxItGTaKbGTa\cZcXQdQdISpEHqTiTIpU`mPmdYdiCzCheXcjSjcZcjSjcRwBcRsRgDSjOdASG_#19!5?Q#6!40?_?_?_?_?S_S?S_S?S_S?S_S_LoDiT_TITaKPmTiTiTcXe\i|A{@}@}tI|Rm\rm|u~~n!4~z!8~T~Tj\jUhUjUHQdIPcGCBOI@S#4!8?OcG@I_IOcGDOHCP?D?AC_AGHcGP??@c?AG@C_SI?AD?Q@Ac?@O_C@G?S!24?GCOd?A?@?@?@!12?A@#3?A?@a@$#5gO_S`K`IOAOaGaGQ!4?S_CgAgAgA?A?O_!5?O#7!9?@!5?@??A??H?ADi@CGaDIPeHQkTiTmTzVi^nYzVnZ~v^~j~j~j^zV|]|^~^~\~\!46~^~^~^~^~n^n~^z~z^~^~^~^~^~nvj|iTnzn^j~f^~~^~~n^j^~^~^~^~^~^!5~N~N~n~~~^!8~|}|~z}luz|vi{KxEtItiXqWsiW_Y_WaKOkOc?GOcG???_CG?O??O?O?O?O?O??O??O??O??Og?gOg?GQ_IOcYShaShqDwdguHuhUhvI|zu\j}l^|^u|nzv}z~}~|}~~~|}~~~|}^~^~^~^~j^j~j^j~j^j~j^j^qNyTi^iti\rmPiTiTiZeXaTA|B}@}@ItAkPaKPAH??O#5!4?C!8?i?iSaShUhOhudYPmIvrwld{ij~~~j~j^iXu]DNphWciJAbIvGpKpGS`Q?BCiBGAHOcOI@??_G_G?cO?G?A@??A?@!32?A$#27!67?O@!6?@A!4?G?_D?OC?_?C?G_!92?G?A???C?_C?G???_???_#13!46?@?A???A?C@CB?DA@CBC`I@IPjEhQDiTiTI`]@mPIdITjCjUHeZCjSJcZCjSJCFSJCJcDY`CJ?hATJULyFYDHuHUhUGtACHaS@Q_A_HAOCG@C?@?A@???A@???A@#22!89?C??G?c?P?GCAOA@S???S?S_DA@__OCCABO?cO???A#26??A??C?O!11?A??@??@??@$#11!492?O??A@O?cOG??AC_?O`O?H?i@WcGqdQI`SgpYcGqKOkOe[`]`]`\a\zUlZtmZ|vm~T~i~Ti~iVylZeXfWfWvktkZsnTzmZuZulZuj\ivxn]Xe$#10!502?cGoGPIDGE_Qc?ScQPCG@cOI@CDOQD_I@IPaK?Y_SaGaChQcIPcAGP?i?T?iT?TgDQcPaGAWdGQGQcIOiCPcHcHQcHS_SGCO_CW-#6GfKbM@JU`YdZdNyN~N~nT~Tntnlzn~n~HVlJ~JUh^vnV~VnV~n~n~n^~v!11~}~~~mz\mzTmZsZcZcIcGRcIcHQCOdG@I?IOASi?ICI_IcG@ACG??O?O?O?O_!8?i?i?I_IOI?I?I?I?i?I?I?i?iCiOiSgTqgPeGtIgAgaGagAgUhUhQtQoLa\A\a\qCoDoDy@eWAWaWAWa[`MOl?lOlQkXiSgSiTgDiOaS#8!12?@?CAG@CHADADAPeHU`[aTIdGVChDYaKhBQkBgWdAiHSM@iEXCePIeHSEPiQHSdITgDiQKBgTGcQ@i#19!5?CE??G#6!20?G???O?O_???_?g?iOiCiOiCgTiCZcXa\_LQl?|A{A|A|ItItJshQtYdytJulQ|QdyTityT}XvuZjvp~zxvz~z~z~z!4~n~n^tnTyTnONiDY`IChA?C@???@C??A#4!5?QcHAcO@OCAP?A@CO_GH??G?@G?G?h?CO_P?C??GC_A?gCA??@I??@!27?@!8?O_?O??_#3o?o?o?o?o?Oo?OsG$#5vGrKpmSh]dYcYoDo?o?Oi?iOIOQCO?O?ugQs?shU_GOg?gOg?O?O?O_?G#27!11?@???@?a!7?O??_?A?G!5?G!19?_!62?G@?C?@!4?@?G??O?_!5?A?G???G?_?H?_?@?C?`?AO#13!46?A@!4?@?GA?C@ASGD??DA?HCA@?S@GA@GC@GA@GC@C?B?D?B?D?@CA?@???CHSLqCQ`?GF?CbS?COG???@C?C#9!78?G?C?K?CCGC?C?C?C#5!4?O?O_IOiDiOn_Twd]srQ||z{u~|uyj~h\un\jlZedRbyLysImX_YdATaSJcRKaPCQ?Q?HACI`Ga@?G?C@??GAC?C#29!58?g$#9?O?O?O_#7!65?OC?PCiPcJcJcZTZtkRtZulzfYv}t~tn|jT~tzt^tZv}\zv~~n~n~n~n^!8~T~T~t^tnt~t~t~t~T~t~t~T~TzTnTjViLVmXvItV|VTu\R|UhUhUkIdNqLa\a\aLzLyFyD}Pf\fSf\f[bYpMQ|AnQlReTjVjTiVyTn\j!12~}~z|v}zu|y|y|mXuh[a\itYugrSy`[pAsgR{QdYsPsipiSpcyPisPsipiShugYoiSyOlqwTiuZl}PujqLzhW~vo~z[j~znv~~~}z~z!5~v~~~n~n^~~~^~V~TnTzTnTzViTzcZe\a^qlQ~A|B|A|AtItIsJUlIdYDIsHQlAlYDiTIDi@eG@cOGA??A#22!23?O?A??@GC?A?AH?AG@S?SaHOaS??OOGGCA?@?@?C#26??G!9?_???_!8?_$#11!491?G?C??@?_?CA@??aOH_OGaPKAHQLHESgtQcXUWFSjSzKuhQtiti\j]tj\vlulZu~lzV~i~TynyVylzU|zT~j}T~j^un\j^D~J}F|J~D~mN~FJt$#10!495?_?GCO_W_IT?CaSBcOCaPcC_Q_HA?GRC_BOhOA?p@Sg?PISaS`ISaGQHQcH?QCg?T?iDODgDQCgACi?S@i?C?H?aS?I?C@GAC?I?@!4?A-#5~|i~Y|j}Ti\u`YtYDYtiTGsjchuleteEXQlyPMxIPmPMtGugTiDoDyCxa\?Y_ISg?GO#30???_#7???A???G?BCHATgDoLqExAtKRlQf\juLqLVi^dyDYvhUlZvj^rujvYvxvlV|VlvlZeXf]tjUhV|V\R|V|B{D^tJTiTaXATALA|AtIdRCJ?DIODQCHQdI`CQ@?~@}@eHAHUHe@IdYdITiDiTIdHEgVGfGaL_DIPCJ?jCRHbCRC~TmT~SntI^hvn~~nn^n~n^n^}~~~}~|!6~}~~~|}~y~|~|]v|mz[nyvz~v!4~}~}~z}|~z}~z~|~}~~i|~v~|~}z|~}z~~}~~z~}!10~n^zVlZ~nZuH^rmTnTzD}@~@}@~@}@~@}@eXAcHuHeXaDi@IPIDGbSHADOAGC@?AdOA@G??ItAGaOCA@#5!13?Oc!4?hAgA\aTIOnYtjuLzUn|n}!7~ulZvmXf[lZEhToDDkEd?U`YmPEpGOcQHOCO??_CQ?O@G?g?_C#26_?A#3!12?g?g?g?GO!24?TgT?TgPiChUGQdY_ItA|OfY|$#9?AT?dA#6S@iTaHU`IdYdITiTJSJUHQHIXpEhQDiPEpMPmPItHViTiNyDzE\a^d^tjV~vn^~~^~~~|~|~uz{Zu|iVyLqKxA|GrkQdWaSHqLqgS_QCYdGShQcGO_CGS?CGCGQgAgQGQcXeW`IShUgAgAgAgA{@Y_IOiTi\e|i|q|A|ItYkzs~ytnylzulYt]zl}~?}@}Xe|UhuH}tYdYtiTyTitYewVgvWe\q^ytmzs~Szku[zkz?i?i?iOAS_CGO???O?O?O?O_#8@???@?A!6?@???A@?D?A?A`GAPCbODGC?G!4?@?@?C@A?C@?C?A?@??TA?G???@#6!23?O_CgQc?OcHu_KPiOiCy@}?}@}?}@}?}@}Xe|ZuHuXe\yT}tmtyv[ju|yn|vz}~|Yn|}v~~tI|v\nz|}!13~nZ!4~U|V|a\itnOdISHqChOAO@#22!7?HQcGPeWb?__S?AG_QPOG#26!7?A!5?_?C@G#29!78?aG$#22!12?GC??_!4?a??O???O??G_C??C_?C_??_?A!4?O!7?_!8?_#27!8?A?@C?_!5?A?@?C?A???G!8?@?G@_??A!4?C?G@?G`?A!20?_C!4?A_??c!39?O?_??O!13?O@!4?P!19?P??@?G`?Q!4?O?_???_#13!66?A??CA?@C??@??C?@#4!144?QCHAgCQG@gApGC@?_GC@AH?c?I@iS@?Hc?cAOA@I?HO?_D$#11!490?O?AG_Q??GE`WC@?oG?hAlOE@IO_?QcHlIseTUSZQLoLqnYvi\ulZlZU~T~Q~tni~T~j~U~l~Y~t~i~T~~T~i~TiRi}iTiTzUhvlYd^tI|ALOdA$#10!493?@!7?A_OM@AsCO?AhOc@IUh?QAO@H?g@_CaLQGOdGTaHQcQc@?A?D?A?T?i?S?h?Q?d?I?T?i??i?T?i?C?@?AC-#5!11~Vmvm^j|l}mzl\|z|l]}UrZxl}mzl|neU~l|neuj\t]~mVvlttzhcyCPAOhQCG_#30?_#27!5?A???C!5?C?O??@?A?G!5?O!5?G?@?S!4?G?C?OC!22?A??A!5?G!35?@???A??G??A!5?A?@!8?G!21?C???G!7?@??A!10?C#6!43?_?_?_?_!15?_?_?_?_?_???OdW@qCgOGQcY`M`GQdYtJ{jSzkR{jS~lynyvY|mz~|~}|z}|~|~lvz}Z{~|v~z}|~t!4~|~~|~~}z!22~n^}~ZvJuH}@~?}@s?iPIC_CO??A#22!7?HQcZ?u???OOG??PCOGC#26!4?A??A??Q?C!5?O!6?O??C#3!16?S?S???@???T?T?TiPCPCPChA!5?dGPeWbKpEgU_SHQgQcGtAsJcXvG$#22!11?gPGP_S?Q?PCOa?C?Q_@GGcCQ?PCOAOOh?OAOOHS_I`?P_GOAG?CQ@?g?C??_#7!12?@?A??I@QHAlRk?HCPeHUhEHaTIcRCzC~@jUlReTiZejSjSJcHU?I`UHQdITaLqLqNoLqLOfGTaCRcRK@i@Q@GCA?AGC?D?HC??c?GCA??C?A?C??C??@??@??@??AO??G??A?@AC@ACAC@!5?@A?AHA?AHCA@?i@QdATiDYdYcYfGRmTjTnYvItIzn^znznznzv^~^~^~^!25~^~^~^~^!15~^~^~^~^~^~~~nYf}LzVnvlZd]p]vlYdIsBSjCRkBSj?QDODGdAPC?A?@AC@A?A?QGC@cB?AG?C@A?I!4?A??A??@C#5!22?O_@?cGsHu@}?~@}J~Tmtz^zn~~|!7~ulZc~Hi^yFetjeGjaPGfWf?OG`?OH??_PGcRGAHe?AO@?C#29!20?_??@?A???g??iS??g??g?O!6?_G#10!8?@A?D??@A#29!4?OA$#6!17?A?@??A?A?A?@?@C?A?@??A??H??A??H??A!4?G?AGACQHCzE|jUlZv^~^!5~|~~}z|~~t}hulQkQ~szeXuhUxe\itZkrCy?iShQkPiPcHOjSjsZuh~t]hulYti\qLqLoLqLonWvi\rkZkr}T}l}vz|~|vz~y~uz~~Z~vz|~~z~|~z}~z~|}~v}~|}~~|n||u~~|~}|z}tz|z}!5~}|~|u|~|uz|}zT}lQ|iTydYdYdWtkPiSiOdGtIpCO_COCOCOCG_?_?_?_#4!199?T_Dg@AOGaODaO??OHcASGe?cPICA???c??OG?cAO`GT#10!39?cHOAc$#4!30?_#31!179?A#11!279?G??OC?GCaO??sG`GOHc?g@IcRGc@EOlPlIKbIpA|jU~lYvi\ju~lzVj}HnyumXu~iVi~?@mzEzmRUlZun|ZYVeXf[rMxVh]hugVlYtI|JsJcGv$#10!492?C@!4?@GfGA@SAd?QHEO_PGcRGoHAcAO`GSAgASh?QdGTaSH?QCg?@AODGOcH-#5^VNZvL]W^W^]nEV]?^?^_^A|B^aTKrLQkZcJKJCjSzTMXmXuB~dZtiD|lZvnT}}rWLdw[h{?{?yCgS_S_S?S_#7!4?@??A?A?@???A@?A@?C@C?@GACR?J_RGE@QHA@A?@A?A@?A??HC?Q@GCA@?A??A@?C@A?@?A?C@#5!19?O?O?O?O?O?OCOcOk?kOcOCOcOcGSgC_GO_GOg?gOg?g?g?g?gO?O?O?O?O???O_#7A??@?@?A@A@A@A@A@QBG`QHEhQNsNsNsNsLzD~D^lzMrnR~Rnrn^j~jVjZfZnZnZnZvLzd^tjVyTnTjTnt~JvJVlZd^t^tnTzFyLzE|A|B}@}?~@ITbJQDRK`ISa?`GCASC_HC??@#9??kOk?kOKOcSgCgSGS_S?S_S_CgSgCgSgCK{k[[[sK[CKCKCKC{K{SkoS!9?CKC[?KcKOK?KgCKC#32???C???C?CKKCSK{#11!9?A???A@??@_?Q@G?ShACaCiPChCPI_J_]_[b[`[cYcZlvYnylZulYvlZb}HVyamTrmO~QlYsJgZeXdZmPnQ~PnYdZATBTIdRCjOJCBOHBaHA?A@$#4___??_`b_B_@?`_@[_{?[_[?{?[gQKQl?CGcOCgS_?gOCOcG??OcGO?A#6!5?@?CbOIDBU@zB}DzVi^j^j~j^!4~}~}|~|~}~}~|}~|}~z}z~}v{zk~s^kvx}lu|}|~}|~|}~|~~uz~l}vz|}~|}~|}~z}|~}~|~z}!19~n~n~n~n~n~nznZnR~RnZnznZnZvjVz^vn^vnV~VnV~V~V~V~Vn~n~n~n~n~~~n^|~~}~{~|}|}|}|}|{l{t]luxUkoJoJoJoJqCy?Y_QC`KOk?kOKO_S?SgScWcOcOcOcGqCY_ISgDiOiSiOI?sGsgQcY_I_IOiCwDqCxA|A{@}@~?}ti[slykr]tj\~]vz|jz^uz~~}~~RnR~RnrnZhVzVjvj^j~j]j^zVjVzVjVzrBBbbbBrbzrzrzrzBpBHBLj|vn~^m|~|bPbbRA@_`A@?B?@A@qC?ICCgOG?o?G#4?AKCKCKCYKISHCI?KStKKSLKS[gUk_SiOgPCpC?I_I_I_S@SaG@Q_#3!13?S?S_CGPaKOl?lOdIsPcX_YcPkOk?kOdYc|i{itYkzSnsz{nu{\u|yl}~$#10?GOCGO???_?_OG!8?_??_??_?_?O_#11O?_O!5?_#30!33?@#27!13?@!6?@!13?@!35?@!101?A!10?A??A!5?@!12?_???O#7!105?A!10?@#31!13?O???G#5!10?A?A?A?AGO?_PA?AWaW?kPIRMp]rSzQx}LzzDrrRfRbBrBb@qxrwrxdrtHczs\?IAaOb?q@_@?@AH?DAGAGaPCOD#26?@???A?@#29!21?@!4?A??A?@?A??A!31?DO$#3???_?A#22?C?C???OG?b?B?B?@A??@A@???B?BOB_R?JCA@a@A@{?I?ADy?QcGOi?@GCaOA_?AC?@#31!361?_O!16?_O???_???_!5?_#10!23?@_??GOAG_?a@A?OH?P?CaOAGcPCO@SBGaG@QcHCQGdODQcHQdGQcG@aG@S?G?@!7?C??C???A?@?A$#11!15?_???_#22!448?OGG?G_O?G_O?@A?B?A???_Q???q`??@#26!4?A???O-#4VNs?O_@ObLPK_]_YDS?z?}@Qk@yClRGS?@G?@c??Q?g?HC_J?`A?PC@iO_GAC??O#6!4?GC@aHCHaLA|AtIvItjUl~n~n~n~n~n~n!4~v~v~v~v!20~v!12~v~~~n~n~N~N~n~n^rnZvnzmXv^v^vnVnZnJ}JuLqNyTiNyDyF{JtITiTiDiRM`^@}DYfGVgRcREPjEpFgVGVGVpE|A~ITi^a^jUh^i\vN~N~n~n^~n~n!4~|vz|}~~~}^}n}v}~u\zt]jszSzsjUxvg^uXu|qkP}tylux]titiTjSjsZc~I|Rkq\ulYvyluxuxUx}tyv{zu|u|yt}tz}v|^z}~\z~|!5~|!11~TiT~DyD}DzLyFyLYfItItJdITZD]djli[{x\^[~K]NENEFEFfX|[\BNDHB?@!4?ENFEFAFFHBIDJCIL?G#31@#37_#20_#12O#4A?O!6?_!7?O?o?_GOG!7?_A_@yEtTjmTxCpHk_N_Y_T_T_T_I?O_?O#3!9?xASG@qCwBkPeGtAt?YcQgISiShEgQLOd}~Z}n|^ze\jv}\v}Znt~~|~~$goA[`]OcO_?_#22??@C#26!6?O??A!8?_!10?_#22@?@!6?@MGBoA\_DgC?O?GC?aH??_??O?C#5!49?G!12?G???O?O?o?o?O?O_KOcGOCPeG_G_GOgOcOs@sHqLoDiToDyDwBsItiTiTyTkp]_}@YdWvgRKZkxmCpMwV?v_vgKXA|?diT_\_ShU_TaGo?o?O?O_?O?O#7!4?AGCA@???@_@O@G@?HaCI`SJCjCJShEGV_HeHALRm@IDQHE`ITITiSjSJcZ?tAkRLaHQdGDQHEHEhE@IDGBCHAHADI@IC@GA_C@?aC?A!5?A#9!11?iTi?yDy@yCqDwDqdGTItIsITICY`ISAT!9?o?oW?w_GCA?AG?IUCNEMDNC??O!4?O!8?IC!4G?O??!5O??__???_#11???_??_o?iDA?qLCwOQCX?ICPiC@IcQH_^_^_^_^_^_^dYvLulZulZulZCtjUsLyB{RmXvI|IudZcTtaTjUxVlqnY@?c@OA_CXaSG@aG@cOI#29??A$#5??@BM@M?C??B?@?@?A@C?@?C@??@??d?@U?T?RGD_C@RCQIcM]HvKrmS`VsLxa^iVz~nvry\Squ\Q|AlIpGtIShQ?O?O?O?O?O?O!4?G?G?G?G#22!98?_!4?C_!4?OG???g?G??A_???O#5!164?O_!4?O!4_?O?O!4?__!5?G!8?@?C!6?@A?AH?GGGLGGCKDWCID?DBEFFF\MN^!5N^YY\NxxNnxHWWuG@wTapaLaZCGc?_G!4?A?CA?Q#29!41?G??G??G$#10??G_??_JGQkO^_Y_AhA?B?g@QC@Q??A`I_QaS?bODOCCq?O?o?SGaGO#7!361?`!6?`!8?O!4?O?O?G#4O!5?O#30??@!9?@#2OO#3!5O#33_#10?_?_!4?_#6??D?_?C#26!12?G!5?@!9?O$#11!10?A???C?w?{?{?Eg?wCgQkOIsGDGiGSiGjQg?HCO??_#33!365?ABEA?B?A@?@?@?@??_!4?O#16_!6?OO#43___??_?___#46_#47_#41_#16O#40__#49_#50_#51_#2!7?_?__#32!4?A?A!5?A#10!8?P???@EG@?A_O???i?O@CO?D?I?I?I?T_IDGaHQcHQcHQcAG?`I?@C!8?@??@A?@$#31!421?_??_?o?_W?G?A?A#3_!6?OOO#41_#35G!6?O#22?A??A???A!7?@!8?D???CAO?EEDF@FEF?WCK#30?O$#4!423?O#36!5?_?O#32???_#2?_#10_#14?_O!7?O!6?OOO?O!9?_?_!7?_#3??O$#24!441?_#37_#19G#39_#34G!7?O#48!7?_#1!13?_$#38!443?_#40?_#31?@#44???_??_$#42!447?_#33???OO$#45!452?_-#3~|~~|}|y~sz{QkqKoCg?GO_?g?g?g?GO#5!4?@???A??C??CB?@A@QGAEGraWMZe\huhUjVn^zvm^~{uZh_qkZu_vGtQdWdAdWDGtAoCOdGt?TgT?TgT?TgPi?gOcWaWqCOCOCOCOCOCOCOCOCOcHShU_}@}@{@iSPEWdY`YcQgQcZcYD]xe\yd]huXe|ivy\}v{~y|}|v}z|}vz}]zb[tZzVt{ri}j|{ZzQ~]kfYzktqx{zYlhudYtYDwCyDy@kOdY@KpAS?Sg?gO?O_??_GO#7???@!6?@???@??A!4?C@A!4?@??@!5?C?I?CA?@???A@??H?D!4?@#5!14?_?_?_?_!21?O_CGO?_CgQGT_?S_?S_GO_HAD??OAAo?@DTT@@C!4?@#37C#60O!5?o??WWGKG??CC??GA!7?_??O!6?CEAE?C??CCC?S??GggWGG_?_oo?__??_#6@#20O#66_#11@!4?@A@CCK`Y?dIOI@IcXeGvGeXCzCzCzCzC~TmtZulZTulQlZQuhVyTmTzTmXviTmXvI|jTmTyV?Q?cPGCAhSa@GOA`GC?QHC$#4?A??A@?D?A???A?@?@A??@A@A?A@??AC@?D???@?g@??@Q_OGCg??d?o?CPaOCHaCGO_#6!9?@?CQHCRcHVGvIlYfYlYfYvI|NznYvI~iVi~iVi~iVmT~VnZf\fLznznznznznznznznznZujUh^@}@}B}TjmXfYd]dZlVlZcZdY`EXaDY`UHeXATGDa@GB?DA@AG@CA@GC@?CGAGC?GA@C@??A@C?D?@Q?D?BGDA@C@QCHQdIdYDzDyD}RnYd]rM|j~jV~Vn~n^nN^fNnN~Mn^nN~Nm^~~}~~|^~~~Z}|!4~}~~}~~^~~z~t~z|~}~~~|}~~u~y!4~}!14~^~^~^~^!21~n^zvHeXATGDaHU`ITaHUdIodOlQDX?KHAI?A??A@#35A??A??@#36@#20?A#61O??O??!4_Woo_OsOoUY}cue[e?iMy}wqsWowowwG[?__gGGI?O??_???O#58?C???G#10C??A??@??@??CAG?I?dO?@cO?@A?P??P?aCX?rChCQ?iPIcHQc??OG?_C@$!6?A??HCBkPKQC??HaCOC?h?SAh??aGaHUgACPCi?i?HCq?TiDOk?u!5?O?O#9!16?C#22!79?_!13?_!32?`?S`A_C_GAGS@S?A_Cg?_@W_COAGCA?c?Q?G???_A!9?_#9!13?Oo?O_Oo?oO_Oo?oO#5_!6?_???_!12?_#9!71?eXExAdqGUhITiHU`ITEWiQliC[BEC?GGCE@C?BB?@@??B#58?A#55A#10@#48A#33@#24@#37@#52@#40@#42@#43@@#67??_?_?_#68_!6?_?_#67!5?_#43!4?@@@#41@!7?A#62A#1@!6?A???C???G?OO?_G_#26!12?_#3!26?_HADACh?UgDiPiCiPeGTiPeGtASiPiDg~l~Zmvz|Uj\}vn|]vz~luz~~$#11!12?@?@_JyTuTiLyTUTiTUtj[vWugV{zCyTzSlQ_DY?OgA@H?GC?_#4!347?__?OOO!6?C?C?A#12A???@@#59?A#53!40?@#54@#55@#56@#37@!5?A#3@??A??A!4?AI?G?CCGA?_$#26!47?G?_?C??O#22?@?GD@_??A@EHSgO_CGP_?AH_CQH???G!7?O??_#19!311?@??G?A?A#16G#41O!8?C#34!50?@#14@#0@@!6?A???C#57@#35G#14C#43?_#69?_#23_#22A#0?_$#13!411?_#51_#40_#66_#44!5_!4owgWWW[!4KCEUQEEEA!4B@B@D@B@@B@DD@D@B@B@@D@B!6AEAE!7CGgGGGOOOo_?_#31!6?C$#3!416?G!4?C!4?AA???@#46!47?A#51??A!5?C!7?O$#52!416?O#54O#10G#7A@#49G#48G#46G!4?C!5?A#2!48?@#20A#5@???@@A?A?@?D?KA_@?G?O`Pa?cQ?_I@COA$#24!419?G#63G#14??C!9?@#24!51?A!4?C#17C#39G#65?O#47O$#43!419?O#51!5?C#45!5_?o___??OW_GG[K?KKG??WGW?WY?O??CKGAG?GC?s_wWWO_ooo?O_OoSO???_#48G#64???G$#39!426?C#4!59?@!4?@@?@?C?BA?@E?U\iWaPS@GITcOIdWcXeGvGeX?aCG?Q?h!8?I??_O??G$#9!486?A?@???A!5?C?GGOO$#42!486?C#12@!6?A???O??O$#40!487?C#46??G-#3~nVv^NvV~^^~^^~NlvlFZflVQnD~UN|nolololodycxaSg_g?@O_#5!4?@?CA@CbIQC{HViFqgzeJVm\j~~}l~~ulytmXvkzuJ|uwi{r[rkR{b]pnWfXuhUwqlQ|a\itYdzSzdYtjSzcZsjSz[j{vWn{yTmxulyTm|ZuzkZsju\j}|fz~|~}z|~~|}~~}~|!12~^n^~~~^~^~^~^!19~^m^!5~{}~~}!4~|~zm|YTqlitZW`Mpm_nOMtYcZcXaKoDW`Y_ISgSgSgSgS_S?S_S?S_S?S_S_CgOg?gOGO?O?O?O?O?O?O?O?O?_CHsH_Q?cOCOCgOcGOC_S_COcOc?S?c?S_S?S_GOg?g?O?OeAIO@@D??A@G@C?AA#38C#4?@#61?G??__G?wAsl???A!4?a_aaA???A@qrrzu~V}LEZFMOFiDAeDID]dYLuJ]tErVvARFJrQReBFReEaUeAeUaQEAEAMEMojUUWs?g?Oo_O__???_#11@???@??@D@AFN?siOGs?wOooOooOoGqHeXEXEYDS@gATI!5?_!10?_PC_GAOH?cAOHCA#76??S??C?G$#2?O_G?O?g??_??_?_O??O_?O?G?O??_#11??CQCQCQCI?PAShASD??cHUg?vGpIpKoGoDwA?_?G#6!11?@Q??HQDIPeGRCHsAHFTBKbKRkB[`MOfWeHUhFLQlA\aTIdYCjCYdISjCZcJSjCbSBGfOBDiPEHQDiPAcHCRcJSHaS@AGC?A?@CA??A@??@?A#4!12?_O_???_?_?_?_!19?_O_#6!5?@!8?A?CPAdIDQDIcB]`MPNOnPIdZcZe\rNyf]d^tjVjVjVjVj^j~j^j~j^j~j^j^zVnV~Vnvn~n~n~n~n~n~n~n~nQ[B_I?UGdQCRCiPEHQDiPIDQCRcIPIcRRJBBJbZVNV^V^l~nH\dFAAADH@CAA?B@?@#24?A#16?@#45__???@A???_okK[MrrPVPXpvRRp}HGGCH#67?_@?@??@!9?@?@!9?@??C?@?@??C??C??C??C!4?C!4?O??C#72?@#60OGG??_#10@!6?KHG??ySoC@g?hI@CqIiCdMII@NIHrLUXExExDy@iS`It??wCw?G@U`IT_S_G$#29??G?_?G??_??_??O?GOg?W?gCOg?gO?O#4!11?@??A?D?A?@Cj?UIpGQJODgA@c?T_DO?O_#22!97?O!61?@!6?A@??@!10?_G?O??c?O??O??_#9!64?lBwU@uHdYHjgjPEhQdiPM`YhjGJPm`ZGk?KgcGC?_?_?_!6?G?_GA??ADC@??@?@#41??A#33@#70@#56@#71?@#78!31?_?_?O?oO?O?OO?_?_??_!8?G!7?G!8?OG!9?__??_?_#24@??A#16A!9?O??_#14?_#6??O#29!27?C@G??C?@?@?AG!5?@?A$#1!5?_#10!10?A?A?C?A?@?A?@?A?J?J?J?JODICGATHQy}HUgRSG_C?C_?C!4?OG#79!300?_#31O?O??_#33!5?A!5?__?OO#35_!7?C#68!41?QwCW_NGDiLHiDi?YCqHS`IxKgGsKoOKkcWSg_GwGgGwGgGCgSgG_Wo#44??@@BAAEA?CC?G?O#4BAB???A??C???G??Q@SJD?TAG??cG?_???_$#1!24?_#22!40?@?A??OGFCHSgPaS#19!304?O!8?C???A#3C#60___oOw?O?G?_O!6?O__OKCCGCCKGkkC?CCC???G#65!4?_?_??O_O?_O!12?G_?_??G?gO?O?O?O?O??_OgOoO_?G???_HG#73@#43O_?WCOG?_oO?_#80_#49_#9C#17O$#14!385?_O?OO?GOGG#43_??O!8?A#45!71?!17@FCGG??S?CC??G?O?O??_#38O#74??_#29A$#4!388?CC??A#52_#16O#70O#44___OOWGkCsK[U]UmD|JQ^NBPB`?GG?G!5?G#74!71?@#75A#46G!4?G#53G#5@??AA@?L@IGAcO?C??_!6?@!4?C$#7!388?GG??C#41?_#55?O!7?A#59!101?A#2@@?AAC!5?O!8?_$#10!390?_??O???G#37G#54G!9?@#64!96?@#56A#77?C#14@@#1?C#3CC@C?G!4?OO!7?@?@A@C@E?DAC???_?_?_?iOAS_?z~EzE^tuh]ti^i^t^mz^v|nu~Z|nuz|~~j~~z~v~$#2!391?_!9?AA#58!107?C#35C???G?O??_$#17!396?G#48O!4?C#68!108?_#50?G#20G#22A??C!4?AG$#1!399?C!4?@#48!110?O#76???A$#46!400?G!5?A-#1xacpSw`aP_T_Pg`a_`S@?_PGO_I??O?_?COI?cOA??O???_#10?FADiCPD?G`?Q!4?Q@I@aTGDA??_#6!13?@??A@?A?D!6?@A?@A?TA?J?DOGA@GAPAGDAODQC`I?@AGAS?HC?A?A?HCA?@??A@?A?A???@C?DA??A#4!17?_OgCgSgCWaTIsYcJsJkCZCjSJcZSJcjSj[BcjKBkRKjcSeOf?vcsGSgCgSGS#6!11?A??C?A?@?@??AHSASHQDiPIDQHePIDqDyDY`UHeHUjEhUJeXEhVHeXEhQLa[B{B{B{BsJuJuZuJuLA@!5?P??A@??A?@?A??A@?H?CA_@?C@?C??C???@?D?A#42O#56G#60_??_???o?AA@?@!6?@!7?A?@#78G!6?_#75!10?_??_O___o_osoWWuM[USYGOSSOQOSOOWWWSOY{wswaoq_i_eaaUaqqoisogOO_G!8?A!7?A#43?@!4?B?CGCKO?Wo??_?_#16???O#76!5?C#1_#22O#29??O!20?@#76!23?A$#2EWPIhAYSgVgTiCYSYSGqkQcQcPOhU_QHO_?_!4?_#11!10?TAk?ntIVkZviTgS_SG_?_OGC??_#4!82?O#22O#10!39?_?O??O?_!6?_!6?O?O?O???O?_#22@GG?G@!9?S!7?X?SGAHGS?A?@?@C!18?C_???G_O???S??_#9!32?pMoNoNPiEx?UgBxEgUhUhTgU_FyHUgu@WO?AWQLAL?VAE@EB#80G#45__O?__GpW{{wy[^}}\OO?BIAEFFDDA?@?@@@!5B@?@?@@#78??W?G_WIG@C@?DE@?O?G??OC@@C!4?@@?@!6?@?A?Q!14?_?OOS^SMYE!5?@A??@!8?G??_O_?_?_#82C??G$#3?DICADCHEGAICRCHCI`KRKAdJCdQhNcUjYdSzIls^ilu~Z^vgTy?xAwO?O_#5!5?@IPiDIDIdQrJyKZUv!8~}~~|}~|~y!6~}|~}|~i|~s~ynv|}v|m|vy|nylz]t~}|v|j~uz~|~|~uz|~}~~|}~|~|nn~}z~y|~~|!17~^nVzVjVzf\itJCZcJsAxCjSJCJcJcZSjCBkZCRkRKrCRJWfO~?YJvjVzVjvjj!7~e~jt|urj||!4}z|uj|julyTmtyluXmtyHYDydUHeXuh?xUHsXexUguXexUlq\b{B{B{B{JsHsHcHsHqKoNoNomCxE|gV{CxUhShUgUhUw@sHUHy?AG@C@QD?I??@?@#43??G?C#61O!4?_??DCa_?@_ni}{TwWgwwg{e}^M]MKCC[cIFADIC@D@LDHDD??@?B??C@#85!11?_?_#61??@!30?A?@OD@@AGBACD@ba@@A`@QAOCa_G#10@!4?A@A?A?@!9?DAA_FOj?RCqSiDA{@}?}@uHsGsIShSd$#29!16?@?A??@G??I?C??H?C@I@CPAH?TAH?c?GOg#4!4?A?ACG@cGTiC_C?O?aOGd?ODOCg#22!121?@!4?@A!4?_O#14!154?_!5?_???g?W???@??@?@#53?@#65!15?_?_O!9?__O_???_O_o_yOAoQ?AOOEWMGG@AG@B?J@EBIAIDLAJKECCAJD@EJATHLHTTHXThHHLIDBITMhMd@__@_?w?_?wGoGGG???KeC[koWO#14@?@@@!6?O?_???_$#26!70?O#22???GC?B_@G#11!128?O?_O???O???O_???_??_??G#31!136?A?@!5?A#83_#2?O???CC?A#81?A#43!24?O?O#68?_o_OO?W_WoWkWCYCIcA?E??FGA??A!5?@?C@G?G@GAHCA?AAHC?A@?CGC?C?IOCG?SC?DOGDA@E@Ag?I_?wE|SkDa?A?C!6?_#41?@#49@#47A??C??G??O#11@?@AB@FBFBNB@A@C@_@C@c@C@?Q@A!6?C!5?A?GOcGQgDgQcGQcGTaG$#4!368?CGOC?G#19?G!9?@#59C#67!35?G???C??A#84!16?__?!11_?_?!7_#60!34?@#67O?OGsSO{}{QWg#60@!7?O#0A!7?O$#79!369?@A?B#16_#10?O!6?G#17??A#44!131?@??A!4?G???OO?_#37O$#7!369?_?G#33_#20??_#70_!9?@#45!135?C???G#4?B?A@A@AC?M???C_?U?W@C?C!4?G$#36!369?C#34_#24_!5?O?G?C!5?A#70!134?@#46O_?_???_#1C#54O$#3!371?O#35!4?OC!6?A#37C#53!137?A#38A??C!7?_$#49!379?_#46_!8?A#24!135?A!5?G$#44!381?__oOOWGk[]EMD@AA?@?@?A?C@??D@???A?@#2!110?A!5?G?G?G__!5?G?_??O$#38!381?O!8?@#69!135?C#6?C!6?G$#0!381?G!6?@#3!140?C!4?C???OsGWOO?gCoIGi?}Gy@iTg{@}@~@}HqJuJtjSjQnZvlVyVlZvlZvi\v~|!6~$#5!529?@??CC??S?GGO_?g???G???O$#40!529?G!4?_$#51!530?G-#2_pQpSr_psq_xcQpwL@T?E\QLWHMCNGE@sGqSGC`Q_@_O_OC_?O_???_#4!7?A?HOa?HOcQwOgsoopgdWRKo!4O_O_O_O_!8?oo#6!7?@!6?@!16?@#4!6?ooOoOoOoOoOoOoOoOoOg_gcgsgSgsWsgSgSgSgSgUgRSidItQLqtItqTigUpUGsIPDiA@LAI?lACAT?LA{PmQpSgpShuOdySpI`MPItB{?{?kOKOaOaS_#6!12?A?@?A??A?@?a??A@OAK`QG?@GD?AH?C@GA@GC@GA@GC@GAPCi@Ci@SaLAdIDQdIDG!10?_???_?O!5?_???CE@A#33@#47G!5?@#69?@#61g__CSWMMdeNgOyT^FJ!4B@@@?@?@FABBAD@B??ACAC?A?@#85!7?_#88?_O_ooowoow?KGCIO!4?AC?C?O!4?q_oowwGsGoGOO?O__?_???___??O#85???_#78CAD?A?C?A!4?!4GKGKKkYSOGA`_?___??`?`?O_?_???_#91C#3CE?AAI@LDIlZ]JcXEHEHUhEhuhUlQlQlZE\jULzLrm|r}tz|!8~$#1VMDMBKVMJLNEJLMFa]i~x_cqfa@xorw}AtG_boWcS{QeXAoG???O#5!15?C?A@?DADAHFIDYFkQNNnNn^n^n^n^!8~NN!7~}!6~}!16~}!6~NNnNnNnNnNnNnNnNnNnV^VZVJVjVJfJVjVjVjVJVhVkJTITADALADIDI?D?I?@A@?A?D?A_DOAGRG?hAO@A?HCA@CAE@MAC@MpMpItAsB~B~RnrnSfSjTZ|z}z}z}zu|N|~}~|n^|~}~\^~x{mlrUkvv}fqzlsuzyv|}vz}v|}vz}v\mzT}zT}j\q|YtylYtYvlYvi\juXmJDmTiLze|zUlJEC^E@GCD#38G#83C#35@#10@#45G??O_wOWQOG@!5?FF@A#75??oo_??__o_o_!7o_o?___!4owGkwsW[??ECDEEF!4B@#85?oOoGSM]IF]Li~yvNudBd!6?_#94!10?O?O??O??O_??O#89???KI?C#68!5?AAAB?AEBE?AAD?B@C?CS#67??G??G#43?A??AGG?GC?G#5@!8?O!8?__#29??_#4!18?O$#0G?g?g?G???O?O_??O_!7?O_#29!5?@??@??A?GA?H??GACi@GCoGOGo?O_??_#22!19?@#10!98?_!4?_?O_?_O?GO?G?T??C?Q@Ci?OGs?@ODO?gPAA_?AG?CG?AG@??@G?a?CO?c#22??G!8?HGH?IcAC@C@C@CHAo!5?O_!5?_?CA@O?G@?G?OGCOAH?C#14!13?_#9!17?_?QdGTaSHePsY@iTACHACHQSWj?HI@A?A#39?C#86A#43CC#80A#59A#46??@#67??_!4?GG!4?G!16?CC?IKKC#84!8?oO??__owWwWgGGCKCCIB@BDB@@@DG@?@?@G_HYkYD^NLDCEIUMUMMMmMKMKGGW?OWGW_O_OG!4_GOGO!7?_!13?G#89???GG#45???@!5?C???O?_#11C#37O#48_#56_#17O#96_#14??_#76?_!5?O$#3!21?AH??C?A?C@?GAD?CB?HB?L?ElBTzC]`yLShuHugTq?S_??O__#11!121?G?_??_??_?Qh?h_GoCoDoIo[_i?t?cgSOl?_P_AhSAgOG_O@G!6?G#14!102?O#4??O#31!4?_#3?_?O#34_#24O!5?A#42??A#37@??@#68!5?__?O??_O_?_?GCKCCCMIADIEMGC?GC?A?RD?H?AD?DA@?@???@#87!4?O?G??GCCM?A#95??_?__?_#94!7?O#65?G???A??@#85!12?_#65??A!8?R@?J@NBN@FDCC?EO??O@OO_g?UXQB`[\ApQUO[}?S_S_O_??__#10A@C@E?IDQC@CJ?HEHEHEHEHUhQlQlQ_o_O_o?o$#76!26?O!8?IOGC#10!10?@?A@?@!7?o?C@D?C?A@?dA@AGCQ???_???_#22!104?G#26!12?C???G!16?C#19!133?@#16??_!4?C#65!15?o?O?O?GC??_??O?_OO?O?P??G??G???_YPOH?ILACABA@@A?@@A?@#93!8?_?o_?_OO_OO#75!11?A?B@?!8@B@BFFFNLFFENNNLVGOOSo_o_{!4wsoCoo_o_???k__GWAAATCc?d??i#46GC?G#0@??A!6?O??_#11!4?OAO_O?_O?O!8?CHACHACAK@AK@ICA$!51?C?AAE@EHFILLJQmWjQLWkAGOGC!4?_???_#2!278?_!5?A#78!14?_?O!5?_O??GwW?CKICG??@G???O?G?KACH!5?CGEALE?A?@#87!34?O?_?___o?OO_O_O_???_??_?_#67!12?@???@???A@#44!18?@?AAC?GG??O?_#60_#83O#33?_#1!8?_$#14!364?O#0O!6?@#43!38?@#68!78?@???A#61!13?@?@?@?@??@?B???C??@??A@?I??C?O???O?o??O#77O$#81!365?_#44_?oow{oiKkIEEFHHBE@@A@#47!148?@#54@#70@#16@???@#66G#4@@?@CGAO???_O?c?O!4?O$!366?G??@#68!169?O_?O#92??G#8G$#70!366?O#60_!5?Oo?S???CA#42!157?A#55A#1@??A??GG$#41!367?O!6?@#35!166?A#2@???C$#1!367?G#59!174?C$#90!542?A-#2TjSATISlJcXASbMpA?_??A!7?A??nTiTeUKTmIxIyTTulI[PWDI_T_G?O#10?@?@#11I@Q?ATgD_Z?Bs@egUgQCOGCQgOgAo#26?O#11!8?_?_!38?_O?_O?_O?_O?_O?_?_?O_GOG_OG_W_W_Y_SgOmOkOiShUwVGQHQGR?ePk@eOl?`MZUlYvI|ItYlYsJ[bS`KAT_LOEPISBS`KOkOKoKOhGOgQG_?OcO?G#22!11?IDA??DAs@AC@C?DA_#6!31?@?@A?@?@!4?@?A#9?C@AG@C?HaC@?BCA?@OGGDAB?@#61O???__og`OOIGDcMDCCKCE?A@A@???@#88?_!8?CwSG??WoooWOGK?CCEEAMGAAAEBAB?!6@?@?@!17?A?@!6?@???@@??@@BBBJbvFVSU||eCESS\GKHWC[s[Acc_o#78!12?C@?A@@@H@D?AEMD_QHSPGAR_A?@?OCWO???_#5@?A?AA???CC?G#11??CGOGoGO_OGO_O??g?O#29?O$#0iOiTiShQcXa\a[`IsGTaOcGOdIShQCGO!6?_#3??@??@?A@ACBGDAdQiTuhE|it}tyl}|iOiS_Sg?GO#5@??D?dQGCB?D?JCB?C?S?C?A??CPBR@HBBbBBbBBbBBbBBbRCCUCESEC_AG?C??I??@?A@??H?A@??H?BB?CA@??@??A!4?D?HA?@?@A?C@?@#3??oCoCoCgOiOiOiOiS_?_?_?_?_?_?_?_?WaWaWaWaG_G_G_GO#5?A@?Q@AGA@AD?RCj?RCRCJsBlRLRnRnVta\bNqLJe\z}z^iT^!7~^~^~^~^~!8N!8~}z}|~}~}!4~}~|~z}|v}z~u\z}~{z|~?C@C?C???@#60o_[IBKFG#78__O_OGo_O??jHA?E?A??@?G???A@#85!10?_???_?O?GG?G?K?SCCK?CC?@IACAA?B?B?@@@A?@?AOIHYJTB@B@BCGK@A@BA@A@A?B@AASkOCG?g?@?A?G???G_P?OAo??__#65!18?@?A?!4ADTGOA\dqjEQhc??_O??O?_ooO?__#4@?@?AAA@P??CGO?C!4?G?_?G$#1?C@g?`A?OAC_H?OCHtI\nXvnYtjUlxvnOiTiXhRiPsEtCigG?p_caoOG#4!10?C?@??FOJCjSJuHEhU_ZGcr@OlQdCrk~z~j~z~|^~Zm{k}u{{[{{[{{[{{[{{[kzzhzxjxz^|v~z~~t~^m~\m~^e~\m~^e~[{^zl]vnu^nt^f^bYdQ`Si@iOl@iS?EgFhEhFgVHCBSHDATI@?GO@G??DG?O?I?@CHEPdGFOfXeTb[bKrKOm@KoFOcGQlCJOFGbKbSB{AKqKOkOg?W_[oGo?W_???_Og!8?_?_?_?_?!8o#14!9?C#0!30?_!9?@#37@#46@#65!7?_?_O?O_Q@?_HC?C?A@???G?@??@#93!14?__OoOG_WOO?WGOGgG{cS[I[CMCIcQeiU@b?uOJsQDSISE[_[AT@IDeccEDMSMsMk{gOkoSGOGGG???!4_?_o__?_#68!30?G??G!5?`C??oSg!4_#60C?G??O#10@?A???K???pQ@A@A@ACBC@E@E?DiS?SgG$#76!17?A!30?O#29??A?G?D?I@UhASI#10!16?O?@G_A@?gCA?W?G!80?C??CGBCOC@AO?Ag@!17?Oc@AC?TAOACAC@Sa!15?A?`A@_A@_CQd??_OCg?G_O_G?O_?_#4!84?I@?AAGC#7@#45_?CC_?G?OOMKCCAA@#67?@#75_oOOogGg{{}}WUFNMl}qpo@!6?!8@#99??_?_?_??_?_!6?_???O?O_?O!17?_???_O?WO_#84!14?___??@GG?A?CBE@JBIAKIIVN^n^Kk[k[{{wWOO#61!21?DC?AIGA??G?_???o#11@#2CKC@?oG$#5!218?@?@#6!131?CAA#47_!5?C#54A#68!10?OG??IIHA??C@?@?@#85??_#87???_!8?_ooG#95!7?_?_O??_?__O?OOo?W__O_WOGSGKWCgSKuHlc@c_??gw_[_WAQsGGO?gGOgOGoO#94!9?A???O@O@?A#67!48?O#46@???C??GA!6?_#35G#3@@?D??MDytititJsjUhUhViTjVjFvn!8~$#34!352?O#14_?O???C?A#84!22?OoO!4?E`OoOO?KMN}zFJFNvEMMMEMEAFBB!4@B!4@?@?A#100!31?_#87!23?@?A?Q?I@?A??C!4?OOOG?_O_oO_O_#43!29?A??AGA???GWG#70C!6?_#16G??_$#10!353?GC#31@#44__OoWgGYATSB?E@B@B?@#98!43?O!6?_!9?!4_!5?gOG!6?__!6?_??O?G??O_?_#75!18?@!9?!5@!5?!7BFfjm}|{}{s{wy_p`oAGC?gCOGIGHCS#45?@C?C!6?O_#50??_#64O#29A$#2!354?O?G#3@?A#1A#44!187?@@??A?CC??O???_$#38!354?_#55?O?G#50?C#47!190?@!4?C?G!4?_$#43!357?O_G#50!192?@#20@!6?G$#0!554?@@??A!8?_$#40!554?A#58A!6?O$#1!556?@???C??GO??A$#14!556?A!6?O?G$#54!557?C#53?G?O$#96!557?A#97?C-#0~\SuzxKmzgnx{}Jc~|zmz]tz|ju|iTzcZtiTiOcGP_@_@???_#29!5?@??D??H?Q@?G?O#4???@!4?AGAc@??AC@SAIPEGASASBGUGViUlRmRlZdYVlZlvLzLzVj^jvJ~J~TnZVjTnZe\bMPeLQnTYF|A~DYDZEXFYDZDu@^?nQLALQLRc?A?GAC??A?@!5?A!7?@A??@A#10!11?@??@#4?@??@A??@A??DA?AD?CA??AC?A?HA@QCJDaHE?VGDiPMShS_Mh?n|Qh]i~nY|M~]y^}hEpM@uHm@YdWTItWnu|mz{nuz~z|v|z~s[k{u[{[!8oCYW!8?A#45__?O?CWCH@CAA?B@#80_?_?o_O?W?_#95!8?_?O??G???GGOG???O?G!6?CCE@?@@!4?A!9?C@??A???@?@???@?C@AC@?@@?@A@???@?@@!8?c@PCHQo?G?g?GC?CCA?M?T`CQEA@AC?C??_#88FFCCCKAKG[GW?OO?o_oC#75@@@BBBF]N\xooOW`GOX_O_?_#61??O@?DJRVI{ico_G?OO?_???_#59?_#10??GO?G@_i?A@CC??CAG$#1?_@?C?P??@?A@?S@?A?OC`IC?SGADiCJcITgPeHQmPmQkRcj^~lztmYqOYD_OG_O#76?_g?_#10!12?QD?_I?@c?@S_G@G??@??@#5!27?A#3??_??O!4?O_GO_?_?_?_?g?g?g?g?g?g?g?gOcOcOcOcGO?O?O?O?s?s?dGPa[ti~y|u|Ytmxu|i|}t}}y|}m}]}}]i}uxmty|ulyTisYdwTy?gOg?gOg?O_?_???_#26???@??C#5?@A@CPAT?A???@??DA@?@D?@EPM`UHEPmDYFiTIFOHAPCBOHC?CAGAC?JbRBHbBb!8NxdFgL?I@@???@@@#1@#61GGCQ?G?KCCCA@?@@#78?@A?A#93GGGwO???_oOOG?W?C?CDEK?KOGGG??GKCKEBB@A@?A?@A???A@A?@!5?A@?@??ACA?BD?A@??@?@!20?A?ICjULJ\?GCSC?MAIPF@fIEAL@\A\J]Zz}WWowoo_o_O_?_?___#78!11?@?AAFFf?Q`@?B@CA??c_??_!5?O?C?_#37@!8?O?_#83?o#17?G#5?GG??_#29?A$#2?AG??A??CQ!5?I#76??C@!4?A?@?O#2??O???ACHQd?MOLQkZS??QCIPcLi_gQC`?I_#11??@?DAGCA`KPcPGUlQlZSj[Pmwa\a{bKR_V_ChAKPKQCYDgQcQGqCqCgS_SGs?s?gOcGSi?cXa[`MPaLOIdWA\?QdQcPeOdQcQHU_V?HaXaHaGRe|JulZezGvI|QfkT`IT?DAHAcGPEG?TA@I@@DA@P@?@@_T?HEOGDAGODiOHdWAi@|ReTzUlRUhUkZSiXUgvgSiPgPiS_Y_O_O?hS_S?O_?_?_?_?OG??_!6?_???_#3!32?A??D_I??A@#60_??O?g!4?CE?@?B#85_O#88?_!9?oCC{WUIMAC?CC?AAA?@BABA?CE?EABB@#77!7?_?_G?O!8?_??_#100!14?_?Oo_oeoYCW[Wy{_gSAg??c?O#85!7?CA@C???A??@!13?@?C@F?G?G?OGO_?o?o#65!17?CGGGfKSieOkJpNvJMUkGS??C??WG??_g_??O#96C#86G#4C?A?@???`?A?_C??O_$#82??aH?CaP?COCA@_O#3!40?D?QLaULc^VVm^y|uz|]rkRkRg?gO?_?_!8?ocG_GO?O_?_?_?_#10!65?H?c@?_HC@G?AGOAG#76!25?_#10!23?CH??@?C_CG@?_OC?PG?aOCA_??I@?CI??CA@!5?O!6?_?OG?o?O_???_#22!36?_O#14?OS?G??GA#38C#75O!7?_Oo!4?KG?IMDE?BBB@?@@@#99???__O??G_GO??OO?O??OO??W?GG???E??FA@A?A@A@???H@AA?A@?CNCBG^CIEKAY@?IKGGC?H??D??[?gSQzZGcJ\IOiO_??_o_OgogOWoKg_W_Gg_g_s?o?_#87!5?BBA@C@AACAKJCGEKAg_gGO_#68!11?AC?GAOKOGO@gQO_g_o#43A@@AKCI?KwG?O??_#11!11?@?@$#5!91?@?@#6!245?AQD@?C?@#44_OGgCUQBH??B?@#87??_?O?o?OgO?sC?AA?a???K?FAAB?@!7?AA?B@#48O#102!14?_?__??__#88!54?EBAAA@@@#84!23?@A@AD@BDBCJVHRLR]Uuk[{w_o_#67!9?C!8?@A?CG#46@@?A?@!5?O#1A!6?A???A?S???O?A$#10!341?_?O??AC#59G#43?C!5?A#84??_?oW?W?SK!4?_!5?A??@@@B?@@?@?@???@?!4@??@#103!15?_#72???OG!4?O!5?O?O??_?_??o?O#84!34?@?@#80!26?G#45!50?C??AAC!4?_#53??O#76!14?G$#2!342?_C!4?CA#24A#40A#68_?_??O??G#47!10?_C#85?OC?g?CgS??G?G?C?C?A??C?CC??C?C??A@#87!75?@#44!80?@???C!4?__#97G$#9!343?A???@#56!4?@#65_?_??O??G?KCAAAD???@!4?@#98!8?__OOW__o__?G??O?G?O?OO_GOC?E??C?D@D???@G@AI@KDK?IBOgWC?WOWPGCKICQEOJC?EBADABUAhDCcRZc_Pc???_???O???O__?_OO??OP?O?G_?_!4?_#60!57?OOO#16@!4?A!4?GG?G?O$#33!343?G?AC#46O#41!5?@#67??O?G!5?A@#42!5?G#100!16?__?O!4?!4_???_!7?GGGK!4?C?CCCSEMCC!4?CC#54!131?@!6?G$#17!343?_#16OCG#78!9?__#46!13?@#101!28?__??_?__O__oooOwWsWGWWwgAOooOgoWowog_?_o?_?__??__!5?_o___#41!109?A#0@@???C???O??_$#70!344?_#0O#37O#72!55?_??_???OG#50!158?A#33A#3@?@BB@DFCFFFCA@D^Weoh^~z|v~~~$#35!345?G#42!224?C#2A!4?KG?O??o?S?O??G$#69!345?_#55!225?C#14C???AO?_!4?_$#47!572?G?O$#5!572?@-#0~}~~~{}~~x||!4~vu^~}~fv}~z}~|y~tszmhupG^cZsPIdy?@A#29!9?AO?D_A??O??CO?C??O?g??G?G#10??C???@???A!80?@?A???@A?@#29!4?G?C??A#11!34?A???@??A?CB?B?B?B?BA@AB?@B@IAQHtBaHRAdAXAiP_EHCjOHeGaLaSi@]_]_]`Yd{`]_{dYc?_?_?_??A`?A@?A?q?__?o_???GC?GC?A@#44OGGSCAB@@#84??_COOAIE@A@A@#100?G#95?KW[O???G??A@???A?@#102?C?OO?S??G?__q?@??AK???_?C?A?C?C??bodW`@dS`?DWCGSGO?GG[Soo?oo_Wwgw_wWOqOk{cc_!4?_#100?@?H@F!7?A?A?GSGb?@GWCKKGKGA#48???A!5?C?O#85!8?A?@A??@A@??OCG?O_Og?_#75?@@@BBAFFNNLX[XOke|wsow?_#44!5?@!9?@A?AA??!4C?!4G?!4O#17C#60_$#82?@???A@??CAA!4?GG!4?OG!9?I??O?GC_???G_O??_#3!11?@??QGPCJDMRJfZj]lnS^}c^c}{ykq{qkqkOno^_~Ono]sisYcwDwcWcwCwcXcxCxShqKolQkpItgsHqkQhUweWugUwSj{j{jsZkzkzsZkuxUhu\u|i|{l{|k|u{[m{\m|e\RjVXExVhVj\b^`^bMPvI\b]hTNSjLlVlZF|jV|Lz^vM~n\~Zkn{^kn{^[|}{{|}{{t{huGsGsGsGs?s?cGO_O?_?O?O?O?O_#10?P?O@OC?AG?TAO_GQ?SA?SA?HO?G?_OCGC?CCG#31??O#1O!6?G#60__?_!4?AA@#87??_!4?GK#99O??O??g?c??OO?C[CGG?CC#103??CC?CC?O?[G?CC?GA?@@[A!8?AAA@edOFQfUmQb[lwcWcGA?WOS_g?GoG?WcCS?GC_CGEQAW?Oo_O_O#53?C#99!4?@A@?B@?C@CB@?SKFCF@B@@ABCDAJQHPIhgS`GAOAOG_g_O_G_#123?O#88!4?BBAGCSKK???A#65!6?@!4?ACB?KAP?C?G?c[O_Ko_g?O_?@#43???A#47??@???A#2@!9?C!4?G$#1!5?@???A!7?@??@?G?@?C@?A@?A@?@A?A`?Q?BcPA?mYtjRhRgOmXa[_YaKtCQ_w?gcO?C??O?_#76?O_O!99?_O?_O?O_GSGcXEGUGSA[?]?[`I?dAG@QA_BCQAGAcWASgAoC_Go?O_?_#29O???O??_#10???@?A??A?@!4?@??@?@??@#26!18?@#5???@???@??A@#3?g?g?g?gO??S_SG_!5?_?O_gG__G#104__#23_#43_??_??I#65S??W?CCG?C??@???@#48G?_#80?B@B@AA!6?@#100!6?!7@C@#107WGO?CYAI#119?_??GWG?O_#107??CIWYK?G???GG!5?O?O_#114!14?CC?C??G!7?_#98@???@?I?AHeASAE@A@GUH@OgG_CG?AC?BG@?DCEDQBAGSkkwcOOO?G???C#87!7?@BBBA@MESS[s{w{wo___#46??A#78?EBPGABJEBY?mOo?GOg_G_#40!8?@???A#65_??O#3A!4@B@@@BF$#104!18?_#2!11?C?G?COCHCQ?HcGACGDOCGSkUkRnPe\`MdW??g?C?o??G_O_#4??A!9?@?C?G@??D?I?A?I@A@I@QDA@RCB?RCB?RCB?BCHADAHAC@GR?ADQ@CHA@AHA@AH?@?@?@?@?@?A?@?A?C@A#1!20?_?_?_?_?_?_?_?_?OcGO_S_CgOgO_O_O?_!15?O?_?O??_#4!10?C?AGSAcGQGeHSIVhUjSNuHvLqLjD]`M_N_M_Y@U_I@GCRD^B\VJTnsMjTiVLzDZVRZFJZB@FHBEBF??A#61O??OGG?CCAAB?@@#98__???G_gOOO?_A?GOAAWc?c_??A?@#114?_?___??_!6?_???G?_?S?C[s#112??O#101!10?AAA@@ABDIDABABHBD@FABB@BRB!6@BRLJFJEJvaUq?gS_GcgOW_WOc_aA?Oo?_oOoooOog_??_#41?C???@??C?c!5?O#80!12?G?O?OG?_#68!20?@??B?LBKACOCOOO_???g?W_W?OG?_O_?_#109A#43Ow?__?OO$#76!48?@!6?C!8?@?Ah?A@#11!5?@A?@?@B?B@B@RKBGRDQlOI_T?lOD_HS@cHAwEGbWFgBWeGAwEgQCpIOcPIsACJsG@kQ_DWd?TgDaSASASIcQCQCHcQHChQG_HATAAQ@ARAG@B?BA@A@A#124!129?_#22G!5?C#9_?O_#19?O#105O#33O#0G???@#75_?!5_???IKC?A#77__#117!8?G#87?@@@#42@#69!16?_#115o??O??__?_???_??_?g?GW!5?G??GO!6?_?_??__#107!16?g?_#72!7?C?C?GgCsOgSOW?k_WcgO??_???O??_!5?SSgoGo?O_O_#84!24?@A@@BHBIAE?CKWWOoo!4_#61!6?C@?@A?BTAFJENm^~~{S|c[_ygOWWgC_Oo!5?__$#5!323?G??CC?EOACPGG@?@?@#68_#78?_O!4?O#85?_?_O??@E?AFC!4?C!8?A?A#118!12?O#111??CCG?C#113C#118??_G!7?_w_#122!11?O#72?A!8?@!4?A?@#108!7?A#115C#93!20?@#95??@!9?A???A?@#77?_#93!8?C?A?@A@IBHDZd\fIxL}}|]s{koo__?_?_#45!34?@!5?@A?A!8?G#67O#115C#116C#37C!4?G#35G$#76!332?O#79???C#6A#55G#20C??@#59@#67?G?WWG?B#88_O???K!4?@??A??@!4?@???@@@#108!14?G?O#112CWO_O#121OOO#40C#69?w#100!20?A#77@??DAD???ECICGC??A???A!6?GACW?W?GO#93!22?A#95!15?@?A?@?@?EACA??S?a@??_G#60!55?CCC#75_#49A#63A#0@??A!6?C$#12!337?C#110C#7@#45O???CC?A@@#68!4?@#93OO?GCC?AF_???KCE??A@E?A??@#72!22?C??@#114!24?_???_#120!68?G#56!76?@#24@#64@#104?@#105@#20A#1@@??AA#41G#4A?A$#41!337?O#106?A#10A#71G#89???O!4?OK#101!4?_??_!7?___?__?O_W?wg{YyyIAMEIABEBBB@@???@?F@BBA@B@?@#9!176?A#88C#78??_?_#62G#10A$#47!340?C#92A#72!16?OO?O!9?O?_?O?O?C#34!213?C#96?C#50G$#77!370?_!6?G?O?_??Og?G!4?_!8?@?AC??A??@?@?@#104!181?C$#41!370?G-#0~B\jTJ\b^jVj^jVZ?Yd@IRDT`T`DZrBvTTlZ|{]}~~~{{~~}nco}gOk_SoS_S_O_#76@??A?C?`???@GC???DGQ?@Q_@AGSc?CO?O?O?O?OCg?g?O?O_?_?_?_?_??_??_?O?_?_??_?_?_?_?O_O?O_O?O_??_??_?_Gc?Gc?g?GC?SGAGaGAGaG`AcH_EP?@C`GCBS?T@cAT@cA`IC?_QC@C@?aH?i?@G?Ha?SA`GA?Dg@Q@Q?T?CO`?SGA?I`GAH?_C?O_?_#4!6?@??A??C@?I@??C@?DG?C?I?C?G?SaC@CAH?DAD?DACHCOG?A@i_???G??BA@#133_O#95O!6?OO!5?G!4?G?O?CW#107?_???_??_O#115?_?_#114?O??G!4?KC??AA?@??@@@!4?C?@!9?A???C??C#81!5?O#128??_??O_#127O#114??A@?A@??_???cGSHC?_XK?KO?Kb??_??_W?_O???_?O#98??_?_?A#100?@??@??@?AG!5?A#98?@???@?BCGE_B_eXESs@g`a?OC_???a?O#85!4?AC@C@OA?W_OOO_O#75!4?@@BEFDMMNMN[y{wsoagooo_OO__O_?AQ??gCCAaG_GkC$#104?{ASISA[?SgS_SgCZcYSTgY_]_]ocGsG_GO_#1?@!5?@!5?JC@UaRMhJ`]`YdI{~\tlyTItyiqPgiI{qsgOcGSgS_GOgO_?_?_?_?_O!47?O_?O?O?O?O?O?O?O_O_O_OcOS_SoCoCwAsIoiSyo]ti{i|isY|i{Yt[ti|Zkzsz{v\q~?~QtmsXuhsYcxuwQ{_[_Y_Y_IShAs?s?S?S_CGO_#10!29?@???@?@?@#1!14?O?_???_!7?GG???@#87_???O?O!5?E!7?B#101_C??@!5?G?A?DCAQ@?@B?DD@B??@!9?_#111_!4?_#107_!5?O??C!5?C@@??AA?@#112!14?_?O?O#107!5?OG???@?@!5?A!4?_#72?@?B?@?@@A`@a@a?T?c@??@?AHC@??QU@DG?LISJ[`SgQsG#93???HAKQCXiDITh\pHvJ~V~^lwww}cs__O__#78!10?@?A@!4?B?A?GCSB??BQ`ATGaCg__PAObX?CAA@?IC$#137??_!5?_#82!7?C@?I?C_I?I?I?CG?IaACAA@@???AB??@OOJ?@C?O#3!13?@G?A@CGAPCPBGBDnYdJUhVbJViN~N~N}N~NjV~U~n|n]~Z}\~]~Z}|^}~\}n~]~\}~^}\~]~\~m^n~n\n}nN^}L~m^n^fZnvJ~F^fZnJfXfHVhFXFYDXATHCjCJ?AP?@A?I@??A@GA?PAC@?I?AG?C?T?kAPACHAHCRCHADALaLdIdZdIUhB|JtIvhUzVj]n^}\~~}~k~y|}|u{z{ytylux}tyukqmOmq[a[a[a[qkq|yTy|iszCZKRmTITOHq?OTEC@A@#75G?S?O!8?@@@#98O!4?GCBBCKE?IBHF@?@O?O!5?A#125_!5?_!4?CEEACAAAG#127G???C?Q#103?OGGK!8?AAA??@!9?@???@?A?@?`!5@?ADA?OGOKP@Ki??U@KCOWg??gOO??O!10?O_?_?_???_??___#48?@!4?A#95!11?G?DG??CAICGC?G?_O#88@EB?JG[CMKG_O_ooC??_#65???G?@?@??D?FAJHSEMGKIkGQCWQWGaxDW_wWoSoQoo$#106!4?_?_!8?_???_#109!18?_#2!14?H?@ACI@IDITA?aGQ?aOGC?Cc?P_#11!14?@!5?@!6?@??A?@?C@A?@?C@A?@?A@??@?A@??@A?@?A?@!4?A?@???@A?@!101?@??@A??@?R?CA@?HB?AD?CQHA?I?@RGPdPGbSbG@XaHPCA?g?AOH?A?Ac@GC?COGKF#57A@#44_??GCCAA#68GCC?@A?@#94G#139_#72_?_??_!5?BA@@@!4?@?G!7?@AAA#52?_#81?O#49_#135_o__???_??o#130O?O?G???C??_#102?A!9?@@@!17?@!9?@!4?@?@???@LNHK??K??W???_?O!15?_??_#115??_#53???A#99!6?@@LGVXexaHqDQ?Oa`IO_?O?_?_#80???A!5?A#84B?@A?BCJCJReM[wW!6o_#68?@?@???H@C@C@?CHA?CDG?A??C@CHA?@A$#96!5?_!10?_???_#29!50?C??P??A?C#5!232?_!5?O!4?o#0?_#2O???A?@#84_??GO?GGK?CG#99O???OO?C?GO??G??G#112?_#118_O???_??_O!5?G?GCC!4?G?G??H??C?D?@@@!5?@??BFJHKG!7?@?A??AB??D!5C_A?OkWs__ogWc_c?_c_?O?O?_#101A?B?F?BCJCidIEXE\lI}J]iNIU\CRM^TCHSIUHQsIs_Y_O#41!11?C!4?A?C#87!13?@@?@ADNKJCJokWO_?_#61!20?A@?@D@?CC??A@?@!4?@$#76!313?_??O_??G??@#12?G#40_???C?A#34@#78o_??E!4?A#131??OG#77_#103_?_??_!5?ooOOGKC?JKHMNEK???CCABA#107A#102@@#40@#112OOG??G!4?_??a??OG!9?A!8?GC#77!38?A@B?E?CKQCICGCWCW?O_?O_S_Sg?O?O?IH?GO?S_?_#123!19?O#84!71?C??G$#10!314?@!9?_#55??O#60O!7?@A#41?__?A@!4?AEB#134O#100oG??__?O#119!4?O!6?_?_???GG?OO??W?YG?OOICSD?@BA!4?@???A??CC!8?CCE???@AA??EC!5?_!4C#108!27?O#114!22?_?_??_#43!98?@$#124!320?BEDA#42!4?_?O#70A#47GGCC??_A@A???AA@#122!7?_#126???_#77!4?C?IAO@CO???C!4?@??@#141!4?___!4?_#136O#116?WOGCGae???O#125_G???_O!6?__oOOo_O$#138!321?_#58!6?G#80_!4?G?__???_!9?C!7?E?CE#120?A#108?__#102!5?G#121O?W!5?GGCK?A@!5?GDA??A!4?!4@G??Og?O??WWOWGGEAMCCKCKGGGwgwWWGWGG$#105!328?C#46O!6?A#85GGCC?K??G???G#132!24?_??O#126!13?OO???_G??OQ?G?CQ??G__O??_!5?O!4?G??G??_O?O$#24!329?C#123?_#49??@#43B?@@??@#88OO?C!7?@#73!21?O??OO???O??C??@C!4?A???C#132?_!8?OG?_??O!5_?O??_G???O?_$#65!329?G#93!11?O??O?CC[?G??AOG?OOGC#140!14?_??__?_#129!19?GC??_?_#73!5?O??_??G!4?G!5?__O$#48!342?_#120_#53??_#42A@@CB#128!25?_!24?_??A?O_O$#115!406?C??DB!4?A?DCC?A?@?@?@@@??B?AA@?AA@AaQAAIE?QDAAQaAIQOCo?_OO?_??__-#0T?@AP@?E@AOHACO@??@DI@IoC@?@A@QDA@?cJASJSIuHvLrfGBELf^unVmU~ny^}_?c?G?OG?O?_!5?AS_Sg?g!8?_?_?_?_O?_!22?_!47?O?O?O?O?S?S_SgOGqGQgQGqCXaKAgAKA_!4?O?O!8?GOiOIoIS_O?Sg@AC#3?@C?A@A?D?@CPCbCOAHC@a\ADQM`NtJtNtJtNtJvl^l~l^l^~~n^~n^~nnN~n^~~E^jTmVjvoI?IO?A?@#40O?OG?kcooo_?O??OOO#154?O!5?O#151G???G#51o?OOO?_!5?_!7?O?G!5?K?G??C?C#36_#57!4_#21OO_OooO#121@@??A#116@?AUYKKIKKKA?Q??oOgGOOOGW#126@?AC@?C?CA?K?G?GC??O?oOG???O?C?C?GC#103?`??A@??_A!4?`A?A?AERAD?ICSGbOkIHk?WCI??G_#98???@?@A?@RCTAAWpMgVC_G?s_WWGCO???c_#85???@A@ACB?KOgOg?O#75!8?@@@H\{l|Z~n~m[mk}]|{ygcP??@ADADD$#104A@A!6?@??O???RHKIdetBBAfAH]DA|MlIc\ISJsHsGoGOcgO_#1??@??@???D?@NBHFRNfRnLZNv\zu~wgJHAuRF}VunRxT]^]^]^]NbXL}|y]\\]}\^x[]~oz{ncjwNKzWlaTwz\SuxzT[vtwNduxzw|}mdvx{~|{mf|ryUmvUnuVmbmJvJjfj@lbHI@ErKAcAKaCWaCPhDdPH\^n~NfnF~n^n|~}~VaCL_EP_JF{aA[gpz}z}tmwvW~szkrKyJlcry\Alyk`]oAsIoIsIoIsGQ_Q?Q_Q_!8?O?O#11!5?@?CA@!4?O#12_#1?C??@C?@@#41A@!4?C??GGG@@???@@#48@@?G#108A#103A#111CCC#59AA?AAEKC#49O!4?G!9?A!8?C#126@??@@#58C???C?CC!5?G#145o??_#136?_!5?_#52G??O???O#73?AB?@?A#127??W?O!6?_!4?_#112??C???_!4?OG?_!4?G#101!4?B?@?@?@??@??@!7?A??A??A?ACa_F_DITkRc^[?_[cO?s?_?o?_??_#95DA?A??O!4?Y?COcW_O_?O_#87?@@?AAKNCY}WScW#78!12?@@@B??A@CRGepwwTw[WW$#137_AGPa??@EOHOGO`qC??O?G?C?CG_???O#150?_#82A@??@??@!5?G?O_O!6?@!6?KQGcOGCOAcO?_#76?@?DBSaTHCw@gHOkCi@_@_@_@_[Cq???`_a_@__Ca`?GC?OOOCOo?cOOg?C?aH?C?a?GA_OG?CCA?POGCA??APO?GChPGhOHgPKPcGcSGSiQGU`UHC@THT@THBCHACQGAcA!11?A?@??LPATHCJSgBHTaTIC??@GODGa?I?AGO@cOQGC?_O?@O??G!20?O_?O_??O_?O_??w_OgOgSGJ_XPaIH?A#48C???C??MEAOO#87A#50_#155?_??__?oOOo??O?OO?O#21__#81C??!4G#128O!4?C!6?@A?@!7?A!5?AA???A?A!6?@GHCAACAA@?ACCHI?@?!5_WO#118!6?@@@!5?B!6@!4B@@?@@@_aQOUoO!4SWO[SGMCC?A#107_#59_C???O?GO?_?C#72!7?A?@?BKW?aX?aGa??S???O?O??g#88!19?@?BBEEMD{_ow_??_#65!15?A??@@?A@CRGIDA??@?A$#105G!8?C!10?O??GwO??_?G#109!12?A?AC?RCHAW_GOgOg?O?_?O??O?_?_?_#2??GACG#3!14?A!10?A?@AD?A?@?A?A@??F?B?JCB?BCBALAF?aH?E?i@GADOI@E?B?@?I?A@?A@?GAC@#138!22?_??_??_??_?O_!6?_O?oGOg?O_O!7?_??_#4!81?C@ECGC?A#46O?C!7?G?GCCC#147G!4?G???!4C#73GG#163_#40?GKC#20__#102A#107@?@@#91_???O#38GCG?C@???C?AAJA!5?CC!8?C???CC?GO!6?O??o!4_#132??AA@?@A???c_K?WKWsAOOAS?W?__!5?G!4?A#114??@?`??A`?a!5?G??Wqo[K?_O?C_g_?G?@??@G?O#108??O#53!5?A#100??c]??GgG_!5?_#41??A!9?G#84!15?@?@B?BD@fJZf}}}uaBQAc?O?O_OO?_#46!6?CACGA?A$#96?gSgCItGOgCaC`ICgcQ_?O???gOGS_?g??O?O?_?_#138!24?o?_#109!135?O?O_O!16?_#138!88?C?_#5@@!4?A#10A#0@#54G?O!4?_?OO???O!4?G???G???K??GG!6?G#119G#121C?@#37O!4?O???gO???_!8?CC!8?OO_#129?C?C???OO!4?W#121!9?A?B?B@BAFBBA?K?MSIU?[[KwKksWoOK}ici[SGKK?KK!4G!4_#107!17?@???O#99!15?@??@A@HFE@FGI[SOG[cccacas_?Og#68!51?_??__$#106?S_CGcIOg?aC`ACG?Q_!8?S??_??O?O?_?_#51!277?_#66_og_OK???G?G?G#84@@?B?A#93AAA#159_??_#101A!5?A@??@#99@#50OOo_#55OO?OOG!4?G??A?CA?@?C@A#23!4G!4?G?GW!4G#86O#125AA?@?A???@?@?@A@@@BEDFCD!5CccW?og_o_Go_???__#114A#107!8?_!7?@#102!7?_A!9?_OWGKYZDP@fSKOPS?P`HOW?O#48!16?G#93???@BB?@B@BRHJ\JV@NRnZe\m\yk[ogO_O#61!39?_$#150!5?O?_!5?G#153!303?O#9OG?@#92__OoO!6?_?_??_??O!5?O#134?A@#23??_#62???G#133?A#118E??ABA@#142C!4?@#20_?O?O???OO!4?OGG???G#140A#73A!6?@@?A#140KO!8?CCGGO?g?oGGGO??G#119!9?!5@??!5A?CCCA?@OOAA#77!9?@?@?@??@?@@?@?@???A!4?A??ACA?D_LaSiO_?_$#6!318?C#105C?A#43G?C?B#47@???DE?A#67?C#99!4GAAAE#120@#115A!7?@???@?@E?C#103?@#63_!9?G??_O??_!9?C!6?Gg_O#142?O??_?O?__OO#73!25?A#128?__#73!11?G#115_!6?O?A`@?a@???I??c?_G!5?___!7?__?_$#44!321?G???A#42?A@?@#85A??@!5?C#77?GG?G?@!5?DA#122??@#56???_???_OGAI#52OP!6?A?@#19_?O!6?G#103@!5?@#49A?A#149C#152G?G?_#127@?@???@#119!60?CCAAQO??K$#155!324?_#80!4?@!9?@@#146??C#72??@?@@?@#58!10?_!4?__O__???G??k[#13_#91??G#25ooo?O??OO?_?_#55??CC???C#165!5?__??_$#68!336?A#117CCC?CC#160_#161??___#162__#69!11?C?C#73?A#116A@?@#145?A#50G?C!6?C#148C#121A???A#118A?A#100@#107@??@?@#51_#91_#132??A#141!7?@$#158!337?_#139@#156!10?O#100A#112!11?A@#125??C#140??@??GCD?@!6?@#141@A#56C!8?C!9?_$#74!369?_CA_#70?o#24_#35O#125@#143!8?@#164_!5?_#81??A$#144!370?AC?A#86??_#132!10?A#157?OO#34G$#135!387?@#112??@???@@???@$#69!390?A-#96A?A?@A?@?C???A?GACG?ACI?A?C?AG@C@A@GFgDOEO?O???gS_W_G_?O#109???A?CA?A?`a?IC?Y?W?Oc?OiOgS?Og?_?_???_O_#2!22?A??C??C#76!35?G!4?A?HC?A@A??@C!7?A???A!5?A?C?G!12?A!5?A#2!5?A?A?BB@B_?_??G??POPOOO?OoOoWwwWwGCKK?C?B?AAAa#29A??A@@?BB@@#2A@H#106O?OOO!8?C#171CCC#82A#14@#28C#83@#16@?@@?@#3@#5A#26A#171@#154A!6?!4@!9?@#161??__!8?AG?OA?E@A@???_#164@@?A??C??CCCBB_K?C??A?H`?I??_???AA??S_G#92CC??G#20@!6?O#116A!5?@A??@??oR_OOYOYHCKCCGDWKcs?O?GG#112??O!4?A!6?C#132?@#107!6?G!7?A?@?@#101!7?C??C?A?@???@?@???@?AL@J?BYsLQlOlQKxCgcG_CgGO?_?O#41@??@?A@C?ACQ?gA_C#88@???IH]k???G#75?@?B?@!4E??abFN^^}}x}{w{{w{xk$#137|w{{}!4{yqZ}|poSWoxoopWpYwwOosyccA??QG_gc?_OGg#150!5?_#82!10?OgUGSgOhO`O_Gg?@#76!13?A???CA?A?HC?BGQ@QCOK?cOK?c?_I_W?G_W?O???O???O???O#2!25?@#138!9?_OGCOAG??_OC?OGDA?_@???A?C???OGAcB?C?OGE?GG?_OG?C?CGC?KGG!4?ADBG?I??G?E?E?A?@?@`_!6?G!5?CC?A!5?O!8?A#158!5_o???_oo!5O??W?wOWWWKFEFBCEAA???@!7?@??GG#92OG?G?G?G?O?G!6?G#21?B?CC@CSGWG???CG#178@_wo}LDQ?C???CP?G!7?_#179o_#91GS?S??G#145@???GoCKWwwwWO#52?@???A_!4?OG?G??G#125?@??@d?CCGC#118?oo@WWXlLKKCOo]UEz|\rQpzgyTkmSCgW[GGECA#77???C??C?EA@@@?@?@?@??@AESIScIOgO_?_O#48?@??A?@?@???C_?C?GO?_??_#95I?P#123?O#80?@Ao@!7?O#78!19?@?A?!4ABAAB$#106?A?@??@???C???A?HACAHACAC@AC@AG@A@?DGD_EOAO!4?S_W_GO?O#138!20?A!6?A?_A???O?OO!5?_?_#109!77?_?g?s_]?iOjkQogTYSkr[pkPyTidOtGWsjOjTohV_VGN`U???SO[OC!9?A??G#167?_#170!13?O???O!4?O??OW?W?WG?KG???CC#154_#160_!8?_!6?_?Oo?o?!4_owww{wwksMZrizryzzq]}~NSvnUZvUc[cOaG_?O?kocCwGo#157A???@@CC?@#57A#163??GOEJ?A#195_!6?_#157?O??GG#177??A#162???G#23?@??G@??__#136ACKG!4?C?GO#128!5?@?@ACAB@@BBAB?GI}?C#121A_qojLJMfdeAAARPBB#103!9?CA@A?@??OA_Cq@wDeOAoaHYCgOiGeYSAABASX??g_SG??_#99!9?A?@???ACA??Q?sACh?IP?_#87!7?@?@??@BNZev^}}[s{o_???O#65!7?@C@@D@@C@CO$#150?D@A?@AA@@HC@?KA?@ACCH?CGC@ACD!4?O#1!41?CA?C?C@IDHUbMbM@CHUJ?@SHE?rK_D?K_JAbQJAbQJYLPFbfvBFfnn^nnn^nnn^nnn^n~n^n~n^n~n^n~n^~Vf^n~NWeQqLOkSl]IaRiDsB]?L?hC@?GDA?G@?@?BG@iDA@GAcI?_?aGU_SGE_UG_!7?ULLF@@AC?@??BBJ@BHJ@DAC?EIQqkZ~{C!4?c!5?A_?O??CSC???I??A??@@???AA!8?A#109A?@#76@#177A#172@#173@#40!4?@#185?OG?CKCCC#174@??@#155???O!4?_???_#175???@#163?@#176!5?@??A??C!9?CAA!5?@#186C#179A?@?GG#79_#28__#15_?_#37!8?A?!4AMG_o?___#73A#140?@!4?@@_P?JCL@C?AA?C?CQQ??GW#73`#126@???AC!8?A#115_???g??A??I??C?AO?i?CA@C?Ao@`P@P__??_O?GC#107?O?O?_?_#72???@?@?ADANQLaEwEWdYgSakYSg?Go?_#85!15?Q?PA?O?cG?_$#0!8?A!6?@??@!8?@??A!9?@?ADI@A?@AC@ATaCjDjTNRlE@@A@FDANCNFTBX}jTjS`Yc@[PKPmHuHcZ{JsXuGr[qlqLolOlOlOlOdOcW?W?W_W?O_O?O_O?O_O?O_O?O_O?O_O?O_O?O_?gO_O?ocXcHqlQhQ`SHCPAH?@`ODAO?dAOgD_QGaCOaC?OGe?P?@OHC?@??@_P??`?c_a___o@A??C!6?@!4?G!7?O#3???A???B#17___!4?__#181A#3cC???OA?GB?GC???AA?C@AA#154G#124?C#79C#166A#157C#51C#170@??@#175!15?o!4?G#162!11?_??gO?O_G_???_@KB_FOCwW?w_O_Oo?wooS@@?@??_o?G?A?AA#57?G??G??O???_#86???@?C?OO#144@??O!5?_#149!7?A#130!5?_#132!7?@@?AB?Q@JC#119??_???Oop__GK?@@!4?`??C#102!5?@!8?GKGGKA?HPGCeO?gg{k{GeKoO?__#98?@!6?@?AP@O?QBS@`HRNcIJSiS[ogPOg_D?G#84!11?@???@_JAHXxx~n\[wo__$#193!11?_!4?_#104!17?C???A@?@@?@eTBIDBUDILjSySgogOhSgSGO_O_?_?_#168!16?_!119?C!11?GGO?G#76!5?A?IC!5?G???G???C?C@C?O@@@!4?!4C#64?_#12O??_!9?G#156_#155_!6?O#66?!4OGGggg!4G?KCKCCCA?@??A#159!4?_!4?CCCK_???B??@C?@BB@FDET}h]OAWO!4?_#124?@???AAA#169!8?_OC??b?hO?KCCC?CKG?O#63!7?CP??C#132??A?AA#129???A!4?AGGGC?___?OogoO_#127!5?_O?C#107!4?O#114!7?G??_gOCA_KCC?P?gP?hOE`?q@w@GOA_A?O@o???O??AC???A?O#100!19?C#93!9?@??@?A@EK@DMQlVy{Mk}cs_?o$#105!15?C?_!5?`?_??g???WWgqo?OG?GkIcO#166!178?@??@#29!7?O#166??O?!6_O_?_?_??_#109!9?_O??O#90??_??O#171??___?_#26_!7?O!5?G#21G#105!6?A#185__?_#190!18?O#155!30?A??G??_!4?_#7@#180!9?OGGA?O??@C!8?G#35!10?C#74@?G!4?C#38???@@??a?CCC__???O??O?_#108!59?C#59???_$#110!224?OO#171G#168!13?ECCACCC?C?C?A?AA?@_??_???GWGGGW?KCC?OC!7?BB@?A@@#167C!9?@A#92?CC#0A??A#156!49?C???O?G_???_?G!10?G#21C?C??@RBO_Qq_CDJPVitisw_w#142?AC@!5?C?Cem}[K!9?_!5?_$#82!225?A!4?A??oOgoogw#171?G?C#166!21?@#10@!4?A!6?AA@?A??G??!4C?C??@???@#183!4?A#184A#54C#40C#177!54?BG!5?GW!12?O#155?C#192O#51A!4?!5@BA?A#152!9?@!4?O?C$#167!225?@@#179!40?O???G??G?G#0?C#109C!4?S#181???O!5?G#174__#173!68?A?A#12A#36@#191!16?O#25!5?O?O#127!19?@#126B#125@@@A$#167!267?@@@B@#22@??@#16???G???A#28_#166???!4G#182GG!7?A#25!64?A!5?@#194!13?_#168!7?C$#194!280?_#76O?@!8?@#2AAA?@@@#79!68?@$#173!283?_#169!4?@@#189?O#15O#29??C$#188!289?O#187!5?G-#137~B}@~A|JtkRlYfYuHbI?`APCAOdADI@IdIRHjTKSoQqoSsSsAO?O??Oa???Q??O#109??@A??C!7?ATA\v}lytmTyTmp^qlQ{jSlQlOgoLsGuGS__O?o?gS_OgCo?gC_?gC_OcGC_OCgC??gCO_SGcOCGoG_GO?G_?CGqCHQcQ?qDgS_Rox{{~o{YuzTr~r~|~~|~~~}~|~~|~~}j\jvlzju\QiuH}IA?C?c???AA?@!7?G???G!4?C??G#26O???G!5?C!5?A#156?A!6?@#197_!8?_???oO?_C??CK?!5C?CID??A???A#163!11?OgwwoMoSafcxaKiUkWGg{w_O?{S{{G{wgo___?_O??_GA?_O#180E@??g?WF#36?C#203{Ku}{{wO#0O#25g!7?H_@??Ak#24@#116C?Qi_O{Wmal\MDB!7?_?OOGMA@#140@#132??@Q`???g?__G?O?G?_g#73!12?_#103G!9?@O?P_PG?e?bO_POO_FQ@EXSiC`AQgRCkW@KAGcO?GS_O_?_#99!7?@EGfSA`k?CcAH?O#80O!4?AC?W?Og!4?_#84??`B_bCrdUxJrZVm\kprpppooo$#193?{@}?|AsIPkQdWdGaWsLYCkY`LY_YoKs???c??_#96?A?@?@A@A@GBK`YC?gPC@QG_??_O?O#1!15?@??A!10?A??AG??Q?AGD_J?aHI`UGAHSaGOChAGVGBgRCJ?jOFgBGV_JOjCRcRCJtATaRAHcRCHQcGRCaHOEGB_@!7?G!30?A?C@A??Dc?_?A?QOOO?@@??@!7?@G?GH?CDD??@BA@@@B@#176C!5?A!6?@#174??!5_q__?Oww??_!5?A?OwGOW?g?_?@#175SGO?OCGKAmNmIeKSKCC?K??A#162@???@?@??@?A@?HgcA`?@_@CQIXEGY\MNFB!7?A@#169?@#124_#157W_#138G#3A#213oG!4?_#33G#21P!7?CA?B~[#86OA#145@@#136@?@#142?!4@???_owwkCANBJB#125_?_OGMGAp_gGGG??GG?OW?G!4?G??GG!8?__#126_#107??@??G@#102!7?@?CCEBA@B@?HKXEJDZY\lVKh?__oooWgwc?C#53???@#100!7?_#48!4?CO@gAO#41?C?cA?O#88A??IEEJ?OgZO???GG?GGgKO?C??_#65!7?C???C$#96!9?A#150!5?@#196SC?_?p??S_?K?D_?Gs?O?I?_#106???@?@A@?@GBGdG?PcH?H_?G_OGOG_#76!30?@#138??DA??@??A?SGC?C???C???C??OC??OC??_OC???Oc???C!5?_!5?G_CO?_!6?H???@?C?A?@?A@!4?C#104!27?_!6?G#171W?K???C???A!4?A#169C!6?C#205_#106OO!6?G???C!4?A!5?@@@#194@#188?@#173@#159!11?A#156_#206???_!7?C#159_??a?oO_QPO??aA?POPXPo@sWoGBABAB@@!8?@@ABC??CF@@A@?@?AD@A@OC?@#178_GCCtNNNw]lO???_@#173B#28@#5@#7@@#13@#20@AC#218_#164Eeuo???@?XG[#34?@#4@#58C#52O#128Sk??_?_OW???A#52?@#130C?iH_WCKA#126_?__OowKO??q`a?QOH!5?o?O#107!35?C???Ag?O!5?C_???O#77BCA@CDAC?@gPkOgSgS_S?_#93!11?A@?TGd~l||xo`@_DE??_#75!11?@!5?@ABMKMIMJJJ$#105!18?@QCGA`GA?P_?Q@Q@kAS_RJLlKMiGgG{es_Q?`???__#182!5?C#82?A?@AHQDIPID?P#76!44?A#168!51?GC?A??C?@??G??G#138!27?@???@_?o?GCO!7?@@!4?G!4?AE?AA?A?@?G!6?A#2@?!4@#210!24?OGOOGO#66?@#161G??G?K?SG?A!8?_!6?__!4?_A@??@??B??ACC??EQ?W?GAAUA??CCWE@A#164_OoWRG_O_?_OmB???]#215O#202?A#204??A#1A#177@A#57??O?AC???O??_#16??A#63_#55G#165A?@?@!11?O?C?C#127?_??O?O?CC?A!4?G#73?_??_??O#59!45?C!10?_?O#72!6?A@AA?@AAA?@AhA]hUHeWbgA#95!7?@G#85???AC@W_Sg?T_?gO?C?G#78!19?CC$#104!52?C?ASCI?CCULaVIcdfQ\ulytitg?g_#110!144?G???GG?K??GA???G#2??@??O#172_!4?O!9?CC???A#171?A!6?@#199!20?O_kC__g!5?AA??ICGU#211GWG#212!18?_O?G???O_?__#160@A@??A!6?@#155!4?@#21_!5?_#176?O#195??@???S#191k#153A#217??_#193!6?C#23@F!8?A!4?_#91?W#125_#126_#129?C[CAA!4?_OGCBBOoO_OOLND@@#121_???K@UDUTVDFCD_?_oK[?oSSC?gg_??Oo???O!4_!6?C#101!26?A?BCA@A@@EO@GALTGTi\A{@S?_O#87!22?A@ACNVN~rUsVSR?IgAsKCgO_O$#0!55?@A?QG_@ATG?@G?G_!4?C?OiCAG@QCIPgDiPM_LQlBShQkOfQL_Js@qHSJDqDY@b\aBXFhRQLr?rKBGrON?jORkR?ZcJ?rGJgRCA\aLcTQJgRChQdGhSCiPa[?IC@A?HAc@CaG?C?A??A???@?A??A??@SaSGQCSH?lOGs@sOBBAB@b@`@@O!5?@@@?@H@GP?@?HG??AAA#66O?O!4?G!4?C#211!28?_#200GOO!9?CG??CCCIEAC!8?O?C?OKGKWQE[oCGO?OO#192!33?O#194@#214!10?G#163??@#157GGo?@A?Cq#144!5?A#130G#140?O?G?C?CQA@#149!13?A#128?C?A@A!9?O!9?G#98!63?A!4?A???@?AGO@?GPKQVxH{qiA??A$#150!55?G#168!170?O?G??C?AGAGA?C?AA?IEA???E?CA?A?@#82C#182C#185__?!4_OoOo?WwGWGoSsgSOSS[]C?A?EFDENKAAA!5?B@?B?@@?_??_@``?@!7?A#201!54?A#207C#178!13?G#36@#179@?A#192Go#76_#180?C#38!9?AA!5?_OGCA??@#112!15?C!9?@_!6?_?O!8?O$#64!226?@!9?OO#170G#182!5?_#82O#209_!9?G#155O???G!5?C#29??A#190O_?o_oGgGSGKGG??G!8?ACG!5?B?A@#173!93?CG#124o?C#118!50?AAECEAA?BABbaABQZvDBFEBB@BMUStoOck?_I?Eu?PG?G?GK$#179!227?O?C???KCCCKEGAKCEC?CAC#76@???@!6?@??A#205C#10??@#212!32?O#156??A#191!98?@?UG#114!53?A??@@!4?@??@??AC?H?GA?@GGGDgO?h?OG@?OaO@OG__KO!5?O!9?W?G$#82!228?_?_#208G#166!4_??_?Oo_oO#198_#29?O#3?G#216_#162_#174_#160_??!4_??_?OOO_?gGg???CCC???!5A??FLD@?AH??@@!7?o?_@!4?_`@???___???O@@@B?@?@#169!67?A@#138_#119!54?@?C?ACC???sCCCGwgG?SCCSO?!4A?AC?Cc??G$#106!228?O#97!6?O_?OO#180!9?_#194?O#181?O#158__??O?O?OOGG?GG?C?CCC?!5A?!6@O!7?@??!4@#168!100?G#116!55?G!7?G$#83!237?_?__?O#124!11?O#104G#10C#17C#198??C!7?A#171!134?C#115!56?@@???@???@O!8?OGG??@??CI@QI@AoG@G?g?cE?O?_a___?_$#156!256?O#177???G#3AA$#154!262?GG!4?CC!4?AA!5?@!6?GOWG!8?AA-#193Ono^onO~_^o^onoN~p}P~P|rkR|r{zcy_spSOg___WS__?Q_A?G#96???A??A@A@I?E@A?@?T_A???_G_#109??IELIcJDJBLbNBMBlFNLFLYfYLJELyDzCytwsyTyulyt]tI|U{ytwpubRr^NFNJN^DACJCIP}_oIC@AKAFMKMNFNnNnM[mikUBHJFLHFBJFCLJBLDnNN^NNNnn!7N?B@JAHBABAH!4A?C???A#160_OGG?GGGC??CC!5?A??@@@#210!4_?_?_?Oo?O?G!5?C??_!4?G!4?CC!6?O?!4O???GG#206?O_!6?O?_#174?A?@#156!10?O??O?__#212???@??GI@AB@LG#162?@AA?G??BA#180_??GCS#36???_#180!8?_??@??G#21?o!9?OgOO!7?on`B#55o#125B?_@?_#142!6?@@@???@#121?_?_?OG`?_GO?aCaIaBAPAEH@OEDABbJbAAE?FjAFvJ\N\GPROP_o__oOo?_oooO!7?OOo_O_!5?OO#102??ABA?CEDE|@Eb]k??o#72???C`?g@NHcUXaWc?_#41?@_C@aG#88!7?B@?@!5?GENFYEyB?NE|?W?e?C??ooo$#137nON_NOn?^_N_NONo#196?M?m?mAKAkAKBCIDPI?I`QSIOA_QHS_GS??G?_#106!4?A@A_I@A?@C`GQ@?C_G_O#168!36?A#138@!9?_#168??@??A???C#1??O??O??I@?CA@G?DGCBC?BK#90OOO?O??O#179???_???_OooOOO#182?_???_#82???O#179?___??O?O#191O#1_#168?O#2_#166_?OO?OOO#1_#22_#23_#155_#40_#158_???o!4_oO???G!4?CC???!4A?@@#211?__!5?O?O???G#222?O?G???G??CCOO!5?C???A#212???_#229_#228_#230_#224__#223_!6?O#229_#212???_??_#163?_???O_??_OgQHUZUEFBB@@?P??CPB@P?@??AFF]TGT@?@!5?@?@#191!16?@G!4?O#57_#192_#105???_!7?C#57_?_c#36??G#91oL#38_#116EEWG\}M^iMSkw{YM^C?A#135_?_!5?_?O#132??Gd@OTCK@aWG`a?KK_O@O?DGC?O?___?_#119AGKCE??O!4?O?G???oxhhIH!6?_gOOO#107!4?DC@?@HAH?C_O_O#101GALqDdYQu@}OcQg_#48C?@?O#93??@qOTAtnV~n^nwkvepqOqooo_!4?_g_#84@A?AC@K`IjBMB$#105!18?@!5?P!7?C@I?IC@CHCHC?AHA_iDoAZDhIhKGK@S_gsoW]_Go?W?O#1!43?@!7?_#110???C??G#170!4?G?C#64??oO#138!7?A???G#2O#64O#214_?_#97O?OO#110!10?C?GACGS?GA?CGAG?OO?O?_O???O???O#104mGM?C???C??G!4@#2AA?A@@???@#166@?@#221A#26A#189A???@@#156@@#219!10?_?_?__?___oo?_??ggGGCKKKCCC?C??@#227!10?__???O#224!6?__#162!19?Go__SG_a#223??A#195?C??Sg_?_#164???sIsXm_?DA`__?_inUPfVBJ^XU?RsG??@o#168C!8?O!5?G??@#86C??OQC#152A#149S#130G!8?@A?AA@@?A@#119!4?__OwWO#127!4?O??K?_??O!4?O??OG!4?O?O#143!9?@#115??G?@?A?CAHC?HC@A?Q@U@?@?CA?R_@aAD?i?_SH_OO??OG#77??@AL?LaY`CGS?_O#99@?E@AW_HA_?H#95C?tIOg?O_O!6?_#94!20?O#75??@$#137!30?P?I?C`C@IPE`AHUhCTHTqF|CwUtSosOS?GS?I!5?G#82??@?A?@!6?O!5?O!5?_?O!4?_#104!26?G#166!12?_#82!13?_#166?_#168@!8?@??@?C!9?@#208!10?O!4?O??OO#214_!6?O#226O#106???OG???@#105C#82@@??@@#182@!4?@?@?@#154A!4?@#199!16?OGGCCK?ME?CAA?A??OO??A??__?o!8?OO!6?_??GO#155!19?_#176KKKA@ELD#161!14?@#21??a??@!6?@!5?g?O#76!7?_#203O???BMX^^~}PN#4@#164FJJC???oO@#63???G#225?G#140oO!4?@?@?_O??_O#126?__OW[]LDMFCElf[zC?C??A?G?Ad??D_???cC??_?@?GS?O?P???_#114??@I?D?ICA?F?AC??C??GDIA@G@C??@KAgC_O?cO??_??O#59!4?_#100!6?@#53A#98??AG@?WdA^E|]U?iG#85!8?CQGOIGDGHAH?G_G?KC?G?G?GO_O$#104!60?_?@??HCa?ADCebZEVLnmtxqdYsgO{_[okO{Oo_Oo_???_Oo#170!58?G!4?_!5?_#97!4?_??O?_O??O#196!6?_#193!11?_??_???O!6?G#184G#208G#192C?C#138AA#190_?oOoo_g_!4w!5{}}]]]^^]^N^M]NGEED?A??@!7?_?__?Gg!5G!10?CC#160A!6?@@?!5@?B?@@#178!12?A!4?IyK{qc}gS]oOw_g?_ACOCKALMEJIED?@!4?C?EhNkJu??EN#25G#177O_!8?O#51_#28_#157G!5?AB#127!5?@?AC#125!13?OO?CB@AA??B@AG@?@?W_gGPOCC?WOGOOCC?_`w?OGG!4?_?___#103!5?A?C??CA?C??C??C??G?GA?A!4?@?B@???A??gOAi@K@AtOA?W??G#123!15?G#80!14?GC?G!4?Oo?o???O_?O?O$#150!62?_#0O!7?GP?C???OO???O@?Ac?Q???`?AGOAGAdWdQCHqDyCzDIDIDiDGQDI`ITAHADI@EHSgK__oo_o_?Kzoxse@YDpwyt_@G@A`__!4?@A@DA@GAC??A_GCOWAos_a!9?_?__???@??C@eKLGLEDCCCE?@A#15G#156?G#185_Oo?_??WOW??CC!4?A!4?@??@???@@?F@@AB@BB?!4@!7?__?O?OO??KCCCEBCBFABDEEE?A@A??!4A?@#21!16?O?SG?_#157!19?WoWo???_???GCW?G?__#106!5?E#202_!7?_#23???_#13C#178?C#176C#124_!5?O#129!7?G!6?C?@AC?C???A@#112!4?O#128!9?O!4?__!4?G!5?GG#116G#112A!6?A?A?G???@!4?_#107??G!13?CC#112_#59!14?A#87!49?DADED???D@DOR?O?fdbGRIdSK?K$#104!166?_?oOO?OOOG???__?O!9?O???_#82!12?C??G#66!7?___?!4O#209?C#194CC??A#220AA#150?@#206?A#174A#29@#224!26?OOo!5OG#174!4@??@!6?@ABBA@#231!4?_#200G!6?GW??OGWGw__?_oSe?kO?C#177!6?G#164A?OO?_#169!21?OO??G#194!15?G#124@#204_??C#213@E???@M#18?G#79???O#192_?C#3A#25@?K?C#128!4?@crA@o_OoG!4?__#127GKKB#73!21?_A??_!4?O@O#118???c_!5?ECCAIWF]CLGJp@?@GaxI?U?o_ea?@GT[?NmK_gSOWGgOG_$#214!184?_#166_#198!24?_!6?OO#188?O#173O#177O!5?G#155?G#181A#172AA#212C#10@#159C#209???@#212!28?_!5?_#211?__?O?GG!4?CCC?OO?O!5?G???GG??O?O#161G???S?O?GOG!4?_?_hHO#57!33?O?OOO?i??s_???O#208???O#171C#169O#215?A#96G#36!8?A#173???B#138C@#137G#5C#7G#12G#126!98?O$#83!210?O#218_#196!9?G#191G!4?C#201!4?C#195C#162?C#197!34?K??AA?@@!4?@???AA?AbA@??@??B??@#222OO???WW_!4?_#207!70?A#217??@#162_#155!8?_#169!4?B#153_@#14G#20A$#12!226?G#228!45?_#206!4?A?!6A!4?@#221!12?!4_#171!97?O#106G#191O$#200!279?O!7?_#109!116?A#202A$#175!280?_??OO?_???OK?G?!4GKG???@@@E!4C?G!4?KGOGEIHV@EH#215!75?O$#156!283?@?@@@$#159!285?O?O!6?G??C!9?@@A?AFCCC?E?CEE?@!4?_??_-#193~}x~}~~}|~x^~m|!4~|~~}!4~\}z|~Sjx{B|gCTu[yhdu|?O!4?G?CgC#104!4?@!8?DBA@kyP@I_WMBBbZ]}\NzM]|V^x}T~i|~j]xukWgwWGwgW_WgwgOo?__!8?oO_O_Oo!9?_GG!8?O!6?C?GgOw#182A?A?AA?A!8?A??A#54G??_??_#160?GG??!5C?O?GAK?C?@?A??@#224!7?__o_o?O!4?WO?S?G???CE?CAA?A!4?@@H@??CCSOO#199_A??_?_!8?O?O!6?W?Gg_!4?GA#161AOP@@?P?A??B??@#51O!9?O#21_???`Cag_OO#57?_!5?_C?IA?C@CEEAECDNDIW@BI\oos@?W#192@@#195?K#162@#155@A#124G??G!9?C#20_?AA#39GE#116w??OopIOHAG@?@#132SaAGC#119?OghPAO#125!4?_?o?O_?@OG?cSa`bOIi_IO@_?AO??M_E`AfAM?G`po#119???A?@?OC__Dff|WGH!4?CDC?GEEC!5?GKC#103?_?@?C@iOCO?ScaH__gCG#108O#99!7?HCKE@A?Y@cieHqComGs?gO__O!7?O#80CCC@GRG#85O?AG?C$#137?@A?@??@A?A??@A#105!12?A#137!6?A???@i??@?AG@?hATiDQdrGBqPj`GI`??O???_?O???C???I_?G#196?O#109?@??OCP??G?A!8?A?@ADFFvFVf^eUFVnE}^V^~n~V|mzMcZcIcGg?A?AGJFLLVbHHGGGPH?HH@F?C@@BFEEFC??C?GKGIAKC!5?@@?@#1@#31C!4?A#218@@#159GG#174_!4?O?W!5?CC??A#219!5_ooowOW?WG_gGgK?CES?AAIFJA?FBD@B@BAB??G!4?OO???O?O!4?!6O!5?GG!6?C!4?@A#159?G!5?AA!4@#92??O???O!5?C!4?_#164G?G??C_g_O?_???@@@??@@!4?@!5?@@!4?ECA?kAEGGOOC___?___?AO?GC#63?O?_#51O#92G?@#140@@!4?O!5?@#112!9?O#118_O#127!9?_O!4?G???A?A?OA#115?_!6?@#127?E?E??@???G#73C#112!4?@?CO@A?@!5?@!5?O!9?C#107!11?O?I?Dg?G#77@??XEoShOo?O#48!5?@?CG_#93@CGSHOLON@FHBDJFRNIVfJ~D~MzjZyuce_oooww{}$#196??C!7?C!8?A??@!4?_@CA?jSCB{AUPiHaDSQG?Ak?Cqc??O??_#96???C!4?H?AOAGC?A??i!6?G#82???A!4?A!4?i?CA?S??GOC#106??_#168!5?@!4?@#171!19?ICGCAC?A!8?MEECAC?A?A!8?C??C???C#154_!7?_g___??!5O??GGWWOCGCCCA?@??@@@#175!11?A!4?@???@@#197_?__OoOO??O?_GoGWg#206GO!4?C#231?GGG!5?C???A?GG?CC?C???A???A?AA@#212C?__A?@@?!5_#176_??_C??A?@#160_A??_GOGO??_#163?@#178@?BC?W?O@@B@?A#35_!4?__#86@???___?_!8?_#177?@!5?A??CA?@!6?_#179??@#91OgSA#125OE?DEDACaCSPSS]I?@BB#107!5?_#132!10?A??I@D?@???@??O??S@GG!4?@@!4?@E?AGHOg#143??_#118?_gw[[qOW??ECJ@DfBQrjaxXXhXXHxvQZMMe[Ig#102???JiFJQ[UU??G#98@??A??A?e?R?PiTNcwP?Oe?i?Oo?oO_OG__G?O?g!4?_#88C??ONNKFFBB@$#239!11?_?O#105!33?AS@iPGHQKbSHMS]voY~~nuu|Lg_pkP?K?sOE_og#179!58?C?CG!8?oo_o_#96_?_?O#214_?O_#64_#96!5?GG#237_#242_#106C?A!4?O!4?CC??AAA#104@#2@#220A#150@@#177?A#226@@#201@#185!4_!8?GG?CCAAB@#222!8?CCC?C?_cA???OO???GH???!4C???GOOSCO#185??A!4?A`?_@?@??__?_?_?O_O_O_?_#211??WgGOOO#174?CAK?I?GO??G#177!5?g!7?@A#176!7?BG#180AC?KM?S?KC#4_#1?O???G#157@?@??@!9?HG??@!6?_???_???_??G??b#38!4?_O#49_#121?G!7?___?_?SgOgtGVCI@lWiPICPEGFCNCCEABA@???@??p??QP@GGG@!8?C?ACJQlk^yNE@BA!4?aoooGWWGGGCC??AEEAEE#101!16?@??HEOAaCkHYchIO_?_??_#41??A#95A!4?@???AGACGC???O#123_#87!8?@?@??@$#106!64?C!4?H?AOCGA??aS@?@OC?C_??_??_??_#166!47?_!4?_#191!8?O#97???_?__O_?OOoOOG!5?O#191_?OC?A?A?@#48O#66O?O??GGG??C!5?A?A?A?!5@#211??_?o?GWGKG!4?CC??!5A?A???@!9?GG!9?_a___`@`_#221G?G??!4CAE?AB!9?!5@#200???CCC?___#155G?K!7?g???_COc?A?C?AEA??_#186???@AFB??A#36_!7?A#179A!4?OO!5?_#178?@A??HCOCGC?A?O#156?C#173G!9?A#69!6?C#55G#73?A!6?_!7?C#128!19?oO?_OW??SOKcCK???C??AACoG_GdO[Oh`O#114!13?G!6?CA??_??O??_?O__O??`?pPG_SQi?D_#72!8?@@?ABCdJStHUgQ_O?O#123???@#41!8?C!5?T_GC?Q?`?O#42???G$#0!75?O?@???D?@?S?C_@?_??`??_C@??P???`C@A`Q!8?@???G@?G_?O?gAPC@JCJTJFV!5POOoQ_CEEFFF??@?O??WIGIK_?`?@?GG!7?@@!6?@#198???A#233A#181?A#180!6?@#164@#156@#92@#197_??O??GG??K#212!16?GC_C!4?AA??@G#174??!4_O_?o#229@?@!4?G?G??CCCO?!4O!5?G?GG?!5C?C!4?AA#228?A@@#160?G???C??A#195!28?@??@A??A#173A?A?@#97_!4?O#90o?GOO?O_#180A!4?B?A?_?OS?KGG??G???S#25O!6?OC?@#148_#130??__#129_#126!8?_?_GOcOIf?ACKAfTmtZmHvGH?I@!9?@??AA?A#130_#112@#126!11?AC?AcDQO#115!8?G?AC?A?ca??_??P??_???_???_??PA`@CT_O?O_??_#120!16?G$#110!145?GA?C?G???Oo!5?OO#138ACA?@!9?C!5?C#153O#174_#158?!6_o?!5OwkGkccssOQ?AGJEAAG?FABAA??@#229!13?O?O?O???GGK?C#200!4?G!6?CC??CE???@#238???G?G?!7G#161@#224@!4?GG!4?C??C???@A???@#154?CAC!8?O#25!26?_!9?C!6?@#168AA?A??Kg?_#171!14?OO??W??A#204A#152!8?@#132??S#128AHAK`LQHEII?@@#116!21?__O_?g[?K_O??C@GGcC?sq?OWOWG__OO#69!18?@#126???O$#214!145?_?_#97_?_#106!11?G#82??GGC?C!9?A!4?@?@!6?AA???@??@#190!12?_?_?OOO!6?C?E!4FBBB!5@?@@@#199__?_!7?O!8?sC#210A??O#190A?A???@`@?@??_#234?C!4?AE!4A?AAA#227C#190OO???O#158!5?G?A#163O@!6?@@?@#124!24?O!4?GC?C???A#170O!9?OO_#28!15?@#15@#23@???@!6?CGC#127!5?W?G#140!39?G#73!4?@?C???O#140C$#64!146?_#90!21?_!7?!4O#192_!4?OO#208A??C@#188G#28G#209CCC#199!18?_?O!8?C#228!16?O?W?G???C??C#175!5?G!7?_??A?A?_ABA!4?@???_#220?A??!9@#235??A#206!12?O?O??SOC#169!29?KGK!4?C#16_??O?G??_#21???_!9?OA???@@A?DAACEEAB!5?OGGB@#129!54?G#119_!4?@$#168!168?@!4?@#226??_#166!7@?@#196?G#11O!8?C#210!19?!4_Oo?wo?OOOWGGG?GCK#200!5?A?A#210???@@@???@#159!5?OG!4?_#228??G#227?G#236!6?CCC#206??A#159@??_!4?_??_?_?_#156!18?CGGGOW??WCCG?@?b@OG#79!16?_#207O?G#196??_??O#17?O#14_#83_#169!7?C?CS!7?oaa__?OO!7?G!4?A#142!62?_$#181!177?A#1??G!4?G#168??CC#155O!9?C!5?AA#185!44?_?__O??O#161!4?_O#212AA???@@#197!7?_AAA??_@!6?O??O!5?G_!7?CO#162!6?C?eaCiEegREZkZ[[badLx\V]Q[SOG#12!7?_!8?G?GKG?G?WC#36A!7?G!9?@#191??O!5?_?@$#241!177?_#193???O!6?G#15O!9?C!4?A#223!80?A#235???CC#222O!6?G?G!4?CC?D??__#168!43?O?OO#21@#110O??C#194!32?O#51@#153GG?C$#105!182?O!9?@#177?G#232!95?@#160_#200O#174??_#175???O?O_??O?O?GG?O#138!44?O?G#109?GGG#207!33?G#216C#57?_??C??@A$#207!182?_#243_#156_#179!4?AAE#227!99?G#210!7?G?G!6?_#23!53?A#64_#192!36?C??A$#237!189?GG#150G#240!170?O#168!38?_@oWK_$#110!189?@#202!211?C?@$#79!401?@O-#193VFdBFTBlAO@L?P@WVfdVFdfRNfrmFTFrkJC^cj[JuVVvFzFqGPcY?hO?PADitIPg@?C!8?_#0??A#104?@?CA@GI?dXEAiDPIARHIeBJAhXHdvffU^bfl{zskv{}t}|u|Vm|JsySkDvJHQIAB!7?C?@#160_???_!6?O??GG???CCCA?IAB@?@@@#161?_O?O???C?O???G?C??C#227???G#190?@???O?O?O?O??G#159?_?_?_??O!7?_#190ACA?C!4?A?AA@???A!8?D@BB@?@??@!8?@#228O??O?O!7?!4O#206G?G!5?G!4C#195?__#156_!5?@!7?@#226!6_#12?C?CC?C??AAA#245C??C#97CA?C???G!6?G#104G!5?C?W#110O#34_#169?@_?@@!4?AA#36?C!4?G#92_?O?A?A#142CCC#119_?_O_???C!4?@!4?@#128???___???AGeIBIHH?M_EKRDP@CAOY?WG!6?CCWIOIPioSACA#118!5?@!5?O??WSA?OP@??AHBNH`@P`@OGGYuQTsM\II?aO#102!4?GWPXnvDt?wO#72CCB@CAAtLUPYPi\gydwoGoGO?OG_OGO_O?_#93A?DkO[TY]|rn^|~j^vm$#196g?W_W_GOChEoBkAD_GOGoGOG_OG?OgOGRcZ_JSBsHggGwCwLtiZduSjlisgO?_cAWaOaGCO_C_#106!7?@??A@?I?AOD?iCP?cO@GS?CA?QG?OG_?G#82???C??GA?G?A?A??AO?C_#105?_?OQG?G_???G#2O??@#153O!7?CCC!9?@#208??@#174O#197___O?_?_!5?GGOO?O!4?ACACC?DdA_@?@!6?!5G?_?_OcW_k_iA_A_??Q`o?O?O?__O?oO_??P@_A!8?G!7?A?AA?A?Q!4?AAA!9?@?@#189_!4?_#235_#186?__#228O!4?G??C#79?_#162A?@!4?@?@??@??@?@#96G??GG??K???C???A@BA!5?GG???C#90IAEB?A?ADC#157?@@???A?C??C???AA???A#16@#132_!5?G???IGg_O?OO??O?WGGCoYCG?GEC??@?__??o?O!4?GG??@??@#129_MYEG?O??@_#132!4?H?O?g?E_Op#112??@?GCa!4?@??G??CO#114???EA??A?BO@?@_A@o_TsICiT?ahC@?C#101!4?_BkQzCsJoSGq@mCgS_O?O#120!6?G#41!5?@???A?D?QG@i?`AG#85?_??O_G@$#237?g?W_GO?WEwA{AkA?OG_GOG?O???g?g??O_?O?_#137!9?AC??HACQCGO!4?CAG@ODhASG?W?P_?a_?GC?OO??_G??O!7?_??O_#1!36?OO!6?C!4?@#158__?oOooOWGGG??CCC?AA?A!4?@!9?BA@@??@?@#219??_!4?OO??KCKK??ACCCBBABABBBA@?@@@#200?G?G!6?G??W?GGCGC?GGGWG?C??O??OO???CC??C??CC?CGGG?G???AA???A#178_#195_#243___!8?_#230!6?O#164?OO?OAC?m?BCA?AC#51@!7?@#57A???@!5?`!5?O??O??_?_!4?O??o?O?@?ASSAaA_?QGSSOO!4?B#49???_#39OA?@@!4?_#112!6?H?@!7?@#116???O?owSSOCCDAEL?A@ACGAcqs_cuAQP@pRmlzbcDcdcCC#73@?@??O#143!5?O#119?@HHTb`gkNfemxHduwo_GKGSgc_?_GCGG#107??_?OGCa???O?_???O?O#98!5?A?CHA?g?`A??A@?DJbFPF`N`FhVcQMUXdWQ?D_?D#88!10?O$#239?OAC?AcA`!5?O_G?A??A?c?GCP?A?C#105!25?@ADITIPcTiLqQlJr^f^m^|\]}rw{cctOC_w??_cW?Co??og?C_!7?O#196!27?_G#166_?O!8?ECCEC#173G#96@@@#174_#185_ooOoWwWWWwkWOWG[GYK?L@LLDDC#206_???OGCCG?AA?A#210!6?a`_AHH@@#206?C#175o_G?WCG!4?OG?cSSI@WGC?O?J?@?P!4?A??A?!4AE?A?C?ADABBA?A#199??A?A#159?A!4?@@#163O??_#199???@#26???_#155?O?O#216?!5O_O_O?O??OGG#26__#7?_??OO#193_!6?__w!4?__o#106_#105__#14A!5?G!5?G!4?@!6?O???O#164??A!6?_?_#20???__???C#63?A#118?_??O!7?AEAC?A??!4@#140!7?o!7?OSO?@??@!6?C!4?_cGc@A?O??@#127!4?A?a#115!13?GOA?OO??O?O??C!4?CGSG@Q???_A@???dO@?iTCA_E?O#77???ACAh?wGoH_!5?C#99@ACCGA?CGaGQ?QGA?IC``CW?g@_A$#96!83?@?A@?I?@?T?I?`G_?PG??C?COG?O?_#182!31?Oo!8?G!4?G#170?AA#180??C#2?@#190_?_?___??!4CAUCQMAM!4A#156_#154@!5A??@@#230O#185!10?O#211?!4_o_o??SC#185?G?CKOKCCE?A?`???@A!6?A??A!6?@?@@@??C!8?!5@H@@?B!5?@@#223_??OO!7?G??GG??G??WGC??GA#21???A?BC@@???AB?B!5A@@@#16C!4?A?A??G???O??O!9?G???G_#21!6?O?A!5?_??O???@#69??O#81?W#73ggG?O???O#126!8?OG?C?C!4?AIC@?@#52??O#129O#130!5?@#127?_?a??@?G#121@#126@#38_!5?O#121!12?O@g`LiE}Zm~uqCaKCA?_???Ea!4?OOo_???CcC?G#48!39?@???CO?C_C_COC_?G?G??_$#0!96?C?AC??CO?A?A???G?OGOA?HA???A??G?gO?cA?H?Q??c@@??@!6?AFCD!9?A@??@#82@#106@#173A#205!4?@#180@#176@#199?__!4?o??o!5?G?C!7?A?A`BaaqP?BP?O!5?S?WC?O?O?A?oW@@bSGCBWlBF?@Q@?@@OA?AO!7?EGI?K#206GG!5?C??OC??O#210?C?!4C?A???E#15!6?_#156o?o#15!11?_!5?OOS??GG#13?O#35OSCKG#0?G#90C#218O?O?O??O#25?@#104COB?CC#83A?@CDH@HAA#170G?OG??W?G@A?GG???G?[CC!4?GG?CG#114!7?O!4?_#127C!4?O!4?_??_!5?C#49!6?_#142!21?CC#126!17?G?PGQDG?c#69!8?@??G!4?G#103!4?CAA?A?A?@?@???A?@?@?GTGQ`EGa?GiIL?@#93!17?A#95!13?@!4?A??A??_??CO?A?C$#109!103?@!5?G?@?C?A@?AP?@@?@?@??@??H@ARGGc?csDCGG?AAI!6?@!6?A#196?A#194??AA!4?@#175!8?_?o?O_??OGK#174O!4?A?A?@@@#212!18?@?@#211!10?OG??C!6?CECCC???!4C?CKGGKGH!5?A#156G!4?!4_??__#189?__#173_#219!4?G?GCGGKCKCE?E?A#178!11?AC?DC#177?@?GW???GG!4?@#91?@#182?_#2G#170C!5?C!4?A#138_??_#36?_?__!9?_!4?_#25!8?_!6?_!5?@#38!4?CA#121_X??O?CeDHhZEL]ME]AEAB?@JDDB?B?@!4?__?O$#191!144?CC?CG#194_OO#138G#156_???O!4?G!9?A!6?@#200!10?_???GCKGC!7?_#161!37?_??_#222O!7?G!5?_OOO?Oo!7?CC!7?CCCGCG??G!4C??!5A@B@@@??@A@#173!7?___OW!4?A?E#70??CGG#83O?G#150O#82??o#239G!5?G#153O#76_?_#90H@@?CCG#79_#12?O!4?O?O?O??@?@!7?g!8?CG???C?@#103!4?O#74A#112_#128@!4?@#73!11?O$#179!144?A?C#64@!8?A!9?@#207???A#212!20?_!7?O???Gg!5?O#206!35?_?_#174??__?_?@@?_@??@!6?__???G!4?G!6?_BA@#175!4?!5@?@?@#18!4?_#163!14?G#25???G#6??_???O#37?G#14?O?CC#198!4?__#164@#168A@!8?__?_!7?__?__!7?A@G!5?G?AG?IBAEGCC?A#145!7?A#116C@AD@$#97!145?@@?@@???A!5?AB???@#223!29?_#224_!5?__??WWOG?G!5?CCCAAA!8?@?@#210!14?G??G??GCG!4?C?O?C#224_#161???_?O!8?CO?OW#178???O#212O?WG?WOGOg?C!5?C?ACDFA@ABbBBBFGB?A#2!6?___#25!4?A#166?OO#157!4?A#86AA???@!9?G?AEAE@DVCDA@!8?O!4?O?O?O_??_O#192@#91O???g???D#152!4?A#125SGG?OO??___?__?__owM_OO??G?GaG`G???A_KwOgOcQGHA?G?@!7?GAOIOIPAgl?SE$#110!145?AA#29O#168C#106?G!8?@#164?G#229!34?_???O?O?O!6?G#159!44?OO???@#219?__?_#154!5?O?_?WOO?O#176??__!6?!4_??_!6?OW???G???G?GGCCG???@?@?C!7?A#204!11?O?O??O#246G#196O?W#109O#3O#35W?G?B!4?C#37???A#208?C#179`@KacCG?_aG{CC@?G??G??@!4?A#130!10?A@#141A$#209!146?__!8?GG!9?A#66!28?@@?@#228_O!5?G!5?G#154!42?__#158_#212??O!5?_#54!4?__#66O#50_#177__#155_O#224!16?O!5?G!5?K?A?C!8?D#57!9?O#28C?C#203!14?G#183C#169@#110??GG#124?_#34??O#4??O#145??C!4?A?@#245?C!5?C#215!8?@@#191!4@???@@#126!12?G$#171!146?G??S?G?G???@!6?C#236!32?_#222OG??G??_??CCCS??A?GA???@?C!7?AA???@#206!24?_#159!10?C#158O?O??G???G#211!13?AA#189!33?G#244!17?C#241G#20???@#9!12?O#20OO#124??_#55!18?_!9?_?OgGK$#220!148?_#96?B#216_#174_#192O!9?C??A!4?@?@#231!24?__#160!77?G?G?G!7?@#25!78?_#51!31?_OO?CC??@$#207!150?_#150???A#154_!4?_??_!4?CC#23!230?O?G???@$#201!154?O#198G??G$#243!155?O#176O!9?CC$#214!157?A#155O!4?G!9?A$#179!158?@-#196ASASA_GQKO?C?CHSaSJCgU`SICaTIPgEhCPCi@hQ@GPiT_TItI`ZeZa[c[A?AOTipQWZ_lYShYSiSiOaSKQKOcG_?@?a?o???__???KcWOGC!8?CSK??O#214?C??CC#160_!4?OO?GGG?G???A??GABCE?B?@#222_???OO!6?g__!4?C?O??AG!4?@@!4?aAA??!6_oo???O?G!4?C#154?G??CK!4?C?CC??E?C!7?A#161@#227!6?G#230!5?_?_!5?___?_!9?OO???OG??G?C?CC!8?C#206A#234_!5?G#194_?O_oooOo?_o_!5?!5O??G?GG!8?A?AA???A??G??GGG!5?G#168@@??@@?@?BF@?A@?A@A??A?AA!5?CGG#90A??G#38@??CC?GG??_#132C?IA?AA??C#38_!4?GGg?o?O?G?_#127!4?C!5?@?AA!5?C#140@??`G?g@?OO?I#127C?C?E?G_?WG#73_?G??_#143!4?A??A#119!4?A?A@@A@??S???GK?AYAC#102??C??AA{goAOUaVSC!7?_#98!4?C???C?G!8?C??GC?@?A??I@WJ[WUGlB@#41@#85@G@G?C$#193g?g?GS??_Cg?gO_?H?_Q@?GB_PG?_E@OQIIPCQSCmbETiNiTAtMcXc\bZb|~{laDKcCcS?_?C_!4?CG#208?_#104!7?A@?A?_CAA?@??A@??OQP?A@@BPHB_@AAHGA@?A@@B?@@BB@@???A#4A#20A#50A#190_#188@#173@#155?@#159?A??G??O!5?G#219?O___??G?OOO??CGGGAA??C??@??A!5?@!8?O!6?__!4?O!4?Oo_?OO?OO?OGOO?OG??G??C?!4C??CGCC???C?S??O#223OC!8?GG!4?C?C?_O!4?G??GC?C!4?A#178A#201?_O??_#188?CC?C??A!9?G?GG???CC???G!5?G@G#162__!4?_?_!5?___?!5_??___#171O!4?G???_?_#157C?CCA??@C??O#63@#91@#55@!8?AA#69@#73A#126??C?G#52!4?_???_?O?C?G?G!4?@#132!4?CC?A?AG?C#38!4?_?A!7?A#121!6?@!5?@@D@BBmFLj^XntZ~h~z^l|t[{QwWEqaeAEAAE#107???@#101!9?KCGG?GGHITUhVGIDZChZ_\aXiPuLsZ[nO}KWSOsWk[?S_?_A_?_#93?G_OC[}}rypyx|{$#237TiSJsHSkRgShSHUhSjShUhUgTITiTgUhC`?i@gA@O?g??O?_G?O#105!9?@A??A@B?B?@AA@A@@@ITHQLonZv]y[gO[@VR`@@ao~pWAdA?KCCK??KCO?o?O?O#191O#186_#173_!7?G#199_?!6_!4O_O___!4?GGCGO!6?AAA?A??_?_@BOooOPWHw?wKsgcOo_{sWSDWCGB?h`?GQTKLC?AEPA@!5?@@@??@!7?@#212??GC?C#155!11?@@#154@@!4?A?AAA@#231_#232_!8?__?_?_!4?OWO???OO?OGWGCoO_#189@#187?oGGKW!5?G!4?O#171O!7?G!6?C@A@?A!9?AA?G!4?!5G#106C?C#76C#204GGG#4C#13C#207O!7?G#138A#57H??G?GOOWQKWOs?_O_#140@!5?A?C?E!7?O_!4?_??CA??A?C?C???PA!5?W#73???G#142_?__???g?OA?O#126!10?@???@??AA_?@gOC__OGC?C??_#118??A@?CCeGHHWlHd@X|dwIeOA@#77!6?GC?G??QSI`QgP?O_AO_A?Oa?A?aIc??c?_!7?o#131!12?__#88??CCEDAAB$#239?@@?@AB@?BBABA?A!9?_#246!7?OC!4?g#239?C#137!20?GO?G_?GQChOChSiS`?a@_B???@D_UH`MG_WGWGG??A???`_?_!4?o!9?G??GG#185_?_??_?OO??G?G?G???O#200?_??_#206_!5?C!4?G!7?C#230G!5?CC#212???C#211!5?G???A?IGEBFC@??GDD!4AB#224!5_ooo__GWggGwggwgOgGWG?OG?!6G?GKK?C??KSSOW?S[CCGG#58?A#216W?o?__!8?A?_!7?A??AA!7?D!7?A?@#209CG?K??EC?AC#164_???_#176_!4?O!4?_???_?O_?O!5?O?O!4?O!6?O#173O#9?C#3C?!4C!4?A#35A#12?A!5?A?B?CSG?_#136AC#52C???C#121@@??BD@G#129!10?__OO{?O??OO?___!9?O?_GG_Gg?o_O??COO#132!8?WQPA?eoKG_?O?O?C#115!12?A?@?@??@?_?O_??COPAg?Cl??@?@??@#72???@?GC?EDACXECWaLCPK?O@?`OJ@QbjiBaRaCg^US?B?Ba?A$#246???_??_!6?_#192!20?_?O!4?O#106!49?C???G?OAOD???@???A@OaCGA??A?@?A@?Q@?A??AG#154O!6?C!5?C???C!4?@?@?A?AA@@#185@?C!6?@!6?@@!7?G#212!8?@#185!5?AA?A!4?O!7?@@?@?A#222?O#229?_!5?_?_?_?_O_O_O_OoOOoOw_WgOgggC_G#155???@?B@?@@BC!9?@?@??@@#229?C#238O??O!8?O#15?@#173A??@?A@#220_Co#198C??A???C?@#182C#214A??A#30C#196A#105A#109A#138AA?@#26G!8?@!4?A#212O#79@#57@?A?@B@AA?AACAC#203G#36?@#194?O#191GG!4?O?_#164??C?H??@#14?A!4?A??G#116@??B!6?o?oo_OGOoOWy[Y[?CA?CM?K`l\UCXryhhx_osocGG?OI?ROFFKfjAmhJJ^?O?o#118!9?C#112C??A??A??_?O?C?Q?G_?g??OC#114??OO?_???@_GdOGQ?P??A?@_#53!11?G!4?@!4?_@???A#99???@??D?@??@@?@?SCS?D`TAWA$#184!11?O!25?C#150!58?C??C#96A!4?A_??A@O!6?ACCCE??A??A#174_!9?G??G???KCKG??ECC#224??___!8?O?OO!4?C!6?A!5?@A@#197!14?A`?__o?GGG?E?AAAB?@???@??@?!5@?@??@?@?A!5?@!9?AA#227!4?O?GG???_?O??G?C?C?CC#235?_!5?!6_?O??G?GGC?C#195??@@#172GKG?OGOGG!9?G!6?C#180G?G???G??G!8?A???A!4?A!6?O!5?_??C???K#25?@??@@#86??@#180??_#124G#109C#37A??G?OO#125@@?K?OGi?CBCcBM?E???@?@!6?A!5?C??AE?BGB?ODVCDC?C?G!7?C_C@dIE`leS}??!4O!21?_#103!5?O!7?G@uhOkBU@oa@S_b___???_o??_#53!24?G??_?_?_$#182!97?CC#0!5?_?@!5?AO_AgG??@??HGC@???@AA!4?@#156C!8?@#161!4?_#54!6?A#228__??_O?O???GGG???G!6?C!5?@#174!17?_!4?OOOW?CC??GAA?!5AC?EAAA?!4A?AA!6@???@!5?!4@?A#243???_??__!7?GOGOGG?CO???O!5?G???O??CC??C!6?@A!9?_#195_???_??OOO__??_OO!4?O!6?O#201?G#173?@?A#169???@!7?@!8?i@gCSOOoo_kCk__g???_#170[?_#96O#104_#128@?G???WK?O??S_@G@H@DADAB?@B@@BB?A?GICG@QO?DK?C@?Q?BOR??G!4?@?Cc_?piY?w???G#48!92?A??G@G$#110!104?C#208G???G#150??_#97_!6?G???C#156?__#188O#179CCC#207G#153C#162G#109A??@@#158!5CAAA??@@@?AAAB!4@#229__??O??O!4?G?G?CC???CAAA?AA!4?@@@#200!12?G#190?@?@?@@?@#156!4?G#155!6?C#160A!5?A#228_?o?_O_O_O_?__?_?O?O!4?_G??Gg?OOO!6?__OO!4?oOGGK?GCGG?GG?C#221!9?OO_?GG#26?A#3??A#106A!4?A?C??C!7?@#104@#220?CC??C??C?C#157??@?@@B!4?@!8?A?A?A#179!4?B?A@!5?_!4?_!4?@!4?O#58C#110_#127@#74G!4?_#119?@#127???@?H?C?A??@#149???_#130???_#142_o#49??A#121!13?@#130!10?O?O$#191!106?CG??G?G#110!6?O!8?C#189O#177O#197_?_!7?O__G???O?WWWoWSCWSGKGEMIF@?C?CCECB@__?@???@?@!4?CG??O#206!17?_?C???O!5?G!4?@??@!5?C?D@?C?C?C!4?A?AA???AA???!4@?CCC!8?C!7?A??A#176AA???AA??A?A??BAAA@?B?A!4?@#20@#31@#193ACC??A@A!7?@@#187C#216??OO???O#192A?CA?A#28?@#164?_?A??`!5?O!4?O?A?A___#170?@!6?@#21??@#36??A#183!5?A#142???A?AG?G??O?_#52!52?C$#109!109?O???C???@#171?_???_#182??G#198O!8?A#196A??@#210!5?O!12?C#212??OO!5?G!5?O#231!4?C!6?A!4?@@#158!24?GGG?!4C?C#156!7?CCC?C!5?A?!4AB?B?@AAA??A#50!7?A#156??BEIKJDEB?BA@B@???AA??@B!11@#164!5?A?A#29?C#218!5?C#76@@!4?G!4?C#124C#213@#202@#233!7?C??C!5?!5C?C???CC#153!4?G!6?GGG?O!4?O#16??@?@!9?A@#35???C??O??_#56O#144_$#193!109?_#182??O#245!6?G#194_?_???O!8?C!8?@#161!19?CG#190?@@@?A@!5?_!5?O?O?o?OO??C??C?A#227!23?O#222!17?C#177!30?C?C!5?@?@A#231?O#154?@?@#92@#205_#248___!5?O__G?_O?_#177??@#201!11?o__OO!5?O??G??GG???A?I#163_!6?_!6?_?_O?O_?O#161???__#105!7?G#186_#202O#201_?O#193!18?O#165?A#86_#70_#145O_?O$#192!121?_???O!6?C?C#159OO??O#175O!4?_?_#200!19?G!4?_!6?A??G#176!90?G?OOA?GAC#247G!7?_???O!7?C?KCG#181!17?@HGG??G?C!8?A?A@@@#11???@??@#243?G#192!13?CGG!7?G?OOO#130!25?A#129?C#149A$#82!127?G#193??G#155O???G#201C#195C#105A???@#174!24?C?C#210?`!4?O!5?___?_C!4?CKGAGA?O@WOGKSKSA#235!64?O#15!4?@!6?A?A!7?A#227??C#153!25?A#186?_!8?O#209!9?C??C???E!5?C?CCC??CCC#11!5?C$#191!139?A?@?@#211!25?A@!7?A??_#189!97?C#238??_?_#224!10?CC#138!29?@#207_!6?O???C!6?G?@?@??G???G$#175!173?A_?A?@!7?G#109!140?@#204??A#137@#178_???___O?o_?_???oO??Oo?oO??o_O?O?OA???OOO!8?_!9?G!5?O$#159!175?A#242!154?@#216_#241BB@A#21!10?_#186???G??G$#173!346?O#124!4?@??G!6?A!6?@??@@!7?A???C?C?G-#193i?G@_C`OC_?@OcH?i?I?I@CH??Qd?GA?QH`?Do?@UCQgAPSJ`ciQctJWdYnnMlS_\aXEgDi?TgQC?AOCW?G??C??AOA?G__O??__O?OOH???CC#176o??GW??KAE?A@!5?!5_OOO!6G#178C#224C???CA?A?AAB#230?@#210??O?KCGCK?EEKBIDJCKDNFFJFBEBBA@DBDA@#206AC??@??A!4?@#199@#222@#243!6?_#249?O!4?_#223?@#232GWGW???!4GWO??K!5?___A???_?__!6?OSOS!9?G??`?``@?`@!5?C#180!12?G???O!7?O?O@?OGO?A?CCCAA???@#57A#55_?cGO!4_?C?A??E?_?C!8?C???G#62OGg__O_O?OOO?O__?__??__???OoO?OOooo___#145O!6?@@?G?_w??__#130?O???B_?O_?O???O!5?O#128_A??O?_?`?`_qAAA@GGHdOCcOKGSQDACGO@?G??G#126?O_?_?I?COI?AO??G??G?CACC#143G#115!5?O??CA?H?kP@GYdkG?GgO?_#72!13?@A?@?D?A@!9?@?@MS!4?A?EGP#131G?AQ@s??Cc?O?_$#237TiTiThUHqLYsHQChDydIpm@qlQlOlQlQcQKOiDY_H_DOdI_CGP?HA?_A#137!6?HA???O@_?I?C?qCXaHCpcXAwEGgCHcA@O!5?GW!4?@??BAA?A#104?A#197__?wOG_KG!7?CEABAFB?@?@!5?Go?gO?CCG?CE?A?A#211!4?@@CCACBBA!6?@??@#231!4?_?O??O???_??__goo?OWowoSO?G???OWO?CCAAAI???C??CC!6?A?A???A?C?B!6?C?C??O#235?A??AA?AG???A??A!8?@??@!4?A??A#173??G??G!6?C!4?_!8?C??A#54__!7?O!4?_!8?_?C?CoG??_GG__!4O?O?O#53_#133_#77__#177!4?O#69?__#180?@?@??@@@#179@???AA#55O!4?_#241CC??OO#74EIG?OO??_#52?A#149?C#116!8?!4@ESvnnYSmuEtSDUTUVCh[|wEdeQNqRJrb?@OOOP@!4?G#119!8?O!8?`CaQ?__!4?__cc!5?B#107?_???C???A?C#77A??A?I?H?@?F?iCADK?\A{?E_SgTqdEGFGECYOObtnEb\Op#134_C#93?GSHUHUJPBtJ^^$#196?T?SAOGAHQ?G??AS?@Od?Oa?Ql?GQdOl??QCOACQ_H?DG_J_OAPcXASdYdOOpQa\a\ehUYTtiRlHzcLq?CA_h?WOCGSIcCI?OgM^B?@#22_#7_!5?G??C#105?@#156CO??I??@?@_@?G?O??G??OO?_?_?g?GOoGW#222??_OoOoWGK?XSOOS?WAGO#229??_?!7_oO!6oOwgwWGGS?K?C?C?IAK_CI@MGDMEDA?I?!4ADDD@D!8@???@?@?@@?@@?@#187??OOO!5?G!5?G?KG#220??C#186??_??__?!4_?_?oOooOoOOOo!5O_?O??O??_?@#124??o???O#21_!7?C!4?A?@???@@??@?@!6?@??@!5?@??AAA?@E??!4G?GG!4?OOWOGWWIGIC?KGCCCG#12@#90CCC???O!5?O#14O#116?@!5?@#52!10?A#149???O#52!7?G#125???_?_??@?@??@!6?C?SgcIHJ_gUJONBDj`G[SCCC!6?GG#73?G!4?C#114!10?C@KCsK@?eP?Y?o_O?cO?_!5?G?G??O#53!10?A#59!4?_??_#53!5?G#40?O#100!4?O#98gvd_c??_Og?G_$#192??a?G!7?A#184!20?c???G!4?_?OC??C#105!31?BIPESB@FPa?P?YDN?OP?CB#150MMAA?DB!5?@#216?G!4?@#174?___!4?!4GCGC?C@!5?_O!9?CC#229?@#199QOA?JBJH#224???__!4?O?OO?O#236?_#197!7?CCA???AA??@@@#247!13?_???__o???OO?O?O!6?!4O?SKC??CGC??!4CAEC!4?EEE??F!4?@!4?AA#187?ACE?C?A?A!4?@@@#188!10?O!4?G?O@O???G???G#23_???G??G#63G#155?CAE?AA???AA?AA?A??A!5?@@@B???C?C#164A??CC?C!5?GG?HG#139!4?___???___#168?A?@A#14@#16GG#38O!8?@@DE@GGYKCDBkJsgOohOC??G?G???@?@!6?GG!6?O#127!10?G?C?A?GO@OCA?I@??O#112!7?`?`??@??O?_?_@QC?A#103???A@G?OQ_Gad?RCWaTGgOWSAaBg`GOPGGgOG?g?OG?_OgKWgOG_W!4_???GW#99!6?QH?gAGC?O?C$#246!5?A?c??`?_?_?O??OC?OC!8?H!6?C?QG!7?C??G#104!26?_!5?_#0_!7?_!4?_???C?A?G?@@?@#124??A#194?@@#222_?O#199??C???C??B@@?@???A?AB!4?@#195A#161???C#219_?_?__``!5_o_oo?WoGoW?WGCWKGKKKMIKILA??D!5?A!6?@#228!9?A?A!8?GC#248_?_???_?_?_!6?!5O?OO?GGWGO!5?G???G??G!5?C?CD???AA!4?@@?@A?A#187!10?@#176CAC?E??AA?A!5?@?@#15GC#92!4O?OG?_aC?E!7?GWSOOWSOW?EQYOOCs??_?GG!9?O!10?O???O!5?O#36C#25G#69__#96A???O???O#37_??__#129A??A?A??OG??G?JWmmsh@GO??@?@G?GGG??GG???A?OO#132!9?___CA_Ce?OOCCQBIAOAGC?CG#118?AAUqO__!7?@OPC~zwooAB?MO#102!4?@F@?@DLD`tSsUOo??P_O__!4?oW!5?O?_O#95!21?@_AGA?_$#184!10?C!6?C#192!17?i??`G???A???O?G#208!39?@??@???JE#2???_??O#31_?O#15O!5?CC??C#200!7?K#159A#155O?O???_??__oO??_?W?G#163C#212!25?O#222!18?@@?@#236O???_OOGO??o?_!4?_?OWW[CEKC!6?AEE??CA?ANMMMEG!8?A??@!4?@@@#216_?_?o__O?A@AAIAWO!5W@P@???KCGC?KCKCCC??CEECCACAA?AC??A?@?A!5?@!4?A???@#162?@!7?@??@?@!6?@!7?@@@??!4@???G@@@BECCMCMEE!4C?K#57!4?@#86CG!4?@O?_???_#140!4?C?A@@!4?C!9?A?a!4?_O?`G@O?A???S_?C_A?G_HG_??B#73!5?C?_??_?O?C#101!47?AA?A?G?G?E?fCaDAATaSBi@DIDA@A@F?F@IDM@GAO`C_nGFA$#239!11?ACHOA!6?G!4?A!7?@!12?A#96!41?_?O!8?C?@?@#26_??G!7?A??@#210!7?D??A#162O???O!6?G#228C!6?A???@?@@#227!36?!4_G?O?GO?CC?KACC??A!4?@!4?@@!7?AAA?A!9?GG#228??@!6?@???__?_?O??O!5?_?O#205!7?C???O!9?A!5?O!6?O?@#178!5?A?@?@?@??@?@A??@@#73!4?GGG?O?O#59G#148_!6?_!6?_#69?o?O!5?_#178AC?CACC???G?!4@?@?@!6?A#245!4?A#104@#97@???AK#142AAC@?AAGISCC?WwW??BFNFEc_O!7?CG???AAA#121!29?_?_???_@h`hrjtztMtS?@KD^JXZzV}LYJGj#114!49?O??O$#184!96?C#191@#3!4?_#182??C?A#21?O#18?G#161_!9?C?F?Qg#211A@B#177??_!7?_#223???C#212EA!4?@@?AA#174!38?AAA@?@@#247_#238!16?__!5?O??_??_?_!5?_?__!9?O???A??OGII??G???E!6?@#173!9?O#195?O??C?GC?C?G???GCKAGGAGG??G??GG?L@?ECCE?AA??B???@#176!9?@#39_!4?_???_!4?_?_#163!4?@???@A?A?AAACAAECC@!7?A?A?A#164AAA#109!6?A#183A#35@?G!4?G#128!6?@@$#237!96?_#10!8?O#198G!9?@#190!12?A?@#154???c!5?O?OO#224!51?CC?_??IAAE??AB@@A@B?@@?@?@@?@#235_!8?O!9?W??G??G?G??GG#195!4?_#221???G??GG???CCC?CCC?C??CA???A?A?A?A??A?@@@?@?@?@#223?A#26?G!5?CG?GO?GWG?G#58_#50?__!4?C_GOKO??Cc?C?CO?CAC?C!5?C??C#23!6?C#59???_!5?_#169!12?@!4?@@@#83!6?GG@G??G#136B??C#56!4?O??_?_O$#226!105?G#6O#106G??CC??A??@#160!11?O#92!6?_!5?O#228!55?GC?C?C#234!22?___#221?_!4?__?_#249!5?_??OCAA!5?A!4?A??AA???C#223O??o__?OO??G#207!7?_?_?_??_?_?_?_???_??_?o?o_O???_#28??_?_??OO#156???C!9?@#140!4?G#81?G?G#23?@?@#156@#177A?A!7?BA???C??G#161??!4@??A??AA?A#250!5?_?_#239!11?C!4?W$#214!106?C#173___?o???G#161!23?C#200?A??B@@@?@@!6?G!5?@!7?@#230!27?OOG!5?G!7?G__?C#243!8?G?O!4?CGWG!9?!4_?aG?`!4_?_???O?_!8?G?@!6?@???O@!4?GG???GI?AA!7?G??G??C?CC!4?A!6?@#121!14?_#72!28?_#40???O???_#91!11?G??CGGG??O?O??_#70@Ac?_$#164!112?GO#185!27?@!57?@#216!32?O!6?O#234!6?O??C?C?GC???AC#195!12?_???_#194!12?C!4?A!8?@?@?@?@#164!4?C??A#223!5?@?@#177_??O?G!4?C!6?@?A#39!64?_#152O!4?c??C!7?_$#4!112?C#206__oO?w?CsIQOY@SG?CC!7?AC?G??A__?CcTkWGG?AA#230!79?O??@@?@?B??@??A?@???@?@@???!6@#173?@#176@POO??G!7?!6G#248!21?@#36!8?_#79??O??G#49???_??_?OO??GCOOW?W?oCO_GgG?GgcWG?_GG???G#214!40?A#237A#63_#130@$#97!112?@#222!28?C#201!148?C!5?A??_???___??_?_@`@?@___#51!8?_??oO!4?OG!8?A??C!5?A??A?AA??C?A???C!5?G!8?OO!5?O#244!18?C$#195!112?O#189!177?@#18!42?GG$#202!112?A#164!221?CC?A!9?@???@!6?@@-#193C?A?C???A??Q?C?i?CG@O@G@A?D??H?D@c?AWcOcGcHCXCHc?QIAkta@UlId]dI\A|A|AsIPgASJSdWoJA?CAD?CE?DQ?A#24?_#28_OO#173G??C??A#219??O#197??_?A?@???A@H@C#15!4?C!8?A#197!5?@@#236O?__OG??o?OoOoWOwooOS[?C?C!5?C_??CECC?B@!5?E?AA??AA!4?@@?@#248AA???A#235??_?_!4?G#224C!4?A?A?!4A?A#195?C??C?@?@A?A@A??@#171G#192_#232?A?@?@?@?@@??@!9?@#124??__??QOOg_gS_O?WGgOGG??C??A?D?AE?@??@#92OKKEEAVMEFBCJAE??@@@?@!5?_#73?GGG#59??ooCC??_!6?@G?OOGOHDo@??A??A@GWO??OO?_!8?O!7?A#148@#39A#250?@@#73A!5?A!4?G?C!5?_#130G?@??A?@?A???G!6?@#149??@#125!5?o?gO[AboZO}Gj\DHv`[IIQ_``@A#119?GO???OWO!6?GO!4?@CBHDDSCKCCW?__??!5_#112!4?A#102GO?GKG?@aOe]CGYue|_?EEaap_Yc`pJmu}u^EOkCC#98??abD~J[gEWX{xIh{Y|$#237zItkRkJslTYcJp]@[qB{AiTuGtqkRSlQ_ZcPaHAXAPaOaOaXc@S`A?Cg??O??O?_#137!6?@ACH?O?A?D??@@@?GG?AQ???G#32C#2C#15_??G#206?_OWSKYKMMKFKDEDAQWGAKHHA???C!6?A?AAA@???@@@#231?___#227??__?_?_#235_???_#247?_O?O!6?G!9?!4ACC!5?G??BA@!9?_??A?A???@O#229?A?A?C#171???_?_?_?__#223!4?@#172?_?_?_?_#243@???@@@#205??A?EA?A?@@A???A???A#26!6?_?___???_???_#195_#173!4?OOG{[CC_?C?A?@@#51O?OAGHKG?@#140_O#39ACC@??A!6?_?@!4?pLC!5?A?LF?@@?G#102?CGK!7?_??_???A?_?`__A?a_?OO??GG?G?_@g!6?@??_??O#116A!7?OCCOO?O?okWSgGHHw_AQQUkw[!4g``WpD@[E`AC?C!5?A!5?O#121?DKKWSC`BNU|ne`fd@@fbfbebbbae?C?GGH@AGG!4?C#107!4?G!6?O?WAO???O_O?O#59!7?O_GOCG??O?_O?@??OG??_#100!4?q?o`O!5?O$#196?@?@?P?H??@???@!5?C!4?G?Ac?Q?O?HC@?@A???A?A?AHc@S@I@UhQdY`ItA|A|A|JskRsjcjWfIS@AICGC!8?@#7O#11G#156_??o!5?CA?@@??__?O!6?C?E??@?!5A?@@?@?@#247?O?_#231!15?GG?_?kWKW[K][MaMAEG@@@OOO??OO??ECCBB@@?@?@??@?@???@#232@A?A#195_#249@!6?@@#232?G!5?G??GGG!8?C#221!14?_#172?___#171_O!5?CSOOWKOSSOO#76G!5?G?G?G#164!9?O?_og?S__!4?C#55G!4?O?@WWKHO?WIA???@_?_O#119C#125C?AAS??A?A@??@#119A???A!7?C???@#99??@#103__???_?_?_!8?_!6?C!4?__oooO?H?G#132?@!4?O#136@?@#129A??A@BFDCCQ?@CD_aAF?C!5?CCDCSMAE?A#127_???G?A_A@S??WCGA!4?O??_#118WWo__!5?OS?WWOO?[[SGOxWOQQAQPrR?}XPomCYOOOoaa_?_??__#77!4?@?@?B!5?@@?@??@?BCE!5?_@`PO@d#95!5?C!4?A!5?C$#246?S?QgAoA?I_HsI_SaGsAhS_GTAG@G_??C??GCOc?sGCHCGC??G?GO#239?O!25?_GWOG#64O#246@#104A!6?@#26???G??C@A@?@#161!4?A?@A#174OO!8?C?E#154AA@@?@#230?O!5?_?___?OO!15?G!5?A#232_?_#238??OOOW?OOOG??GW?GGG?GGKCC???EEA?EAC!5?@?@@?@#186_???OOO?O???O?OG!5?CC?CKEC?C?ACAAEBAA?BA@A@?B!8?@@!5?@@???@#138?G#29AO#205?@!4?A#171!9?@#157GOWGGOsII??@@@#56?_!7?__#54??@?A!5?A?A???@?OGC?QP?C\?GU?UGO_o_#77?O!4?_?A!8?QO!6?OO?G?G_OW?KCO!7?G??C#59?O#149@!9?A?A???G#165!8?C!4?@???AA#132!12?OO!5?O__o?KADDG?OAA`?C#143!5?A#114??GG!7?GO??__?_!4?_B?AI?OGCJCA?[?QKBCA?A?CaGC!6?@??S_GOCGOcO?G??H?H??CAA#72GOiTOG#99??A@Wc???cO@_$#192?_!4?C?O#239_!6?@#192!7?_??O???_G?Q???G?@?O_?@??Q?_???G#105!26?C??OA???@?@#10c?O?A?@?A#79??@#212_?O??O!8?C?OCQ#229_?__?o_o?_o_?O_W_!5?CQCKGOW{K[KKKMCM!4EJABBB@B!5@?@?@#234GGG?GG??G#221???G!5?C#249CC??CC?C#173O#189_?_?O?G#234!4?@?@@#231H??@#194!9?_??!6_?_?o?oO_o_oWowowwWoGWWGCGG#76OOg#1O#106?GG?O#11!6?G#180!8?__?OO_oogi_?A?AA@#25O??o#15?CA#58C_?_#155?@#38_o!7?C#49CCO???A?@hgK??_C??B@#115??_#118!6?_#250???A!7?CKKCWO??@@HDECHGCG#101??A!4?C?C??G!8?cOA?c#142??@!4?@?@@!7?@@@AAACC?G?HHGPBB?@AAA#126!22?@???BA???E??@!5?Aa#73a#69!12?A#103_??_!5?CC@?@??@CB?CGOCHCD?RHS@IH?GS`HWA]aGPCHAE@GG?S@!5?A?`AA#93!7?C?BC@E@EA?A$#184??G!7?C!6?@!4?A!9?A??_?A???A???_O#96!34?_C???a?`#82O???G?G#29??C#164O#176OGWkCGA?@@??GO??_g!5?A?@@???C!8?@#249!28?___?_?__??G?O!6?O#228!6?O!4?G!4?_!4?@?@#15O#156!7?CC#201_?_?_?_o__?_?o??OOWOWOOOWOOGWGGWKWC?K?KCCCGSCCEAEC!4?ABB`AeAaB?BA@!5?B@A@?@@@B@D!4?@!4?@#169@#23C?o??A#91_?O_#128??_!6?_OoGOOO???O#250!8?G?G#92!12?@#62@_@!9?KK#121CCC#69C???C?G#53C#251??@@@!6?@#119?C???C!5?CARIGCWGCC!4?__#127!14?O#52!6?_#112!33?C!5?GAOHC???C?C?C@???C?A?C???G#101!31?B?C???@!9?A!7?_??GOGTGK#131!4?A@??A!4?@$#239!29?A?G#183!49?O#17_??_!6?G#5_?O??A??@#216??A??@!4?O#155_O#222?ADH?A#227??O?O!9?C???G!4W!28?A?A???__!4?c?cCd`@ROp@@O#243?G?G?gg?_o_?CC!6?CG!6?G!4?!4G??G#247@?@#207!8?G?C??C???C?C#220!8?O#29_???G#188E??C?C??G?C?C_?C?@SO?K??CCC?C???@#26!5?A#21?GG?sI_A??@#50!6?_O!8?A?@O!4?OC???@#114?C?A?O!4?O???E!4?AAA?A???AAOGO!6?OOAOGGG?OO??_OQQgOC]GGKK?eGO?c??c!5?_#38A@HKK?IAA!9?D???A??!4O??@?A#115!25?G!9?GG?O??G?G???@G!7?_??c@??I?Q@CAHK@XD`?a`O@cqGC??___!5?G!16?G#134!13?_?_$#14!83?__?O??G!7?A?@#188CAA#224??!5_oO???G???DC_??OGOXGWGG?CC?KG?CCE?EIACIBEACA?!4A?A#243!12?O??O??C?A#224?_!7?__@#176???___??O!5?!4GOGKWC???OAACC#228?ECMAKECAC?DCECA!4BAA@A@B@?@?@#192!14?G#181OO?C?Gg?_??G_GGKOCKAKCAE?A?C#57!14?_#177!6?G#152_#63?OO#52!7?_?O_O_?___?_#62A!4?@@!5?G?GK#103!10?G#101C!7?`!4?_#122_#72!5?A?A@?DFCEEHAAEBA?@AA!8?O#128!5?A?AA??OG?O???_???_?OOO?@?o___?C!9?wK@PM``KHCl?bC?AA?O__o_#102!32?_!9?@$#192!87?_?C??A#177!6?_#155_#243!4?@#154!6?_#223?G?G?_??O??A?G!4?CC!9?C#228!34?@?@#223__?_?_?_!7?_??O_O??O?GG!7?C?G#205!4?_?o???O??OO?O??O!4?G?GG??G???C#26!18?_?A#207_O_?_C?`!4?B?O?@@A@??ODY@AAM?EADAB??@??@#148!19?H?@!7?@???A_oAA#40!20?__o_KWQOWC??QA?AGHGAC??G!4?__?_#69?__??C???DAA#107??_#145!5?@@#152@#140?A???G???O?oG?Cg?_!6?C!8?GOcG??A$#35!87?O#0O__C@PA?@@#181?C#228!19?__?_?_??_???_O?O__O_O_?_?CGG#230!35?AAB??@?CA!10?G!5?O#221??AAA??@#227!5?G!8?@???@#231???@#5!32?_#195@@#127!62?G#132GCG??GG!4?G#115!24?G#72?W#100!4?@#111@@???_#120!5?@?@#111??_#122?_#99C#139@@@?@#121???@??@A#100?_#125!9?A?OWGCCO???_!9?O$#202!87?@#1G!7?G#162!31?@#155?A???@@#177@#216!48?C!6?_?_O?O?O__O?WO??_O_KC__oSWUmWOIA#207?_?_!9?O#11!34?G#180A@#121!64?A?C???A!7?O!4?B??OO@??D!6?C#107!9?@#115!10?_#108!5?A#98C#115!8?G!5?O???G?cW?c!5?_$#33!90?G??C_#219!36?O!4G?CC???A!6?@DB@B!11@?@#234!38?A#177!4?O#230!15?G?@@?@D@C?@??C#124!32?C#81!66?CKG?CG!7?A!8?A#119!32?O#118!15?O!7?@@???_??_?__$#6!91?G??C!5?@#54!31?@#227!77?@#138!61?_#140!68?AO???OOC#125!61?@#121!14?OG_!6?_$#3!91?_???A?C?A#69!242?C?C??@!4?__??__Og?__gkGqeP?ABA@C?A#81!51?C#127OG$#106!92?O#52!336?A-#237~Tj{Je\iSNsnYntZexQntYfxVkWbC|B~?TgBk@QDiDYDITIC_?C?ACA???C@A@#241@!7?_?C??GG??CAA#173O#176O?O?WGGCE!4?@A?C#230???G???G!8?_?@?Oc@@o?H@d?GoOOxdgH_AECA?@?APbaCC!6?A_!5?O[GIGAK?G?AI?@AK?C!6?A?@#220??_!5?O#171O#195?@#181??O#201?W??_a_ORDU^EbBRo@xghwogOO_WGwoOWCG?O_??OO?G??KCK?CCEGC?E??DC#195c??G!9?GO??C?O!4?@C@??GG??EW_CghgpSxq@C#21_?B#58@w?G!4?WOG#132?A_oOS_wECA?O@S@GO!4?C#50??G#39E??AC#54?O#115?_???G?G??C??GKY?S!8?@@?O?g?L@A@_`aHG?AwgcOiG?AO??WcCE@@?A!8?@!4?_c?g#125B@EC@?GGOS@CK?OOO?`?oOAaA`i@PP_GX_`oOR_AC???@!5?@??AC??o!4?@#119?_?@@?_G???_OWG?cKKGgkKCECM[Wo_Ooo!4?E??@@#102!5?__``aajk}Z]^^NNNLFDFFFn~FCAbE#98O???@?@???@A?C@IAD$#192?g??C??C??A?d?A?O?@O?@O?G!4?A??O_?G@!8?G?_!4?CgOGOCG_G?O!4?C#90o?O#226?OOO??G!6?@#227_??O?_??GC?CSOoW?w_C?CCKEEE?G!4@SBAGaCGg?_G??G?_??C?KKGG?IyWGIW@?G@WHGGG?GG??CCA!5?B@B@@!7?B@C#173?O#194?__?__?O_o?o_?_???_o_wwGGGggwH_XW[gLeEDEDNVNLNFFEFFEBFKKLJKEDE!5BABAB?ABB@@BAB@#173EM??!4CG??CE?C?ALCAE?AE!4?B@?A???AEC@?@???AQ#25@O#23A?@#56_GGOW@??SC??A???@#125AoO?O?Go!7?CUGUUK#114!4?Wg?O_OogGQC!4?W`cG??AA?@O?@_S??AA!4?@?EHCEQXC?tXCa?_?WhX?E@?A#122??C???C#114???A???G#128??A?@???R??C?A???A@?A@AOP`OPO__?P!4?@?@#143?O???G??C_??_#112?@!4?A??CG_?@_G_@!4?S?CA!8?_G#103!12?O@?_???ICPgS@QAOTSB#77??_???OO?WgOgg???B??X??O_O?_$#184?A?@!6?G???G!6?C?A!8?D?@!6?g?O!9?ACACG?C#240?_#150?@!5?@@?a@#14C???A??@#26??G??C#181A#224_OoGOWOO!4?QAB??AA!5?C_cCS?CGAKICE_E?G???CCG???O!6?O???G?G!6?C?C?A??A#235??_??_?_??GO???G??g?G??G!9?G!7?C??@#207S?C#187??_???_!9?__#186??_#248??_???o?Ooo__O#232_?_o_??_??_G_?O_?O!5?__??_#31ACA?A@#36@#57??@#180!7?C???B??@AG?AAA?A?gG?O#51_G?E?O@G@#140A??@#49@A?_#118G#121G!5?CCAAAMAAAcyo_`?__@@WG???@@AA#125B@#103??AG?Oc??O!6?O??O???C!9?AH?@?I@?C_@??c?O?GgE@CDE@DCF`??IOaCWO#127???@???A!6?G!5?_?_???A?A??P__P?@_?OC!5?@?@BBAA#118??@@???CC??CCC?C?Kcwo_@G_p_ZQOeC@@@pPpbFNHLHJhvaf_MCGQ@o?CEG?KGG#72!7?__??_#103?O?OO??G??O#100?@!4?@ABN^Y??@$#246??SA_XaOJo@O?O?cHAk?I_GC_QdGo?{?IGAs?yCw?O_go__O!4?@?@d?A_OoO_???C?A!7?@@#11_!4?G??C#230_#22?@#229??__?_!9?C!7?_G?O???dO?_@O?G?_ODi??Q@_!9?_?O#238???AA!4?@`!4?_??OO?O???O#188_???O!5?_???O???O!7?YUUOGGA!6?C#248???_#171C?CA#220??A!9?@!5?@A?C@#172@#171??CCC???C#220@?@@#248?C?E#243G?_??OOo??_OO_???_OwGo_G?W_GWGW@CEG@GED_!4?A#164???o@A#63G_BG@#52??__?__?O?@#81G?C!4?C!4?@??_!4?A?`@?OIAECD@?A???AA#102?oqaA@BIBC[??`eIggINIE@#119_GCA@A?uoo!4?_O#118!10?E!5?@!6?!4@A?c?wW!4?_#140?@A?@?@?@#73!5?G_?G!8?A?A#141!4?A#112O#116!4?@#73!8?_O!8?A#143!7?C#115?_??@??AO@?_??a??_?Oa??S?G?W?@q?o@Ia@?K?CC!4?C!14?oG#118G#72???m?D?C?G???GtIyCtgZ$#193!4?O??@_!8?C!8?ASH!4?A??O?gAO?CA@?@A[kWgwOgOa_@?DEEEB@@BC?C`???A#166OSOGG?CCCAA@#206!4?C???AGGG@c???A?@@@?@H@#176C#228!10?@???D@?CAA??C!4?G!7?@??@?@#206CC#176C?C?A#229?@???CA@!6?@A#205_!8?c??_GKCC?C#173GG!9?@#172!18?A???A#235!7?O#192?A?A?A?A@!5?@#207?G#235!5?O#216!4?Og??GWGOG?GwO_GG?O?GCGEK?ACAC?OCK@?GO?OC?G?CO#57@#207K#13_#18C#37O?_#55CEeACC@DA#142?C?@B@@?@@#119AA!5?SOCG@!8?c`W?CCC???C?@#77?@?@!6?q{WW?AEC#69?_OG?C_CQO!4?o#102@CA@C?AXK~^BBA_oOGC!4?AA??IA?CSW#132@@B?C??COS?k?GO_QIg_O?O!5?C?KIICAAGOG?gI??c!4?G??S?C?C?WG??`?@?AA!4?AA#103!9?@?@?Q?A#107!16?O?GC?_!9?O#119!17?oO$#196!25?@!8?C?AC@?DA@?CASG???E!4?G@OI?GGWC#97_!4?GO??G!8?@#189?G??C?A??@#236_!9?W!7?aA?QG_a_???O??!4OC??H!4?@@@bc@?`_???_oO_o?OO?O???@?@@D@@??C!7?A?A#26__???O???O!7?CG??GGCD#205?EEU@VB?A!7?W?OO!5?O_O?GG`Go!5?GGgOgW??OG?W?S???gCO?A#176O!8?C#28A??C!4?A#186!8?G_?_O#223_#212_#178??O?OK?CHE#124??K#177?C#91C?O@#50?CA?AA#116???I!7?@#140_?__!8?G#59!10?OwgO_?OogHCO_?_?GrbL?C@_?O_??@A!9?C!6?A_#101!10?oG?___gWwGc?s?G#121@?AOC_wo_g?c?g?gOcCCKkKK?CCC?GC?CCI!4C?M?CX??hS_c?g?gOGo??AbNKYYyuXXw]o^OPENZIFBC]?__!6?G#101!26?@!4?_?_?O__O_?g!6?@?_mPnYmy[so_ctIoCpGQc$#239!28?A???_?O!12?@BBB@?@??@?A!4?_??OG??A?@#237A?@#182?_!8?@#18!5?A?@#155@#231_?_!4?O_wG!7?QGAIGG?@O!5?AAa!5?AAA???@??CD?CCQAa??o__x???@_OC?A?CC??C??C#201_#194_#223@??@??!4@!6?@@#172?_??_?___#243!34?_#187??_#186!7?O??W_oO_w?oWg?OgG??__#124@!8?@#228?_?_??Oo_Oo_o_oO_O_O?O!5?_#38!9?OA_O@?_!5?C#127?_#73?CWWKGGGHOC@`@`B?M!4?@?O??!4A!5?@#107???C??C#40!5?@#101??C!4?@#121?oOoWWKKK#72!22?o_?GO#77?_?O?{?g#119??A?C#116???AA@@?A@AA@??A@AA@A@@?O??_#114!53?@?Q?A!7?E?ECAGTG?pICcICPGOBQ?O?G??@?@!5?A?A???O???cK$#242!49?O_O#105!5?O!7?AA#245O#137@#252A#35??G??C?A??@#223__?_?O?_SGG?C?CG?E?cHDC@?@??GGGC!6?O!4?A?E!9?OOO?OO?O?A???G??!4C!4?AAC?A#228!7?A?A?@A!6?!5A@A?@!5?@#209!44?@#26!24?G?@?EAABA?@?G?@?E???!4@?@A@A!7?@@#128!20?C?__P?C?QA__?_@_#49?C?_!6?O?OGG#118!9?@#101!7?@#72!12?C#118!8?@_??O?@#107!21?@A?A?@#108?AO#112!11?G#126OC!4?o???_???O?K?GGC!9?IC?C?_hJUjUYuQ[?kPNwyCC?p?`!6?A???@#102!13?OO$#96!64?_!4?c?A?_@???C#167O!8?@#156!4?AAA?@@#174@#197!4?A!5?@#234O?O#243!17?A@#247!6?__??c!7?@!4?@???OGW#248?_??_#224!12?@@#216_C??S!7?@!4?B@!6?A??@#181!58?@#180?D#11?@@?@@#5?@@#227O#157?A??A#144!39?G?G?G#69!10?A!4?G?WO?@@!4?__@?`!4?CLC?C#99!53?WWO#100GO#73!16?G#49A#129!8?@#69!71?G$#183!64?OG???G#64???C#2_#82__!8?C#228_!5?O??G!4?A#219!4?@??A#235?_#216!31?O#249?C??C!7?AA!6?GG!5?O#247!10?A!5?C#232?C??EBA??A#188!73?A#230??O???O!9?_#145!38?O?G#115!17?K$#153!64?GC#83__?O?G?G??E??A??@#234!14?_#243?A#232!6?o?_o?_#243!45?A?A??_O?G!4?G_G_GGOO?[_[OOS?G_GW@A?O?AA@ACABD?@A@?@#189!66?G?C#223??_$#244!65?O??G??C??A#214O??G?CCAAA@#249!21?o#238O?O?O#232!44?@???o!4?_O_?_?OOSc?CK#189??_#187?G#248G!5?CC!4?C#231!79?_#79A!7?@$#208!66?G#104!11?@#1@#216_??_O?G#221!74?@#180!23?O!5?O!5?G???C?G?DA$#30!79?_#207O#29GG!4?A?A@@@#186!98?G!4?G?C$#235!81?O#201!112?GG#221O?O$#192!195?_-#237~Dq}hUKrC~iTnqlyKzlUxNuj\alYftYmOLQKQ`oAS_sI?Q`???C?A?ED?a@_#226OOO?GG???@#243OOG?GEA?AC!6?A#212!4?GG#223???GCGGW!6?C!5?A??AAA#189O?_!4?_?_#243???CGA?K@IGO?K?GIGELWI??EG[CGA??CC?G?DC!4?C!5?GG???G#235O#172!8?@!5?@!7?@#188_!8?_!7?_???_!5?_!6?_??_!8?OO#26O!4?_?__!7?_?_???OGO?OOO?OOO?OOO!9?OO!6?O#25O#7_#34_#20_OOG???__#55@!9?_#132@#130??G#125?@!4?@??BAA??CG?SSC_?oO_#115@?A?ICCGAABA?@?@?@oYwASAGCGCGCaAP!7?@D?CC_??CB@@@?O?O!8?OO?GGgCcQDC?ALOAA#112@!4?G#125?AAAEDD?KAALGASP[OVB?`Dc?oG_?O?O?_o??oG__goOOCcCC??OgC#73??@#112??OC_?O?gOO!4?O#132?@#73?@#107!13?O#103GI_POPQ_AXPKhLO??@AG?A?C#100!11?_??O??_$#246?OK@AGrCX?T?OHACR?AgA_GOATQ_?Gd@jqdplIFLHB@PF?IAKC!7?@#214G??_?O?CKMEE#82CA@#247OOO!4?C??CC#223P#243!12?_???O!5?A???C!4?G??C#15?_#249???C#231CA!4?A??@??A!4?A??@?B!4@!4?@#232@J@JA@??@?@#173GG#180?C?_#247_#221@!5?@#187!12?OC?C???C?E?CA???BA@?@IAB?@B@BBPO??@@@#186!6?@_?O??G?A?GG??@??C@A?@!4?@#228A@DA@E@BB@?@@?@?@!5?@A?A?@B@?@?@!6?A#28_?_#21??C#36O#15EA#58@??_PO?O!4?g#116C??AEQ@#129!4?GC#55??O#49?@??CA?G?G?GAO#118??C#114??@@@?AB@@??@@!6?@@?B??AA@??KGKSLpRPOPWqxrHLphGwOsg@CGG#107!6?ooCIyaC#114QOG`I?LOAGOG#119?CC#73A??G!6?A??G!5?A???_!7?O#141C#143??A?C!7?@#118!18?@@?@@??p?FAaayy_LTT}{WYW]WHple_`H!4CHC#101!4?_?Sc[O?s_XoIkOmS_[hShkIID?I\?nOnPeJuJ?VgVitIt$#192?a??S???a??a??O??C??C?@?_??DOA?OC?GA???O??AC?@!4?A#83_??OOGGCC?AAA?@#188?OO?G?CCA??@#180@#236_G?SGG??AEBA!8?@??CSOO??GG!5?D!6?AAA?AAGABFACC!8?@@???A#228??C#180G!7?C#248A?@!4?@??@?B???C??___???_?o_o_?OG!5?GG??G!4?CY?GKIMWS[[]!5[IGX^YMC\]NlW[}?EIFFF@?@C!7?CC?AA!4?O??O#188??OW?G?OG??W??G#25_#15_!9?__O?o#20_#63_#51_#163@#178ACO@CA#9???O#63_??A#52C??GA?C???GGCOO_cCAA?CG???GC?G???O#121AAA!4?A?KI[K[O___cW?OWIMIoAA!9?B#77!7?C!4A!7?o!4?__??_?_@?@!8?@#121!9?@?WW{[TcGPGp?o_qoo_?_`G?A?G?SOQQHE@EIICHE?K_D?CD??HGGOPaRSHCBpMon}lzY}m}UMMKCGXHH?@?AAA?A?CC#102!9?___?Oo__`OOKHBAD@HK#59A#103!13?@#95O#99_#53??C!7?_??@?C$#193?G???@?G!7?@!9?G#239??G#193!8?CG?_??__g??AB@A@A@?_?_?@?__#171_!8?A#186C#230G??G???A??G??@!6?_???_!4?GGG??A??@D??@!7?C?@??@G?@?@NAM@?@??C?@B!5?C?@@#238A#195!7?A#171?_!4?_#187??C@!6?O#232!16?O_!5?G?O?C!4?O#221?@???A?A#205???ca?_?a__?QbA?UoCG??_??A@CA?A???@??@@!4?O??OO#124??O#79_#180G??O!8?GO??G?GG??C???KK?O???O@#19!4?GG#56__?KBAGC_C_?Oo?C??G_oo??__!6?_#81?@!7?E?G!8?OGCo?_?o?I#102!4?@??@@!7?A??G!7?A?A?@??G?IAFBNT[C}_IE@C?@@C#126!15?a_PO_OG_?O???OO??_`?g?G??G?AOEG@@BC@ABAACB!4ABPG?OkA_?WC`MO?A!9?G#107!6?C#77!20?_!7?__W_GS?PcJdAC?GC???O@@!7?LOmHC@CI??_??C$#239??@??_#184!5?G?C??_?O@?O?C!13?O??A!6?@#244o!6?_??A#137?_#14???@#106OO#205__O_#235GOG!7?CG#224__?oOOWW__GWWC???A??G#249?`b@_#247?!4G??K??C??C??M??CCC!5?O?O@CAA???C!6?GEA@FCE#207!6?G???O!29?@#186__O??O??_!4?_#232!13?C!4?A!4?@??@??G?A@?@EBDADF@A?@??A@@??G?@G#195!4?C#31_?_#13?__?_#232CBC@CC??A#173OOO!5?O??O!5?_?AB#13?@#91CC#38C??G@???_?C??o_G??GCGYQAO_cswOOOo?__#69???!5@BCA??COG!4?KAS@C?OH_E[GWuwSySyPP_@???_!4?C?_O?C?CA#118A???O!9?__??O?g?KOxoc_dLs}bb@@#132AA`G`?WIG?G???XGA?h?cUIi@LC@W@_cg_GG_K?aOWCKC?ABiH?hER_IO??@??C#114?@??@!4?C??C?Q_g!8?OAOHECOGHI?AHCCOC??A!4?A$#239!39?_!6?C!4?K?C_AE??B#209!4?O#201__#182?G?A#138?A?@#231?oOoG!5?CCC??@!8B?_?_bbA?QO?O#235?OOwWoCO?_COSG_???G?!4_O???__k_I!7?G!7?G!5?D!5?O#243!31?!5_!8?_?___?__#173!19?O??O??OOoO_!8?_??_?!4_??_#76??O#28_?_??_?_#124O#207G#21_#23_?_?__?_#195AA@?DE???CGEEA?@@#51???_#74OO@!7?K#125@#141?A#142GG?GQO??__O!5?__??_#119@?@?@???KA!4?A?G?C??K?C_??@kCC?_?c??_?_@?_!6?___??G!8?A#101???C?_@?@?@!6?@#127!18?CCC?A?D?C?A@C???C?O!4?_?_?_?O!7?OG???__#119!21?_?A@O??O!6?@@e`b_deC!4?A#107!11?@#72???_!5?OPjPbXbUjEOCOID@aXOa??OoGOtgUGPIpI$#196!41?S??G?O???G?C???@#241OOOGGKKEAA@@#181G?C???@#228GKC?`b?@@_?__?_O?Oc?ow?O??G#238???O_@o_o#221_#205_#228C#26_?o?_OO??_!5?_!8?O#232A!4?C#194!8?__?_!11?__??OGKU?@@AQE?A?@BJ@JBFA@A?!4AEB?C@AA@?@B?@?@A???@#26!22?__#189O??O???_#194??_!7?O?O#189_!4?_#227!4?C#186!5?CG?KAGAGKK?MCC@!7?KG#23_!5?G??CA@#144HGA?O?_??OO_#73???@#116!13?C!8?_#112!10?_?O!9?C#54!5?_#59@??@!4?CAgqM_?@K!5?AGQ??g?S?H#111!9?G??C#128!28?@@D?E??C#116!16?O??O?G#73???O??C#115!22?@?Q__?C??G??G??@??@A?GA?POCAA?HC?AI!4A!4?A$#202!41?G#240G?O??_???OGG#150G?O#232!12?_?__#249___?_?O?O#232!19?_!7?@@@#224???A??@??@?@#205!12?___!4?__!7?O!5?OO?W?OO??AAUA!4?O?gSSCHG_GWOC!5?___G??_??WGOW?O?O?wsoO#176!29?O??O!4?!4G??GG#29_#223C?CA?@???A@!7?@???A@??A#177?_?_??_!9?__#157??_??_OGG#24??A#37?O_CCcGWW#132!21?@?C!6?GA???O__O!6?_#103!27?CK?C?A???C?A?C??S?__OIAy?]C@I@@Sa?AR?_AAHOA_#112!19?_#116?A!5?@#128!12?O??O!8?_#69!21?_#103?_??C??C?O?_#98!30?_!9?A!4?AOc_Is?A$#153!45?C#105?C#242@??@?@#150!16?@@#109?@#216??CA?A#229A?_O!5?C??SC!7?S??C!9?@#216???!5GgOOOW!7O_???CGO@O!5?CC?A???G!6?CCAA#26??G??G#220!30?@#192@#238???G!7?C!9?CA??C?G??O?C#243!8?G!6?C!5?C!4?KCCAIC??M?GOAIA?G@A?A?@C?@B@D??A?C?C#124GG!6?O#164GGA?C@#142!4?A#128!4?@??@A?DB@?C?@???@@@\?@A?C!5?O??_?_?_#59!5?@@?A#102?@#40!27?G???G#121??O#112!77?@?@?@#135??@$#137!47?O#217?OO#96?O!8?@@@#207!12?@#173??@#238O#227G@AQAHHG_CC?_?C??SEDJB??CCGCCEEA?A??@?AAA??@@G@@_?GG@G???C??@!9?A#235!59?C???_!5?_??_?_!4?o!8?@!7?G!4?O!4?O!4?G??G?O#205!13?G#235C#216!12?C???A?AA???G??CC#140!12?ABAA!8?A@DC??MAIA?G?GGW?O__?O$#204!47?G#183?_#64_??O#188!64?_#206@#176@?@!4?_#188!9?O!6?O?O?O?O???O?OOG!4?G?GOw{!5?_!5?H#187!65?CCC__!6?_!6?O#249G#230?C??C!4?A#28!20?O#164O#207GG!6?O#212??@#145!14?O#49?@??B#73!19?@@EACCGA?KW???O?__!4?O??_???o$#208!49?G#16??_#97_?G?C?GEC!4?@#234!51?C#173!23?O#186?C??W???O?O!6?O#216!86?G!8?GW??KGC??A!7?CC?@CCCEC?@#188!12?G#201G#223A!4?@?@#54!47?@?@$#201!145?!9_??_?!4_o__o!4?DErgRAHQaaOC@UdfMwC]C[wKU\fx|GSPCAA?DGCJ_???C???@!8?@!4?O?@???_?GG@#171!4?_#207_!5?_#201?A??A??O#195A#21!34?_O$#195!145?O#238!102?A#195??G#220!4?_???O#247?G!6?G?G!7?A?A#176!17?A?@@?A?@@G??G$#181!258?_#221O?O#13!37?_$#171!259?_-#237lRKalQLAlQH`Q@e?n?cXONG`JcNGMTJm@?HADIDN@AE@b_@???IGK?@#198KC?A@@@#243O??GO?GKCA??@G#212???G#156G#176C#235O?G??G!6?A#187O#248!7?_?S[QA?B@#181!4_C!5?_c_?Ag!4?G!5?O!5?O!4?OOO?O#191???_???O!8?_?O_?_???_?_?_?_?_?_O#31A#172??GG??GC??CKA?CKCCE?CACAC?A?A??A??@?@??@#138CK#11CG#4G!4?!5_!7?_#24??O???_#55C???CCK#15?@@??@#21@#74!9?G?G#56??K!5?G?G?G!4?C??C!8?_??@??hG!6?_?@@BB??@AA@BCA?AFD@C?E#140?@??QZC_#49O_@__?_#143G#118?O?_!4?_??C_OE!8?@#72_#102G#115!5?@?C??@!5?C??G?GAGc_?OGoOA@_O_?@?AC?H??G!4?G?GA#126??K?E?@CoH`Aq?Sp?oC?C?CC??C#140!4?@?@??O_CP?`_KCG#73?A#121??G?@?E?O?HgIdJPvW^lz[jXRzXY}Ueu}SKG??OO@!5?O#107??G#102O?_?cCkidcS?B?CAc!6?AA#98?_?OAESDO@KACG#100!6?@$#246QkR\AlQ\AlQIdQHvON@cboVY?XOQpiOOENEKI#252O??GC?A?@!7?C#171O?GGC#205K??A???D#229O!7?C???O@A??A?B?A#236??C?CCA?EC#235!6?___G??A??@#218G#193G#166C#82CCG#106G!8?_#194?__aEEAABB@B?_!7?C?!4@?_!9?@???@???@H?G?!8G?C??C?CCCGEEI?CC???G?A?CI??GDADBBD???AA@A?B!6@?@#157A?A#23GGGEG?C?CAC??C!9?_??A?G??X?P@P?@@`@?_!9?_???_?A#55?OOooq`aoqKAO?_??@_#74!5?O@??A!4?Aa_CCMKGG!6?@?_#52A?A#116?CG#73???OOO???_??DDBD?A@#59?O!5?___oo_KEO[qtmc!7?R_G??_A???O???_!5?O#112@?CA#121O_!6?B!8?KNBNHJcGHo?!4@E@C?C?C!7?C#129!8?@#127!5?O!4?OACa??C_#73!4?O?_!5?A#118?CCC!6?@AQS[|d_yuRZPp@OEAGC???OO#101?G?gSGXgHYULY[o@G\SBmLlHgGH_@gP_JOGPaSiTiTiPkA$#240??_#202?O???O#252?COGC?G?OI?C??C#204_!9?__#242O#96_#241O?_?_oOYWWCM?A#194_!6?AA#106?@@#249OO#223?_?O!9?@C???C#238?_?c??gG?gg?OGW_KcCjBA?@#188GKC@???O!4?_??ACG?GN?O???WOO??GGOKG??G?GIG??KC?AMEGCCIIBH?CGINIG!6?A!4?C!4?@?C???AA??@!7?@#192???G???G??G?OG?a?A?_?OA_#105OO#0O?_#9O?OO!9?A_#76@#31??@#63GG??O?O?_!4?_?CCC!5?A???O?@??_!4?_!4?OOa!4?E!7?@?A@A??C!6?O?@?Aa_c!4?G???SOO_g_Oo_#91?_#128@@@?QTMBE?C#119?BO??G!4?O?A@GE??HPEHDIFA?@!7?@O?OA???O??C??CogCG#103?EL?BB??O!5?K?O_GM#77_#73!6?O???_??_OA!6?G#112?C#128???A?A_@GPAHAWCoWGoCI?K?CYBa_MP@#126!4?A?@???D`GsI?c_?C?Sa??_??_O#115@?@??B?A?C?G?CGIC`?AAW@WB???A@#53!5?@#72@??_Goo_g?O_?o??_GOPIECeEeCa?GCG?kAp$#218!6?_!7?O#192??_O?G!4?A?C??C@G??@?@#196I?A@#166??G#14C#203__#202_O#153_#183@#105O#207_!4?G!4?A#227?_??__?O??OA?QP???GG?C???@@@!7?A#249!6?@#205G__?_#29KL?C@RO?_CO???C???G#221?A!8?A?@#124?G#243G#106O?_??_??OO???O?_?o?cCOQ!6?O!8?O!6?GG???G???G!4?G?G?G!4?G?C?C??C?!6CK?G#207?G#79C?G#21C??G#18G??A??SAP!7?P#50CEAA?AA#56???GKC#13@#18G??`!8?_#91!4?G?C?C#20???@!4?B?A#92@@?A?A!4?C?G#148_#144C!4?G!5?@!6?A?@??A?ACG??G#55!4?AO___#132???G?HU?_!4?I?_#54G!5?_??CH?AD?@??@!5?O??O#77GG!6?@@!6?A@_#107??GLG???@?I@#101O#81!15?O#132o_SI@CEQO?}A?o@pH?_G?C??C??A?AA!11?O???k_HGCPWLhcQSA?CGA?A!4?G#119?CD@@H???___??B?@!5?a!5?G#77!5?G?GS_PO?gQd?@?@?@S@A!6?_?_PoHpGXHSaPaTAPK$#244!7?_??_#193C?G!5?A!4?S??@!6?OO_C??C?@#2???A#150@???CA??@#137@@#247?_#232___?A?ADEBB@#234_!7?o__Oo_O?OW??QW??G_?_??OG???D#187SC_#26GA??@___!4?POOOQOO??OOO#192__?_??_?_??_#172!6?!4_?o#192O#105_??_?_?___O!5?_o_?oOoO_?_OO??!4O!8?_??_!4?OO#193??_?o?o?_?OGO?OO?_#181!5?A!9?@@#188@#37S?CGGGCG??WO??_??_!6?_W_O?O_?__?_O?go!6?_?___#25@?@#86?A#155@??@#91GGGD#50A!5?G#70A?ACACD@KCG?OW?WGOO?O#20??_#58???OOO#129!5?G#149_#125??@I`[_FA_!7?K?A#114GG!11?GOAOEBLIPQm}igCs~c^fyjYcbJ??O?[G??C_o!5?ADOggOe`O_??O?_#125!6?O??oA?KkC?_GIIAqHB@IQ?IOA_cYCc_EICI?KGCO@Bpc}BTqSxgaAUQ#112!6?@?O?@!4?A??G?G?g#114@A?AGC?GccAE?@Gt?gAOA?A@???@#100!10?G???G!4?B#99QEEAC$#240!13?_#202!8?_#239???__#240??_#105?_#198O#0!4?_#83_O?GGC??A@@#246O#191_#218@#172O???C???A#228?G_!5?_?CAC?K!4?@BB?B?@#248???O#194!18?O#220?OO#172OO!9?__!4?_#248@#207?G??GGGO?C???A?I@!7?C??CAI?@!7?@A??G#173CC?!4CAA???A???AAB?@?@#26???@?@#180@#171AA??C???CAA!6?@!6?C??AA!8?@#51C!8?A?EA?A??C@??AAAC??AO!6?_???A?QQ@AD`GDZFLUIEKCWs`??A??@?G?OA??C?G#20AC??@??A#152???_#142!4?@?@???@?GH?ACBAO#121!11?G?HGF^Fb?O?GDC???GH@EI?E#40!4?_G__???G#121!4?_!6?O??OOA#73C#101?A@??A#118???EMNJKK?_BBEP?CFNBBR@@OO#127!11?G!5?G?oWoOGq__oO#143!39?_??_??_#103!7?@???G!4?g?cGO?dPDe@g@SQPAa_EAc??_?BEEC?A#53???O??_#48?O$#153!32?O#202_#214!5?O???C??C#240?O#217_#192?O#96?A#193A???@#186?GGK_C@?A@#230?GkIKI?ACEEA???@!7?D@??@?A#22!14?ACAA?B#76oOO?GK#187A??a_?@!6?@#209?_?_#198??_#187!11?G?G#186A#193_!9?_??_#201@BA??!4@??@???CG@???G??A???A?A???A@@B@?@@@?@!5?@?@??@!8?@?@@@#24?O#5_!7?_#16??_#2_#34??_#91G?G!4?O#20?__?_#38!16?G?G!7?GCG?_G?GOOC?o???C???HOooo___!7?@!7?@@???A?KH^[sKK#81!9?S??_?A?_A?@!6?O#118!19?A#102!5?@!7?AO?OAdGC?_#119??Oo?O??C??O?Wo{kc]elbo#116!21?@_@?H?H@_H?TH`PoarQ@_GC?G$#226!41?_O!4?CG?C??G#242CAA#216_o?OO!4?_#224?O?O?OO?OOGG???C!5?@#249??A#189!22?A!4?@?@@?@#124G#216@#205C???GCH@?H?CCC!6?A?A?A?C?AC!4?G?@#181C??A@?C#205???JA??A!8?@DCG??@!4?A??@!4?A??@!4?@#184???g!5?O?__???_??_#3?O???_#34??O!4?_#74?G??C?G#56??C#155???@?@!27?@#18!6?@#7?@#128??G#149G#142?G#177???@#39??K?O??O#81_#145!6?A?O!6?_C?g_???_C???G#112!20?G#69OG_O?_OSe`O?O__OOW??KO!6?@??@F@??G??C??WC???_!4?O!5?_#73??_!41?C??C!5?A$#97!41?W!6?A?@#244??@#124_#181O#26O#173O?O#201CC?C@A#231!6?@`!4?__?O???GGCGCI!5?CG@?D@BA#209!10?G#198??G#182GG#10A#79?A#11A#173?@#235?@@?P#220!6?_?_!7?_!9?O#198!4?O!8?O_OOO#195C#187G?H!4?@@!7?C#220?C!4?G!4?G#235?@#191!12?GC?G?G?GGG?G#31!4?C?G#177!4CKC?E?A!6?A??A@@@???!4@A?B?A?A?A??@!4?@?@?@#23!25?@???A#121O#86!6?C!4?G?G?O#115!34?CO??O??_WA@Eg#54!31?_#72!4@$#182!54?G#195_#176_#220A#235!5?OGCGG#236!6?_```#189???G#221?_?O?o?_o?__O?o?o?WoGOSG???R?O#30!7?A?A#137G#171!5?C?CC?A!5?O?OGO@OO?o?__Q?O!8?C?C?OA?@!7?O#28C#186?A#235A?C?C#176A!4?A#198!11?G!6?G?G!7?G!4?G??A#28!7?C!4?A!8?@!5?@#38!5?GCGG?K#54!46?CG?O#125!97?C$#206!83?C#247??C???C??A@DA@?CAA#27!18?@#138?C#201!7?AA?CC@?D???C?AEFDDDCDDHJAGI?!5@#109O?OO#26@!4?CC?C#104???O#221?G#109??O?O#207C#193_?_???_?O_?_#208!5?O#220!19?A!7?A#12???O#26AAA#207!4?@#13O???A???O#92!8?A#69!51?G#37@A?C???ADAAG?IU[CCS?CGKO?ooO?__???_$#243!87?A?A!9?@???@#32!16?C#76!44?G??G#180!5?C#243G???A???A!5?@?@??@!7?@?@#188!32?A#1__#15G???A#58??G?G?G!8?GGoCoOOOo_OWO?ACMkmM[]]]CMCCMOqUqq?OQ@S?AO_??C??CCC??@__??@!4?@G?W??`?_$#124!166?A??C#216!16?A???A!5?@?@#7!40?G??O?O!4?@!5?@#49!61?G#140_??O$#11!167?G#189!20?A#196O??__?o_OoOoooOo_O!4o__ooOo?O?o?o_?_O??o?OO_?__#35??O!9?__#19_A??o_O?_#62!57?O$#198!191?_#20!55?O???OOO$#14!247?_#26!4?@?@-#246Tii`SIgTQLqhUWVgFQBVIfQ^@J@E?ABA?@#90A@#96A#194_#207_?o!9?@#180@#221C???CC?CC#224??OO#176?O?OO?O#194_?_#216O!4?GG?G#187O#106OO#172!4O!7?G??G?G!5?ACA#246!5?O!9?O#137_GGgGGG??GG!9?C?C?C?C#208!5?COCG?C?C?GO?OGO#137@#198!5?@!4?@@?C#237?_#184?_O?CGCG??G_!4?AcOGA?AD?A?@A??OMSG?C?OS?OCa@_??Q??OC??_?C!4?_#58G#24_??_!8?AA!4?CA?C#0G!6?O#19G!8?g?GG?__???_#91??AGCOO??@GHA@??LOOOGA@??kBAAC#52GCsK?GG?O!6?G!7?_?_#125?CGBG@?@#81@@!4?A#40?_[CW#77O?G???A???CCMI!4?GG?G!4?GGG?CCKG?IK???@#121!4?_OO#54?O#103!6?@?@@#73?O??cYC[wOA`G_O#141???@#127??aBh?C?A`C@A!4?@??CA#52!9?A#127!6?@!4?H?O??_?_#112!7?AC?C?C??A@???O#115??OCQ?G_@AI@_c`aQAO!8?O?_#108@#72?GOO???AL?@#114?G!4?A??ABAA?A?A#72??@?O`O#100O$#237i@PSI`TALaLQHFgFO@CG@OL_GCC@?@#218?_?OO??G???C#228_!8?O!4?!4O?O`!9?G!4?G#188??O#181OO#198??_#196???___?___#191_!4?_??_?O?O?O???C!6?A?C#109?A??@#172@@@#194???@!6?@#191@???@!5?@??@??@??@??@?@???@??@??@?@A?@?@???@?@A#237!20?G#239??G#105!16?A??GO?@B?CICGQGOAA_oS??_!5?CO???_!5?OoO??_?o?_??__#3?O#51A#58@@#24???_???_#13!4?O#58@?@EK?O!4?_`?G?K?O??_?GAFGB?_`_!5?@?@@??A?A@@??AA#128!4?@?A!5?@!6?@#59???A???G?A?B?@A?@@?@@@B@!8?ACA!5?AC??Wh_#118!5?_CO?OQG?O?ECCC?A#121X[WCO_?N[[O??DIC?q_#128???SgCwO@cTjWRk_DDIHSQJ@AEaGwO__?Hd{AYSK?O_?_#119!20?ABBAAQ[KOC!4?__#102??QWGGGLDLt^H]Inc_??O#59_#98!4?@#53!5?@#102G?A@?KKCC?CKSKWCc$#218?C?A???_!4?_!7?C#196???O???@!5?@???@#232_!4?O???OO!6?@?@?@@#216??@#231??!5G!8?AECCE!5C???A?A#201GG?G??A!5?B#196O???o_g??wwqsoOoW__!4?C?C?OCCScaSkcS_W?WagoGwcsogsiKacmWeWkOCICa?OwsgowSwoSOKwcWsGwNC~PQra\fTJ[uJ|OGBsOlOoItWeWtM`_@qDy@m@@NQSKVmOciSiqkoKsgOK_g!6?_??gWo?o???O??_??OO???OO??_#177@#56@#90_#63A@@@?@??@@A@BFEEIGOO?_?__??_ocaq__??o?G_#142!6?_#128?G_??O__O#49_??o#51C!6?C?G?O#49??B?RQ!8?O#72??_w_???KGC?CCCG???A?GG#121CBB#101?G?G!4?G#72GG!4?Oo#81!9?_#77!10?_#81??G!6?@#125_?ABEcOOgK??XwSiQiCKQI_S_c?C?A@?H@OA!9?_?@?@AQ[cXhOo?_#118!19?CKKLbbhHUAMcOC_#101!7?G???_?_?BCACKTgdYPMTQlQDa_APCOo_Wg?g?_?_@XkxkYln$#244?OC?_S?G_O???_?O?_O?O#193???A???G?C#242O#203@?_OOOGCCA?AA#235GGG??C??CECAJC?AE?C?_`?@@@!6?AA!5?G?G?GGG?G!4?C!4?@#184_!7?_O?O?[?CCGGG_G#220@?@#96??_!4?OG???O???O?O!6?_#184!9?A@???AA??A?CA#246!56?G_#109!6?@#0!4@!9?O???C?CG?O?G#37@@???@???@?B?EB?A@@?BM?MWUKyDAA@A?@CG??GCO?__?_!6?YO!6?o_O#140!10?__!4?OoO?Oo!7?@?@H@?CC?A#63??_#69KLdC??I!4?C@?@!4?@#87O?o__oo?_?o_oO_o___Oo_#119?@???@!6?OCI?di`@BFa!5?x`abB@aAE#126!4?@??@P_KF!4?@?@#140!7?O?_??O???g?GOE?CGD?Q???_?_#121@A??CGDILomtrMB~|jnY~I~nt[{Wp`_#114??A_hSOIDOKQ?C?c@__!5?@??O?_#108!13?O#59!5?@$#240???G@?A!9?gCG_?G_?_?O?A??@#213OGKCK?C#106O!4?C??A#26CEAA???@#247G?AI!7?_!9?CSS#209?_#193_?_?_?_???_#205GGG???A???A!4@#193_?_?_??O_!6?G!4?WsOSooogcoOg??_?GgKcWcGCGE?GGKQI?_?O?aG???_O`?_???@C@i?@g`o?G`ACBOi?ICGSaGaSa@SAdQkA@QdAdGbGdAOMPICO@S?iO?G@_?O?G#1!4?@@@??A#4A#20@AEB@G!7?@!4?@AAA!4?C??ECEE???C??__?WCWSC[[WOGOOo__#55@@@BNCQ!7?ABB!8?GGCG?OGO?S!7G?wwWWwopOaE?O_??_OwSOO#114A?_?_P@A?CBA???@A@?A???CC?AB???FECFDBCC@@AE???ADQGaHD!6?EcoW@ZWrIqEC#132???_G???`?cWJicAQ@WCCA@?@?AG#129!6?O??!4_!8?A#141!7?@#132@A?ACHDYDOM@?GOo#107!21?`?O!10?A?A?A???G$#239!11?C!5?G_?_#202???COAGCC_#241?I??G?E#209O??G#240@@#212!6_?!5_?___#249G!4?GG??CC!4?C#192_???_??_???_!4?OO?O?__O?O?OGO_O#209!10?@!4?@@#104?G#183!11?_!9?_!15?O?O!4?_#104!74?AAG#9?@???G???@B??A???C!7?G#104O_???_#192O#5G!7?_#34!5?__?_??__#51?@?@@EGK?O?GOC!5?G???C#20O#152GA#116!9?O#50?_??_??_?_???__!6?CISg_C#148CAAM?_#62WG#102!5?C!4?A#99?C#93_??_??O#253O??_#84O#47_?O??O!4?_#93???o?_#102!22?O#69!7?@#116!19?O??_OG?FGBIYWOCAKcS|pLpFhTY~CYA{Cg?_#126?CA?A?OA@OIC`K??OO`?p?OG_?_#103!9?@?G@QLHAT@sAOqG_S@SO?GWOa?A?C?_?_??gCCG_Ic@A@?S@QGQCwA?A$#137!25?_?O#0oGWK#83CC#233?__???G#186_!8?O?O#243POO!7?@_@#186?@#221???_?_!4?@??@?O@@?@@!5?@#248?AAA?AB#198_!8?G?D?C@!8?C@??AA!5?@!7?@@@?@??@??@??@#192!12?A!5?@!8?G?C!6?@?_!4?O???G_?G@?@c?G?O?CO?G`??_@i?i@?c?`?AG?k?O_???C??OK#13@#34A@?O???O???@@?AA!4?C??CC#2??G#193O!6?_#38!22?AAK?XCEA??@??DKKF@!4?W[SOOOAAEEEIECCC?C???!4CHIACGo_!4?_#54???A?A??D??@?A#98_?OOWOWWW?G#103?CG!5?G!9?A???C#115@@?A?OGSQEB?@ACG?C_GC_G?G??C!4?@#142!30?_#73!26?A#77!49?_???BDI@ADI`mOg?QkQOBtKoHAO_OhO`@`@A?QCBCA$#204!26?G!5?__!5?G??A??@#238O?G?GG?G!7?GIIK!4C??CFDE@A@?BD?BB?ABAAA??@@??!5@??@#106O?GGGC??AA?BA@AAC?A?A?AIA??ABBA?A?A?A??A?A???@@?@??@??@#246!12?C?C#3!74?@@???C#19@#63C#51KC#2A#237C#137G?_?_!7?_??_O?_???__O???_#49!25?A#56??OD??LA!5?C?tOc@?BBb@@@!4?AA?A?A??A??BA?CG#39!4?O?G!5?O?AkG#73???@#48_!5?G#40!4?A@??G!8?A!4?A?A#102??G?AK_CEDA?@$#1!26?_#2_?O#97???A?A?@#244AAA@#153C#172G#188G???A!4?A#195@!6?_?_#230!9?G?GO??G#236??G??G!4?CC#247!4C#153???_#105_!4?_?_?_GOKGI??m!4?CAC_O?C?C??C?E?A?AGCA?A?!4A??A?!4AC?@B?@??@A@@@??@A?EIUIC?EMAEAAQAGPC!4?`?@!4?@#246!47?GO#52??O#14AOG?@@??C?CC???GG?G!5?G#10?GG#33G#23!38?_#144!17?@#63??!5@!4?@#92!13?GCG#121?@???@Q???A@#53O#80_??_??__?o#250???A#119C!4?A#69?@@???@@??@?@!6?O_ggWDIG@?G??C_$#105!29?_#104!6?@#239??@#217@???@#171C#124C!5?@#234?GG??G???C#227!11?W?G?G#234!10?@BBA?A@#207!8?C#220G!6?@?@#192!4?@!6?CC!6?@??!5@!9?A#55!104?A#49_#54_#35?RAC?A!4?CCC#63@#23@??@?B??@???B??G?CGQ?A?@A?A?AC?G#91!43?C??EE!5?C?O!9?_#58?_#250??O??C???G#101?C?C#54!12?C???@#42?_!7?O#41??_?_$#205!41?O?O?O?O#248?G??G??A!8?!5AaaB??@A@#243O!9?G#194???O!4?OOO?W?W!6?HB@#233!8?@@@#239!18?OGO!6?OO?O?O!4?O?W!4?_OcG?GOGk#70!81?@#56G#96??_#239G#33C?A!7?C#18@!4?@C?@???C??O???C??C#152!55?@@?@#134!28?O#115@!5?A#75!7?O#71?O#73CC#53?G?G#80O?O???o#48?O#98O$#201!42?O#198C#202?A#192A@@#194@#178_!9?_?O#220!12?_?___#188!11?G!4?C?!6CAAEA#150!33?G#140!115?O#202???O#4?AC#3?G?GG#12?G#70!4?A!8?C??O!6?O??O!5?_#88!80?__?_#81!12?C#88!7?O$#220!42?G#223_#246??@#29C???C#216A#163???_#205??@!8?_!4?A#234??C#209!17?O#171!10?C?CC??C#192!154?O#16G??G!5?G#4???G$#223!60?O!4?O?O??O?OO#1!194?O?O!6?G!8?O$#184!268?!4_$#13!268?@#19@A???A$#170!269?O-#246TIsA\bODtCQiaThcoIhoS{qzGw?O?_O?_??O?OGO?O!6?GgOgo__?_o_oo_?O?GGIGG#184???O?OOP?PG??O_?_G_??G???_?Q@GQGA#105!4?_!4?I?@WeWaWeWbWeGP?IEGAGYC]?[A[?OCOUgOCQCOTiWU?[IOK?GOK?OGCOK?[?W?K?O_?O#192_!5?_!4?O!7?_@?G???CP?I?C?H?Q?C?G?O?S?S?S?SGQcA?I`G_?A?@?P#191??@!4?A#246???C!5?A#208!4?C?CA#193?A!6?C??C!4?G?@?A?C#19@!6?@@!5?A?GG!9?G#56?O!6?CE??BADAMAA?C?CO?_?GO#125IOC?C!6?A???@#39@@#69@?@#59?@#40@#77@@@#101@#72@#87!11?L@?@BEBEABB@@FZRLIDIDEBB#48_??miGo#114B@C??CCCO@?y?PP??@@C#73_aQD[vAO@??q?G?_A?AGO?IC#140??AAAEKc?EOg[AO?@@O_CIP`IO???K_#127!5?A???GAS`C@AGG_#143!5?@#112???@?G@?_!5?A#107!5?_#102e???O?_@?@@FJP?GCW@bDEJWww!4?O_@#98?G!6?_?GOC??QA?a?ACI$#237I_A\aOLoIQhOTGCQH_OCg?HCOC_G_??!7G???G!5?G!7?_C??CI?K?A?A#183??C?!5C?CIA#193bBb@BCB@???_?g??_??Q`?_Q_?gWOWGOC?ICWeWeXeWeGQCG?@A!4?@?@_?`GOH_?GOGO@_@?`??`?`OOH?PGDOJ?T?H@GP@DF@F?GQcGQCPCgCBcIPCQ@?YCqCRcZ_AcO`Y_U_L_Z_U`Kb?J_BgB_A?GPcO?U@G?O?C??D!8?BGSKAHC#96G#191!6?O#137???ACA@C@?@A!6?GI?_??GOG#35@!6?@???CG?O#91??_@???A@???AC!5?H?C???G#52?@@B!4?AEGO!9?A@#48C??A#121!5?@?@#95O#85??CGOKKSC#98!10?__ooO_WO#75!8?A@#98?_?_???@#72PTKw!6_#102???H#121!4?GO!4?G?G@?T!4?@@!5?C?_#49!5?O#116???POKGEO_TnbAEAJ?pm]titytPMqgSPgS?_`A???O_?_#126@?A@U?o?CcS_?c??GO#114??G?gg?Hc`Q??GOGcQ?CWC_!4?O#100??Og_#107!4?_#115o#114o#100???G???O!5?O?GGCAK{uKmKGC$#244_CH??G?A?_?D??QHA@A#192!5?C!9?A!5?c???A!8?O?O!5?@@@?_`?`?_pp`o___o_OgGgGo?oG_g???G??CA??@?@#237???C???A#184!16?OGCGO?W?[?[_W_?_!4?C??G???C!6?_!20?_?_???_?_?I?C_G??CG?aCQ_!5?_!4?@_?@CA?B_BGB_B?@?GP_C?U@W_[?KaGOg?s?Og!4?O??G!5?@G@#0!17?A???@#10@#34@!4?@!4?@?@#104?G?O#58@?BWX?AWC?cC_@@AE!5?PAGS?O?C???G??G??_#69_#98_?_O??G???O#47G??CCIAAA#93OSCSiiumqBbr_`d_`???__OO???G?__WW!7?_O?O??_#99O#120C_#40A!4?G#119@?@?C??@?CAg?COGC_Q?Gg#49G_??G#116G#127!7?A!4?O@#129!4?G?__!4?Wkw`SwC#125!5?C???@CBGC_KDYPShSBIcScS_O#73!10?C!6?@#119!11?A#101!7?CG@P_EM??GoCB?BAECGSQ|vJf|mR{NeqaRpo@@@?@@B@$#218?P???C!4?C??a#239???C?A@A#202??_!5?_D!5?CC#191A!6?A#193?!5C???GMGG??AA#239CECCEAMIIIGI?A??C??A?BCABFBFDD@D??G?K?GC?G??GBCG#192!16?C?O!5?_#208!6?A!9?@#105!44?cH!49?@??@??AK_g?@U_?YgGhWdGsn\hz|izur}tr^~n~OOOY[iy_K_??k?SccowG_#17G#37@?ECCA]W_oG?PA?c??AC@IO???Gg?o??O??O?_#140@??C???GA?CD#88__?!5_?O?O_?__SO???OGG^]Y^]^~^QMNCK?G#47@!7?KAD?CA@#101!7?A#102@#59CM?G?G?GGOE??__??_#132???@!9?C?Co?`DHs?ID@?_#38!6?o!7?O#149?G#38!18?_#132???_?A_?@A?GKa_NCi?G?CGA#115?_??C?P?O??_QG?GGc_?@KCQCaO__#108C#72?@??GOO?_!11?sG?Og?OGCC_AG_??@#93???_$#240???_??aG?H??G???COCHA@C???G??O?_?O#217__?_O_O?S__s?C#173@#233A??!4A#201@@#198AA?A!5?_?_!4?@?@!5?O?O?W?!4Oo?oO?@#246_#137!11?_??C?A??C???C???AC!4?@?@!15?G!4?@??_?ACA?AC???A??AC?A#35!81?@#4A#2A#137O??@#96!25?A?@#208???S?C#3??!4A???C#4C#246_#2?O#63@?BC?`CJC?AT??@?C?E!4?S_O_#35?OO#55K@Q?C??S???G!6?@?A???@#253!30?@#48?O#41_?W_!7?_??o?Oo[#77!5?OWOOOWo__oC#81!5?K?_ROL_A#128!5?Q!4?M?O???@_?_DClTgaA@@GDAg!6?B!4?DI@IaPKRgeRHRYCcHAGGSW?O#119!14?@!4?A#103G??`?HCL?eOG@W@qHaWGOAoCG__?A@C@CCWG?x`B!8?@?@@@#99?GC??GOOoo#95O$#193!24?@?O?@?G?C#242CC?C#21@#216@@#178@!8?@#209A!5?A!7?@??@?@#244!4?A?IG?G#196?!4CG?CCGC!5?VgSc?uTg^vVBfcRdpzs`!4@?@?@Pdgr`o`pe`a_Ba@BEBbC@Vbb`baASaGqbSJAlbCrkbqjcpibsav_}iW}g^vLZVlZmZVZkPtiZdYu@qLPgHCZkZd]@^_^_]?^_Y`[gSGs?[GtkRcIDY`GudNaza\qmU~J}lV|oO??k?BodVvUaQaHO_S??S?GG?GG_?O?dccc?S??_O{{O{gWGG?OOO_#86C#90_#51???_!4?G#196???W!5?O#24?g#144@?@?@??G!6?G#116???O#93_?!4_o?O#75G#56@?@#42!34?CC?AaOc?OOg?G?KCEDB#115!6?B?C!4?A?@gI?`D?QI#125!4?_??f]~H?urNP[ioBLsOy^IgOgP?@A?@A@#121!34?@?BPGHoJSzRjYvPy]Shx__A@A!5?@@#77!11?CIa?@OC???A?BCDHAEGcA???A@CA!6?@$#90!24?A#0A@FAA#82A#137A#153AA!4?_C?c!4?C?A??A!4?O!7?OP?O?O@!4?@??@#191??O!10?GO!5?@#198!31?C#191?C!7?CG?G?CG?GC??C?G??CO#237!97?A#39@#56@#109?_#192O#104C#192!25?@#104!5?A#1A?AA!5?C!7?_#23???C#152A#38?O??Ga!6?@?A!4?C??C?I???OO_#148???A@B#80O?OGG??S?GI?OCCCEaA!6?_!7?_?_?O?I?Gc?@GCCCg?___?OOG?GHI#69!8?EAA?AFG??UCISAQg@C#140!9?c#52!22?O!5?C??C#73!29?A??C#118!12?BEA^CsCT]U?Q?OOBFcA?G_#98!7?A$#104!25?@A#196_GG?O#244O_O?O???G??OO?oOo?_#243@#242!4G#194??@@@#196G??G#241!11?C?CC#96!12?A#183A?A#237G#239!162?_#14!36?@@#86??@#20@!6?@@EA?W_!5?@A??K???@G???C!6?G!5?_#81D??@#114???O??G#42??O???KC?IC#253!41?O#121!15?@@#54?@$#105!26?C???C#233?@#209@#171@???A?A#201AA#194A?A?A#202??G#195?@#226C!6?C??C#191_?O?O?O#208!23?C#105G#109!201?A#0!6?O??_#193???_#34!8?_#55O_#244???O!7?_#17_!6?_#74O#50@!5?AIC@AC?FBA#59C#38A@#40?A#84O??___#118!58?A$#204!28?O@@#138!4?A#215_!5?_!6?O?O#186?@@#207@#218??C#244??O_g#241!30?A#16!209?A?C#0!19?g#96_??_#51!6?A?@#14_#64_#83?_#128C@I??A?@#129??G#87??O???G_?O?OO?GWgGGGI$#4!28?C#10C#173!5?@#176@!4?@@?@?@#216???@#150???CC#240??O#241??C#217O#9!242?A#70ABA!9?@!8?@GAG???G!9?__#53!15?C#58??@$#252!35?C#76A#181A#239?G??GG#183G?G_#184!6?O#14!272?G#246_??_??O#49!10?I@??@C?@C??H$#204!43?CC#212@?@#193!279?O#104O???_$#162!43?@#96?G#64!283?O#2O$#74!329?@$#239!329?_-#237i?Q@dOBg@S?I_DOA_S?gCAh?PI_U?GD@cJOaGO_?OGcGeOi?QAcOcHvGaKADOgOgSDYDgDGODgDwCX?W?W?O?S@?O?G?GOg#105??_GO?_G?C_HQ@_HQ!5?@?@?@#183!5?A#105!17?GO_?GOc?GO_CGO@g?S?g?O?g?GOCg?G??A?A@A?A@?@?@A@!7?@!10?G???G?O_?O?g?O#239!17?A?A???A?A?A?A?A!5?@#208!10?CO?cG?C#184???_#192???O#193??A??@?@O#184!8?@!7?G??C??OO#17G#96BA_#16A#23@#97A#208K?O!6?C???C#244_OG#150C?A#98O_G?_#95?g#85?CCWCA???A@?O!4?O#48!6?_?OG?A!5?g?CoSISkySK?]Kc_cs{SK{CwKWSkGCCWdXCqGSG?OG_G#133A#59CABAIQ!4O_#125???B?@GMXK@???@?GANwP[Oz^Ko#129??O?CU_?G??YdNpO??__??_!4?o?O??dW?A#125@?@?@?DKHKuvaahOE_#112??A@?gC??A#103_??_@@_d?LacI?oC@EWJIa?H?AB@CAAOH{LxzS#251GC#99!13?C??ACerQaYA$#246TjcYIdSQihTSIidSJhTPhSUjePGgSqIYPcHP_GO__OWOGg@Gk[GkWS?t[o_YiDAD?gCo?O_?o?O!4?_?_?_!6?_#198!12?A#137!5?A#192??O???G#191?A?A#137!27?C?@???@#208???C!7?A#191!10?@?@???@!4?A#239!4?O??O!8?O#198!5?O#191_!5?G#246!26?A#193!7?@#105??CGOgCgRkAcHQcIPcB@IR@JBtJbJQnoNqLpjDUaUiBAJ_O}DYeg?dcf`Rog[W!4_!4?oWK@{GiW{?KO!4?o#64?G#97S???@#61C#80CO#93S}V~zwC?C@?A!4?OC__APGOAG@C?@A?@DL!4B@@#53??O_?C__S?oOWOG?__!8?o!4?A?B??BA??CW#40?CGO!4?_#119C??G!5?_?A?w?gs#116!7?C??OG@__P`??@a^AC??AJURZAT^@zEZEBcBSZAFPOEZc???GO#73C???GW?C?GC#119???@?_??C?C#107!4?C!7?@?o??_??_!8?GC#112?_#59??@#98?O_cA?DAA@Ac@?@AdCg?GGLH@C$#244?S@cOAg?S?I_DOAh#252C?A??@#196!4?A#239?A#218?_?A#193?AC??C?M??D?D?F!8?@?O_??C?@?_?C??@?P?@@?`@_?_G?_GODA@eBAFBsLoKrKrKpNqLuHuHg?OC_ACQlOI?_?OG_S?gOG_Q?_CP?c@Gb@BB@B?B@@ED@DHE!5?_?G!8?hQHaHOdAHOIcTAsAL_DYDGdGeHcBSA?yDqChCydYCZsIlA[BkBsGaXCQKpCi@k?S?O_#191!13?_A!7?O#137!10?c#208!13?O_?P?CG@!4?A??C#104??@#96?A#193?A!9?O??C?A?@???Q!6?AGD!4?A#63A#56@#88G!5?BbZHEb??OXgghZKDKBC@C#99?@!5?I?S?G?COI?D?A#40???_#93??@??A??A!5?A#80!5?O#101!9?C#77A?HOOc__#118?A?A?A#39??G#54?O#73AO?PIDZD?}e@ODGaAC#128?BA??AA#149GGO_O?_?O#128!4?C#52!4?C??_WC?c??G?A?O!4?G#127???@!4?A#126G?EYG?O#118?@RY}WLiN]CIOGO_?@@ECA!5?D??C#77@??_?`?_!4?GAA?G???G#95!9?A???C?SCG$#218??G??G?C?A_@O?G#202??A?CA!4?C!6?GOcGO_GS@_??O!5?O#196??A?A??@?C!5?@?P?@_?C???CG??CG?cHCDGpCXsLOkIQDaKPCpIOC_GS?cFXdZD{Xk?ET|^|lS^j^VnV^l~^zm~Z}v[uk[ysmW}ugYyqawT{h{T[luV}tmxU|uUcsKskG{SkcYGsGw_FW`AdYaPSIwbKzDWCrCR?A_@C@_AO@c?wASHcYc`KqC{@}HfK@\a\zcXti\sWktYtlCyUkR|HukJtMZwmtGQswIs[SlON_LqKCIGK_@oss^n@wdWPzYYW[kDS__WW??_ogWK_oo@cCa??a?_C?_G?A#59_#69O#99O?_?O_?@#87!5?_owWow__#80??OCRGACJKAEABA@@#41!8?A?@??@?@?G@@?EA?AA@@A@BA@QBBBAA#115!13?@!4?@#121?@@DDCKO^MO?__OAcOG?Ok?Ae#127?g?__#140D}^LKO_??@?D_??C?HgC@i?ACxC`GRG_??_KcGcWG[so__#121!4?@O?`O`vtm}UGD@@A#102!7?B?SW?_?oIW_?oWWoww[}JG[EABAA??@#100_???BA_?A?BEEe`A@TxP!4?@$#240!7?@!8?O?g?Og?SG_T@hDOc#192!4?!4@??@_@?O_!5?_G??AC!4?O?O!4?OC!4?_?C!10?G!8?A#184!14?CA_A?_?OG_A?A?`??_??_#239!26?A?AA?A!6?A#192!8?A??_A@??G@?O???_!7?G`C??G?A!4?_???O?_?O??@C?_@?A?O?Q?a?@??P_?P_?P!5?@?A?@#137!30?O_?G?CG!7?AC#0!6?A@!4?G@GC!5?A??@!7?G#17@#87???_#41_???_AB#84!9?CLDKEDFA#98??__o_opwW{KCmS?qg[CCI?@A?@?@?@B?AA!6?A@A?@?@C??@GA?GO?_W?o?O#103??GCG#69@@A@E?GGOO_!6?_#126??A#132A@@O_??@@#55!7?_A#38@JSC_??IoGc_??[?_W!5?G?G_??_G_#132???!6A@GPCCbW@??G#115!4?_???P??aOH?cO@?SGA??@CCD?ACA?_!7?O#134!4?G#93!17?A??_?_o$#193!19?A#252!16?CC?G!7?O?_#184!11?Og?G??G?G??G?gCW?O?W?O?O?O_!5?_?O@??@?A#239!11?a??O!4?_!4?A#184!34?A??A@?@?@A@?@A@?G?O??O???O?_??CAGaCGQ?CGa@C!4?a@??GDODI?AD?DAGBCHaOA@GQ?H@A?@?W_]_K?CGEGC_JcRG???P!5?A?@O?_#237!42?@??C???O#33C#24@#239C!5?A???@!5?A???@@#149G#72_?W??G#94!12?A?A#120!13?_O?G#80!20?!5@#120!4?__??oGoc?_WC_G!5?_#102!4?@O?__#81??A?BBC??C???C#130!22?CG#52??W#128!19?B!4?@??Av_@?@OoG?C#114!14?_O?o@WcAQGAGA_PGHC_BO??D??C???C??O$#242!36?A??A?C!4?C#239?@?B@A!4?@G?@A@Aa??A?_EGA?A??_?CFBFFJAaIaCQ#246!23?G!46?@#192?@#246!35?O??O#137!56?A#246!54?AA#4A#63@??C#2??A?A#244@#104???@?A??A!5?@#218???C#14C#42G?A#40@#72!30?_O_o??_oOogCg_IO?IQ?_?G?G??GO?wCOCg???G??C`@CbVclFZ@dq__#114?CKKKGgOo__?___#127@#140A#142!25?A???@#55!19?CO#119!54?A#59@#101???Op?_???CCaS@JBkOWD\[XWwXWWWw$#198!37?A!4?A#244!6?@?A@#183!12?A??A#241A?A?A?!5A#86!235?@#51@#58AA#37D#74A#38??@#56@#137!5?OC?kOk!5?C#47!4?O#103C#77??C#49!100?@?C#72!113?@!6?_?SOPk_O__c??_$#233!38?A#209??A?A?A#109!271?CG#217!13?@#1?@??O#96A??Q?AAA??@$#153!41?@#20!276?@A#240!15?@#237A!7?G#65?G$#9!318?C#16!17?@!5?_#70???@$#184!336?W?gC$#35!337?@@@!5?@$#246!337?_?O$#110!337?AS$#192!337?G-#246TiCqHTI`[AiTDaYHdSIlHbUKXreCtiITtIiTSidSYiEOzLdYYuAn|iBhtcWOHqoTC_nOpg?b?D_U?AD?dGuGO??C?P?O?O!4?_??_??_#184??_!4?cGO??O?Sh?O?O?A_?A??A?C@!9?A???_#192!17?O?_???_!16?a?O??A?C???AOC_???OA??GA?Ga?C???A??A?OA?S?@???C?G?I???I??G??AC?_C?_#105@?_GA?QDG@aChQg??@gC?OfGAhQkuPV_Y`QTaSgEhV?TgDQ_RcJOiDQkOcZ`WaOdCWCC`SGoGON_AGDB#83O#93O???@?G?@?@C?GKMF~[w??oOgC]MIM@@???_#80?O#53?O?G?C??C!8?@@@GGG@IEHNLNAASC??A_QICCCAB!6?_#77!10?_`RrECCgc^_[CKWo#115AO#118G#121[YH?@N???@#49??AO#38_??GS?SKE?qqGGR_G??Fm_qNqO?CgTG@gI?Q_?C#128?@A?`VGtBC@#126O??W@CCO_#114??G?oOGH?CPcQHQ_Y??A?_?_?G?_!5?BOA??g#108H_#100A?CBCC?gO!5?o__c{KCDA#93_Wg~jv$#237iCqHSi`[AgT?aW@C?I`?ASG@aCGPI?T_I?T?I@OI`CPhC?Q?d?`OATgUGRcHqLAgQLOICQlOeOJ_\_GaGR?dItIP_CG_@?_C!17?O!6?O#105!28?@C?Od?AGP?i?OACG?@C??@!4?@#237!18?P??@??@C?@??H#246!34?_HO_?_C!4?G#191!6?A?O???_CO???C#208?D?CG#191!7?@?G#208!6?@#137@#191!9?G#137!11?A!7?O!7?@C@#244_?G??@#99O_wooOAGAX#87A!4?@?@@A??@@@?@#40!9?_O_OoG_GO?WOKOcc{{uQVA[tWuoa?hg?O_?C#101?G!7?O?O!6?_!4?_?GO_COgO?W_O?_O_#69@@@F#81@_C#125_oO_PKUBNKeE@#129_O!6?@@CA?O?@GGPKCOKciJSatIEtL?@`_?G#125?AA_FI{bmJ??BC?A#118A?GGOoJNFufbKA??_#102A?GGKWVbE`rZFzf??EkGhA!4?@#98!8?G??_!6?OGQPBB#85??OG$#218?@!6?@??G?C?Q???O#202!13?T?i@SI@COGE?Q?c??O#184!6?G??C?C?_Q??ACOCOa?H_G_?Q?@?DIPA??C?A?C_#239!17?A?@#184!54?O?O?OCO@c?H_AG_S?iCP?H?I?O_?@i??@??IOD??H_?_!4?P?aG_GO_H!5?GcQ@_A?_DOeG@SI`QsHo@Q@GQKPG@CGDO??@?A_!6?_??OgA!5?C?G!5?_??_??g!4?_??_G??GC???G!7?_?O#110_#96O#97??O?G#88_#72_!5?@??S?O?C#88!5?B?oK@F???@#72_??_OO?G_o?KACJBBB?JFE@BBHAA?@?@A?@!6?__TupR_Pqxo{W~n{_xUGicx?u@raNjFEKGg?GO??G_W#102?CGOG#73???oVM?H?B#142!9?_o?Oo?KKookNvMoO#149?OG_?G???GAS??_#73!13?GO?SE??A#112@?@C_C#115G!5?Ga?HcGK@dq@??GGG!5?GKG?ACWc#134???O?OG_!14?_#95o?G?CP?C$#244?O@C??C??D?AG@C_!20?_#192!4?@!7?@!4?S?A?@a!4?H??C?@?G?G???O?G!4?_??g??_!23?@?A!6?_??G??G??G???_?_?O???G??C#239!47?C??C!4?OC_!35?C??CH??@#237G_#137!23?C??G#193!7?@Cg#208!29?@!5?O_K??G#239_???_#0_#150G#64_C?@#41GC???C!5?@?_O?_!4?_?O!4?GAK?`#120!4?GA#102O_?_O#59O_O?g?g?Q!5?_!6?OO??!4G#120!4?AA@!4?@!6?C?G!4?O#53G???O_!6?_#119???AoaDA#132G??E#140g?_g?OH?KMCAFB??K??AC!7?A???ATO@??_P?QLAKPquL|[Go#132??O?cI`?AG#119!5?_DC!4?O#77!20?OOo!5?@?QG!8?A?G?AG?A#99!4?gCS_$#240??G?a?OA_O?_O?_?Y`SAsG`qCGPi?T_I?_!5?_??_??_#252G@?GC#239!7?AC#193??H!4?`!4?@!5?A??CG!5?A?A@SIO@iTYTiTYtITyTiTiTI?k?S?xACaHO?s@Qc?DQ_DOIO?Y??i?OAdGPaGOI?OAG`CO@c?HOaOc?HQCxASHOiCPGaTGaSHqCzCPCjC?GO_IOG_??I?CaCHsBs@s@CX_RKpKPkPcHcGbGeWdQHoFO_@O???OA_???A???HQCOa?O?_?_!5?C!45?@??Xa?G!7?AWAQ?A#203CA#35A#42A?@A#85?C!9?ACIC@I?I#99?O?OeGQc?P#103!4?_#77?G?SK?KC???CG???GC?C!8?@!5?KCCG?G?C#98??@CA?QPACP?S?GO#103!5?@?@CA?C?A???_#128!7?_O?OGSO`?HA?@#56??__!9?_?_#121!31?_Wcwpwl]rVBA!4?O#101!22?_!4?@A?AKcj?OPxU@np~v^|F^\ZBBB#131?_G?E$#193!50?G#196!12?A!4?G?A???S?AD?D?_?Q??C?TgPKg`HITiDiTIdITiDITiTiPdAuHnEhAXeNnJsLZtylTyjsN~D~nT~ntWvi\UjtnI|tUinSZnsjTnYjuLiElJeiDyIvSItTJaLP?iKqCpm`NIoDeXmiPTaWjsA[B[JuXeIkPEPeBKQeXvGvOBGkQLoNOI?fOaDOKBSJsLyvC_iDShfgIVYKzSLRzyyRrVnWfTSlQGa?ZdUli[iVXUg^iVQlVkZSnTYdRnR_[e[bYaDjBQjVFFN_[@C???@#98G_!4?I_?Q`AooP!8?O?__O?OC@JIAUHE@@?@#114???_?_??O?O!4?_#48!9?CCBBA@??@_@?@?_??AIC?@CP?AHaGT#114!7?B?@??@A?@BEKc#116!8?A!7?O@?H???@???@@!4?B??@@?@??_!7?_[AGD?_#127!9?@#107!12?_O!5?CO!6?CGS???c???F#59B#72!5?@!4?Sb_GAhU?C$#239!72?G!5?OO!6?_?GA?A?CAO#246!19?G_!4?C!75?O??O#104!118?C#237!16?S#246@#37G#48O??AC?@!4?_#80!7?sI?C#48!4?_??o??CK`EHE?DA!8?A#114!17?OG#99!17?hC?GAG??C??S#59!6?A?@??@?A#55!12?C???_!4?OA#149??G@?A#103!55?_?G??X_ADPcQDob??PUC?WCW_?@OdOc?Es@??GCA$#90!338?A#101_?gK?C?A__G!35?B#69?_#99@#250_!7?_O_?_??O_#40!39?A??A?@#52!14?_!5?O_?_?G?A?@!8?C!6?@??A!8?OAG?O#118!54?OO$#70!339?C#75C#16@#77OA#100??G?C#130!130?G#136O!7?O#119!78?G$#123!340?O#95!6?G??C?B?g!8?_??C#144!113?_$#80!347?@-#237CP?GTOI?dGaPk?Yd?aOGD?cOGDA?TgAOHCQ`CGPaCGPa?TGaT?IOdIt?tI`IsJcHoHqDGTI`M`EhBoDO@qHqHShUgU_S`OG_???O???_?O?@??@?A_GA_?@_!4?A??AO???Q?CO#239@?O@C#105!13?@??@??cH#192!22?CO?G@O?G_?@?A??_?G?O?_@???@C??D?G???C@???_???@CQG?_?G_D?a???G!4?_C???OAc??S_?G?GO?g#191!11?C??_!4?O!14?O???C?A???C??C!8?A#239!4?O_A?@@#56A#101CSO?O?G??aF@O!4?_!8?_G??a?_O?_G#53@OIGc_#250CIcX#54?eD[SSWCCoQ?@O@?_?_O?O#250A?G#72?@@^^^m^FJFB??CJCBEKE?DBC??BOA@OB@@@!4AD?DA#59???@?CO#121@A??O#52@EG@??A@#144??sO@??@???A#136@#149??O???WOk?D!4?`O?C?A#125!5?_GOkzg\QANEa#126O#112?I?D??A#115O???@?C@?QGG@C?HGI@_x?OC??B@@Eg__kA?@#72_OGCScIP?G???A#95?_?c[QmSoe#131mSyojSq$#246jCPaGDPI?TGAPc?ITGdQgQHdQg\iATxEqhKYreKXreC\iaTKivtnYOInIo]T@sYUDeGiQi_UO?oCWEgEgC?C!4?@!14?O?_?O#184!4?cHQcAhS@???A???_GQ?AGQG?O??A??A_C@gAOC?O!5?G?O??OC@O?@??AOA?OH_AG_AG_A?@A??C??AO?O?G?CA?C??CGOA!4?_?_?AD_??GaSICXc???@?C@A???OHqD@qKbKROhQc@?OIPAH?_@_???O?o?ShCQGcO@aG!7?c?gA_Ga?Ga?GA?C?`??_?O?_?_??Oc?O?gSg_Tc#96??GC#244WCA#102?G?@C!4?_#48???CICC?GOCO???k?C?O?G??C?O__?O#69!6?AE?A???CWGC@BQB?@???__?OO#114??C#77y!8?K]SGOGWO?O@G??ACG_@CG?O?GG??H?H?lQJUI___#69A??_#140@AGO??@#74!4?GGiaEqi]G#130!5?G?C@A#140O_w@M\??@Qw?PsHQPUU?j#132??A?gS?XC_!4?@#114???_o??B?EGCcbQOG?@CoAA?_OG???E?C?O??P#98??_ow!5?ACG??`A?A@#93gO_GO@aDJSjL~$#244O?aD?A_COA?C??@#202!34?G#192???d?O?@?_I?@_?O@?C?@?_C@!6?@_?O_!5?AG???A??A??A??A!14?Q?C?G?D!8?A??g??G!9?@_?G?O!9?AG_C??_C#246!20?C?_?P??@?A!4?GO_?O!5?O??O!7?O!11?CGQc@?O???AG#105!8?@??DAGADICI!4?@A?_HOAlZulJcHQDGTaHQcHQdGdAgQGdOcHQG`IPCHQdG@S??C???_CGC#41_?K#75A@#72_?@?@??Og}h_G?cC___OoO?wOsitPAH__?O[k_S#62!5?cgHwb`___qIG??GAIHJHIHg_#102!6?__??wowo!4_???_?_OO_O!4?_!4?_?W??O_!4?__CO#119@?KGO_#54_#38@FMPaOAr@@!9?__wg_{zelBN?[@?`C?@BG?@C@#55???@#73???CACg?_PA#118??WWGkwk]HRoswo@`R?GH?Ooo!9?A!6?KMI#134!4?GO`A#100?@HE[{]\n@?@#134@$#240?aGO_gC_I_Dg?YcOiTIdQlQGdQ?TgAChCQ`CGPaCGPi?TGaP#184!9?C!6?G?CO@?SG@AGA_@O@O?QGAHUgUg?_?@C?_???O#246!21?_??_???_C_??_??C#239!56?O@!4?_?G_?Ga?_??G_?gO_G_?g?_???O!14?_???G???G_#198!11?A#193!17?O!6?_#208!34?@??G?@gC#0??A#193G?@#121@A#95I?K@?C#53!5?Oow#114!15?_O!4?A!7?@?@#148???G!9?_#49??OO#48!12?@!9?@#114_#108_#98??A!4?@??OA@#100GA#108!4?O#114!9?PIIOoo#49?C#128?O?O_?@#63!4?EO#37GO#152?@?C#129!11?OAA?A?OEK?RGG#121!13?o?GL~tfaaB@B???KG#102??C!4?_aE??CC?MFbSlggwGBMM@@?OC?@#99!13?OWaC?JFHOH?C$#218?GC!4?P??O?A@!9?A??_#193!37?A???_!4?O?O?GAgCG!7?@???A?T?GD?GD?GD?GCA?K?PC@ODOGC@G@O`?OG_DQH?G@?gA@CQ_DQGaTGaPCGTAoAgAsAOChQCgPCR?xEHObSI`SAgDQG`I`U_IdAPI?gO@GAP?aDGASGD?G?@G??@C?H???@ISJcYcGDOEHQDOIOG!5?QG???O@???GPi@?S?_?_#137!57?@#104!8?`#37O#40go#88O#93GCo?O?G!8?@@?@@?@C?@!6?C?@#59C!4?@!4?A?O!4?@?A?@!6?A??@?BGIoA!5?O_#101?C??@I@CQCHQHKacJlysNKWESK]EDDLCIEIOd?G#115??@?K#132@#125@BAK??_#56I[_wKW?_?@@!5?EPCC?A#116!6?_o?MG_??c_AQCMH?A?@#119!13?SOC?@EKA???_#107??C!12?BA???o#59O#77@!4?_$#202!4?A#239!68?G#196??C???A?C@C??@??UHSgpIGDqGdAwDqGtAxNqVGQcHWAaQktQlSViTFGhSddQlExEwhVwLr[AtLizeI|E|FsJlJqEhyFkqKzChSjKaT[b\TqLtYc[`]`YtKdiELqeXGuPGvP?fOlUrKVQLUpGURkVG`@_A@IrGexQkoNonDQCgQC`CpCJCcZm|BcCgUiT]QLvTitJtjUzluXnYCf\QcHQCZQlQtITSlRSlQtIxVKrYLZelR]TizeHYf}AiTRiYVJRp?A#35C#134?_#98_?A?G?_P!4?CB@WOJYKIAIBCJ@?I?K?A#41A@#40???CaXXrsW??O??AAB@@??KK?KCC?ECECDdF|yC_#53!9?@A!4?@#73!33?AKG?__#142?C?KC?eA@!5?`r|WMBBV@#52!8?_OA!4?C??G???_#103!21?_??BGQG?OcAT_E@IXCpGG_OSC?@?O?Q?_?BB??A?CG__$#239!84?_A!4?H?ACA?TqGdAwDAGDAgCo?g!5?C?G?AG??G#237!71?C??C!8?A??A??A??A??A?S!7?_!10?@!5?A#42!85?O#99!4?@?A?PGGO?A@??AAC?A`G`OA?AD?C?A@?A@#39!15?G!4?_o??OoO_??O#103!18?O?_???_O?GO!4?_?!4_Oo__o_Oo?Gs@SI?C_#81?C??O#145!11?CSgKS#55!20?G#128_!4?!4_HSCQCP_@@#101!38?O!4?@!4?WKEB`JOc^Sqpb@$#103!339?G?c#85_#41!8?A!5?CC#77!8?O!4?E?B@?AA#250!14?C#92?__#119!168?o?C$#100!340?a?UAED!21?@#102?GKG!6?CG@#53!15?C???C$#133!370?O-#237\_SI`@CBOM`SIh?SgCOi?SigTAhSBgSBG?T_AH_SAH_SA@gCQ?OK`ITiChS`UgEpCO_HOcGqHqCiSGO@aHqGSGOGPgOaOIO?OiO?A_GO_?HO??AG#192COA_!4?Ag??Q!4?CO?@_??@O?C@?AO?AO!8?Q?H!7?G???_@C?_?@??C?H?C?a??Oa??S!4?Q?gAO?COG_AGC@G?AGCOC?_C??GCQ_CG??@?AO?A???OA?c?A?@?C??_C?g@cHAGACGAO?AO?AG#191?Q?G?A?_?G??O?A!8?A??C!6?_?A!8?C!7?CO?A#137_@#34_#37O#59_O#101_@S???s?iSgQcH?R???QCHCOCGOCOaHOAOICA@G#103O!6?O#69???C!5?AAE?AC?C?E???A@#103!4?@???S?CA??iAHCAaC?E?kQUAqA`g?GgcGcOCKQcOCCGCHC??d@T_C#69C?ECWO__#55@?C?CGG?G?G?G?G??A_#125!7?oo!5?_!6?Bl}WUWNK__H#112??_?OA|QC#115gC?_dGQHS`cO?A@AQROKED_?_?@BS!5?A#121KKA#134??hCIC@Fg?gAw?CI@CA#95?@?D?@!6?@C$#246a\_SAY@c@OI`SAh?QgCOi?SAgTAhSBgSriITkQJhsUJhsURhluaq]t_TZQjMhTPMIlJuDZQDUCx?AcGuGS@e@aC?CADGD?@A?@?`?@A@#105!56?C@A?D??D#246!24?_?S_?C!6?A!4?O!6?a???_S!5?_@G#105!43?c?@GOAC_@iCPcOAcHQDgD?IO?hQcHOAChCgQcHQdGQHOdQcGOg@ECSJ?C#53_#48G#72GA!6?S?jSDBA@?I?DLHABFGFDAF@A?cecrW[EAA?C?A?@#139???A#62???K@L?G?CG??C??C#102oOK???_A?A@?___C??O_pgSoooqQgggKC]UG_OOsOGO?GYjg_?G?OG??GIYqg?_#121@#81B?K?O?_#52?G!9?OAS?GO_??S?C??d??A??@G#55C#127!6?@#132___R[?A#143???CG#119??_yS#114OhCQ@K_JSGF?CA???aO?AL!4?K!4?wbD??C#99!4?@!4?KC[?woOyPh]cWa[YcYLidugQ$#218?A@?C?OG!6?A!6?@#240!15?_C#244!6?G#252???HC#184!11?G?@?O?G?c??HACGO??@aGOGOGOgO_OaOG??OA?C?Og?C_G!5?@??H?c???C@?GCQ`?A?G?C?GC?_O?G!6?T??S?H!4?C_?G_!4?SG??O?SGOaO!6?PG@?G@?Ag?H!4?CHa@?C?`?_?cO_@?@G@QHA@???@AOAs?G?G?OcI?G??P?_G_O?Q?@??C??O`O?`?Ch?Cg@_D??@_OGD?Ac!4?GcQ?gQ?O_O@O?G@Oa@???O?Ga?Ga??`?GA??@A?G?C#193O?@#56C#102AK_#77!9?gWs]kSLY__ooGoo_wg[SnXHP!4?H?D_#250??C_CEKGeWep_O__O?OOO?G!5?OE??G#77_?OaA?@bJD@CA@@BA@@?@@@?@?@?TC@?A?AQ`??AHU_u_V`Ys_#115??A@?G?_#132@#140@AC?GOOOoOO_OO??oGOCg?NohLQEDGVAXIIcr`Xd[O???@#73??_AT#126_DQ???D#107??@!9?G??G??C@#77??@??A??IcO_?_IBOG#125o#73A@#131!5?@!9?_??O?IcW`CP_Q?G$#240??A`G_IOe@SI`S?h?A@??A@#192!27?G???I?_C?O?A_?O???_??G_??O@?@!8?@!7?_C??G#239!97?O?G!6?_!4?G??G!9?CO?C#192!75?C#208!22?@#0?GA#96G#64A#77_#99@!5?A?@?@#103???_?_O_!4?_#48B?A!8?G@??C?A#54!15?@@A?A?A??A??@A#101!21?@??@??O@G??VA@?B@a``?@CPQ`R?A_U#119!7?@ACKOO__#128G???_???O??__?__???o??q_HG??w__TO??_ABkQ@eGFO#121?@ISyl^zfwAL#118?BjEQGc?A?A@#102?oW{hgKCaOo?WIP??A#72@@O!5?OGdQ@CG?G#103???@#93!5?_?`OB?A?ID?DAHUh$#244??G?OC_?G_!4?SA#202C@_C@_?T??OA?O@?CP_IPCOAH_SAH_CQ???@#239!12?_#193AC?A?@!6?AcGO?C??@aC?CA?G@C?@?CAOC@CIOC?aHO_Ag?\AgQGODQcG`YdQG`MOCIOcI`Y_[`CH_CH_IT_IPcHc?cHOI_GQ?cOJSAwBSIOmOJOe?OHOKrCGTgBGTi?L_@CH_@AD?P?w?EODOA@?TA@OhAh?GAPAs?wChCpKRcHcGRGdWcRGqCZ?RCIO?cO_P?_@Cg?D_@aCQ?GCa?hOI!4?aG???_??O?cG!5?_???A!6?G?C#237!11?_O#218C#80O#93C#103OOG#53!13?@A??QCG???G???_!5?CA@?D?BB?@?A@?@#39!8?@@@B?@?@@@#115!29?C?_!5?G???G#59!9?@!5?D?O_#73???BAK?O#142@@???A?AC@B!7?@#103!41?OH?Q`S_?QgF`?O?_G?`?OaP_A???W?C?O#98??_OICyoq??Fa?_???C?A!6?_??_OO$#252!16?@OI@SG??AgC?gCAg?C#193!16?@#239!24?@?@A!7?@a!5?_?K?C?CGOC?CA?C?_#237!89?_?AG_?G?A??_?_?_?G??GA!4?@!4?A#246!97?A#204G#239A#244@#130@#98?G?@??@A??A#40!6?_#99!9?@#102!8?_!7?O_?__#49!14?@?@#72!39?A???@#49!25?A?G??_#74??@#50_??_#116?O!4?P?O?K??H?AQgDCT?ICYEW_#59!36?C?@!4?D!5?C?@?C?@#100!8?wOOPR?EEJ@CGC$#196!76?_???C??@aC??A@GD?CaPi?hO`I_APhQb\UlVxE|AsVHvlQhYdU`GKrKpeZpnQ`]@MbSju\ju^_i^`mQcZuZqJsTVgvZi_B{BkJ`e@L_nO~juLaCiTaUgTA@U_JUPaSOKoRKSBMPBGFOmOa[_C?sQhEw?k@GFpErKbGPePvGeWFQKbLhCykRoJuHELiU\iQTjQ[UWhHuU`DWQDOTjmXDPHuDGViLdIbUdYeLWZUxDlRSlQTdqIYdXvnUwhrgOC@#100!4?Ab}~~GhS#59!28?_??_?G?C!6?WcWA]_[OGW?KGG?O??COGHOG_?OI@@@CG_O?Q??G???G#100!11?A#125!29?K?Oo?_???_??_#149???@@#119!62?GG!6?G!6?AP#251!8?_$#95!334?C#114!36?__OWOc??C??_!9?C!6?C?C??FOISCWL_?GOWOS?k?GS?GKGC?C???O??_!4?GC??C!7?G?G?A??H@]Wo_#38!4?A?EAEEKCK?KCKFLAGAFM?A#101!61?CCW_@aE_?G???GfO!4?E!5?@@$#40!371?O?G_?WhYIXWRo@B@!5?!5_oOgwGg___dBOF_CGSI#56!55?@A?@@@?A?AA?B#129???C!4?@A#118!65?O!6?_$#121!397?A??AA#63!75?@@@#69!78?G!4?_$#77!398?_#53!161?C-#237aG?BgD?aSGA`LOg?RKAPCAXCAP?i?SjgU@Ga?T?i?PG?AHCq?@QChQdWDA_QDWdAGbC`IPAShS`QcZcI?J_HaPeWaHA@AOeOdO?P?G@?C@?`C??@#192!4?OAG_A?C?H??@CO?@??C??_?O@C?H?O?G??C?_C???S???@CO?@?G???H???G_C?H?O@?O?D_?AT?AO_@?AC?IO?I`?A_??_??S??@GCOD???_?OC?A?`?O_?cG?S`G??AO??S@?_A???G@ACA@Oa?_?G!4?O??O??A???O!4?C?G??C???O?G??G?A??_C?c#191?A??A?G???OA#246?_#96_WC#77_oWC_?b???C?QCGTID@?A@L???B!4?DFKJEUAEkguIEEA@@@Aa_oooOWOO!5?GCC@CI?EDA@`???@@@O?`KL?qJJCOKO?G!4?_#115?@`_O_@_@`??_#114!18?C?C???@@?ACKog#125AGCD?@@?A@?DEGQC\CGpSkS?_DKq_IWCysG?eQLzdcDA#126G?L#118?owoq}zdFLCW#102AAKACcwYpG!5?@@@?AB@!7?@G#107?@#99??_O?@???_~LvJaHA?IPIqlRkdOGMdcuQR$#246TaGSBgTGaTGAoDAgCPkAXcAXcAT?i?SBgUtLiiTTiAt\SqXLuudyUkIby\LlifYhu[Y[tklhAAYCH?P_X_UCWCG@?O_Gc???GAC?C??I!5?_!75?_???G???@A!5?_@!4?OC@Q?A?A?A?_!4?_?O?G??`?O??C!8?S??C#105!23?_GA???@A??IO_@S?i?S?H?A?T_A?AGQ@cG@A?A?Ah?SdGPA_I?C?WK??@#98O!6?A#114!9?OgUP_aosICWd??_!4?G!4?G??OOG?C??GAAAaCB?i?Q_??O!4?O_?KKWSI_YiedBA_O?GoC?gO@_?OG??@!4?@!8?A?A#59!17?A@G@??B?W_GO_#140D@!4?@??@?@AC@??A?@??LJA@HO?BG?B@W#73?G???QqGT#112???GA@K@#115C?O?Q?C__OPA#77?C?EP?A@A?CA!4?a??B?B#100___g_?_O???_#131!4?oGSDQ_T?aDG?kRGdO?G@?c$#244G?T_?OAO@?_S?A?T#202gA?_A?cA?_?S?h?S@gAOD?i?D_A_HCa???G@!5?_#184!5?C??@??A?AO`?`QcI???H_?aOEGA@AO?GcO_@!6?c?Q!4?TI_I!4?O?O??C!4?GCO_O?HAC??_??C?C?D_?P?O@I?@?IO_??GC_ACOC_?c?A@??_C??CGA?W???_GCGS?p?P!6?G?GCHS@?H_S???_AXEGE?bGOGCGAH?@A???C?_G?H_??G?GOc?u?w@oGCGTGV?eP?BGCgCI_W_T???_O@_A@?A@?aGDAD?_A?_?GCO@O??_???_CPcaG?@#237G#0_G#73G?@#102W[C?Sw!4?_?_?_O_?[???C?AG~^IOoo__wwOO?TG@??C__!4?G?`__?Og?KOAG_O?GOG??A!7?G??a`@!4?_EFFfvwEYmUIMEJSMUKG|Ldx{i\z@P@?!4c?CC??@@AFUEe{{_O#81@?C???S?KO#54?_#128???DHA?ITMiPG_O?A?BPCRDGseX_ACO#121??o_~o~FDM@#103??Qg?_B?DQ@iGD`IO?wO??MG?@K!6?QSTW?A??A#134?Ia[@zSH?A#93?_GcXaTGo@Q!9?@$#240?PA?SA_CG_DGAgOA#252?_PK_X?_XKi@SA!6?O!7?_???H!9?O#193!4?O#196!9?GC!4?P?C?A?G@?O_G?@eOBADOCXCiTHIPCj\vAg@SPeXvIdm@nOrluXeRgJDIvcSxjSJ\aZ`ZaYDYeLakPsItc@MrKrAXShaHUXA\_]_^?ZdYr?T_DAtGFO_@aAK@iSa\dWv?Rc?O?sGS?IDqL?K?_?P_GQCb?Rc?uG_\bGrGBSb?UHudQdIBW@IDIDQbPaAgtGiPs_RSiOTDV?jJy@lCZGuSlGm?TgxOvLsZTmpRhmHExHYtm@Z?RHdfQDF?@#72CC???G!9?@#59??GC!5?G?Q??O???O!4?A@?PG@Ca??OOGG???CBDBC@A@!7?O!6?cOWIc[B?Q???OBA?G_??AO#107!5?G?GO??O#115!29?@A?C#49@?AI!4?A?AAAGO?W?O???A_??G#55??C#114!25?G?qH_XG@_?PA!4?A!7?@!5?C#121C!4?@#95!15?O?CG_C?C???A!7?G$#218?C_G??G@?AO???D#193!13?@#240!11?OG#244?A#193!5?G#192???@OC??A?O???@?_A??O?C!6?CA???@??_?C???@!5?G?P#239!84?GA_?AO??O?G??C?G??A!9?_???G?Q@??@!9?O??S??S!5?O#191!23?C???@!7?C?A!5?_?O#198!5?_!5?O#192!16?O#239??O#24?OC#16@#101_??`C@@DJ^LJVACA#115??_!4?OOc??_?_#72??@???@@!9?@@#54??C#250???C?C?A#103_?_?O?_???_??@_T!4?O?O?G?COjC@gOOG?DHCPgSP_Sa@gOcAQWE?Ta?wG_h@@A?C@QC`I?g??O#54???@#121@?A?O???Go_?OO_???_#132__!4?@??o???___!5?Do?AHGDA?A#119!11?C#107_O?K#101!4?C`mDluKOqGe_keTIFO`?ACQOACD!5?C#98!17?OIfpQYHGc$#218!41?C#193!33?G!4?_O?OC???@?OcG??G?Ga?a?C_Q?i?OAGsAsJcHc?TGPiOeGQGaHcQcY`GQHACiOaS_M_T_Y`GQHQcJ_IPmOGbCwE`QLq?eXaT?Z_U_IcGfGQ?\?_G@ACGs?g?@CaOCGdGQhEHA`AT_O@aGoAXAGD?`?OGcHAHQ@aGA?vG`KaHaGQLOdWf?s?oGcGCGT?APCI?DgA@cG_G_C?CGAO?`?AO_PGA?C!7?CG?O?OCA???S?cG!4?A?A#97A#53G#41A@#48A#115A??A#40!14?I@#119_#69_#101!5?GBC?@?@?C#69??_??_?O[G!5?A#72!10?C@C@#101!16?C!12?_!10?A!8?CAAQCQG?Y?_!7?_#119!5?A?CG_!6?_?_#116!6?@!5?OC??CGC!4?A@!4?G#72!31?Go??o?O?GGdG!4?A??CH?D@??W?hC$#239!80?C!7?C?CO?G@???Ga?aO?_OCG???G#237!80?cG??@?Q!12?_G??G?A!4?C?C_AOCGCA#125!94?_#56?A#103?_?W?gCyo__O_GoGE@GAODI@?@!7?G?C?A??_??CA#121O!4?CC#77!58?A!4?@???CcKQGQX@zYhzYswSoGgW#69!4?A?O#73?oYiuAK[KKWo__???_???A???o#108!46?@#98_??G?OO??o_?_??CCWqWIc\aE?AQ$#121!330?A#69@#122?O#53!30?@#115!6?_?OG#53?@#118!62?@#128!34?@#132??_#50@???@!7?A#129!6?A#100!52?C#134O!4?O#108?G#118G?G#115?@$#40!372?G??A??A@@@H?GGOg@[PeHrIiPeHaPqCiTI?C!7?C?_#112!142?G$#119!372?_??G?CC???C-#237GaC@IU`SGAc?hAGP?aOD_?D_?T?i?DIi?dOI?DOI?OI`CQH?a?SOdQcBG`ICR??pEO`SgDq@w@iTITITiSg@ATiSgSgUgPAO`O`GdIO?ITG??K`C#239!73?I?O??H!7?OA!4?@??@?a?GAO?a???@!4?P_???A?O?@C?@C?OC!7?@C?@?_???_!4?_??_#198!4?C#105@!8?D??G?ACG?A?D?I??iCO?CO_?GA!4?AC??HACI@MG@??@#72G@#103GmJEAW?O_@JfPF`SE_??O!4?O???A?C??@A???C!7?C!5?AC???C?@?E?A?@?C???@O@O!5?OC???_??@?YCgC?hCQ??T@K?BAG`AI?S@HSAL?DGBGEpGGG?SBShAS`!6?_O_#115@G?AO!6?GC?GSG!7?_?_O??O_O#126?C!6?O!4?@#118_gop\Q@@Q#102??WSg?G]DFFIFC#77@A?@?O_??_??O#108???G#251C#100SWKXEV[}}ko?Q#93_?_gQHuhqt[aWaH_???O#134??c??_O$#246TGaS`GI`SGBSOdAgT?i?Ti?Ti?T?Y_TDYIdtyiDtidSYjcu^TaimYLX{REtxk^VIwnMjRYKmASS_O__?@ADySg?A?B?@C?_?AGCO!6?aS!77?_??A_??O???S@??K?O?OCi?G?O?_?G???_GO?G?C??`C_?C?O_O?O?@??Pc?@C??O!9?_#191!11?G!9?G?A!4?@!10?A!4?@#153!15?A#208_A#35OC#118OC#101C@CG@A@#111??C?G?G#107?G#118!4?AA?O#72!9?O#77???@@@!5?E?BAAB?@@!6?C!4?O!7?G!9?A?G?G@GIC!7?G?G??A#118!7?G#77!11?AACECJ{jUljM~PNYs_O#40_#59O?ETG#119A?O??A?`?@B?ACO_??_?Ko?kSG?O_oo?O!9?_?CME#114_dO?_J?A@?@?@#122?O#100oO_?_o_#114!7?B#107A#98!7?COEPGB@@ADYKJM@!16?DpmJhdP_$#244a?OG!4?A@OGC?_C!6?O#252!19?@!4?_G@#192???_A!4?A??_?@?O?C_@O??@??G@?O!5?@?O??_???C!8?O???G???H!4?@C!5?@??@?G@?A??A!7?A???C?G??A??@?G?C?A?C?A?@?C???G@C??G?C?G@AC???D??@!4?oCP??AG???Ca?GAPC`?G?@?_DO?g?SG?@?G`C??c?OC_I???_??C??C?Q?DgT?DGDOChA?`?O??@Q?@?A?_!21?G!4?C!15?G#56_#115O?OO!6?K?o??_OO??GG@`SP?Ag`_WSaWOE?_???GC?C@??g??GC?C??C#69!18?A!5?H_#72!4?G#69!11?C#101?G?G?C!20?CA?A!4?O?O?mOdGO#114???APisk_#125@Oo#118!4?_!4?_#125?@?A!4@???@???@?BELL@AN@#112_?O?A@!5?@#59!6?C#101!6?W]@@op?GWfOkOc_tPRHjbb?_?_??O#72?@#131??OKV`cGQCGaPc?sQSjS_#100???AG$#240?CHAS`SI?cG`AGPA_O?o?O_?O__O_?_O_O???O_?OI_#193!6?G@!5?C#184G#252???_G#193!9?CA??_??_??ACg???A?@?@CG?GA?C??D_???aP??Q_SrKqGqHqLqSiOcWaSaSgDwDoCxA|AsHsIpIoFoLoHuGqDqPgDwBgTgEwBgTaSaOiPeOjOeOgPOnOGQsGOAsJ?I?Ps?@IoDG?T?c?GAS@aWe?G?TA?@?i?SAOIOJOI@I?PcI@M?jOi`Ao@GA?AGQ?aGA?OCWA@o?G?CG_GC@GOIC`?I?AH?AG?C?@?C?B?C@A??HA?C?GA?C!7?A#49_A#102__OopCCMbFACOM?MBhRVo!7?EB???A?gGLMIABG??C!7?O?GHI???g_?`@?C@?BHCA?O??O?O???@^VUT]c??@AOBO?@`p_caOGCdA?_@??O?`ojifkFhK@`pp_#72!8?_#102?B!4N{_#69?@?W???GNErYsico?O_!5?O?gO_!4?_?_#140A#115!9?O??AG?o?c@?_CA#72!9?KGA?E?AG!6?acQ#99!4?G!7?_O_A?GQ@?@??GAXALjSjIMPOSQMN$#218?P?_!4?`O?A?OC!5?G??G!5?O#184!42?@g?IDACICgO?@ASgCgSGQ?P?O`?@IcA?DG?@?_Q???CAG???GADGC?G?C?C??G@??G?CAG@?HC?@A?@?G?GC?A@?@???@??G??@AC!4?A?A?@!4?H?G??IcIsJ?A??aG`C_BO?P?_???O?eOCOA??a?R?AOCi???I?A@A_???OIOIOa@Io@G_???A???A???GCGA@?c?GcW_HSA`O_Gt?SG_SGaSAh?Ag??DAGO_Q?lQGaSHaHO_AOdC@#237C#96A#40C#114G@???_?o?O?o??_?_?C_MKgg_oCIPC_@`hGC??_?Oo@pAwW?GKO_MG_@OcJOlA[G[GmA{q{Aice_FZCIlAG@k__@?_Od@o@IoCPgOC?QOGCPQ?wPSAW?aW!5?_O?OO?G#81!20?@???E?o!4?@?B!5?O?G#118???_#128!7?@?A?@#69!8?G#103??_?C?K`ABkb_ygGdWb!4?A_O_OFOlJ^IK#95!17?O?C??CGA@C@C$#252!16?IHD?AD?AD?I?D#196!49?O??@!6?@?A??i?b?CWaOPgY?aTGCBKhUjGpDuHuDoGbOnReXbWjTqEwNrEx?tIsApMoLoMqDu@qLoKiUwFwUgVoFwUgXb[jTkPlOmPmT?e?dQc@?@??_K`K?AGQCG?aCGFPKbCH?HA?LOfG?CgC@O?`M_@cG_K?ZcI@c?`CG?S?M?VgVGtGvWDxULrAtkIuQlrQFTqIoEdPUGpbsSjoT`xUSxB|waXuc\huOlpXbsSojT{`OYC#239@#140G#70@#77AA!4?@#69!15?@?NHA!4?[???AOo???GCA??_OooC???C#115!21?___??c@o!4?_!6?_CAg?E?A?@@O??GDCi`eeHC?C??OO#59??_#121!24?C_?HD?OGC??PGKM[wS_O?KABCKMMG?WgO_?o_ow]|M^@#107!4?MMGOqCGOOO#134!9?CCCHCC?G!7?_???_?_???@Ic@C@$#202!17?C?I??I??I?D?I??D?I?D?I?D??COH???S?@!4?_O!5?C#239!23?@!6?CGC?A!4?D_???aO#237!82?AcH!4?_?@C_???O!8?OC???a???GAO?G@!7?_!5?O?O!4?G?C?O#217!66?O#240G#132?_#59!5?O_??G!7?O!9?SG?@?AC`ODAOs_?oG{?@@??_O_aWqaPsIO?@_?o?w???sOG@K?CJTAOEIO???A?AO_IS@G?A!7?__?O#73!41?BEN?_!8?B@AE?G?C?@?AA@@FIEC??_IG#98!30?QGG?B@$#218!322?_#108!8?G!4?G#119!12?E?C@??_G#121!11?A#40??A?C!4?O!6?`AOAPAC@?AH??@O??G#118??_#119!21?A#107???_?G?C!8?AOOO#132!30?G#49_?O#132!11?@GEAAA??@!5?@?GOOCC?E@A$#119!371?@!5?G#49!116?@$#101!373?A?@??@$#53!376?@-#237aGOCgQCKQHCaGeQhCG_SA?HcOA@OC_I?aS?T?I`OH_SAcPKAG@OhCh?I_S@IaH@?i@QdGtAShEW_Y`GCHUGRKOaSbS`WaXaHe@eWaC?AC_IOI@CA!18?C??C??C??C??C!18?G_??_??_??_#184!13?Q?`C?A?gO?A@E_F_AgDOGc?I_??h?O?_O@?AD?_OcG@aKB?_PaWcP_S_EG?aI`A?H?C_?_?A?_OGDOG?Q?_C??OCXEHQC`EGHcIPe?`IS_TI_TGQhCaPCHAhCQHcQHcQHcQHcQH#246_@#56OOA#115C[?}K_OgLdBGhPPGCcbW_bSCAMrGo?[`Qk?IS!4?o?CAG@?a?S_?_!4?_S_#77!4?OOG??O??OG#115PhGGgAO_GGO?LG?G??_OhGOTcaOSAgE???G?aOsOCCC_?qAOQOP?_#77CGK?G@?@?B?F@NYUlsWEr__OC#119@AG??_?I?p?_@!6?__??_O???GEI@H@#112??@#107!5?_!4?@?O?A@#101?!4_WsB@!4?swNI?gA[PKJCISVIZa]dQoA#98??_#99?~nAOCO???gOG??O?H?iS`QPoOG$#246TaGPCgR?cQHCPGCObSJ_HuOALoM`IT_\?jiiTSIeOJh\Iep|VyjUZU~TJisT[umfTukYRIlhAPdNdYuhQ_dc`n?@WAKAC??O?W!6?GOC`CO#239!21?P??P??P??P??@!18?A?GA?GA?GA?GAO#237!9?Ga?G!6?D?@C?A_?O!4?_??@C?GA?G??CG?PcG?_GA??P_?CO_?a???G?D??@C!6?@AOG!8?O??G#239!9?c#193!14?g#192??G??O#208!17?@#97_#20C#121A?a#103bD?A??@?A?@?C??_AG?AS?a?@#69?cEXBOl?wC_oOowK{Ylvun\[gCgWkcks[_?_!6?_!4?_?_?O`???O!5?@G!4?_?_G#102?A@H@H?Pp`?_?OD???OqATKCCCLMKLJbBvu}y}}wcww_???AB@!6?_!8?GC?KCM{kW??GG?C{E!5?__o_?o!4_!5?O__GcI?A??C#113C#100IkUkVfZBA#77O?C?g??_?G???_#134???A?A!4?T#131?OK@G`I_T?cqOdIcqTPi]c??_$#244G?@gA@?_??AP#218!24?a???C#244???P#252???_C!5?_!6?O#193O?G!7?_???C?Q_!5?@??G?C?C??O!4?@_GOA??`?OG`]`]`]`]`]`]`]`YcR_Ga@gA`Ga@gA`Wa\a\a\a\a\a\a\a\aD?HQCHQDGRCGRcGfWfWfWfWvdPKrdLiOiO?AoA_H?BGDOI_CI_?O`?O?_A@_A???@CAC`C`?GPaGCX?TGACP_I_O?I_CpI_G??_`I?tAGrC@A??@?GA??A?d???a#237!35?O#110O#63g#38C@#102O?I@@?@!7?G?B???@#118!8?C?A#59??B??IF@??A!7?B?B??A?@AI?Z@|WKJCFTJhCJE???C???C??C_???aDGC??C!9?G?`?@??A??A#107??A?G@#101!6?C!8?@?A?`#59!4?_??B?@??o!6?KCGE?GO?A!7?A#107?A#121?@!4?@@?@#77!8?_#111!5?_!4?G#98??Og?_G_G#72D!7?@?@DI?@C@?GD#93!8?pepMt^iVJDnYdZCiC@#98?HmIDb{Rg$#240?PcAOCGQHC_Ge?hEWbSJsHeXaLoMpITa\?T?G`SHaSA_?GA#193???C#192?_#202???S@I_@??G#192??@?c?O!4?O!6?AG??S??@!5?C???@?O??@??G???_#239!77?A?@!9?GC??c?I@O?g?O?_S@_O@?A??A!4?G?CAG?@!6?a???G???Q?C??c!5?G!6?C_#217!50?C#83A#73@#69G!4?_W_O#59!9?@??C?G#40!17?@#118??_???O!6?O?O#102!8?__#119_!6?_?O`?P_!5?O???O!4?O!5?_#107??@?A#40?A#69???_??G#118!5?O#108!9?G#40!16?GCGAgO#69C?O_@@PM?pA__?@???C!4?_??@@?C?A#122!22?O??A#95???O?OC#100!13?@???C@?GL|~~^i#95???GA#134!18?DASBg$#218?CA?@?_@?_O??P#184!57?ACG!6?CHO?Q??aC_O_XaHa@a?cG?A?_??A?A#246!80?O?C!7?O@?AG@O??CA???@!4?A?_!4?PCP!8?I?G?PC??O???_!4?O??G?A?_A?c?GA??@#239!50?G#125?_#72_#100G#118?_!5?O?cO?A?OG#54!34?O#40??@!9?@???G??AG#118!5?O??@@O?G??OO!7?_#119!16?_#114!34?@OD?EW?_!8?WAQ_A?B@LRUE?@@So!4OGGCW?CKQG@SbOL?HG#99!13?G#251!17?O?G#100!33?G??CV$#196!72?O?A???@!8?G??A???O?GCXASaKTAKpCOKjD]`]`]`]`]`]`]`]dZkZe\yE|Ye\yE|Ye\a\a\a\a\a\a\a\a\q\udXudWvcXvcXfWfWfWfWfG?KQ?W_SADiWsGXOCO?_A?@O?@SA?ECHACGcGOgEHO?O?O_Y?C??A?C@I_P?G?S@mOdGRGCZ?tIDUOdAXdCXiP]dYepSlr[hQ?ZtKP~]tj^it^ivDUzTmze|UzluZluZluZluZluM?@#144G#101O#132@#107?O!7?O#121!44?W?G#103!10?O??O!10?GA??@?A??A?@G??C?GO?A_UGC??@a???IQ?@G_@@I???aO?OO?@?D?@CI?COChQHcWCYCgQg#73@?DUSK#115?PAAP?P`?@@_QQ_@XG?ggEG@I?A??C?I?GDSIGDA?E??OC$#239!86?G!4?@??C!5?@GP_?@???_?O#192!80?@?D_G??G?CO?_A?DO?HSAGaCHASGO?TGA?aG??OCI?C@??A???_PC??S?AO@GA@CO?D!10?g?A_??_?G?O?Q???G#240!35?A#128??C#119!4?O???_G???_!5?_!6?KRHa?K?O!4?_!5?O?G??_?GO#102!31?CACA#81!67?CAGA?_#77!9?O#103CG?C??A!8?O?W_GOOCOI`SiOmO@uHO~\N^R`@??B!5?_tzVTbmQsqo_gC_O_O_$#114!330?EKEAOGeUGefOWSFWGbX|o!4?_??BCpJDGMEB@@!5?B?BCFA@BA@@^C}AeBCR?icCrCPMEEAE\mAdr`IocfDwvYFERBiPKEgS?_?][U[LIHD`hGTG?__ha_PAo?_!7?O#125!16?B#121G@?qC_#118!13?_?@?O!4?CCCEAAE@B@A!7?E@$#59!330?@A#49!151?G#77!23?_?_$#101!508?_-#246TGaDOi@S_ICPI_DI`k@iSAXDgU`QKbCXaHSqhDyDOdKqFQyH\uQJmx\VTWtmDioInIoYnIdSRLaDIO?_BH?OCWLY@?@?`A`G`Go?pGPC???A@?_?OG!5?O#237!9?CP??P??@??@??@#239!18?AG?aG?aG?Q?CO?C#137???_??_??_???_#184??AP?_HQC@?dGO???h!4?ITAPATg?O???PA?T??E@aS_DO@C@??O_ADGO_?TAS?cA?_???_@OcG?S?GOC_PaU@]@[`^?E_H_R_DGcI?kAoBgR?KaDgR_GoAgOaGoA_C#105hA#218g#64E#114G!8?{XH???CB?_OIdFPpGQJCAV`Go{??@#121EAE?AC_!5?OH_xGS?CGO?@O#102?_aOOOWG^GD!4?C!8?A?@#103@!8?@???Q_?QP?P??OA?_?O???OQQ@QEG@OGI?OCC_G_GOGOkOfOG?I?@A??@#53???WGO#115??A?A!4?@GIG??C?A?@#77OGQDBCA?BCBCHSo?WO???_!6?_#100_?_gw{|MFB#102?D?C!6?A?E@ICG_#77?O#100?O_suU~#99~i?~dgT?OG?aPI?PGDQ_EGaO??_OC$#237Ga?OiCSaITpI_DY_SAOC@gC_Q@GC`OGa?SaHCQ??i?Q@OgDSa?HcPCA?AdIPiTIt?tIdOdY`KqCgTiTIs?zChA_CoKoMOKOEOE?E?A_IpKPcGSHE?a?A_G#239!14?C??CO?CO?CO#237!18?_!11?@!18?@??@!4?DO?G!6?_?DA??PA???A?PA?`I?cHaS_D?_?O???AOd??G??A!7?S?_??dG?C?O??O!6?G?O#208!38?S#237@#70_#72_A#118_kR!6?_S_Cb_oWID?G!6?O!7?_??_I??OC?G??@C?C#114@!5?C??E?OAAIaS?oAGB?IACEA!4@BPB???HDCFBB@OYMr@Rh_GQ?}niwOYVbYAIM?HOKH`w?_?G#72!8?@!10?w?wswso_O__#102??C?WOOo_o@??_OoOGKCA#72?_WGWSg_G_#102??FAFBLntIVoM?J?@#98??O???A#95@#107?_o?_G??GO?O!4?_#72!7?O#134G?@#131??S`?WA_ydaT[CtiCqglZwTKb#134?HA`Oc$#244a?DG?@?G!4?C?_#218!28?G#202!5?Hc??A??_#192A??O?D?O?D??O?G_?G?_??C?Q?@A_!4?A!9?C!8?A!4?_G?A!76?C!4?GQ??@COC??PAT_???g?@ICOdI?_I?cH?S?@O_CO?g?A?DGO?CAG!4?H?O?AgC?I??PA??A??I??G??_???_H?Q?C?O?@O?@?C??C?P???C?@C?@C?@C?H#239???E#83O#56@#115oC@GrGc?AcS??b?S@AcOI?i?@dOQlGU`M?t?AO?O!5?_A@!8?_??@?EOT?L?d?__?gSGEOG?`CAQAAO?SAALA?@?COi?D@KGCCDEK???D?L?gCDDC@KCA@oO?@O#101?C??_?O?AD_A!4?_?Oc#114!9?@?EG??CCG?G?@O?GOGAHA?@#98!4?_??O#53??O#107!11?A@#122?_#72!4?G?C#113!4?C#108??C!8?A?ACGC?S#98!6?g#93??@M?ATIDITi@i?TiDQ?C@A#100???_OK$#240?CO_DOi?T_Ic@Y?TIPmPiTaYDgUhQKrC\aHCQgDyDY`CgD?a#252???O??_G#184!15?A???O?DIO?_Cg???_CoGOKOCOE?E?A?A_IPCO_G?GA?A#239!83?@!7?G???@IO!4?g?SG_G???C!8?O?C!7?G???O!4?Q?_???GCO?A?PA??C???O?C!5?C??_#244!34?O#97G#81C#59HA!5?O#103!4?@#102!11?o#103GC@#54!12?_!5?C#81A__oO?o?BA??_#59C?_A?_??CB?FOB?@@?A#121?o??C?GGG?!4_??OG#102???O???Q?_?A!8?_oo!5_??EkC`rJZZJFF@??@@??FB@#59!11?AA?SC?G??G?W?_#103oOG_GctAID!7?@???j?@?CaOIDgLo~S^E!7?owONwJalUfDeNt|x[Orr]hBSI?A#95!5?O#98!18?_PK~ULAjZ$#218?PGA???@!4?O#193!42?_G!17?@A!9?CO?A@???`A_?`GO?pG@??AG???_HTHPK@tLa\a\a\a\a?G_I?cQGcQGcQGcYdYdYdYdYdYdYdYdY@SaHSaHSAhCOgEOJSb[BSJSb[ATiDY`[AOGQLOA?Gd?aH_Ci?G??GtAC?S`_G???T!7?I?I?I@C@Og??AT_Od?\?u?cJ!4?P!4?_G@Cg@??@_A@?@C?A???@?@?C??C?O??P???C?P??O??O??O?_#104!5?@#125A#102C#107@Q_!6?AJ]#59!14?G#54!29?C#103!8?_#118!10?@???_??_#59!7?GA!8?_!5?_?O??_#119!7?@#59!4?E?A@O?_??C#48!23?_#69@@B@A??CC??A???@#101!4?o_olYcQdjCYsJu?G{_gO??O!5?_W^~FVBB!5?A?@A???@!5?@??@AkjdN@H$#239!74?O!6?C?A!5?A!8?@G?C!12?C???A#246!83?A??A@Q?C!4?GC!4?@???cGO?PAO?H?I?J?iASh!4?a@???_H???CH?@A!6?_!5?C??_??A???O?C?G#133!34?O#112?G?C!7?_#118!84?_?C!4?G?G??G!5?D?G?G@???K#77!5?AC?C_?O_WsiUkQnWgS}dZ}D~FIFJNFCKW_wwo___#107!5?_#108!11?@#122!32?G#115??O#112O???g#115!5?_$#196!78?_@G???O@A@G?C`A?G@GO?`G?COCag@U`UPc?OcRsGa\a\a\a\a\ze^pmZheZheZheZdYdYdYdYdYdYdYdYd[b\Sb\Sb|CzjExjsj[B{jSj[B|iTYd]_kjUc_isgAOeXcQ?TiS_?_?g??A?ADQcG??_IO_G!5?_?OiCDIO_?ALAg?aH?X?UhUPIcIPeG@mpBiTiK@W_U_I_X_^?]_]irYdzQlJ{Eg~aXyEg^eJ|Ej\eJ\UzUh#121!4?O??G?G#112!93?_#107!6?`C#118!55?@!4?D!4?CEBD#114!46?O#118gO?W_G$#119!327?CR?C@!4?WGGE@?_OoCMA?__?_G?@A?dG???O_?@OC?cG!5?_CHAc?_G?G!9?_Og_OX?HCkWCc__{?QSAoG?COg#81!66?@@#121B@??CCEA#77!50?@?A$#69!328?cRj?A!4?O?GC@!5?C!6?U?@IYSh|HD\zMjZpWVMANAEJwOpJYY`H?L?L?@!5?cOC__W?W?_W?C??[??OGog?CA_??C!6?@??DA#119!52?A?AAE??@@-#237}?dOIcT?iC@QC`GAGCAgDO?COAgD?OAG?T_AS?AhCOHcOI@S_Ah?C?_GBc@Y`UGe@gQ?QkQcHOiCH?VgOhO@E@Q?OGoKOD?D?OaSIs?GAG?gQL?QC?A?GA[?GO?_G?O??@??@??@??@??@?AG?C!5?C#137!7?_???_!8?_?OcQG?QcGT_I_TGaGP_?O?G?O?G?O!5?_G?_#246A?@?A???ACGOA??BO`GAd?ACA??A_CP?_OG@??C?c??G!7?A?@?OC??C?@?A!7?A??_G?_???G#237!6?_#105!10?C?O!4?E#153O#83_#69CO!7?@AC?O?G?G?O?_O?@_CO@_GwkrOwNLTIwqMVHF@@P??_cEcyOYLH\DTa_?AKa@C?BCAD?B@???C?`?cW?GCOHC?C@A?@@O!4?G??G!5?OG@??O?G??O#59!11?_#72!6?OOO???cGdkZK~~N{bF?BCIAYRRaO?_O!7?[?I?IDSiOJoNqLOgS?A_???Os!5?Gs?G?C#118_OW__oogC!5?_o?@#111?G#108Ac#100?g{}}~n`j#131?@[Q?@ADA?LAEIHtMU\BI@A#100???_Bq@$#246@Y?dOIgT?yChQCPsBWTAwFwBkPAWbKpEgATgB{SAxeOJdsiJ\sUzjLTu{Jmc]htP]Ulnl@HRun?rSr_CBABaOgChE`E@IOIOID?@?@AdOdA@??_@??GCO!5?G#237!46?@#105!22?C??C??C#192?@!6?A!6?A!5?@!4?EO?C?`G?DO?HS_G???D?@cOG@O?GOc?@cA?C?OcWA_K_WaG_???C@??O???CA???O!4?@O?@OCHC?D?OdG?@??@?_?GO?C#96G#115G_yDAZ_PK{Cpc?W_\?{D{IhSqLomOXc?BKBA?Q??@???A?a#73??C#118!8?O?A#115G?DB?@B?E@A?B?A???@!4?C???_!5?J__?AQO_PSEWAhBTGccHD`?G@X@H@I?`OQA??oO#53!12?_!9?_???B!4?@#101?C@G?WAgQkUiIuKq\b^cZtWiPnSJoLqKSGjS\oKpMGQ`iPfVALaC#119?O#115GcK?E?@???o__G?O?a#101??AtE@@#72@#134?O[?S???OkOgOg?__?_!5?_?gCgVGKGC$#240?`A?@OA?S@yChYcHsBgTAgFwBkTa[bKPVgITgAhSAHeOI@S_#202A@???_?@#192??O@??A?_??O?Q?G??C??C!4?GC!7?_?_!8?G!14?@#184!75?A???A!4?A@?@A??@?@!5?@I@O?A@g?H?i?E?O?G_?A@CPI_OI?A?c?I_B?BO??OGpA@??_K@ODGpC]s|gwUkjms\oh[v?LA{Bs?M_KA_?q?wA??AOgA?GAKBCE#137O#97?O#103O??_C_S#107ko#59!13?C!9?O???o_?sCGOGC#132O#54O??Q???O@?@_?A!4?GO!7?_#118??G#73O#112A#118!8?EA??C?O??KC?C?@_???O?_?@??O??OO?A?QOOA?_#48!31?_?[?jSA_W??_#103!6?!5@#100!6?A@C!8?_#102!4?A#114??A#251???_??G#100o?BBA#114_?OG???A?@?@#102OC!4?C`#99!8?A?j}alnQdQgTaSXcSIOhagTu$#244?COI?@?i!6?A#218!16?_!5?@#252!11?G?COAG??O#184!5?G?@!4?c???OG??GPgO??@A?O?OGOC?D??_OIc!5?GOcAG?QC???G_G?_#237!84?@#239!10?G!7?@C!8?O?GCOG??I???c?I???G!10?_GA???P!6?C@??O??G?A???G?_!9?O#246!14?_?g#241C#101_???W#59??A#102!22?A#121C!7?@A@_!4?_i@jURG???C_O?O!4?OoW_GoOWWGdCSyzyY]ArA_O?`_OG?G#103!4?_??A??D?C?A!6?A??_?C?@GB?`G?AG_??c??AO@ODACA@?G?@#99!6?O!5?G???_#102CCC!4@#53!11?_#103!9?A!4?A@G?@l[SKG!4?owLF??S?HE?BKJK!4B_XQKXIPA#98!5?S!6?G?C?OG?O??_??S?GTzVgVoDy$#218??G?c???@!8?_#193!35?OA!19?@?_??AC???_OGCGA@A?GOa?GH!4?A_OC?@_?G@iDPa?@bCBcBCBCj?gCQgCQgCQgCQG_O`A@aPA`a@aPA@AxU@IOcZ?[bKoKPm?Xc@HQcHQ@GACPACPAcGlIHcPIHcQLQd[_KSaSIpKOkHuSIcYCmPGA_@O?CAO_I??Q?EpI_OG?AAc?J?E??o??OG_A?@CO?B?C?@?A???_???G??O@?D?C@S?C?C_!4?G!5?COC?C?A#208???G#244?B#116A#119G!4?@!4?AO_?D?C?g@SAhCQA@g!5?GC??A???@!4?W?gS??`Y@i@AC??gWSig?@?_Dc?d_A_?CCD``WKX?KSOHc`s@?GL!6G???G?SG?cWKDCK?G???O#77CC?CC!6?A?G?KYfiLJL}hVYeYBCB!9?@@CCG@HUKAgSsGqKa?_Pc!5?_C???b?BShALoE`??A@A#134O_#98@ATG#107???BBBH?Op{oCOKOKK]C`O#93!12?@!5?@A?@?@A?@$#196!76?A!5?cOGC`A`C??@A?GTAC_PItOLA`EGOVc_@OiDSASRKR[r{jSzEzhEzhEzhEzHuVlU\yTMp]TyTMxu|Eh]tlZC|b[rMrmO^cJYcdZcHua\pMgrKtIROdqRk`uQl_kYa[pJSjSKrkRs?_cG@o?CO_S?GO`GaC@S_G_??C?@cPG@O`CO_GdMYdDASkXEO@aGa?AY_@?BAGR??B?BC??yApAGBy`ZQlZUHfA|nYtjExzqlP{rH`B#136?@#118C@??C!4?wGHDAOaO!8?H?E?O???_???G#81!4?_ogKEC??HG??CC??___!7?WOGG??OOGg!8?@?`#112G!6?@#102???AA#59!9?A???A#102?_!9?G?vLDN^}X^v|__!6?C#98!12?gSgoS__???_#108!25?@#112!26?E???A?A???_$#239!77?G???C?G!8?_?_?_!9?O!5?GO_??_??_!7?CO?CO?CO?CO?c?G??_?G_K?G?G_CG!5?A??A!6?@?A#237!43?@O?_@??_?G?E?O?G@?_@?@!4?CA??O??O?@OA?@Ga?H!12?G?O???C@?_#72!38?@#121C#114G??A?BA@?AGcA?bBAA@?AG!4?E@B???@??_??C!19?A???DC?C?A#73!17?@#114!4A??QQoo_ECC`pf_UOa_RXAaA__QcEcadgAGhOrG?aO_!5?A#120!20?O#108!64?G$#77!322?A#112?A@!8?A@#54!19?C#59!27?A!30?A#101!30?C??C!7?@!4?@CGO_?_?Q_@O?O_O$#102!324?O_?G-#237|PwEgTAhS?hAG?i?d?AGD_A@OC?i?DOCA`G?SBOCiP?cGCaHOCO_KQ?iHS_WcHqL?QcPIPiCpAShSGqKrKRcRkQkOcGdGDWdOaWaGcQgAg@?@A?GPaGP?AG!6?Q?@??`??@??@GA???_#137!15?_?IOdGQcHSAO_DgQcHUhShQcZcYdYcZcXeOdY`SHcxAXaSHOaSG`IS?H?Q_#192!4?@??_?PA_A?O?@CH?D??@?PCH_?@!4?A@?I?OAGC_GQH?IOjCQk!5?@O_??G?Q??@!5?@GA??C!5?C!7?D#246?b!4?@#72_O#115R_G_HGOA~tSIhSu\IhcZdQNoNshVOn?_G#59s]N@@@#39??@#73@G?A@!6?_?C@??@?G_?aOOOGGcQOSOaeDIOAc?C?_O?O!5?G???G#114O??O!5?GgGGxZK@cOQHSUhu_@E??_oDGg??g??G#72??O[KZO\Lnz^jJmDVFPNug??_?O!4?@@AAC??IS?H??_O@JS`ITiDoDiDOfGZ_ItA_W@K@#107?_???c!6?GLC!5?B@??BAK#101Kh#251A??A#134??C@RisOhA~aXCbQH`IdYCbsY@ID?CQE$#246Ac@WAgTAhUOcRS@Y?lDqILOm?jS@Y_IpKQcJ_kJPCmXRcXSejxlUolvSqjL`ZUCqzlHmsCPQM|aCJqD!4?G??@?B?R?Qa?AGC?@?O?COCOiO??_???_?O_?OA#239!101?A???@?C?_??@C?G???@aOA!8?A?C??@!5?A!4?G!6?A_?O???G_A!8?@GA!7?GA#237!8?CO#150?_#202OA#83B#114BCP!8?I`SaG??OQ!9?G!7?A!6?A#115!8?@#132!26?C!4?_O#119_!5?P?EAf`_cd`bkctL@fAA`???_??__?_???OO??O#101???C??AO?QObK?pCi_AO?_?C@A??I#41!6?A??A?c#95c#101?@@?BMTA~uJ[VI]sj]tIDYFYTOjGRCNOAHP??AsB?@#108A#115C@??@???S_HDpCAO??B`CGO#100?A\n~Xv^z}kO!5?GCiWks]sW_oG??coOwr?`ib$#240?G?_?A_OAhEXcjSdYAwDoQlOnOjSdYdIpKRsJOciP?eGPaHO#202C??GA?G@C??C#184!9?A!5?O_CGQKBCRcQk?c?cGC?DO`OaW_?h?g???C@O??@OA??A!4?@!100?AG??G?K?IoA_O_YcIOC_?ASgUgS_WcW_D?_@q@A?CaC`COh?ODQcLQK@Y?T@HCPEWfWdWA_TGVoIpIPi@?ODy_\q?QG#105AO?A#24_#86C#77_??A#107GOcJt#118?I_!5?@!5?OA??C?B!4?A?_!4?@_??_O#69!47?O?C?C@??C?@G?o??@CA#103?CPGA!4?@??@C!4?DO_?Cg?DGC?G#53???_CA_#99?C??O?G?O??GA_??cAO?O@OakGG#100???g!5?_!6?O#103?G!8?C!7?w][lrY?A?OOm?A?q?AOK?A???TarS_O?C#99!5?DJiU|?O!8?@BOG?GC???@$#218?A?@!13?O!26?A#252!4?A?@!6?A#196!12?G#193???A?@?@!4?G??@?A?Q??a??@C?P??@?OC?gS_@??C?I_@SaHcQG@gCOIOCIOcIO?_TGPCQgTiGtI_y?{@y@{@i?DQ?G@Q?dGDQ?H?C??A??A??@??@!4?I??AG_A?C?HACAHAOC_HQcHcJOjEwEyDWAk?SH_M`?OAgO?WCi?A_GACgAHS_Gc??`CA??@_?C_!4?@??CQ_!4?A?_?Gc???@?C??_@???A_G@Q`Go?OAG??OGGCK#97O#99O#41G#102GGtSERcG#119??@S?@?aSAH?GD_COJ?gCO@!6?_?_?C?@??AoaUtICA_?CXCiSAG?CiC_SO#81!24?@!9?A?A#102!7?AA@D@A@?Q@EAHMJF?AVRqV@g@@#98!8?O???O??o?g?_?PKrNX`n|bAI[Osq{o_#134???_???_!4?_?_?_?_CO__O_?oG?KpA?@#118_OG?|CuNF@B?QGI`kbKKKY_#102?@#113!5?_G_#131!5?D#98???DaPC@A?@ACGCAdQ@iFGCGPK$#244??E?T?GC#193!42?A?@!6?A#239!21?_!7?G!9?C?@??@??C?gC!8?@C?HC???g?S?OC?OC_??_C?H?A??A?C@!4?C#246!73?O?@C???A???OC???S???@AH!4?_G?C!4?_O?CO`?A??H?O???D?A???G_???A?c??_?@?C?_#208!12?C#218??_#240K#144G#122C#103_??@_#69!7?AG@!4?cQG?H_?Q?_?o^vH`?KQGBoW{sRG_!4?@?@??O!5?P!6?@#112!24?O???C!5?@#59!10?C!11?@??A_??G#77?SAu_nSbbA?@#48!5?C_O?g?cO@CRKO?K#93??KW#77!4?@?@?@??SBGD#98!11?I??C!7?O#114!8?A@?_G???_??O!6?O_#131!30?@#101!6?GO?O$#192!58?O??_H?C?Q?@gC`??H!4?_?O_!5?G!4?G!7?A???@!5?C#237!121?I_???dA??G??@gQ?S_?CO@OA?O_HQC???@!6?_???G???_!6?AG?O!5?G?O#101!23?E?A#59!12?_C#112???_#121!8?E!4?O??OG!4?C_OFHG?sWK@wIaQS@TCTGC?DbAGcjhdWGqtj|Z|z^NN~n~~~mn_x?IAJII?A?A?A#69!19?O#107C#103!54?_#77!19?@!9?A#119!4?wG???_!9?_#72!40?_?C$#196!82?G??@?Q?P??`O?GEG@?EGCQCAiPA?JQm[bKtLSiHsQgvkVQn`MjpmJpMv\IrmQlTiTtIp]D~B}@}B]TtiGvdYcjWfYgVcZqhUhUlXcZcYdYcZeXdYd[bUXExeShqlShfYTalQuHSnSxFwDwDtA{B_R?OCGODA?@_??HS?@?@??A@?A@WEGO?KoLOHOI?ACOnY_H?CbM_\_UCpAWdOeGbWU?S_IdGTES_[fIDN_Dyl?`fZ@#54!33?G!7?_???A??@??S`I?a!4?Cg?I!8?_#118!26?O?O??OK?O??o?OPOC???O?G??G??O???_#100!75?GCEaa?G#102!10?_O#121?O!6?oo$#81!358?oCESM???GCKG!5?O]B_?@?__AiP@jI?CRHCAIDPG!4?A#132!13?G#115O??O??O?G?KOC_CA__OGiCSi?CGGg__OGGG??@#251!72?D???C#112!15?CG@???OCG$#49!359?G#132???A-#237xOCbXcRGePGC`?S?OI`OCgAPGC@gA_I@Ga?TAOAPC_HSA`OI@SA@?Og@SHQlGt_TAh?OaTgF_I?SGPiPmPa?dI?I_I_I?I?G?WDQdYcYcQcIcG_I_S?OaCgTGS_G??IS?AOG?_??_??_??O#105???gOcGO_CGOgC?oC#193!37?c???@_P?`O@GAOChQCQ@GaDGRcHC`IT_OI_KOl?IoMP?S`Q?GcZcGCO?DOH??IT@Qe?Q?e???_?@GcOIOCAHSAGO?G?OGA@O?_!8?@iO?c!7?cv@#59__A_??C#102B#118O_OO_X!4?GAAAC@@?_OG??A?A?O?G??_!6?@!4?O?G#73???G?A@??_`POOWKKeAbtG]KgRbGBP_hSSciEMAG@!7?@@@#114!6?WEdkeO]OGApIcWa`_`OGLKET@A_#101??A@AO@yDqlcGSk?OIC#120!10?CA#101OG#95@?@#100?_o??GE@ecEF@@!5?K???@@HCQYGGC???@#98?CA#118OA??CCBA???@BB???@!4?OBdC#107@#101_Dac!9?O?_#98?@AC#113!8?GOG_G#101{m{SmYkv$#246AhOCaHCRGepISj@idOMgRTgcRgQDWDOu@Si?k`KaXUahSMdsyj[UfdS}jucQRINiwU^nLGRO\tQbdm?C?GOO?OdODODOdODQ`A_G??@?@G@O@A@O?@??G???_@???O_?_??A#137!18?CHO_C?QgCHQgAhQChQlQlqLqkRkRkRkRkRkRkRkRkRkRkRGQc~?MOM`KAKPcHQ?dG?S`GQ_CO#105??O#184?GA?@??g?@?APC?AC?ACJ?QcW_CG???IT?Ac@c?e?qC`Og?@Q?PGACO@cP?O?OGu@SHqGeHWCydApI!4?gdVyc#105B#96?BG#150_#0A#72A@#114@o!7?A_@?NF!9?_!5?CB?A??G#121!10?C?@DDFE`?C?aGOBS?ed_OPW@GAt_QDkSfkm^EJ?POwPlR}n~v~n~}]AAbaB`#102!7?c_cSKK?G?GMFCBQ?@Gg[\]}NG__GG#53???A??G#48A?@??S?AOCHC?H_?@#134!9?o?oGO?G_!5?A@?VDICA?hC@E@BADAWSj#119?G?@G??K!7?A#128_#119!9?o#103?Ai\AkOA#113CY`O??_#99?@A?O#77!15?O?_O_OG$#218CAG?C#240Q__PGEpISiTIdOFgATIcRkQdYdGuHTiPMpKaHSAhOI@#202C?@?OG@#192???H?c?O?@?_?O?C_A?CG!5?C?D#196?d?`?C?`O?A@O_I_?@?_G@O?ADW`[?OISiT_BgLqMhO_USbSyUdxUdxUd{jRkRCBGRAAgBaD_RHAhQ|EgZSdQlQLqLRkRkRkRkRkRkRkRkRkRkRkvHZ?~oN_]QlqeXehUGrliUTgVgJuzMta\isLoFOmoL_iShY_[`O??@A@Q_I_?_?_G?W?H?X??GADgQ@IcdOxCaXCbmDjA?sGe@SHqDqDGtIcSjmY@Y_DWc{O#202?G#14C#48C#119_S??o!8?w???WC?q?ACA@?TG_S_!4?GA?@!6?A@ABCAOOHSAGSWfISGA@?BA??O#132!9?O??O?_GC?_Oc?O#126?G?O#81?@!4?@#103!11?G???S?CO?GAC@Q_OA_???_cOGC#98!6?Q?@OIC@GtCjRCXKcX_WHFC?ypSH~Nv@EHA#103??Og]kY!8?_!4?_?_oOE??WA@!6?AA@#73C??C??g?GA#77!6?O#251O#100?HRmTzd]n~oNgSGsHyT~y|~^~~unv^vB@@B@@@$#244?CbW??GC#252!42?_G?A#184!10?C!4?a?G!4?O?PiPa?_I?I?I_I?I?G?G?ODQcYCAcAcG_??A_C_???GS?O???DI?@G#192!98?C?Q@?AOC???h??H_!5?@I_?CAt???O??H?H?HQCDQC!5?_!5?C@_C@!4?C@??A???G!4?@?Q?G??OA#37???G#77O#115CIJxGwiLKh\C}F?GrcH_HqkyTItIuTjH!6?C?GCO?@g?C?_#81??A???CB`!4?AgGGC_a@gSGA@`Q?G#119!6?BA@@#118!11?_O!5?X[COG!5?B!8?O#101_#77?_!7?OPIT_sDg#99!8?_O_AWC__A_QCR_EoizCMJE???G#101??HoGMU`RC\aOgO_YcO?_?o?gSGc_B?c@#121cGOHh_SCKaaK[?AAONDh~N#102!4?K#108??O?@g#134!5?N?VItIc@i?DA?_??@#72!6?AG?CA$#193!51?_G?A!19?`?A?C???G?O?OCO@OC?dOcA@??G??@??G@O?A?@A`C!5?A?@oA?@G_C@DGQCHQCHQ@CgRkRkRchSBSHQHCAoCD?OD_AG#237!61?@!6?@???A??C?A???Q_CG!4?T??_!11?O??@??@?_??_??A!9?C?G?Q!4?C!9?G?U#128O#133G#81G#69?CA#103@?C!4?A#69??oOC@OD?CO@GCA_@G?O{gKP@sQ}FJD^aU{gw[gw__o?Po!6?C?A#125!4?C!8?O!4?_G#119!15?kSSWsIa`?`OAPA@??@??@#107!9?@#72!9?BA?QLOZdbOncPiBG`?GQ_R?AGC_?OC!8?o?O@O_???`?KB?IT?GEOHC@U?HAH?gO@#107c!6?@#114@!6?@!7?oI@}@$#239!74?G!7?DI!10?_?C#192C!6?O!5?C??G??@OA!4?C!7?_#239!100?A!11?@#246O?cH???@Q`O??_ICG?QcO?CgQG??_Gc?A??AG!8?Ga???O?_@???C!9?AG@#140!4?@#121O#107??CAC@AbE#121!5?_??_G?G#59!11?F@_o?G?ooi_[??O#114!8?_#115!46?_GCG?C?bGAPGH?A_o?`Qa@OO?GC?A??A_@#251!53?_O_?_?_O???_??O#126!8?WO@_AOG?_??_#115?@?@!5?_KOI$#239!109?O?C??I@?@?A??A?@C??@G???@GA?GA?GA?C!111?CI!4?@!6?@???AC!4?G!4?AG?O?c@???GA!8?O@?O@C!9?@#112!8?O!11?O#54!14?O?C?@!7?@A@?A??G?I??GCOdG!5?@#69!34?G???S?A!7?@!5?@???G#98!71?A#127!14?a?A#125O?__?GW??_Sc?_o$#153!312?@#121!41?_C#59!84?A???C!4?_?O_!4?@??C#141!73?C#116eO#132???WOO?O_WGWEO?S$#81!355?AA@#102!183?@#112C!8?A-#237~?~?~?~@|A|@YdY`CAOCH?QGd?OGcAOHc_OH_OH_?GS@_I?S?HCQ`OI?tATIPkAtAG@GuHQhU_UhCYcHOeG@QcXeGeGUGUGQGQCY?ISgOACQ?EoDoC?SGO?AGQ#137!24?O?g?QGqCxAS@I@gh?pOI_AO??GCo?i?@c@OHAPGB?bGf??@?bGBKaCXfWfWfWfWfWfWfWfGQHQcHaT?_S?g???_??_??_#239?@??@!6?_?@?SG?Q???C!4?A_!4?G?GC?@O?GAOC???_G!5?G!4?O??@??@C??iSd??O?@#1A#119_?C!4?C?GE@?@cQ@O?O_PcA_GCOICT?I?c?E!7?@!4?C?@?AGC??CA?@O@C?CDGDYPM_?Ly@?A?_`_!11?pWOw[GKCCcSKU@K@@`w__c?G_??CC???_#107!8?C#101!7?ACPi?ZuHqOgO_G#48C?G?S@C!4?A?OC#100!5?@???@CAA#103?WOq___?U[Qkit}TsismvmC]?@#132_G!4?`@[a?Cr?_???C#115_#114?o?O#103?sg\WtMxyxppNQsycYCi?_???CGO??_?_OcX?tGqLylJEX$#246?~?~?~?}A|A}@YdYxljQUldQYldRXleQXKeoN_uH|biUTtiISqhC]dt^I|gteR\G|v]RHsdUhLhUZ_BcBPdYcH?O?O@_@_@?@?@?`?@A@G`G`G???p?a?A!4?c#105!33?g?s?U?AKAdOHcJsBOJCPUGQIcaS_AsGS?O?Si[?S_O#193!18?PC_G@CO?dI?l?JsJSb[BTITb[aOIOgSBK`I`A@Ad??c!4?c?K?CI?A??O?@?C!4?C#237??H!4?Q!6?C!9?_@!7?A#24_#69@@!9?A?AHCQC!4?@GC_GCogITtIQlWE_@oCIAa`WOIBCADsRHMX?LcmhOgGGWOW???WKo#81?GC_O???_#69!11?_??_O?G?G_O?Q?IA?@???_?G_!7?_#77!15?CAIPmc?o?_#99@DAC_RcOAGaGPMA?pKA?A?@#77???O_?O_W?E??ACOI#134??@!5?@#251?@???@#121?W?CoWD__E???ea?@?_oo?GM@@#108!5?fGoC?CI?_@G#100CACIDJBnNFXvJ^F@ABmZc@#77??C_??COe$#244!12?c??C!4?_#252!5?AC!7?C?C?CA#244???G??@#192!10?A?G?_A???_?AG??Q!4?GOcG???A?@_!5?C??cG?C?_C?OA?CO@I!8?O@??@G#96!33?_??O?G??O???C??G??c??G??G#105!42?@?A#184!11?AO_?gOIC@K@M_?`AGdQK_?C?K?CI?M?IOHPiDIAO@LgPLQk@_YcZ?aShCjCiOcA@^eP!5?A@_#203?_#35W#40C#118A?EFFFBNFG?Q_Q_G?QJLI?OPO?G?@#59!6?_?CI?@_??G?C?_WOO!4?_?O#73!6?@!6?@!4?WDjFEJDrBqM@fIBCB?E@#115???_?O???@?POgAAGH@G_AGg?ACC_AQO???_??_aO#72!9?@?HCLBSiT_Y_?_?_GpMol_KaHA{BwPi?C@CA?@!8?@A?@??@?A!4?@#125??_?A!4?@W[bOX@??WX@DAB#107??_GeI@a#101?A@ADACMOkB@P__Oo[Ooo_??_o[{[???]IvHQDA?H$#202!16?A?Ch?Q?d?QG_AOHcAPGAOH?O?S@gA?T_B?Qh?I?_#252!10?_#202C#184!8?_C!4?A?@OcGEGEGU?QGQ?A?Q?GO!7?_C?CGOG?C?G!5?_#150!34?C???C!4?_!7?O!4?C#192!57?D??@?_??O??SG?QG@ODiOAPAp?P_T_C?C??O?gAO?A???OC@???G!4?O??H?_?G#208!7?s?Q#217O#83C#59Y#39_#115@@!6?@?D??@?`??QcYdIEAAD?_A?dGQ@W@_GQCD?Q`gT?BCaHcQOEG?XO?_O?O??_??_?O#132!7?G???_?_O?@#81!4?@#112!8?G#118a__aCC[!4?@!4?I?A!4?_#53!21?A#98?GA?GR@KRNhUPE_@OLA@oL?CA??A???@#108?_??C!5?g_???G?G???OG?W#119?C!5?A#73G?A?K???o!4?GC#112??O?W@U#113!13?G?P?C???GA?c?GA@?@?A#108_!6?O_$#240!17?O!4?G#244!10?A#240@??A?A!8?gC#193!27?@?A??Oc!6?O@_?_@c@O@Gt?@E_W@G`G???G@?dGhDcGZkRuZcZcZeWfYcZeWfXeXeHilFVhdDHAl@U@U@AH?dOH_JsJ?HCPCHQ@cBOhAPGU?UGvJSAS_S_OO#237!45?A!4?C?G_??@?G?O!9?G#193!23?aO@?A?_?CA??AGS?@#153???G#240?G#96@#81?[#121wOg_gwo_o{g[?GcIhC!6?O_???_?O@!6?G!14?@?@?A?EK@FAAFADE@EBADubWCWOOWK[LPgWs{z{M?mFBfRrjRB@?K!5?CC?!5C#100!31?C#101!15?O???o@wCmS|j]yg\C~@BDLZNT?@kOSA?AGPI@??A@A#128_???A???_???O?G???A@?@#251!20?@#102!24?O_$#239!78?O?G!5?A?@!6?c??_!13?II@?@?c#246!129?Q!4?A??c??A??@G_?G?C???B_A?O_C!5?_??A!4?c@?AO??@C?OC?O!6?wAE?C#112???AGOGO??O!8?C_!6?_??O?G#102!7?C#81!18?A!4?AA#54!6?G#125!11?CA!4?E#81!17?G#114??_O?CROIQP?A@_WgICCCFoaPA`?@?e`???@O#102!42?_gGO??_#100???A@!4?C#102???O#98??@#118M@?`gWC#140!5?GCA??C#126G#118OOoMMd@$#196!84?G???O@_??H???G?c??A?gD?cQ?EO@?q?e?ROa?RcQcHCZcZcXfWdZcXfWeXeXuDQOgCQGqCOAg?G?S_A??AC???Oa?a?_?G??C?C_?`G`?G_?`GBGBLjeWfWfWfWfWfWfWfWehUdYqLiYTiQTsJsJ[b[itI[_LIsFC`W_Q?OSG?O???`IPiPAp?P_P_T_E_Oi?hFs_BgQcRKRcHcZS@CiOhCJQgW_?gViTiYDG@l#126!5?_#73?O#114!19?@@@?A!7?`YOF_Pw[CEB_W_gG??__?o_!5?o___?__O?_#103!40?AO?A?P?O??_AO@?ITG@?_?O@?A?@O?@CCO#107!52?_!6?__???@#115?OCA#142!7?C#49@?G#119?_!4?A$#102!437?@??@`PPXHGG??a[]^YLG]|}}mhw_#112!64?OG#116AE!9?G?A?A$#107!437?O#59?Q!8?DGC!8?@#126!70?O!4?O#52!8?CE$#129!531?C#127??@!4?@-#237~?~?~?~?~?~?vGrM_@cX?C@cAg@SAg@CQ?gGcAH_S@I_S@GdOAHcOGDAoHAPi?HA?`OHU`Y@m?Z?lA|?PACHQDQ?tGtGTgSGSGpE?DAG`?g?_?_?GC?AgS_O#105!5?O#137!15?_?OcHSaShUhE@??CAh?S?a??A?OB_TC?Q_CQ@G?_G@_G?bG?G_??_??@??@A@EHUhUhUhUhUhUhCHQdOIcHQ?hA?i@?GQ_?@??A#192@?_CQ?c???O@S???C@Sa?Q?d?h?Pe?AgOC?O?C@!5?C??_@??_??OC???A??_#208!12?b#240Z#2O#81G!4?C???C#112??_GOG?S_OA@A?G!4?c#114??G?C?@oC??_P?GE`@aTGSCEB_CACAB??A@?@cBXHDpHOo_?!4O?kOGsWguOWoOO__oOG_?_OG__a??_??_OOWWWMGLEcCEwi?DGQgebQXP?DCCCGA#72!7?IDQ`JeWsJ?haKRLgeSrWMhTZah?C#103??_kWsWsjSJg@?@FBBB@??@@A@?G#125?OMgOsqWG__`@??AA#107???_wwWsMS@!5?`#111!6?_#101!5?B?@FG@?GOoGx?@@!5?BGA#107??_#102HA$#246?~?~?~?~?~?~?vKp]mHezYMHtUihTUyhlVTpX{UJisTJisRGlsUHnqYLFukeTxulNIbqhMcu@l?vAW?iEwB_GoHeGA?A?A@a@???_O_CQCBSI@ICB?_???AC@A#105!20?G!9?OgUhQGSAhITCxcDgSGag@kBGhSaRMOQEPKOCrC@ITITiSiSgSgO_#193!12?H_C?h?Q?cIOcGDOjCGQLoLQkQGQ?h?QHQcI_G@U_I_G?Hc?G?AG???G@??@??_?O??Q??@???OA?C@??_G!4?A???GQA#16!8?C#128_??_#73g?O#135??A#118!5?ca?C!4?O@?W?@??G#59!4?O!4?@??OG?C@?_?G?OD@COC?A???@IP_A!8?_#81???@#73B??@#69!6?DG?C@??AG?A?@?G?HCOAC@A?@!6?O?@#102?GOEKOGG?eeqyx`ppxZ~YQO#53!4?G#98??@A?SZ??p?Q?H?C@OA_#77??CO?iCG@A#108A!6?C#112?O!4?O@L?o??QDO@#132_T??CA?C@O?O??@#103!5?CAI_JKzmn{v]h^~Vn|J}j^j}W~}or{zsLAtAV]S}Y|^~sr|zzRqx$#244!12?G#202???@?A?C@?AG@SAg@CA?g?CA@_S@I_S@IcQ?H_Q?D??G?OG!4?_OGC#192?O@G?Q???@!4?GA!5?_?S_?G??c?@CAG@?G!5?O!4?@!7?@?_!9?C#150!17?_O?@!4?GO?G!13?C??C?A@#184!55?Q?@???QGBC???@U`W?HS?d?I?S_GWdCAhQc`AOiDYdCPitMWePCHaGaXeHgSYDIvlP!5?d?K#35??B#49O}#121B?A?ITjPlxNvnR\jQHoi[cCkBdKO!4?o?C#102??C?A_o_?E??_OgOWKWgHgw{[{{}]CGC_O!8?__!9?_??_#103!19?A!5?O??@!4?OaG@?AO?G?GD??G?E?c?dl_@#48!8?@???O#100!7?_!6?@#102!4?OcHcJSbOBOB???C#119_?G???__#128???_O?kG?_S#115???C!5?O?E??C#114@#108?_O?OOB??U_?gOAS@S_S@c??GC???_???g?_@_?_?G???CGC$#252!17?O???_O!8?O??A#193A#240!12?A#252!5?_O!5?C?O?C#239!6?O!6?@??OC!7?_!5?A??G!11?oRGD?@#96!37?C?_?C?_??A?OA?O??Q??Q?G?_?@_G?_#246!55?C???@!7?aG??A@??H?O?SAK??O?C?G@IOgCO_GQ_!5?GAOC@???O?`CO?GQc!5?W]o#83??G#54@#132@C[SWcgOg#115!8?HAGS_?a@_?A?YDASAj_BwgSOIDC`OoCAE?b?_?QoB@?@?@?_??GC?yGu??SG??GGS?CsGCQGAAIACY?IcPKQGDQGO?q?OcGOi@a?a@QoGBhWED?_O`D?O@!6?G#100!17?_#99_CLAK?D?A#115!19?G?CG?kG_OC!6?C__#126?G#116@!5?_#126???O??G#102!7?_?O?_#100!23?A?BADAC?_A?@#77!4?C?C?C?C$#192!18?O???_#193O#192!31?_??@#184??A#193??O?C!7?c?O??Cg?_?_G?G??A???A?a@CgP_OoCRSBTYSB??@o?AGHewVhUhUnWfWfWfWfWb[bsZOJGQaXHA@O_CHA?SAh?T?aCPaCgAGPc@S`CaPGPaGPCOCrCPMtGTaSiCiSGSgO_#237!37?@#239?C??C@??A!7?S!11?AgO!5?@?@???C??c@!5?OC??C???`???G?ATa#97!5?_#69C#125?g??_#119!13?cC??AOA?W?@_O@g?SGCA@_C?I!4?O#101!12?_#107!4?O#119!7?F?B?K@EAGO!6?@CDGADA?IeODVG`SKTDuAJDG?_D??__AoO?@??C?_#101???C!5?A!8?ISjSidYSGdI??Q??__QOhGE`SIc\QmzTzVA@?B#107???COa{A?KG!4?ACL?@O#73!6?GC?W???@A??@#113!34?C??G!4?G?CA$#184!75?G?cAO?@?ODACO?TG@GS?S?OIO!5?_?_?_???GAGS_O?O!5?G#237!128?@O!6?A??_?Od!4?c???A??C???OI!10?@??G??C!4?_G!6?c#119?A#127?O#143@?@?AC?QAO#69!7?@?@H?OCAoIDasBH?AG@QHGC?B??G?G@@?@!8?@!7?C?A?GFGA?G?C_#59!45?OA!5?_??G??O??C#111!45?_#118!4?oO_WMCA?IOYK?FA??A@@@??KC???oO??gHDA@?@$#196!81?C!4?_@A???A@_@G???AGDAG??G?C@gC_S?AGDaGDgUgE@OfWfWfWfWb[b[JCfcRcHCaSgEHQ??h??OA??H??G@?D?AG?G???C??C??_AG?GaO?a?G@?P@A`A@EHUhUhUhUhUhUqUhYEtHuHtEXvOmSrdLqMqlPk`Ky?}H_cW`[b[_G?Ca?a?Y?t?@A@A?O@A?ISHC?i??hI??PAGcXaWeHAOePA`GO??Ad\ti\A`B[#126!5?A@A@!4?C#107!28?A#103!4?OG!6?_?A!6?A???_AO?a?C?_??_???_??_??_???_??_#77!40?C!5?AA!6?DiS`O?C_O???C#121!37?_oo{!5?gC?A@A??BBQIiG\DKcJF?A$#77!365?A#118G??A!23?G?O!6?G??AC?K???@?W!4?_?_?AB???G?o?CK?eD?D??GA_??@!4?@#114!66?A!6?A#112!13?a??_GcOO!6?AC@??G$#121!395?DBE@@??BBA@@@?@!4?@C@?@???C???G?@??@#119!107?C_??Q!4?@$#132!400?A-#237~?~?~?~?~_nOLa\qCGaA@?h?_WC@GaWDOAGgC?PCAg@cQG@c?I@S?`G@SAH?C?`?@Qg@ISJODgFgR_EgTgDgTgFg?cA\a[`GO@O_@[?HCPeOcO?Cg@OC_I_A_@#105???G#137!13?gACHU_DI_??_c?A?Ga`SCaF?iAP?gCP?KE@CCaS@?GC@GC@?O?C?OAO?@?P?PCO?@O@?@UHUhUhUhCxAS`IS`IdGPiChAHAS?hAC#184???c?Q?C???O_PG@A`Q_@cApC?cAC@U?AGDJEDJsC`CEH??IC\AGOdQHOcA\AHQ_HCLA!4?_G#105O???@#49_!4?A#112?_??A_GF!8?@??C??@??_AO#102O!6?O?C?_sQMVHVvbZJN?NMKCJNv|KL^^MEAACFAEBBBAAB??!4@BFV{A??@_BGWqg#118!5?CO?_AMcQ\sYP?o_O_?@_A!4?O__???OO#107???_O_#77??@A?aBGeOkO???_?oO?gCOg??OoG?`AK`S#107??O??sWlUP#121?EAEKMFzUvwO}K?NG???_!4?ABLBDD#103?e?_OK]JmTG`M~MnDbHKpD??cY@TGrPIVjeDzFnNk||NV|RaPDnRNDrVdZ$#246?~?~?~?~?^?nOLaLzt\keRQnD`yuTLayltRPxmiXTUyHduYHtsijVQrihsUZhKUrmdV}t`sm_ToTGVwR?UOR?QOCI?W_OASRCQcGOA_O?G?G@?_?@K!9?_#105!21?O??ITI@GsDqCGAXOGoD?kEPAkAP_WQH?I_VaPIaPiCj?z?hChEwEgEgAhEgEgUg?_#192!36?_?H?A?C?_CG@I?H?I_AG@AG@?CA???O??GA?O?Gd!4?_A?_?A!4?_?C_Q?_???O???_#183A#217?O#37K#121K???_oSzSlUVGD???@?A@AG??@???AOs#114??oSoS?q@Ca??I?@#77?_??G?__S__bXc!4?_?_?OgS@GCGCC?C??_CaKqK!5?O???O#119!14?@H??@??DA?@A!4?@!4?O#101!16?`OKRHdQKdYcXqKItEhiU?}`MpfM|r]`#115!4?G??OgAR!9?AG??D#125_Of_PNTa??dWO#118_GwYHA#102?_O_?O??AO?_?OO??A??Q@!5?C!4?O?O?O???O_??G#115_O?_oICgA$#240!10?O??O#202???A?@?_???C@GAOD?AG!4?CaG@CAG@CAG@S?_??SAH?C?`???G#192???I?@GA??_???_???_C?P?A??G@?_???@c?@CA??A???A??a!4?P?C!5?C#96!23?OA?G?@O?a!4?P??C@??A???AO@??C??C??O?C#246!64?A!5?CO???H?SgC_Y_PgO_G?A@?G@CA??Q_OT?G?S_HO_OCHQ?HAC!5?F?L#218??G#38O#81b!5?G#126C@O#119?_?o???A@??C?A?CA?_[!8?G?G#101!5?C!8?OIOPOAO???_O_?ogSgQ_W?W?k?KsGyKqC_?__?O?O#69!19?H??@!8?@#102?CA?D?G?@?GD??POYn\F{YcWC__#72?A@AYdYELBdIPQD@^?M@EW#102O!4?@gaK`IdA@#118kkxpxpOO!4?@??A#127?a!7?_?_#112A[??dOL#111??_?C#108??BC@?@O?GCB?Gyd??sGaCIdGCPiCgO_Q?A_GAGDC#111I$#244!12?a#252!6?OGC?OI???_!5?CA?P#240!5?O#218???O#252!4?GC!4?_?Q?GCO#239!7?Q#184?GA???CG@gCG@G?_?dAC_G?G!5?G?@_P?OC?GO?@OCO#150!35?@!7?O!4?G!4?_?_?_???G#237!75?@O_O??O?O???@A!4?A?@?S?O!13?@!4?A!8?G??C!6?A#56@#119O#125GrLLA#73@?A#115!9?O`AgQS@yco]??G_JM`FGfLCoOVN?@?G???CC!9?GA@#59A??@#114?@@G??@!7?@!9?c@_RGDEH@YAtTGjfJH[OAcAGciOLIcLeUOKiHCaGACQkDA_HKi@!8?O#98!4?@??@!9?_#100@#103!8?I}VLrU@#111A#112!5?C?A??Ch?Ca??G#128?@G???GP_@W#126C??AA#112!17?C#111?oCA??Y@?A?G!4?G#101!5?@A#114!4?_??_O??o??Oc$#193!20?O?C??A#244!8?_!5?_!5?_?A#192!4?G#193C!4?_?Q?G!12?CG@???A!5?CO!5?CBKICA?Q_OAG@IHDP?OG_Q?O?[QgVGvIxB{b[b[b{bslROo_?XiONtI@IsGqDGAh?H_D?gAPAgAT?GAH?G_U_PIs@iOjCz?nChEoEgEgAhEoEgU_Eg?_!5?I?_AG_AG?Q?CO@CO_T?hQcHs@IPcHQ@SAcGPiPK?A?C?AC?@C?_O?GcP??_G???_?_?Q??OG?C??O???O??H!6?H_Q__!5?O#240C#63A#128?vKA#118!4?_???oI~~~{m[{O_HO!5?@!4?A?A#72!8?G#122!4?G!4?@#108???_#72!12?_O_o_OOwOGS?O???_#107OGAK!6?_?O_#59!27?H?A!6?A#134!17?_#119!35?G??`_???@C@B#73_???XM!4?A#107!4?_???_^F@@O?gSW!4?i?q?GoDG?cI_T?_O_O!12?COI??K??G?G$#192!21?G??O!10?C#193A#196!43?A???A??A?G!4?A??_@OG@C?GC?c?_Q_?_C?HdJkBgVGv?tA{B[b[b[B[JQClJUhE?dO?_S?@???OC??C?IOC?_?O?g?PC_OD?G??_?O?C!4?OAO?H?P?PCO?HO@?HO@UHUhUhUpE\hUThUtGviDyQlUgjUCXqJ}tIZclYjsZdM?cQw?K?y?G?IOPG?_?@G_O?O_?HAWPG_tQ_`AhALAKaLAl?cQCHQ?_OUlTIV?a?he#244_#132!4?_OLA#143?G?H#69!11?D?I?HE@`M@N?@??@!5?G?@#100!32?_#115?@!8?O???@?IKCCA??ECSGIfOG_U@_O??A?Ci?TAOPgI`O?_W_DQK@QgKCA@C??_#143!50?G#126??G???O#116!8?GUG#115!4?O???O?GA?_@A_?_?O$#239!86?_?P@??@???_??A?_?A_!4?AG?EA?J??C!137?C?@??`C?_A??O???C?C?A_??CA_??GD!4?_!9?_?C_O?@?I@G???CH#127!5?O#114!19?_#107_??G!5?C!7?A@!6?A#98!31?_#59!12?G!8?@#132!101?_OOCOE_Oa??C??_$#153!312?o?Q#103!30?O!6?_??G_??_?G_O?_o_Og?O_O?_!5?o??Q!4?@!4?@??G??@?B???GQKG?@_BcQG_o@C??hA_O??S?_???_!6?G?G?CO?sQ?D?H_Q_?@q_C??AWBcXEH?COG#140!57?C@O$#208!313?L?O#59!38?G??O?AH!7?C!4?C#52!160?G-#237~?~?~?~A{agQPGvGQc??h@C?_GS@A_O??HS?aS@HS_CiOD?gCA?HCQ?gDcAW@QG_HcAIpCiTaSJOLQcYDgU_TISIo?hOeO_L?^_V?I?J?T_UgQ?@AcH_I??Q?GA#137!13?AcGCHQ@a?_GA@A?_IA?DOI_cOOR?IA`O?GCaG@T?Y?O?SAG?GCG?c?H?aOAOHOA?Ca??ID??cPC@e@MPmPcHOdItAShAS`SHAOd?Q#184!5?gAOC_G?_?SH_O??A@A`EGCH?@??O?C?D?Wo!5?`a?oIWcI_TQgJScXcRidCY`KO???G?YAk@#203O#63O#48_#115WoG?SAHC?GC!6?`WeIXTpXGmCGUAG?a@?TPGk?aoGG#122??@#101A???[`U@oKagQtaTeHyBCHs?Bg?AHSBmPJsLq@]R?Wg_c_?OO#107!4?@I?A_?A?C!5?GG!5?_!13?O?_???C??_?GCG?K#101@?DG@A`A@CI?B@A@KB?b?BC?@NA@?AC#111???O#118!5?J^fN~{???B#126?S@#127GSh!7?G??@#112IP??@#108!5?@!9?C@CA?CA!4?@!4?@!6?CA???@#114cAPGAOCKQDcaO$#246?~?~?~?|B\BkaRGvlZ|SUyjLTri}SFjxUqj\KiuqJ\xDmyVPj[UqhlUQyHle}dRZqX|SMYPiLhsfqlHdOR`LIo`TCZSeHH@Oa??G_S@S_A?H??c?O!4?P#105!18?O??_?_GOKR?_GSHU@SgQ?dPIDgC_T?KAtAX?U_I_D`I`G`?Q`Q`QHOeOL?l?e?lOHOL_?OiPI?iOGO_#192!34?A!4?A?C_?G!4?O??O?C?h?g???CGCAOC??C??@C??C!4?A?C??_!7?Qd?OA#217?_#83G#59@#119aG#118okapoXuAzV^Fb~}A`X_AGA_?PZt!4?C??AC!5?O#77!4?C???_]@kGqKQcITIPqD?@#99!4?CG_#53??C???G#103!4?CCAAI@HLE`bIO_??CgDq?h?AGCO`A?dAGPABO@AOHAG?G?SIG@GOK@c?e?KRAQ_t?WA?AkOKGy_`KGcGA`s?CSgYSU?WuxCJBSjC??O_O#114??Wo#119?B~??K#125??GujOeW_@BAE@GF_#118oA#102?gSAHOaHO??@?IRCgPAc#112???o?W?SgKOG?gOGSG?gO?O#115?O?O?W?A@H_?CQ?HB$#240!10?O??C#252!4?AG?COAG?@?g?CA`??A#218!5?A!5?A#202O`GCQ?hC?A?@?G_?CA?`#192?_C?OA?G??Q?_C?O??I_!4?OAC???@!13?C?O?C?AG?a?G#96!26?_G??@?G??O?A?G??O?G?a?@O?G!8?C!7?O??G!4?a!6?C#239!48?A?C!6?O??O???g?G???CGC?AC?I!4?C!6?CAGD??`GOdI!8?@#97C#72[#69C#125@@#114OGCA_Gs?g!4?@[A?T_?CAO!4?C??@???ieR{?C?O#100???@#59!7?A#72!6?_???{iQJtSRd[ahWPms?OG[__#102G?COQQQ_I[sl^}pr#118??G?O?hA@KA??O_CG?CGCCgog_AUb?_Ca?CA?O_?G#59!4?O?O#77??ADQlQdCHCBCADKQ?A?aC@BG?D#108???O#121!16?~Zo~j#132u@!9?CD?Q#103?_T?AlubDOac???_CzDiOGpCw@WaS@C_GOhQgOJDHVhPHPnQmYdmPkaO@_G@#107C$#244!10?C@G_#202!5?`???_?C???O!6?@#252!13?@!4?@?O!4?C#193C!5?@#184!10?I?GA_D??G_?H?_??H?S?A?A?H?S?Q???@?A?_#150!38?_!9?_?CA@!7?C?A!8?A#237!70?@Q?DG?@!4?S?D?O_GO???`O?_?PCG???H?C!4?_!8?O!8?@#77A#81@#112C#121EB@!4?@???_#107!4?C???_?C!6?@#59!8?@#107?GC??@??{#98!18?Oc?Ig?Q@SA_!9?_#114C??G#59??H!9?A#102!35?AA@??GCHFIbe|wo???O?QOooWo_??{WGO??_?_GEx?[AOgRKAC#112!9?c#128!6?EX_T?_sg??g#107??CiU_??GGCKOZE~T!5?OIpEIdDIgRAFeEDEb_qu?EI_k?K$#218!12?C#193!6?A???OA!4?G?C#244G??_?@G!5?@?g???_#192!7?O#193!29?@CA!5?O???G`O?S?A?@CGQ_H?UOch@k@S`VgVkP~~~nv~zHPrQoKSLRCrKsHS@sGQ?DOI@aC_T?GAg?S?T_I_D_GdG`SRkQ`SHOeOl?lOe?lOl?KqLoITI?iOIOgO_??I?CO??S@?S@GAOcHQcGRcZ?dQGdQGcPGcHuGdGP?Q??H??C_?H?a!4?D?C?@?O??@I?_A???_??_?O_@??I?C?@I?LjCO!5?A#132??A#107???GC#103A@#119???_W[#103!6?CAG?b???g?qG!8?PB_cIU}?AAGB?gQD@PCG?G?GC#77!16?BaDa@GR_PD?C_#115?C?@A??C?TGDSAhCOgAOdQGDQaSGeOhE?DQP`G_Da?DBOWHGWF@_o#108!19?O#114?G!5?_?O#116!31?DGI[?O_OO#115??G?@???CO_?JcG??g?AChA#118!6?_??O_?O!8?_???_!4?cOCJqH_YOk$#192!28?@#240!4?C??O??C_?AO???C#196!40?A!5?WaC_I_S?K_A_H_CgRcGQcH@IOcRShUgVgRm???OG?CcICHE@a?_GCPA_A??`CGa?C?G@GA_T?@?_?G?C?Q?Q?SAGc@?GAc?H?A?A?@OA?AO@?QD_?_PC@c@E@MPmPujItIhiUhiUheXeGZdkZc~YDtIhVRmTZa?VGvg\gsKoQpaISaCH?Q?Q_A@IoAhEGOC@C@?O@I?T?HA?G?O?P??A?taS`I@_OY#240C#116_#102!26?C!4?wCv!7?AK?BBtg?w@|v!7?@@#134!28?@#114!13?G?O?hCQOdQ`KOdAW`ChO@iO@EODk?SJOPKqG`e?P?oQC@_#72!21?@#53?@#115?_!8?_@C@?A_GaS_#140!15?AAs?G?O#142_#111!6?GO???A!8?O!4?G@???@A???@???C#102!6?CA?@?@$#239!93?CA!5?@?_??G???@?G!6?C#246!143?_A?CiCj?j?Q?ADA`Ap?G?GP??_Q`Y?_AOaH?O??OI?U_!6?_G@_A#121!29?_!6?oc#59!139?G#107?_!4?_?g?AkpLRL_#73!20?@#121@?A??D#118!12?o$#105!312?C??C#244G#119!30?A!4?GMHg?P#126!176?A??K$#153!313?C#112!34?@#69@??O?Q$#191!313?@-#237~?~?~?~?{QdYdYdY`SHSGc?J_AK@aPOGbSHQcHQdGTaSHQdGCPCA?gAOD??QGd?WdItAtIPiSbYDgUk@sATGRK@iOiUHe?e?R_Qc?JSHu?jOdAHAgAC!5?@C?@#137!10?g?O?gC?C_CQG?WCrOIGcQ@PGi_??A@P@cCAOHCc?O??`?GC@??_K_ICH???ICgA??O_?O???c?Q_IPcOcHQlOdIOdY`IcHQcHaPC_I?d?G#105Pa#184?O??ShAc?DA?CHO?GO@_A?G?GCh?DA?G@GAK_GOgPaPA@?As?^?l?QgTqLOIOd?S?C???IGC#204_C#114OH!4?A@?K??F#69!4?O#114!8?@G???Q!4?oOwsA?doE`X?A#101G???oChS?AGskJqKrMPhqUBCB?OGSGcq`i@xCyCyU`UHUGE?A#115?O?G?CK?AJ?AF`qgOEWOOPpGOAGGCoCAOc@OI_GCPGF?cQ@ohDO?IKQsIaWOI?gO?_??[GcA?kEA?CAAD@?OC??I?OGASUCIE@??@#119_}~#121~jhUDo???_!9?CGO#115A???QoXAHFO?`GO!4?P?G#119!6?_Gs?O#115!18?@C?@CG@#119?o$#246?~?~?~?|BlQdYdYd]juavX{SNdq]Kebp[julZulYvi\julYvxmX[UTliyVLcQYnbYOIlGteThKcyR?@qAkGrcQoCLP?sPlXTkZCHQc?a?HOCGOcO#105!22?@AC?@QhQH??dI`H?C`PAGkaCPCJsGcICQhODaOHbCjOKQ`QgUHQ@??_?Ql?_?@OcI@IC@cHQ?H?C???A#192!30?A!5?G?O?_??A_?A?G??_A??A?OA?AO?O@?@C?C??Gc?A!4?g?AG???_?O!6?_#153?@@#240OB#35A#69O#119E?PG??_@?__o{{]Kmb?E_?_?_!6?_??CI??GCAG#103G??\Pc_xPK@?iSD_A#98!7?C?@_W?C@_?_Q?K??CA?@#102???@?__owkLFrqqaq`?oO?W!7?C#119!13?A?OG?A#102!15?@?@C@??ACAR}BAA?G!5?@@???@?@A???CB#114!7?OHC#126!5?AhY?o?OO!9?A#118BC{!6?O_WfWA_!9?Y?HWcX_IWdO_W_IOc?_?IDgSqHgS_PcypUi~N$#239!7?A#244??G#193!8?@!5?O!5?C#202!16?A?A@_A?D???Hc?OC#193!13?@!4?_??_!7?O?G?CH?G!4?O???G?_OS`iTgiSsAhmOnOnOn~}vjETJlQhQHQhdQc??C`OAGCQCP?I_?cA?Q?ODAOHOC_OGQdQGUHSHOPtQsHQlOROlYdITJcZuHZCL?@CAHA!4?G@c??CP?c@GAOcHQcHQGbG?Sh?ShExAtAhEHSGC?GOD_QDG?@Sg???C?c@??c??A???AO!11?A!9?G@O#105?_#17?_#40_#77A#121h?_owO!6?B@_??[?O#103!5?B???C@#69?_???B??G#107!7?@AE#72_!9?OLRKogAH_[aKrkRgVHKQTUAhDyDG[GC?A#114!4?_??G??KO?DG?E@CGoAKbGEo@gOaOMPgDQGd?C@OgAoM@gCDQ?M_T_L?sC?__Q?i?G??_?Gs?O@gE_?COG#121??_OG#111???C#73!15?S??G?_G??_#116?AThAYQ#141O#112CG!6?_??_GFO!7?OaC`C_AQCB?bGAD?T_HODYC_O?@$#192!19?G??A!5?@?G#252!19?_?H?O??gQ?@#184!16?GQ?G?AC??G?a?gAG??_??_???GO?_?`A@???_A?_??_#150!27?A??G??@!6?SAOG?G??_???A?ICA!5?_??A#237!70?@O?@!6?C_?@?DO@G?GaG?GOgPAP!6?G???O??O!7?A@?A#208??O#244?G#49G#101C#112OO???_!7?A?_O#102!13?A@???_!8?__kQ[?MBA??gW#108?@#99!12?oGA?B!5?G#103!8?_?OGCPqGK@DH@Ok?iT_WKPEGcA?e?E_?eCa??@g@S?d@C`Cd?_O@oGCW?I?B_I?WAM@LP@|?@K?cR@jAO@@A?@??aM?@@o[J?D??A???A#132!9?_FC[e?oO!7?@o#107B@j]{kGCKC??_GDIsgWsmKPG?YU@G?C@CADYeGSaIw?x?IAg?O??G?A$#252!21?A@?O??_?GC#193!20?_#192!6?_!6?d?OA?G?AO@?C_?C?P??G@AO?C@??A?A!6?@C?A!6?D?G??A?@?O#96!25?C_???C???GA!4?@??_?A?G?_?O!5?C!4?C#239!73?C?_Q?G???I?CA??A?AO??@?@C!4?Ac?A!4?g?AG???_?O_KokOG_???O#63C#132_#115?A?@!4?G!6?A??U??dHaCSHChHoGE?GC?HpA?D_KA???@#77???wU@B_VGRc?_?@EOCG?@#48???C#100???@!8?@#107!11?C?O?A@??_!8?G?G!7?AO???G!7?OA?G!4?C_O??@?@??_C??C?o!4?S!9?O@ICA@b??OJHHD@#125!13?J@@MILy?gCG?G#119??_#103?S?A?B?_Q!4?QdAD???BCRC@?C@!7?@A@C@ADAD?TAHASBS?O$#202!23?_?G@?O??A#239!47?G@!5?C@#196!11?Qd?a?H?CGOcQKAH?TI?TAIhEOnOnOnO?@GSOg_QC?C_CQG?P?QGAC_O`??_CP?H?Oc?H?G_CA?G@?d?G?`??a?_M?HAc?QDgE?@Oc?oI??c?q_ZsiXcXulQnQsJYdYcZQkRsLIqLPuGvSe\jE|jAOCXAwCxQaehReCGPC_U`OA?OgDo!4?Q?A??GcGsH?H?_?Q?D!4?_D?I?@aHQfS@CIF#96?@#118??kMEDM^qv^WN??@@@?hh^YU\Y_uzU_?O?_??CACpWAPQCA#77!35?_?O???_A_QHD@B#118!10?C!5?A`@@`???@MT@PH@gCAG_A?QqGAOG@GCAA?a`P!6?_?O!8?O!4?gSwW{wiuK_O?oC?_og?_Oog}luy^@#127!8?A?@C!8?G#102!4?`?@CA!8?HQdI$#239!101?O???C?A???@??O??T?G??O#246!137?G?C`Q@O??Og?g?s@c@CQcA??Gc??X?|?v?V?D_D_NON?nIP!4?Cq?G#107!4?@#59!28?C?@#73?@#59!121?C#101!7?@#77@#59???@#112!11?gC!5?_?_?O!8?S#128!8?@AD{AQtcC_#111!5?@#108???@#114!4?C!7?_?_?_?_?AO???g!9?O_??CcBgAiHCI`S$#107!348?GE#121G]A@#140!177?@???@_#111!20?A#108@$#112!350?O@#129!184?@-#237~ONwVg^_~Wf{IlqMohE|IsloOgSylOy?O`QDoDqChQK`IT_TiPiDgFWbGD?I@?CaSHu?uHQLOeXaLoEXaG_HQC@U_ITIPkAtISjQhQgRA@AS_DWAC_S?A_G@C?OC#137!10?i?TGQ_???G??A@_?cSOAGGCGA??PgAPH?cAG@@_GCA`?_Og???gCGQcGQCO??Q?GO??_A?@a?@QcHQcIOdItGaHQcJOiChAS`SASgDO?c@G!6?C#184@!5?A?@???_CQ@OI?@??_A_Qc@KBCRK@JO@?_?IDGDY?OdOcBcJuHO??@skOOA#208?@#203U#35@#40A#73@O?G#118!6?@!9?G_O?o?OGAABJI`?_??G_C???A#77_WG?C?@A@?oMOdKoFXaTG!5?_#53!10?G#77?C?A@AXOJdAkQCASG#114aO?_O??OE?@@A@?_OHgPGEPaH_SBgQI?cOC_Qc??{BoGCAr_KaWAsKdHGcAOdA`GC@?C@??A?A#126??_#103!6?A#73??_#114??D!4?A#126!6?_??gQDoHQ_GS!8?EO#118GYskyT?gDAP?o??G?Ok_qXws{x}l|ULIKV{mWdW_Wi@zcrC?XUmlUhnUDnF#121C$#246?FoF_V?V?bGA@QCPJEwAPJAJdPaCAjDzjEdyNiLzUDr]ta^ITeSYRweSvy\SmjX\jqHlHucqjHeSQIgeSV\ucz{hHPi_eAXG`@?C?C@CgSgB?A?@??@#105!24?DQlQ@QcGSJAH@gDsBOdOlEcAOcASHOdQKQ@qGSIDA@SiTAP_??@?`AcH?cA@ISHSGSGSG!33?A!5?O#239!9?G@!5?AT_GC_?GA?@???Q???O??_?I???O!5?@?G_???gGA@A???OG#217@#37A#59O#125u__O#115!14?A@??A???BCH???`[{BQGdCQJ?A@!6?_#72!7?A@!4?qJuPlRKIxUSJexNRu`hPXckcA?C#102?O?@@h_@CIEC`_O_o{KSCEI#107!9?A!8?_!7?G@!10?OG?@G???DA@#112!9?_!4?G?_DA?OA?O@A??A?@!7?D#125C??oG???C?DJS@A?OK#115??CD??@?iDOOGeG?GecL?S??C#119!4?OAhQDBGAOcY_Y_Oo?OG_??_?O_?O?gOwz$#192?G??G?_??CO?c??_??@?c?O???G@O!4?O???O???G!5?_?G@_C?@G!9?C?Q??H?CO?H_?P?G_??G?A?AC?@G?_ASGOG?gO#239!5?G?_?O!9?@#150!19?_!5?O?A???@?`?_OG?C@!15?CA@#192!62?@?A!4?@!4?G?AG@???C_?S_AGOC@?A??g??O??c?I???O!5?@?GO???_!6?G#240???g#38O#77@#128G#112B!8?A??A?H?g?Q?D?A@!5?S#114??A?WdQQH`SJS?A??O?K?_C#98!11?C?Ga?g@?A`GO??_G?A?A?O?GC#103_?YG@?gS@uPdHBEP@KGAAIHGTAb?AGTGC@?H?C??OCAAOE_AcP?s?o?CCA?@A?@??AO??A!5?A#107!17?@#73!19?@???@O??@_#116__@sXAG@#112??B!6?A#102!7?@??A#112??_AGBC!4?_O_?@?@?BCBC?C??IS_#103?@?@$#193?_#184!5?G!6?G#193?CO!5?C?A???C??C?G#184!6?_???G#202!12?A@??a#184!14?C??@???@???O_?S?PC??AC`A?A?@A!6?A!4?A!5?@#96!22?@_??O?A??C?A??@???G?_A???_?C?@??O!5?C#246!72?_!5?_???A?H?D?GOgPg??Qc?cQHOcPa@a@eHAgA?@??aDBQC??C_?B#52??_#102G#121?KA@JbNtN^K}n[~u{S{gpQc{M[Caogg#102???A??@!4?__GCDA?OQGGwKA@#99!12?O??C#115!29?_OGEAB@@_?oo_LCQDa?pIWCAHO@k?I?G_GCP?e@?E@o?GDaC`GA?O?A@H???CA@?B???@!8?@!4?@?C???C#132!13?AG?CAG?_?A!6?o_#107???@B?A@O?GA@ADB?@A@BKC@???@A!8?A!4?@I?J?@?AHO??O$#239!11?@O?@#252!9?IC@!4?C?G!24?_?OC#239!15?@#193!4?A#239!5?C#193!8?_??C@C?SgTgDoAsGRAiXSDqgZcIpMpMpM~~~i?TGalQlQDQlQcICh?gDOAOA?HA_A?gAcHOdQKODqGSIdI@OiTIPaT_JS`YdZclQdItJShcISheG??DO?DO???H_CO?DOA?S@Ga?HAOdIOIcHsIsGs`[b[cYdWf?T???_CQ@?I?@???@??O_O!4?cA?O@Oc???cGCG!6?CG!5?_#56!5?G#103_#119??@!8?@?@??BB?CAG@??b?PC@?S#107??@??_#101!6?oO?CMB@A@A`KoNY`IOc\i@s@KACQpCGbcXEOcHSUgeHQP_No?dQkQ?I?G!5?_#102!26?CA#119?@#77?A#121!24?_!6?CwoOowWwo{NaosM[Og___os__{?o{_{^yyTdIAcd^QJ!8?Xno_#103I?C???A@cG@Io?Q???@#121!10?_O_$#193!59?_?O#196!38?O??g!4?QGDG`CgTcHqKRcIoMpMpMp???TTiaT?G??Gc?HO??S?A?g?_GOC?OGPC?OA?G?_AG?@_?O?gC??_?GALOaK?G?Q?HOc?_A?R_@AOdZugJtiItIvSUhJsiDxUhiUH|aTiItJsRsJtIvHIa[bYdYdWuA{f[RgK_?T_YCT?G?G!5?_???GAC@?Oa??@a?AGO!4?AScWA@IDtKu#142?C#114C#126??[aSS?IO_O?O_#69!4?@?C?G@??g??S?_S#103??CGC?QG_SHCHap_g_SS?Q@?_?OCgA#107!39?OG!6?O_#119!51?OOo__ckgC?GGCEEB???CG__??OOO??GO?_GBRB#128!12?WOiIC@?A#114!5?O?gS?gc?OCoCOG_OG?A?B?A!9?@??C@C?C??COjC??AGE?hQ$#192!113?G#237!145?OAG@?G!4?OA_OcACAC@k@I?H?C???GCG?O?OCOcASHO???_GO@AG_#132!7?C_Go?_?_#122!37?@#118!56?GK!8?OGcOCa?_CoSagU@dpX@HPGGXGA?GEJx?WPWCtGbAscQslYwWCiK[ZYRQ@NDFB@@CAOWH??@JFMGJNHVKB^F?K#127!14?C!4?_$#183!305?@#38!228?_#129CF$#74!535?O$#142!535?G$#145!535?_-#237^snQ|bLJuLrKXvILvIp^pnWvwfwNyfKrGqHQHQk@iShSHQhU_UHcHEPiS`QgQHC?DaCJ_LQdIpKQ`ShQHC?dQH_ISbSGO_@ASaAH?H?pAp?xA|?TG_I_???G?c?O#137!9?_I?TIPCOG@G?_??@C_CQI@DCCACP?WAAHA?W?D_H?C?cOA?C_X???P!4?O???A?HO??O_A?_A@iChAS`IOdIT_DiOIPcIOdIOdI?iD?I?D!7?D#184!8?@A??C?AC?_?GE@EPAP_PiOk@c?COi?C?GOgWcGCG?OgO?TgC?CgS`GsG#96?O#203G#50o#59A#121o?g_A???GpItaLq~Q~j\~ni^t{On~T~_O_o#103!4?XC@D_AH?Da?SaIoCQ{PZOD?Q_O?_!6?G#53?@!5?C!6?C#103?GA???RGG@CF_Ad@hCGQ@_s?eDWCG?MGCAHCAGCAO@?C?GC?E@C?COAK?CPA@?@#119!5?_oO]IG@@?N#143!5?C???C#73??A??A???A?C!6?A#119!6?A#116???o??OgIOfdC@Bg[MEg#121A@No_#112_#114IHaK?dOIoT@i?O#112?GCA_GaHOk@CHQDI?O!8?C@#107@!5?A$#193_!4?GO_?O?a???_#184!4?A?@#193!6?O#184!8?A!16?@#202@?G?@C??_?O_#184@!7?A_?_!4?_O???C???O?@_C?A??@?O#239!11?C?A?@#105!18?_ACaCPCJcIOJh?cOiOHoI?e@cWcPcB_Y?U_Z?J?LoJ?E_ZcICOdI?iChOc?AhAC@ODG#192!50?CO?H??O?G?A?O?_?c?I!5?G?i???G!4?A?A_?_C?D_?AO!4?CA?@#105?I#240@#52@#114x#132H_?UPGGgdGd??O#143@?G??a!9?i#112?C#114??@@GAtCAg??GoDQO?iD!6?_#72!5?DAN?Oh?ABa_SyDQIhQGFpKHyO??_GC#59??@#102!4?DDYuUqv`{Q?OWW?G?O#119_o_?O??O#107!9?@#119!4?G#121!17?__sQ}{oO~r~l~bLqnJUpKPcWjREGBHAi|LBcG}B?J?D|Gp??OP?@?C#140O??C?Oa#130_#52G#127O#132_KO#118L\^To??_QAdCGiOun|vz\VBTAA!7?@@ADADIQlQhSaXsHUItHVGQ$#192?AO!4?C??G??G?A?@?_G?_G?O?_D???_G?@?G?_??S??H??Q???C??O???O!6?A?G?C?`G??O??H??C?@?G?AOG!5?AO@?G???@?O!6?O@#184?_#150!30?O!8?_??_??A!5?C!15?C#239!72?c?O?_G??@?A@?OC?c!7?G?G!8?A??_??C!5?TaS??C?A@#244?E#55C#115C#73A!4?@!6?G#112???_#118!4?OD?I@lO???P?T?iutGA_?_?oC_gG_#101!5?@?A?CGQGFIT?}hUhTsDZGDOhTUhfWCrcDjyDWpAl?ePuGO?O#107?G???GAD!6?O#112!44?c!7?Q#132??o?OO_GOcY`OKo`GA?T???W!5?Ca!5?@?A??I#38?G???C??O#126?@Q#119?AA?_#103CGaK?D?A!5?A#119??_GS?S@A?O??G?eIdYtiTlQlOiSaHug`Gcgt`x$#246?@?L?SaOGaCPe?dOGoM?COE?FGFO?GrKVDukudP]TjAjucUhLhuZqxmCi]dFkqznI\hSUqhYSErlKJUCuzjYKeVthGbulJuKH@KoEoEGCGE!5?A#96!36?_?Q?@???A?@?G??@??G!7?_!5?O#237!77?A?@??O?G?_C@AP?PiOGOc?COa?G?G?GOcGCG??gO?T_Ta?G?g??G?G?o#116A#125?C^@GcuuRA#115!13?O_!7?AhAAS@GA_XSOOCAY?@^@Oo!4?_#98!9?@!7?_?iC!5?A?O#114!4?@!6?GO!6?@!4?@I@?EO?I?DAGCAGC`OL_E?iC@cPK?CQ?kBSGA?CQcWDGaE??A?@#126!4?_?K???WAL?_HE`I@CC??SC?D?AqKAC?C@CJO?D?O@KA@#142!5?GW???O#73??O#115!6?ASORGg?HAOCH#121!6?_G_kP}JelQdWcW_GO_#114???A?GCA?@#121S?Q?AKE$#184?G??A???@#196!5?O??C#252!45?O#193O!17?O!8?@ACGO?GoCpEWEgCHES?eI_FOSJyTdQIXFiTiTiTn~~Y?ta`cYdaSrKRcJ_IS?dOiOH_HOcPcOcOgQ_Z?U_Z?Z?LoJoE?Z_IcZdYdiTjSlOelQlJSlYTKy???T?G@c?O?AOC?PC?PC?PC?ODOaGTaWaTgF{@u?~?~?~?~PaH??_K?AD?_DGAG!5?C@A?A@??CPa?c?A??O?T?@A!12?_?c#128?G#126???U@G?@?OEOITaK?D?S#119!6?A!5?GAGC#102!6?AIC!7?GDNzk???Aq_#100!30?C#99G#108!8?G#115???G?C?GId?a@AD_OAGSaGCAWc?QG@C?IG_AI@@DO_J?K?A?A_IC??A#125!26?_G?ooG???O?P?G]oOG?AMlMakKQ`@??@!5?@@K__#107!5?@@???O?_C@#126!13?_O?_O$#196???_#239!91?_#196!6?_??A_?hAX_TGcJODgQkPegTiTiTiO??DtIGSI@GPG?aGO?S@??G?C?AOC?I??H?AC@?C_H?C_COa?C?H_C?P?_I?OD?OA?JO?CO_I?_ApCTzUgjUsJYdi\iPnciZcjYcjYdyDWv_\a\iVwB}Hy?~?~?~?mW?~cZQdx_YTo?o?_G?C!4?O?O?@???PA@C@?@A?A???A??@iPA@Y_BS?@#127!10?C#69!18?A!5?C?G#77!8?A@#119???C#77!7?BKCh?LdW_gO?E?UgGOCA???_??O_G?A??DqCApQkOe?bgY_#118!12?_`aD@?P`?pp`AHaKpyProQGopy_i@O_r_|wlWFor\x\NL@?@?AN#112!19?@!8?@?@#129!12?_!4?O!6?_$#246!264?AC???G?G?I?C@e@IPa@CPePePe@?P_PA\A@iGI?G??@A?P??u#101!47?@#127!145?o!5?_?o_?_??O?A#136!9?o_?A$#107!360?G#128!149?_!9?_!6?CS_GAAA{?@@?E$#145!535?@-#237jYsJStgRelOvG~?Ud]h^cZb{BKzNsJYdXcZ?ZcHqHqChQLQcYd?Ag@UGUgDq@GQ@OGaS?IPcHeGrKPiTAg?eOjCOCgODG@UhQcZ_HYdQ?ADQdGrCa?O?h???aG?O#137!9?S`?TIOcI@?G?c@??`O!5?GAGcG@O@OH?@OH?C?H?HAO@OAGO?BO?cO??O?H?cG?_?@?C@OAc?IT_TAShAS`IOdIOdIOdIOdIOaCG@S#184!19?hO?`??_AH_DAhUgEK?C@?qCq?k?V?D?g?G?d?@?B?R?t?B?D??AOBkAO#240?W#0O#125@_?w???@W??A#112!7?iCAG#143???G??QG?CGo#112??G#115CG???@?@??GC_CCaO?o?_#101!5?_T?CZkqDgQ|@SIGtItLqM@fgU`eYkTIEGZegPAo__#107???C@G!4?GC#119O??_???O!7?E!7?_!8?BB??WwCA?A`C?G#126?C??OiS`ACPHa@!4?A?C@A?@#116???_??g}?o?|w?s_wOG?NKK?N@]@!8?G#121Gw_D~Zm[O#103?QCOg#119!4?AF?OD#126!5?_U|MtkU~gcg!4?_O_O$#193S?A_GACGOAG???Tg!8?g!4?_#252!21?G!8?G??C#193C#240???A#192???C?aG?a!4?c?AC??GO??@C???Q_HOdO??@#239!9?C#105!22?@??Oc@Q?GuHCIdQhSaS`O@QcIcAcQkAcQhQcQc?kAk@cBcGcJ?@cHAc?Q?APICgQ_G#192!53?A?C?@C#237@C?A?S`CHAC@?O?q?c?e?T?G???h?D?@?B?p?d?P?C??A???g?_A#81oC#126?ADOkC?Gc?E@_It#118???_?`S!4?_!8?BrCE@y}Ea`^rhH_GD#59???A#77!7?IdYcQLqDlA!8?@?A?@???@B?CHAcXUAt?O?_#118!8?@A@?AOC_[SMCG]C_RMhRvdEFabP|Wy[zXNV{kbUfCrpRpOGG#143!5?D??C#125?OG?OWggc]gKhUkQMpD{AWgB?TLg?D~@YCIBv_@A???_#136?{g@??_C#126??_?W??cO#118AcwcrESh}i~\W^NG#143!8?OA@G#132?O#119@A\qlOMBEHUjUPMNnnNfBBB$#246?C@O_GAcGOFGr?i@W`A_P?[@Sq?o@OcGaZCucZQLcLzUCqlHdQ~TV}ht`VYGevkybTHjttmZqXTCr?T?|VYPl?znaDnyuQ_C?G?Uc??GdW_G!5?GA#96!34?O!5?G??C!5?G???G!7?O!6?@#239!74?i??A#192!11?@?O!5?A?_?g?@?`?G?i?S?c???S?g???_??G#90???_#49K#121ANDAm@O??Rgpi]tI~~TBPAAx~v~^hu|zvN~~s??ww??_#103!5?C@@WAuA_?a?PkPI_Y`???GQ#98???I?c!6?_!4?O???_O#103D???K?FATP`QP?`U_S_?oHK`A??_`?o?AP_!4?O_???G???A#121!10?GKKKIrvr~jz~iTBITj?s@CADA@?@!10?E!4?B!5?@#140_!7?A!5?@!4?O#125RD#132Ey#119??@#115@AD???@Q?@??_#121_?_ZtivWNhA`GQ_?FYTaLQmPkWcgS_K_O?O_Ws{{$#184?_GC??O?@?_!7?O?G??A?@??G!5?_???C?A???_!4?G!9?C#202??@?GaS?G#184!8?G?i!5?O!8?HQg@C???A???A!6?_?OC#150!33?CGCA?@#246!104?O??O??O!5?o?yCjCH?Z?W?I?V?}?U?q?S?g?I?Y?i?AOl?[Bs@?E#96G#140A#132G???@AieRGTGS@#119!5?Gc?gA#132!4?C@A#119!6?Go?EC?W[[_#107???O!5?GDG#72!9?@!5?}`tQItAaKp[WQh]HC?iP_O??@_#102GGHGK]kg{EG!9?@@@#107!5?G!7?OGO#103!17?_#112?C??C?OC#73???g!4?AG!7?A#112!9?@#126!4?C!4?@A#129?o??OoCOG?O???AN@?@_#73C#127A@#112!4?_G!12?_QcITGfO!5?@!7?@!6?G_!6?G$#196?@#192??@!7?C???A?C?A_!4?C?A?@OC??H??_?O???H??Q!7?AG?_@O#239!16?C#193!4?@G!4?@A???_??D???A??CYcWdGQCXGTdiQUdYTCrNcZcZcZc~UAG]I`eHokRu@YcHUG`O@SiS`[@QcIcQcQkQcQhQcQdQcBk@sBkQcJOJeXelQuHQtITiUgZaMgPZ_?GA_H?OAG`CO@CO@CO@CO@cHQ`SIPmONoMPkRcXeHsJsJsJSg@OI_W?aPG_AG?O?g?ACH?C?P?G?A?S?S?A?O???G?I???A???G?O?A??C#73?Oo???O??c#115!10?O??@#114!15?@??@?@?A?CQQIo?l?CO#100!20?@#53??GO!4?C???_O#99???_#114!6?C?A???A???aIsAC`IHC_G?yD@XC?O?KGIHGTKAAd@`CaOg?OK`?B#132!15?Og?e?CADQP?DA??@@???A@F!4?AO!4?C#149!5?_#142?x_C?kAO?W?ABM#114!9?@AHGhAC@S?_#118!26?@A@?@AP_O?O$#239!4?A?@!14?C!7?C?A#202!19?_#239!36?O!4?G#196!8?G`!4?QdGaTAG@?hYdGrK_ZcZcZcZ?hhU`_SGQDAG?k@Q?_A?Ag?@?A?aG@O@G@?@?@?C?H?G?H?OAGO?GO?cOGAO?H?cH?c?P?D?S`TIcTiVg\aUlhUSjIsjIsjIsjIsJShUi`mPnoNpmRkZeXuJsJsJsADSId[BkOM_\??R_@Q?g???H!5?O?A?A?O?C?g!5?g?O?D?D??@Cw@#244@#69?@#119??w#127???@#69!12?GS?C#103!14?A#107@#102!11?A??HHDYT~mRmT#115!39?A??@A?O`^HS@GaOC?IAA?@A__AK`O???O_??C?AC??C_???OG#127!23?_O???OO?GOc?I_@C?O!5?A??I??DCG??@#130A?_!6?O$#239!282?@?_?_?@???G?i?S?C???C?xiO?_???F#121!122?OO!11?_#141!45?G???O#38!29?O?A@??C#165_??O$#128!495?_?_?_?GoCY?W_?S@i???A!7?OA!4?@!9?F$#152!532?FG_?[__$#144!533?E???O$#145!533?o???G-#237lReXfI|Vg~SzkVylUj[ujLvi[a[ax]`]`GqLQcHU_UhCQdIoISbWChU`Y@YcBGAD_H?_GPiSHe?G@?XATIPMOeXAPAPk@kRcPgRkPhQlAl?U_EGUGTaGC@GAc?A#137!10?i?ChQd?@?@O@S@??_cAI?A?a?QGOGD?_?A?H??I?R?QE?D_C??OG?CGO!4?@?CG?cGAc??c?CHQdGcP?Ga?Ch?Q?CO@c?I?S@gA?HOA#192!19?A!5?A!5?c??C_?@C_I?S@G?I_?_G?A???O?G?A?C???Q_@Ci?AG#105?@#204C#14C#59A#128_O!4?O#112!7?D?SJKBO?G?O!4?OID?AO?dO??GA#115??_?CQ?g?S@HTAA@#101_?W??}GoGvYh~^q\u?b|NYH@gxTIC?GEhEW`CPKADYAtOKpOh_WoGoGog?__#107???_??C@??A???@#119A?O!4?C???EA?_G?KaAAAaD??_O#73O???AG#127!7?@?_@CCOBG???C#140!6?oCOGC??AA?@@?@A!4?@!9?C#73g?G??QE?I#118?@NSqhJVJ^g[B?W#126??I_?CpItAK`W?sJadGV?~?~@yDqC#119?R?gOC$#193Q?G?O#184???@?_??_?O#193??@??_!4?@C#184!9?O!5?G#193!7?@#202!10?@?G???@!8?O#193!10?cG!5?GAC??AC!6?P???PaGDqicPWJwTiTiTiTi~j@SrQDWeYcIcYaSjCH?cOl?l?l?dG_ITISlQcHu?m?l?GAWBwB{bUhRcjTiTiUgRu@ZoDYtIXeXq??_QChQ@Si?TGdQHcPI`SHaSHaSGdIpMpMpNoNoNoLa\a\a\`?i?T?G_?cG!5?@G!8?_??S?A@O_G?C?C`O_??Q`??G?O!4?A#217H#16@#69`#49Rc??O#119!11?AS_WACB??O#73?@???A#119!5?CC??GI!6?@#59!6?_#102WS\B^s?@?B#100??C!5?HO???!4C???aA#48!4?A#77!6?@?IOMIOH?GOGoGOG#118!14?Cacskm}}ZwJum}h|vPs}r!5@G?@?GK@@#128!11?@?_?@_GRICTiBOj`SlA@?E_??@@@#142W!5?xwgo@v??O??`GA#121?V?o`GhRDJ]o_!8?o@?N~t^jzMtIcPAD???TIVg~?~?}DyLz~kzUnz~~$#246?GOeGoAgA?BCP?D?hOA@COG@b[aHE@]`]VDolJqh\HUrlWTFthKezQhMcudX{v[IFuZXsmDjqX~vYJe|gteplHe{IsmRYRGQkBcAkALO??Q`GP_@#239!5?O#105!21?GcYcI??iSJCHOcOLOL?d?dAoITGOc?u@s?k?h?wAWBwAC@Q_A?i@iCgQ_@Q?@O?IP?H_#208?_#239!48?@?g?C!7?c!8?G???G?I_??G@!4?O??@!5?@O??C???GG#240o#35w#114[#50G#126@?C??@A@WaBLQgt#118?_R?DA???n}???_!6?I???ct?[~GCRAg?Q_#77!5?__?G@uGcGdQ?_D!5?O!5?A#103!20?CA!5?@??OI@W`HSgSoAgQcIW@OH???@!9?G#121???[s[kWqyALeB[u|??nSiCBBC_O#116???A???cPi@ShOSiOGymoZrrKCAAA??D@!4?A!7?_?@#126gsGQC?C?C#114??GC??_???A#119K}fo???S#132!4?OAC_??SG?_#112!12?C@$#196?c#192@??D??S?G?AG?A?C_G?A?S???O?_???_GA??C?A_???A_G?AO??C?O@G?A???_!6?O?C!7?A?G?AO?@!4?c!6?O!4?h?C???A?_??O#96!32?_?A???_???G??C???A!4?G?@!4?@_#237!78?S???O@AG@A?O?A?S_O@S`A_S@C@?@G_C?E@Q`A?G?I?K?C?E_@#244!6?A#83A#140?C#132AUoMleTIdHS_#114!6?C#115?@!4?@#126?@!10?`#107!6?A???C??C!5?A#108?_#72!10?GaHS?A_DAQ@?gtZTDXUheWiApLyd[Idb?`?O_?_!4?_#112!36?G_OC??_O??AG#73!15?G#129!18?GK?o?_[@IW!5?G!7?O#125oU?BFK_?_o_#115??AHAO??_#125!14?G_WA~J_?O$#239!20?O#252!4?@!36?_O??cA!8?c#184!12?@!4?c@?OG@?O_AC!6?GCG?A?C#150!32?O?@???O???A!15?_#184!85?OH?I@qGYdQ?S_O@?`?_C@C@I@C_K@U`I`A?G@W@K?C@U_@CxDQ#125!5?G???O?G_#132!19?A#114!17?pgCCRgCAgDGC@#98!16?aK??_oGQA??_GO_?O@CPKA_??_#59!5?C#114A??A@?AAA@!9?@D@@@CG??@@?cAo@P?O?GE@@#132!7?CCA!5?gc?bCXOc@YKGAH?C!7?C#38!9?C?_?kC_]s_]??FM_G#74}CAkE?A#127G#132!5?@OG?O_#103?@??CGO#73!15?@$#193!64?O??CA!8?c#239!26?O?G#246!157?t?sHA@W`I@M_I?S@I_Q_S?U@Q_W_K?K`U_S`Q`Y_G?Y?zCqd#121!6?@A?A??C?SgQlQIh??_gws~n??}{nTw~|n~Y`z]vP?~B#103??@gO?BgOAwTaI?C?B??FO#99!14?_!6?_!6?_?O#102!9?CFDDE!4CS]e]uJVJJ[OGWO#125!28?G!7?O??@_?WWCaV[q_JscPi?OgACI@AD?@@#52???OG#130O??_??_#152A!6?w?OGQ?@#112!14?S_?c?V`$#196!105?Q`GEgT_A?T_H?RkBsDiTiTiTiT?SSjGCgAP?@O@cH??OQ?H?AOA?Q?Q?P?_?`?HQ??@O?QCPC?C?C@G_CGPC?S?P?DG?k?Eg@?cAOACLYVHiUd[jPUidYheYItSja[Bs\afWtMpMpMoNoNoNq\a\a\a[iTVijcSAO?C@??G?A?I?S?I?Q?O???O!7?O?C?A_??G!8?s#127!5?_?_#115!104?A??A@@???@!4?_?_E_?caWA?R!4?D?G?@!4?A!8?@#126O?@__?ATBOGOAk?a!5?O#136!29?C@!5?Bk???C$#141!318?G#73G??G_OA#119!105?@#56!94?EO#52?S#144?@#145?@BpK@$#143!319?@#81@-#237TiSjSjuhLuKR}D}jU~DyUwT}H}HQuhZcItAShUHQcJoDYdQcZOiPeWEgRcRcGdIt?s?GBCHQkAhO_SHQlAlOdYcHQkAkPITi@i@iTiDQHsIWCG@_T_?HODGSAGC#137!11?@GQ?_?CI?A???CG@_CGQdI?GC?cE?@GGCA@?C?H?c?OAG@c@??Qc!4?@?cG?_?O?`?C?OCh??_?HAO@??a???@?AC_G?T?I?S?h??@#237!20?g??S_O?_???G??_?GCQ_IP?PaGCP_L_O_!4?@A??O?@ASgDI?A!4?G#204G#14@#73C!9?A@A[?G#119??B!6?A???_TD?oWg_oo?g#114??O?kBGCqHgAQdOA#101??ACBg?[bSHA]lvY~vkT}Y??aUslAPI???cOID_A!7?@!4?@ADAKIKtIPA?A??A#118???@?@?@??@?DqhgV~ZwCdBarrOSS_KL?cc_???C#125_?AAFcoW?_YxMIhYDySHG`a_PID@i?oOo_G??_#52?c#142!5?BB?~AwGE_K#132_!8?@@Bp?aDa#112H_O???Ja???O#126?_SIdY`CxCjCA?A?Ti?tIPIdYdGBCSg#112?C?O$#193i?`?GC!4?_!10?A!4?cH?C#252!35?A??_!7?A#184!8?@?_!4?_?A@?@?@gOA???S?G???_!4?A#105!20?I@O`?hChQ`AOI@_@??Pa@QH?kaCbOk?iPa?Q@G@c?Q?QcH?HODQcGQ?AOI@AC?I?HA??CHA#246!49?O`G@CGA?Gd?v?QLQ`KTCCiKSTqGCOIDITiTiSgDiCiSg@A?_@cHuGu@#217E#16C#125G?o?I?GjHOsCc_O#112!6?C??Ag?O?T???GDA?I?AC#103!4?O_Q?C?@cGQLhOAGpGQI_?gQ_`#72??@??RG@cQ??HAOlePe@YIDsITHAHE@I@A?B@@DI@i@@P@GO#114??C?GCC`???_CPGHa?J?DQ@G?cBA!5?_#132!5?A?W??C??U@H?_?J?iSDCoOSC_??OsO?C__?G???_#38???A@!4?BsHDGk]???C??O#125Om|^???BAC???B@#118??AFJy||SHK_GB#132???O??G`??C!6?SG?C#119!9?@A?J$#246?@A?@???q?Pk@o@?g?OChDA@a@QcHAcZT?|jAgudXSNi_YlHceTmHdpVkIgZVYoInH|t[YudP\UjLjudQWQnI_ZUdQxRMt_S]SiS?DwlsA`CpASI?IC?C_#96!34?A!7?A!4?C#150!9?A?@#239!80?CA!5?T?A??GC!13?A!10?O?@!6?O?O???@#240?p#64G#55_A#132?B@O??CBHYW@a`A#118!8?DB?_?Iyo?_!4?OOW~n~BOC_@?CP#102??_SN|s?_@@A#98!11?A?@kCS_HAO?cPQcPI@oA_gs_oD_`W_SEq?KOCo?_#103A?ccxK_J_[@AUIw?aQWaOI??O!5?A!5?_#73!7?A@!8?O?@#128!5?@?@W?B?B?@B?@?ACSIIDKs_oO??O#56!6?@?xC#74BOAB#128G#116@A#121_^~}_{wmcKwKiTsO_!5?aGokz]jdYdAGA??@!5?@VIpmtYdYv{zjU|zsn~$#196?S?S_??O#184?G???G!4?G???_?O!4?O???G!5?G!9?@!4?G???C#193!7?A??_!5?C!13?@!8?S!8?`?P_CIChUa?qH_dQkVsNcZkjV}}keCnTYhOlSjShQtISgPcGpmPqLOgQObOjOmPiSqLWdkOvGQkZcHQdYdYuHQtITMDi]OjuHaCZuLJ?OiCxATKQdWa[`GQdGQ`SI`Sa\_\a[b[b[b[b[b[b[b[b]_DAG@I?A?G_!4?@A_?@???C!8?ADGPaCG?gC?Cg!5?_!7?_#50O#128@N{_nQS__#126??@AGCOcW_V_W@#115!6?_!4?O???_?_!4?K_RGcQGdGA#77???@ISCs@[Bc\?QGc?G?_#100??@j!5?G#48??G@!6?C!5?O???_#100?C??W?_O#102?_???PROW?}[G?AAO??O#121!4?C!5?OGWCCKGJXbq`WAW{R~HGUsXG??e@I???_!5?_??OGC?_O#116@jCDIOB\?CoY_#130!6?_#136?CBo@O#127??O#119??_#126?@[@?OG?COOG#119?G!4?_OPVF?C@#125!4?SQCrOy\vl~i$#192??G?AO@C??A??A?S@?a???G?C!7?_A??S@??A_?OD??Q?G??OA???P??_?D?O!4?@?GA_??O??G?d??OC??G?C???G?_???A!4?G!8?O??G??H#150!41?@G#184!95?CAO_??_?GUGRG_?I_APIPA@aGCPaDgOa?G@?D??GOADaSGDI?UHu#83???A#54A#38_#127??C???AG#121!4?DQlZc^gZf}|O{n^I??NFAD^DNLBF#107!5?@G?Q!6?_#99!22?OH!6?Gc??_??GSPAXMo]Ke[iWGoo?_#77ACA?DIXA!4?A#119!7?C?C?o!7?wGcD?GBB?C??[A@D#126A_?Q@g?cO?C?S@!8?_??GCO#140!6?@??B??KGK?Is??O_!8?_#73!9?A??A#107!6?C?A??C#73!13?G!8?_$#239!6?GA?@!9?@#202!47?A#196!36?A@??ACIP?PA?HODASQgR_JoRcBSg@@QPhO?cACQ?OACG?c@QCGQC?CG_?P?CO??@OC?HC_AOAG?cH??Qc?I_G@?cH?d?ogP?dO?cXQ_?OsulDyE|GrlYe\`YVdYalSj`]A\a]a\b[b[b[b[b[b[b[b[`^QhO_CJtGAT?`???O@!4?_!4?@!7?C?O_?A?a??O?@_!6?Gu#97?O#121@#52W#116??O#49?d?OC?_#115!109?_C?@??@_T?GC_DGc?GCA_??C@???G???_#127!16?B!4?_A@CA_ADGE?A??ISIcO#129!7?AA@@DGJsIS!9?C#81!10?O#115!8?C?A#127!18?_GO$#239!107?A?_!5?_???_??@?G??G?O#192!134?T?AO??c??CO?G_??_G??aG?O!6?AO?P?@??G?Q?SH_?@#140!5?C#107!121?_???_???c#112!15?O!6?AO??@???G?_!5?G#73!15?CG???O#149!10?@A!4?A_?O#152!5?GC?B#103!19?@$#144!532?_@$#145!533?G-#237DYTitI|Iv[b}Piv|a^tjuHzc~A|UkzcVgU`YdGtIPiSbShEgRKPeWbKpEWbKPMOeHQk@A_BcHu@YcHu@sHeSIOiTaShEgRKaTaWa\a\AXeHqCwAXEGACi@m?IOD?CG_CP?A#137!4?HACO_D???_?ACg?CGQ?G??_@?C@?SgAO??ACO?_?_Q_HQCAC?QC?HO_HOC_?CGP?i?@!4?@OCG@aG!5?@??G??AG@C?H?A?C#237!22?_A??CY?S?aC_?o?S@G@Cg@??O?I?`OG?C_CGOg?PaGa@QgCG_G!6?G__#35G#125G!4?G@ATANTJMUO?G#112?O?_@??_#114?CAM@?_O??_?O_APSOII@dKG@e_I?O?G?_#101??dGA?@SgEJdJUn\j^hQ`LYcO?G#48?I??C???OA?G#93?G?_KOC_?K?KGO#101?@??AAIYcC#115@hA@?_PqSOHCQ`?Z??_!4?_?G??OO#126G!4?_??CGC??OooG?P?__?G??CAC?A?F??@?A??A#127??@!4?C#81?_#38_?PAWvJ[_?GC@#132OCCA!8?AC#126?ACGC@AG!8?_OkbCSIUG@??A!4?@?FGQD?mD[HQ???FOS_$#193y?AS?P?c??O?CO!7?C???G?@??@#184!28?_?O???@!8?A!8?_#193!14?D!9?@A?CP`WhO?OaSD_YR_VGaKxc^nLsoxINYtytItgRU`Z_lQTiTIuhYkhI?Ti[dHiDYDZCl?U_ZgZchQsAlAU_jUXj`Cm?Ts{Nn{[EQpcXCrkP}pysjspvGPcQHsAhSqCzCqLqLqLq\qlqLqLqLqLqL?O?B?@???O!6?a???C?@!4?C?A?@?@A?A?C!6?@?OAO?O#240!5?U#37A#128CrJe~r{ti\??C#73?@IDAC#118??G]E?M^J[pSvVn~oW{nVtMjN?osWADoP#102??ID@?HNuJG??oO#72!6?@??O_UgQ_`OkQd?OtJ?z@m@k#41???C#95KC!6?GOO???C#103@!5?hoUhCgOaCAGA?G!5?G!5?_O#125!6?C?AOC!4?_?GG?CKCJI?_@@?Q_?A?g_O`EQ@@DCy@gGoKH?Q?O!9?_O?MAB#119GCKL]?eQ??G!5?_!5?@IG@GD#132??O`?_?A?__oO???GC_@gO!4?s#112?@O_!4?@$#196?D_?I??O!20?A#239?G#202!35?@??@#184!29?OAO???H??g?OAGA#239!6?_??_#105!17?I?IDGO?@Q_@?cAPICGQ_QA?@?DaGo?i@YCH?C??_O_H?hA_AC?A?HA#184!61?O_??ODY??C_DcAoJS@?@?_@!4?I?@O??E?CHSGAPa?A@QgCG?@?@IdG#244??H#70C#140A??G??AG#49?_OA_#126???yc`II#119?_WB@_o_??GG??ND??GG#103??_T???oAK?Tt?iSPeOHs?Al?m?QgOGO#98!6?@?QCH?kOKcI_GCC?kORfvarAR?bT?RC`?aIgOgcO#77??YO#59??O#107_?@?G@?C???C#121!4?_Oo?OGAemJje{gF??gvBVZ?ZEEBa@__OCGCSK?LG[HFOCG?GK?a_!7?_#52!4?_?C#142?_BQF?A#121_?oWSA@A@BPlR\R~LZPbMtUw_O_?v{vYnRGQ`S`C#127oKO?GAtGS_#73?A!4?G#119!4?C!4?A$#239?_???_#246A??`K@iCGAG_GCGQCH?T?_P?AgRhMcYRIseThKiQXTcqiHdSQIhdSRi`lXucQ}lUsZQHkdZQGmJqXHtfTgLjQXTcr\gLaL_GateOO@Q@c?_O`O?O#96!29?_!8?_!7?A#246!92?OdA_??@?OHOHCJ_iSyqDW{wNttTYedzQXq@E@SgCPSg?@QpE?aTitWtcW#97?O#38_#52Co#50??C#127!4?_?O_#121???@YdtV?`{O#115??@?a!5?A!4?_??_DGA@oAGI?o?geO#77???Qt?N?jCPcQcgOaC#100??CK??A@@#72!23?O?@??A@C?Ksc#118!13?@CIH?ZFU\LH@BR?XOcCPBA??G!5?@#143!7?O#128@?@???@O!6?O???W?GCGUpKPUQ?K??G#129@?G???O?GA#73?G??@!6?C!6?GO#143?_#73!11?C???G#128!8?_#121!4?Di~Pq`Al}j^wnJ\}$#184??G!4?@G!7?C?A!8?G#193!40?O?G#239!35?CG#196?CH_?C?ACi@S@iQDgVGrKrCZ_OqALAdO_?D?OADG?K?U?H?C?P?C@?S`Sg?@QCP?c?_Q?Z_L?D?QC?HS?X_LO?cOUiPTiIBoOBahhEYCrKRm@MCJSBMGteYhuA|SjHzCzLqLqLqLaLQLqLqLqLqLADIdG_CITHAG?H!9?C!8?G!8?CG?G??A?_Cg!4?R??_#55P#56G#116CP#132!7?G?@Gd?O#103!12?G#69!6?@#107!8?A!7?D?A#108!7?O???@#99!15?A?Ar@?Sr?yPA@kOGP?X_nWI~_bAeLtSgOG_#119!15?A@O_!4?AAEMKC??@!5?OG@@#116???_!10?@#73C??A??A?_!7?_OO!6?_#56!6?O!4?DGC@#127O#128?@#115?_??O#114_#112!7?O?AO?G@FOG?d?A#125!5?GI@?pMRNLf|IVaZWs!5?A!7?_$#192???@?C???A???@??P??O@_?Q?_A??CO?C?O@?c?@G?AO@C_AG@COAG`COAG?C?A??G!6?c?O??c@O?C?A?G?AO?C_AG??AO???D?G??aC!6?C?@C?H??G#150!31?_#239!102?G?O???_!4?A!8?A?A!11?_??A!5?C!4?P!5?A?F#144?@#141!11?_?O_#121!22?A#100!77?A#102A?!4@AM??WUMK??@!7?_#132??_#112?o!9?OG@???O??G!4?@_???O#118OO#119!11?O#116?O?G??e?E@A??@@Av?Cb!4?_O!5?@#118wq_?{G?g__?___!5?Nf]O$#252!69?G#192!189?G??_?i??AO?C???CGQ?A?_I?_?G?C_?GO_?`?G?@S_C??@CGAC?A#114!122?@!7?CA@??@geow?CQccW@!6?@!6?@#132_SE?GG??QC`@K?QACCGAAI?G?p`SOGjEgd_E?@@O???_??_#130!7?S?G#136?@#126_?_?_#81!14?C$#48!433?O#69!17?_#73!12?c!8?_?A?_#140!36?A??HKQLGEg!8?K@$#127!475?O??_?C_???O?G??A?__p_#144!31?_??A-#193~?iDGO_G?CH?H?g???@#184??A???A#252!5?G#184!6?O!10?_!24?C!16?A!8?_@!4?C?S?A?@?G??_A??A??C#137!12?@?AOdGA?H?D_AGOC??CO?GCa?@?C@Qc@Q?G??GO?_??O_??AO@i??`?O?`AOD_IO!6?T?A?O?_?D#246!30?GA#237!8?iCGS?Pg@G?_?G?CA?TGC?AO?GQ`GOcGQC?@g?gT?G_AH?C`OlYdID!5?@#96G#38KOC??_#125??A`?OG??{E_?_#119?@@???@FBADW[KKG?GG!5?k{w?G}o#103@A!4?`ISDrcCClGCRCHaDi?G?o_#98?@A@G??ACJ?_CW_LY@[IzfWsjSiwdZ@YUhFq?CA@C@?CO?_??_#115??G??@?aPg_H_???A?G?IC!9?c_?_AO_!5?_??_#128G?GA?CCAE#115??A#116!8?OO???GAG@?D!4?@#98O#115GG???_?oGCBg_?_#112@?O?g?C`?_@?@cO?ICP#125!4?EOOGA}Z@nDrHTidB@\w_??___?O$#237?T@ybM\bmRsjSjUlwVg}VH}oN|rMzcVqHQkAkPK`Y@YcRcXEhQLQcYdGtIPKPeXaLqcRcHeGRk@iT_TaSb[_LqcRcHu@sHQLOe?cHq?tAShSjODRCJcG_Qk?iSgCQ_CO?G?_#105!11?Oc?Q?G?_A?G?@?c@O?SGQ_G??G?D?Ta@AGA@I?AC@G!4?AGAC?G#184!61?TiSgTgPg@g@???AS?a@G!6?A!5?OC?@g?iD??_Q?H?_?cI@I@#208???@#240__#56B?G#128KBBF^|Yoco???_#126EEGo??wk#69???C#115@AC!4?G!5?Dg???HA??GDBA@SC_GWC?_?O#101?@!5?@IDyDEIsgAPNOgo?I?_?G_#93!6?A??@?A?_!4?G?fOLwywo__#103@???GDWBG@__Sg?T_???A`??G?A#132??_?C??@?G?@G!6?K??GC??c?O@G???A_?c???B?EH@?@OC!7?C!6?B@#107??C?A#119???B?CwG_#126A?A???GGO!8?DiX?E`S_#127?cQ?GCaIOICA#121??F[B[ALANvnyt}N$#239?iS?S_?O?GA?A!9?@#193!75?HQ?C!8?G?G_PcRC@Y@@ApHCRidTqMTiTiTkyWLGqlQUhYD{ALyDXadZsITiUgZ_LY?latiTaleXMtILZktKeDQ|ULImSWL_Y@dn~?~~T?ih{BkZV_yy~~nzv~?PkRcZcRkRkRkRkRkRkRl}bsLqLqLqLq?PA@aC?OAOA???@g#202!7?G#193!12?A???A???_!6?O!5?A?P#37_#52nr_[O?_#49?CI@#121???A@?hAI}}FB^{oww__?ooo#107!19?SI??A???GO?_#77A?@?@ACTqCGXo#100??O#99???@??COB?B??cA`CWdJSiTDYC}dhUoLWA_C@A?WG??_#108G#59!4?@A??G?C#118GAI]P_?wscoX\]E!7?CA!4?OA!4@`_!4?_!5?O???__#115!7?_#103_!4?_O?O!4?_?_GGoCGIS_w?O#119!15?B#73_!6?DA??C_#128???GO_?O_D???_#143???G$#196!5?@ACP_?S_S@Q!4?_!8?G?C#239!74?A??A_#196cO?A?G?Oc?gSA?RgDWaKPiTiTiQDdaQD?H??_A@O??_AG???_G@_D?U_@u?WA?GS?PCo?dO_Q?bWOl??o`PAdaYDsIO?~??iiTSBkRCgYDD??OCG?~mRkZcZkRkRkRkRkRkRkQ@SHqLqLqLqL!6?AC???S@g#239!26?O?S?G?CA!5?_???gM#97C#144O#116??R?Gw#132???@?E~~@?X?OD!4?_#118!4?GAB@BFtvt~|YqDRBFot@MoWsg_?O?_#59A???G#108!9?_#72?@A?DITkeonSIspNWfOAcY`#100!18?_!7?O#114@!4?@?ACAE@ERACC?AO???OC???G!8?_#103A#125!8?KCOKSGSGEAJL@@?_???Q?B`CIIEA@A!5?C??A??C#126A??A#132!33?hgA@\@?c?QGC??OwKAFO?o?XQG_$#246!16?FgA@?s?FO?COCPG?udP\Rib]cudXkJaxUCqlHdYRIseriHeSQLHkYQXtcRYSiNi\hKbZQLHkYQHkJucqjXUHUGnI|h?j?KOG_O?RC@?@#239??@??G??A?@#150!14?_??O?@_?Qc?I??@#246!98?@A?ACAsBWBS@g@}?qr|hnvbKSfIRdhjyUUTB?idJ?cRqGC??O_O]~~~?O#142!5?_#140C#127!4?CI@???W#73?O!5?O#114!6?@?A??A?A?AdGQ???E??@E_GTI`IT?_GO?_?O#48!20?@!5?CO@??S#41!17?H?A?C#77@??G?ICC???_#119??@!5?@?G!6?_a??K?C!6?OO??_?A!6?_!9?ACB!8?_!4?O!6?GGKG#126!54?_??GbCBC?t?GODI@o$#192!18?S?G??G_?G`?A_@?GA_?C??@G?A?OC??H??Q??c?@G?CO?H_?Q?@c?AG?_@?O??AO?C_?Q?@c?O??H?C?_???O??AO??`??AC???G??S??G_#96!21?C???C?@??O??A#239!99?_?G!5?C?_AO#196!33?Q@!7?S?A#112!19?@!6?AG?CO?_#102!26?@??JRBAFwkyu[wO#95!43?O???K??_#121!15?OO`cGCA@A@??`PPRGMaf@YKDliXN|{aqOABOBB@?gO?_G?[HGYDlGKW??@??O!5?G???C?ABD?A@@!7?@BARN|V|z]~Vun}WN~tzm~yOcO@GA#73!12?O$#192!265?C?gAS??@GC?AS??S`GOdGQC?@g??S?O?SH?C?QH???C_#143!26?C#72!101?AACC??_#112!16?CGD!7?A_??C???O???A#116!10?O?C#112O???o_??O?O?C??O_#141?O#49G#101__!6?_?_???O$!438?@AA]SQO__o?_#107!10?@O#126?A@!7?Q`??A!4?@!6?A??B??A@??OO?G?O??G?_O#118!7?O?O???G!7?CC?A`@??CBK]WCc$#102!439?@??@@BYECSW[W#73!18?_G!9?CC???OK?OG???_??@???C@??DA!4?A???@!5?G???C??@$#125!472?`OG?O@#127!19?__!9?O_?_CCGCI#128DDEI!7?C$!474?O#116O#140!42?G@?B???B#59OO$#127!475?G#72!42?__#77O??_?_?_?O$#142!520?CC#52A@#114WO???_?O?C?A?`Z?S?_$#102!521?_o!8?_oGWOC$#38!523?A@?@#81A$#129!524?A-#193~?~?Sg?iO@Q??`G?ACG?Q!6?G#196!14?@#193??_#202!15?_??C?A_?GcO??_#184!4?G@#196?S#184!12?C?A!5?@???G?G?a?O???C?C!5?C?O#137!11?@?I?COA_@I??eGDa@?_??O?A?c?OC@A?G@AC@?Q?dG???HQ@C@I?T?G??H#246!45?OC_HQH_?O_?O???C??GcWeXA`cdxQ[gVWgiiwSVzy{xy|xYSdLZRtTk@smsRcl?iTgX^~~r}#244?F#14A#128_S!4?FFFB@?nXSIU@c#132R?VGDQKa[O_?_O_#118?@GC?B@??B@???@BE@@FEYL\]og?}z_O??_#101!7?A@?A@]`ZsIsHU@qK?e?G_!5?O?_?_#93!8?_QGVDnJ\inmCKGGOg_#100G??OOO#114?@?C???@?@_BGOG??GAC?OG?AA?EB!6?C#93__?_?_O?__GoW_GcGOGQGC_C?_#72@??@E?OcG?CGG?K#121!8?AAABHYYzWopqbff{y^umzFhUyHa?@?TG#128??@_GQcZ?OdOCO#126@CR?WA[`IoD_$#237?T?iATjSjSlxnYt^OjcYDzeXvkYbtLr[QhCxAXaTI`QcYCYcItAXa\_LQcZc@?gQGSGAs@GdO?@_MPIpEwB?TaSjOLQcY`MpIT_TaSJOlA[?XAk@uGuHuHcOi?QgCAOc?P_CG_C_#105!7?@??C??S?@!4?QGCa?dGP?HA_G?d?CO?g#192!78?_?OG@C!4?_GQ??C`AO_DOC?@g?C@AC@AC`IO_CGA?OC@?G_A!5?_#64!7?C#49U_#38?QO_?_??C#125@?A@CHUHgw_oo__O_#112??A!4?Q??G?C#73?@#143_#132??g#114???@???@CA?@CQg?CICS??gGU#77!4?@?ADI@[_?SG_#98?_K?a@Go?WPcnO@lAt\_\btePiSDD??_!8?BAC?KCOW?G_#121!4?OQQOAA?C?CA?@!6?@G!5?@C?A@@GE?G?@A?D@??@???@#118?@#101?@!4?@?A@A@ZCWoCw?sKOKGs?O#112!7?A???a?A???G@??HO#143??AG#125??GaQ`_CiviDrKRcZdQlOM{o?Gf|a$#239?i?Tg!4?A?A??A_C!8?@C!4?@#252!29?G!11?GC#193!31?@Ac???GA???AGbDO`CaXdIPiEI`VPYHnl[m_tqn{ZstiLOugDqHCqHfWtIXEhZ_|QuWdwUmGlOAuvlE`kqy_TAjbuXEwVy~~^v~nv~^v^v}]nv~z\mvz]~?nOnOnOnOnOnOnOntZehZUce\id]TiLU?Q???GaOA@#239!11?C#184!13?A?_?GA_G?@?GO???AC???C#70???@#125H#116Ad?@A??_W_cOCGP?GO#73C???G#115!11?C#119BBB?A@??A@!5?EMGG?O__#103@CA???j?Z?A`G|?Oq_i`GC#72?ACJ`BUh]@q\GvASDi??C?O#95!13?`?YOo_???AAC??O?___#107BA?CCU#118?A?DCO[?w??C?AA??AGB?@?G!4?@CGKGE!4?C#100?GG???C???AA?C?A@A???@?O!7?C#118@?@?@?@@C?CsT{CoccC???C[G#73!14?G??A#116!8?c#121!6?BGc??@]tNy^~$#196!4?@AS@Cg?COC??@O@_#193!54?G#239!31?_??@AG!9?C?@!7?O#96!13?@?G?@A!5?_??O#237!95?_??G_Q@???cGQGAC`AGaDO@A@g?C@AC?AC`IO_CGa?Y?@?GOAT?ACA???G@KGO#52?@Y`eKWOW?W#127!7?A#121?A?BADQCANZd^b^jgsws{g]m[c]B~U{woOoo_#107!10?G?D@???G#100!17?@?O!7?g#85!19?CASOOw?_O_#77?@#102?@@?CCOQGG???_?_??@?_!4?P!5?CO?CIA#81?A#98_#95__??!4O???G???[CGckAgCG#134???A!5?C_#114?@!8?@AG?GG?_#126???@??@!6?AC_??CoC`CO@OCIA#127O?GSIC`G??IGAh_#73???A$#192!16?_!5?@_GA_??_??G?_?G?@?@??O?A?G_AO?H?C??Q?@!5?G!9?C??@?OA!4?a?G??Q?G`?O???OA?G?c!4?@C?c@SH_??O@G!7?O#150!19?O?@?OGCQHC#239!95?G?_Q@!5?O#193!30?@??OAC??g@gP#150!8?G#132?G#142?GGO_#140G??AY?_a___#126??DGC?G@H@_CW?K?S!5?O_O?W_S?g#112??G_???_#102!10?C!4?AFNL[S[oo_#99!13?DBACZ?BmA\IA^a[IXmTjYgUg!4?@?@@??CGCOOG?__#115A@_?Qhd??C?G?aG?OOP?GGD?Q??F??@CGOC?A#73@?AA#112@ADD??BA?@@??@#131??__GO_??_#103!4?A@A`A??AAaA?KAgo?G#73!5?@!9?@$#184!16?G!4?C!6?A!4?A!5?_C!4?GC!6?_!5?G#196!50?O???Ga?O@??iCQH?A?e?H`UGiDuOQaPTIG???A??_G?QGC?@??GA?cAoC?U?G@aGB?PdQItHGQoKQHCTigSSHeoFgD??_G?OG?_G_G@`OG?CaPGC`?~OnOnOnOnOnOnOnOIcHQC_HOATI@iDQ@l@CGC?CH???@!30?A???@?AC!8?@#56!5?C#55?@???c#115!45?@?A?I@T@?T?b_WSU`?__#48!21?G_??O#88!26?o?_#103!5?A?@@a?``C?_?@?@?O_PLC?\?T?SGOo_G?C?qG?O?O???IG!4?CC???A???@#77!12?@A?Q?oAo_OsGo_O#132!11?@?@!7?@?GO?@eSL_SG`T??O!8?A@AGcP$#246!18?QDg?WE?O@SGQKadSZEte[Io]kJdP`RTGleSAZqlHcQ}VVlrbt\JuRInvQZpmsEgDg~i\HSfqlHdUOIdg^iLhseQXAtAs?O@@!4?QG!4?O_G@GC#184!126?A?_Q`Q@?C?CGQ?G?D??A@OCA#239!25?O???_!4?qo_#59!68?A!4?O#72!53?@#87O#101@BBABECK?GGG!6?_!4?@??__?__?_?_!7?_!4?O!4?G#119!4?@?A?@#99O?_?OOSgGGoO#119!8?@!9?@BB@?@WC???CIK??OO$!461?!4G?S??A??G!4?A???@?@!4?@@A#126??GG!4?AAA??A#98?OO??C?A@A@VSMK}kw_G?CG#115?@?@?@???CACo?G?_!5?C?G$#132!463?A!4?C??A#107???A!7?_WOw??O?O!9?C!4?A#102!22?A!5?A$#112!466?A#77!4?_?C_??_?c#108C#112G??__#125!7?@CD#88_??O$#111!483?O#85!10?_???__OOoG_?_???O$#116!494?@#111?C-#193~?~?Ti?GP?DA!4?S?SAS`GO???_A??@!10?A#184!8?@#202!12?`?I_S?G!4?_#184!17?A#193??CO_?g???G!7?C?DO`W??G?UPGRkACBPKHQCjYDuhUvvnZf^Y}lzt]}ltIlS[kqY_DmTZcFLY?i@TBgEOHj~Bjj~~zn^zx|Z{|]~m~^BhYb~}NZ^L]VZ^`iZjRjRjShUhulYTMtYLuLYtEbCAt@AQ@AAH_F?L??CG??C!10?O??O#202???A?A?A@?A??_#184!10?GA#196??@?A#153?G#239!4?B{#150A#140@??_!8?A@?A?@A#127?@?A@?A?GC_??_#73A#143???OG???G!6?G?C???S?_#118@??@G??E@Kq?hC?G#102???AI\u~|ko#53!5?@#98!5?@A@?HA?GQ_WDKPROMiTOfEc?W`?OA#85???B?EA@??BCBGC?g!4?_OgWWWwo?woSwWwWks[u[s[snXk{U|XgSbATiAcB@?A?@@?@#98?Gg[oGw}{jq~{DNUjQ@CG?C??O#115?@@GMO@??G#121Ad^{s\|tO]jTlV}JsD?B#125odrZHd[A^_I@PCiChEYdQlTdONrOs?@OK$#237?T?i?TiTmTytm\zViTHsB[AflQ|JSxNwEOlOLaHcJS`WaKhS`ShEgQKPeCIcHEGQK`?J_SAGQC@?bCjSgOLaTgTAsBsHeOdW`ADISBkRc@iTaTi@y@iCADYcRk?iC?@gO_IOcGOC?G#208!6?C#137???@!6?AP?_A@C@IO@_?GO_?T?i?S@gAS??S!8?A??A#237!35?_??_??_??G?G???K_S_S?O_Q_Q?O`Oa?s@YcAgTGcGDGCGCWCOCgCOcGCA?@???Q_IOACHa?_V?A@!5?hO@#193@#38E!4?@B#129??_O#132?CC!6?I@?ADCA?HUx?Z_Xa_?__[__PacY`S_#73?O_G#112???AS?G?O?K?_#103A???J?SI_TKoAH?AOG_#100!10?A???_csO?A??_g_#93@!6?@?AANcCxJRClPk}nzkw[qX{So___WK?___??[CIGC#103!4?@?@@@#100@#93@?C??_A_@`SlgTkR{[{{Ra{huPdS`Dd?@?CC#100???_#102??_!9?CC#108?_#118AYnDP\G???AA#73?I_!8?gOC?G#127_QG`[_J??A?@?O@?GCAGGdOK#126B?aa?P$#239?i?Ti!4?G??@??_?_!4?O#192??G??G??C??OC?@_?C@O?G_C?O?C_?G?C?A??C??G!7?A!5?@C_?G?@?S??AO@C??O?WdGSACPc???AO???@g?A??CH_A??@_?O?G?_??@#105!14?ACG@??G?AH?O?_???AC@?A#239!69?o!4?O!10?G?G???@#240!52?AS#56G#128CJ^[c!5?ApwIK|[{iCws{_o{_O#126@C[CTeXS??]@]OMKXC[iC\_YcY_#119??ABEKFB?GO_#107?C??_!6?_#101???BCHUkB|QdjStKoKa\QH?cGO_W#48O#95!6?A!4?@C_JWAogwOgO?OCO?_@_!4?O#103?@#108??C??C#84?_#41A#95C!6?AA#84??AA???A!4?A#95!5?@??_@@kSAAGa#134!7?A???AA?@#77!6?B?@aCW__#119?G?Oqa_O?AB#132!4?@!6?@?RCGICCcQA`#128?StQkaOZEWdAhO_O?_?_#121AHSlA$#196!6?Ta?a?GOaCG@A?G??C#252!50?`?G!21?GO_#184!6?@???@!5?C!4?OGC!6?C?O??O#150!17?@!4?A#96@#246!81?C`SGa@?I@GaL?K?C`ACJCWAkcPxEibZrirzbzbrlzPZlIrx|}[~~jKTdLxqST|Jg{|{~v~~~Uk#218?G#70_#116@??_GSgEHaT?ATpAa@#121!11?A@?G?CJjT@A@F_PA`A@RaJDRdJ~\g{oo_wo_#72!18?@A?BS?_ISbIrKp[aCOI@_D?a?C!4?A??G#88!11?A?@!4?A?C!8?_O!4?G!5?CCC?G_GaG_IOaPB@?ESIGOA?OG??A#131??G???G?!5A?@?@#103!12?BA@BAGU?d#112!5?A_@G_?Id???A#143G?C#116!15?k?XC_?_?O#132??AAI??KHSGA_$#184!17?G!6?A!5?O#193!43?_?G???@A#196!29?A?O?G?A@QC@_?_C?@gO_A?dg?DqHUhGGO_W_d?O?A_?Q?cO?_AHCTiOG_QgOdiTSigUPlaS?gSS??CO_CCAc@A`?P?_{Ud[?@oc_q`gc_]TcSkSkSjUhUHQdIpIDqHQdI@GQhAK_H?G`CAG@?`U_ACW?G#244!52?_#74O#52Ao?@OgVxUKg??_#112!22?CA#115!21?@A??APKO?hCOJ_TI_PC#77!5?AShOgAKO?G#99!8?@?DGF?BAKmpTglWpY~cWO?`CCC#80!8?@#99??A@?CO?GC???B?@A#94???_?_?_O#107?@#94!9?G#99!11?A!5?S?CQ@?GOD!5?@#114!15?A@P?c?GC#126!10?SiO_@oIyCgBO$#246!18?a@gA`GOdAS`E_AxnAjq[UZoiKfTRQjMjQWVdriXxtZqxvdQ]tSJjttlY]VSyOJUdq[iBi|HkIqXlIfA?A@@wAGR}SgLiS{?EO`W__???@?OGACB??@A#184!108?O!4?OC_S?O?O_Q???O_?A@?@GC??O!8?G#55!38?wC?A!5?@#125?G!6?ToEH?YH@VaG?a!8?_#69!22?C#114@?A@LQQ_SB_TI_@#95!24?A#72!36?A??A!4?AA?A?@?@!6?A#101!40?O???OO_CGqP`ZgSgCw_O$#239!124?A?O??C!4?A?_#192!120?G@??@_?Q?A?P?C?C?C?C?C???C_?OC??@A??S`IOaCHa??S?A#142!16?A#101!135?@B?D?AA@!5?@??@?@?@#72!42?G??g?GODKiUcOgSG$#102!458?A#131G??O#118!4?C#112C#77!6?@?@?@$#98!460?KAA???@?@ACA?@!5A$#77!460?@?@?@$#100!461?GC??C-#193~?~?Ti?i!6?OI@A?@??O?_!4?C#202!27?IC?QCH_COAOCH_??O#184!18?@#193???i?VcGPC#184!5?O#193!4?@?@??A?AD?eGD?GRCHe?JCD`LUpHKYShBXElQ|pN~zu|JEJOy@T_iCT_iCTaIPdGY`twyN_yy~~mvz|MnflmNjlM~?~?~NnOnWfXlZcZcZcZcZcZcZsZM`sB[`ehcJG_O@C??GQG?GaC_!6?A?_#202!5?O#252!9?O#202!11?Q?`???_!5?_!4?@#240???Q?Oy?P#14@#52@?FKgkVAJ?R_g???_WO?oW_O_#127!5?@?G?@G??AGOCIC??OOgW#143!4?A?CPAh??I#118??K_ANwC_iO?o?O#102@AB}JulJukO#72??A?GFOJgQHCO?I?sA?cQH?e?AG?_#95!4?@?ETgYDaD?f?C?O?O#88?DRYM~o@??c?wGGG?{oL_Cqoz{zox|zWZxarrGHB???CG#95oAGe@_@CA@#98cySYv[zu}V|Z\vI{AAC_#103!5?AH@IKbDG?W?O#119@E???Wg#126?PA@UKp?BGS??o?g#128??GPUPSKApKYDJccZgESPa[A#132?j{S$#237?T?i?TiTzvm\zVitiSxUlYfG]vkR]`yVhQKPeGV_TiSATiPiSbShEhQL?OIC_OAHHCC_OCH_G_T?HaKPeGrKHShQhQcZ?YcH!4?A?OjWfKQcHU_TiSyCz?|_YdObWcAgAoHs?wAOa?CQ_@AOc?O#105!7?HAC#137O_D?i?T?i?T?i?T_IOd?I?D??D#239!44?_!9?C??_O?O??KA?AG!6?C???G#184!32?G!6?C@#252?A#193A!8?A#244eO#38M~w??OgsCGc??TO??__??_#132!9?A@?OB@GD?G@@JEFfABB}xCp?o#112!4?CO?hQ?C#119l#114?BOTCiC@g_S?_#101!4?_@ADUHCZeWfOVlsyj}dtIOwOGcoOO__#48?@#93!5?`?AEDqTg~O~r}l}jtygC`!4?G?G?Aq_!4?OO?C???C!5?CGCGSokylvytF\vXqLUjLSZ@iDG@??@#72_??_?SA@taZShghO_#114?G??G?QI?QKG_#121FVDAQ~mt]GrKn{t#125@PKMG@U~`K`I`?GA`???A??RGbKXaTVS?i$#239?i?Ti!8?_C#246?CHE_OdGq@?@K`ICGUcriHt_^i?j|gTEThKjQXUcq~dpZKisUQjXLjqU\sIi~UTriXTCqqjUCUlHcudZu?G??cibCAOplJqh^i?@CPCSA???GC?OOCPC?A?@?K?G#237!90?OAG_AGOAO_OJ??`Id?_@s@?PGRGV?jODGBSH_ACaP?Q?T?T_@a@WAc@gQCH???A?`GC@AC@AC@?{?sG_G!7?G#20_#116??ADA?@?v?OS?D_GC?oG?S_O`#141!5?@?A!6?A#140_#121!5?@!4?PChEXaLUzltUlrIOo#103?g?P?iCPI_KW@SHQSGO_G__#53!4?C#100??A@???I?DA@_O??G!7?ACA#85!4?GG!5?@A@CI?C`O?NyzrWuEd?V]BMaNJLJCBCJEACfcATGCaEODQG@AG#131_??G?_??a#101!10?Ac?G@@kGXCjSRSmS_s?_#115?AD_`g?O#112???A@C???_#132!5?AamQ@vAh#116!4?cIBdCQDgc@Q_CpG_#121!5?A#73@$#196!6?T?CGPaCG@?O!6?@#239???_#252!31?_@???_?_A???A@C??_!20?T_?PC#196!18?H?G??AGD??A?@cAg?O`IcRchEWehQlAMo?C??ohSiDSiITPiITPiGTcIQdSIADoYDD??PGCApOWQPoSQp?~?~?oOnOfWeQcZcZcZcZcZcZcJC`[B[`UHSJOFCIcI?QD???C??AC?g??G!52?O??_#64?A#63O#56??o!4?_#125!10?@!4?@??O@!4?@c?Ea?D`A?OgGGGCC#135!11?A#115!4?P??C?I?@PIEDIoC#77!6?@I`UXcP_G_#98!4?C@O?@g@GC?AH`WTOYT@jDQ?hgP#131???A#75!15?C#84C?@?@?C#117!22?@#99!11?CQGOoG?C@_?aCH?G#100??A?_#77?O!4?ACA@HU?s#107??O_#118DEDbeXwgwc#73@!4?`!5?G?_??S#140!7?_OG?_?OOG#126!10?@$#184!17?_??A!4?G!7?@??O?G??@#193!19?@!10?A#192@???G?C?aG@C??h??Q?G???T_?P???OdGA??C???Si?i?h?S_O?O?A_?_???O?O#184!103?_O@??dG_@c@O@G@?B?R?@?@?@#239!48?_N?\#96?C#55???@A#128@!5?N@?INV@FMFAINM[~n}~}{q{IswSGaCWo_O_???_#107!20?B??C!5?@??_#99!24?CA@AL?EDAnCi}Swg[O??_??O?G?G#94!13?CA@??@?@?@#102!63?A@RSg?O#143!12?G???AO#127!4?@!5?UaG??O!4?Q?G@C???AC@gg$#192!19?G???C??Q??O@_?G?C?A???S??A?g?AO?C_?H#242!42?AGG#184!22?A@?_???G?OG???A#246!104?CI???Q?OG_SaS_s?gOawuOau^|xLm}lniyi^]Kmf|X]Vdxu}~l|[]Rq[xy{xyYuBXHuVv~lN_D?G_#140!4?O!7?A??O?AG??D@??A#49!6?C!6?O??C??O?_O#117!103?O??_??O?_$#202!99?A??G#239!23?@#192!116?O!5?A!4?G??C?C??CG???A??@?O?D??_@O??A_?GA?@???A?c@AC@AC@?G?c??G#142!16?GO?G??i_#126!22?@!6?@!5?@CaISHaKo$#116!356?o#73!8?C???AG-#193~?~?Ti?i!4?OI@A??C!5?I@O??@#184!19?P???A#252???G@C!7?G!5?_?A#192!5?C_?H?_C?Q??H??AS_C?CO@???h?C???cHaGQcG@GC?ODAS_T_??HcP!11?G#239C???_#137!12?@???@??A?C@i?S#237!49?gC@G?_?GQD?APAKOC_COCPaXaOcPA?CGC`?QGAgA?G?V_@cHQ?TGc@iODGAS`O?C@??G?A_?_A???~TuHU?g!5?c#217AO#38F~?E@F^?ACCNCH?GC@g@?wQi?_?_!5?_???o#125?D??@I`MpKqHcCO_O#121@kAXcXnZLYmtBo_#114AOL_JOIgOiCP??_???AOG#101@AD?BTIVK~i^yVxjS|Q??HueXO#95!4?B?RiSxDiA@A@@C@A?DA?_???__GOG!7?__?_O??O?_O_??O?O??GOMSAD??D?O???@?@#101???A???G??P?gRgAtIeHUhUiCBG?@???C#118?@``FfE]TB@A?CE__?Oow_#132?@AD?qG#127FgG?G#140???s?AGQ?_?Si#127!5?G$#237?T?i?TiTm\zViti[jtIhV}hVSojExMydYcRcHU`YDgU`Y@YcRK_LQHShA_AO@?iP?cP?AOFg?CH?gCCqChSjOjChU_UHQLQc?C?CQD?DOhQlOLQcHuHuHYdYDJchYdiTiTcWeXePA?CGcO_@GQ_O?O!4?_#239!72?A?O??C?@!7?_A?G?I!6?C#202!4?_?O!5?P?A!19?C@?_G?A_?GAO?C#193??g#184??@#240?@?U?NG?D#2A#58G?_#52@!4?H?B?O?FA??B??FD@{R]A{WsG_OG??G#132!9?A@CR@?EN{?w_#112!4?QD?I#118cBFsLq^Sg_S!4?__#59?G_#77!5?@?BKATGR?S_?_#100?C?AGlvC?G?_go#93???CGC@A?@@SHKWBY`^Q\vZv{]U]umsckORxTxY[u[N]~M^]N]~~k]kM~Vn`BHAHfI\eHb@CBKCG?G@#100!4?O?a@!5?@#77EGEgSJWAP??A?AC#107?O#119!5?G{u[MIHK?__G?Oo#73???H?O#128?TaLUtHsA?@C@cIT@?SfWHqcGo$#239?i?Ti!6?_C?C@O!6?_?C#202!32?O??kP?i@GAOD_?C??_C?a#193!17?i@Qh?AgOA#184!4?O#193!10?O_GA??@G?APA???CXcXaRGVgU`DJiLiTmTYTjZeVnnmlkmmlmMyxtry?SBjj~~?y~~z]j~u~?}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}jDPacTQLu?GySg?_@?H?B_GC?C@??GO@#252!10?C#196!44?E???O#35@#14_#56?Hw}W_qoW_O_???_}O}w??O#128???H@BBFUB@FF?FYEf]d]pMpKq?O_O#143??A?CIAOc?_#119@?WKW#115Ha??_AT@IDOgGWO??Oo#108!8?_#72???@?DGEOj?dQ??H?aCO#131!12?A_ACG_C#85???GCGB_H???A?BBG?GA?A?B?@?@?@?@??A??@#98!6?_O!6?Wo?OXrnTm\~D~fMKUgEp!7?@#103oCOiQdgOGhICK?W?_#121??G`@_oB]VL@FFKqlQc#125DfwATa??A!6?@??A?@?DaLRvN$#196!6?T?PaCG@?O_C?O#193!39?G?C#240???CO#193!8?_?A#252!19?@O_??_O#184!17?A?@?_??A?G?c???A???CG_?O@#192!84?G!8?@???A_??G!6?OA???C!4?AG!4?C?@_?C@O?C?_@G?C?AO@??C@??G??_??A???A?C#239!5?O_BRg#104C#70O#142?A??_?DCbW_JuwsR?C?F?gC#129!5?_!4?o#127!15?G_CG_#103!20?D?AD?hCSDKoQb@kagOAS_G?__#98!11?Gq?PCGAHkFob_PgCySG??_#88!11?@?!5@?CCCA?C@@#98!7?_#88???@@B#100!17?o#113_#72???_?a?O?G_P?CPCItOo`O@???@#59??A#115?_OO_?Q_?O@_!6?O#126@!5?BKOgQG#116!4?O`IsJH~{rkYTigTiWaS$#246!17?A_Ug?AG@I?xEO@IdPKYqhMcyRhMcudXkaZqlsbU|VciyRCmPIetliWVzZU\PzXLzQJSeSZQhLhucqlX?G??gGEidUCQjalZQ?S@c@Qc_OQC?O!4?I@???GcXaP?AGC_C!84?A!5?_?gC_@?HOB_@cGCHEJGtlyrZ]nlttV|mrxg]]ZqknirZ]Sfyr|hMmzyy]vvt\^V\l|z~??Hqg~U~hhOc#193G?G#144??S!4?G#116!7?@!8?BK`SACGoGGC?oCO?`O#73!9?A@!4?@#107!20?_OA!4?C?CG#99!27?BDERwKWC?A???sgSOaoCW_g_!10?GOG_?_!6?_?_!7?_?O?_??_OGaW_aHUKeGC?aCO?O??a#134!7?G#53??G#102!6?_cCkWTL@ACG#112!9?_P???G?E?G$#192!17?G???@S?_!4?_CO?A_@C?O@?C?O@G?A??C???G!4?@#202!37?A?Q@???G#196!20?G!6?OAG_?A???D?A?GQ_TaTIPiDiScXgOOPQQPPQOpDCIGCTjgSS??~D??C`S?H?~@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@SOiCPiHq?dOD?ATAKOAo!6?G???A#244!58?O#203??_#130!16?G#132!15?@#140CAwGBg_WG_O#141!7?G#126A@?APCAPc??_?O#102!15?ABABBLGCBTUkwgO_#131!53?O?_!8?_???_!8?_???OGcOC?O??_O?AGA#108!31?A#114_?OA?W?h?A#69???O#143!5?A$#184!18?@!7?C!6?G#242!64?H#184!136?GA???GO??C?COAPaO_?_#49!116?G#117!97?A???A?C@?G-#193~?~?Ti?_DO?D??a!4?O!6?C#239?A#196??P#252!17?CO!6?_!4?C!11?C??CO?A_#192_???_C?AG@?C?OAS`CHQCOcGQ`G`IOaCGPaCHOcG@aCg?_AcI?QCa??aO???C_O?G??_??A#239!51?_#237G???_?_?_?_?_?_?_O?GOCP?IDgOaS`A@qHOGo?QcBG?KOA_QG@c?AH_OA@GcA@OC`GC??T?gA?gQk@APcGC???G?A_G???O??@OcWC@IOc@W??K?S?_#56[BArrWe?@EW[pNNV~N?B^|Mw~ksovSW_#116?DgAOF{Ho#132!4?@UHCPI?@Bh{{ocwOgY#112??@?Q?Oc?O???_#114AAGP`CCAQg`S?oG_O#101@!4?oCQ@KiXe`HUhA]kiB@gWOCj_@_??_O?_#93??@?BACC??@AFRGBCICJ?C??@C@A@D@E?A?AO?AD??CB?@?@#77!5?_#103_#99@??A??SI@S?EKAA@C?C?AA#103!5?ORecAWCQ?@A@_?A#121!7?OGo_!8?GFTaKh_#127AD#116@QICjTn^I^LzUxlup}`[_gs$#239?~?Ti?@A?_???@???G#202!32?AG?C??A?PM_POAGdOAHcOAl?O!4?C??C#184!8?_#202!11?@#193@??C!11?A??O??@ACGO?C?_GCJ?G?\@I@C_DYDOiD?W`UiFsJKZSYLYuhe\It\b]eXeXeYdYdYeWeXeWeXe!4~?~?~TyVdQtmTYLuLYTMTYLuLIdR?G?i?O?HC?AGS??aC@C!5?A#202?_?G@c?AHcOI@GcA@OC`GCaGT?gA?g#192?gA?@?OC!5?G?A_G???O???OC??@G!6?C#239@#105@#38@!7?GO_??A!8?A@C?QBE?AcUlWOSh#128?@?N!4~{hCP?sgO_#126C?BCG?e?CCgO#119@??A?ED[WKW_#115D?C?A@G@SKATK_OG_#108A#72!7?B@EX]ahUh?OCgA@_GO?CI?OG?_??_???_???_#95@??GCfKrDxCy@AgAa?`AA?@?DGC?DH?A@@G#72G?_O??O?G?OG_?G?tiTSaUWRsDCJCIFcP??CAG#102?_???cp@?_#69?A!7?A?OI?CA#107!4?CZ_D#126??I??U[o#128AKdSIC_!7?AOHE@M@]PI$#237???i?Ti\qL~Yj}T~gVuJd}R|jSza|P~GeGdItAsHeSIOjSbWA_?RGgEOCI_PG?`S?GdOAHcOAH_SH_@OCG?sAhChEWbYdGTaSjUhUlQeWehQpMpMPiTiTjShWeCDySgPdIdYcZCq_TaOAS_Y`Y_?gD?gDAG@OG?O_?_?_??O?_#239!54?cB?_?o???@??C?C?C??@#252!13?O#202!32?aG?A_G?C?OA?@O!8?O??W?@#204?K#74AB#58WcGC!9?O_?O?_!8?G#129!5?A#140!4?A#141!5?A#125?QIc@Q_S?A#143?B?A?D#118!6?@?B@IBFBF\wti]wyogBOG_#102@BAEESy]bK??G#98!5?S??C@A@CGO@cJOR_DKaTJsQDiSiO[@hHUGo?_Oo?o?o?y[EGWCKGWOO`wTGBWoI\i?OeM\m^mN^EIFUK~TnI@_I@h??@_A?A??@?A#114!7?Ac?AggAT_URhgU@g@#112???O!6?I???@???O#125?BLWqG`#140pOIO?D_QCHCA?G?O_$#196!6?S?GA?_#246S???B_G_Y?C?Cj?K?E?aXvYPIkJqXHtfSiGf|ZhcvRxnxTM_RKIhtQIlsQJlOuJjuZijxTZJ|UZQxdSCYriLh?GQ_?hGAPCGEOC`KPaCGOaCBPiW@ADIO@O@@?PHCG?L_g@??C?DQ?O?O_S_C_#192!68?_#246IC@?QCW?GOg?a?bKilX{vupj\\duYZLsQNd{uRX{mjYUrXviiVT|VVDP}{mJrz~\vvt\TVr~nln}mnJbz}sfZmfNcRqIO#70C#37_#144cX#136CG!5?__??_#144G??~[_?o#52@?@G@?@BHAADHEwAs#127!7?__I?DIGO#121@??RDHQ`zVm}l}lWw___o#103???A??@?@??A`IASL_W_C`[A`GcO#100!7?O_@OOsEE?_??O#88!18?@#100!10?_O_?oO___???_!4?_??g_O!5?_#134??C#77!15?OO?o?O??G??O?`CXOH#115A?CUGgWHCS@gUOs@??A#114!6?@C@#132!9?_#52!7?_O#38?_#55?_#127!6?A@E@$#184!14?G!4?C??_A!5?_!7?@???_!4?C#193???C#244!9?C???A#193!13?C??A#184!44?O!5?G???O!4?AO?I@?_??C!4?G!72?O?g?_?a??A@OGO!8?C#196!63?O@?G_a#83G#142!5?f@RcGFAKo???_!5?A???G?g??O_?_#49!16?C#73?A??G#107!26?CC!9?G#99!23?B?CG?YbTICJLYTiTK`yQUguKoG??G?A?D?@@S@I?S?Mg]?ApkaCO_SQC#131@?A??@??@@??B#103!14?_#100!4?cpB?C#108!6?@#59G?@#119S!7?GFG[MCdBH?}Oc_???CW_\b#129!12?_$#192!16?S?@??@G?O??P?G?C???c?O?C?A?G?@O#240!14?a#196!69?_!6?Da!6?A??I@OgDA?@OJcRcJdQdHEXAtIa[`XeXeXdYdYdXfXeXfXeX!4?~?~?iDGQlIPIdQHQdIpIdQHQdY?kRC@CADA?HS`?G?@?A!5?@#193!65?_A#240_#96???O#165!6?WcIP#52?@#77!81?@?@@??@YdQ_S_#95!17?C#101!52?o??_O?_oOG_O?_O???_G?`_GGgOHpgWGC{zhvMG?HO#107!6?C#118?g?U@_??a``?GS~@nZO_OAq_$#239!143?C??O!4?A#192!87?C???O?A??G???A!4?_#103!308?Mw-#193~?~?TgO?AG???A?O???_??A??@??_A!6?O???G!4?_?O!5?OC?@#240???@#244???G!7?@#240G#252!5?_#193_#192?OC?AG?C??A??@g@QcGO?S_ChAGQcHQc@O?O`AcG`IOaCgAGQcG_G?i?IOAS@??GCHO?C?O?O?PG?A_@?CAG?C!7?G!22?_!7?_#246??O_O?OCO!4?C_GOGC_CI?`_QoloeP}tRKwtsUNjX]ypX^ji]BlcQNTuyJltuYJLtuYXkmvtlnJby{mNjz|\TVt|lnjyymjiy{ZVes}jNldv[Tf`W#239_O#56A_RFdiT_?@BADKd^V_Q`OOO`AGS]PA@Q#116???OhQDyJ?GO@?gC#127@AP?Q_GSGG#126A_PI?DcOgS_Q_!4?_#119@B@???ozo#103?A?GBGEOKBGoAIc?G@_C?O#100???@??@@??C@@OWAA?_?@?OO??O??GCQWKc_O@KSOG?S{YZWTRh?@?HDO?@?ABH?A@@???A??A#53!12?O?G#99!4?A#102???GG???O?OceACDD@DJHWCOg??_#112!4?G?_???_!5?@?G???A#125??O^ic#38!4?A@?O?A?OC?GS_$#237?S?i?TjUkR~tk\zekVyLTylO~g]tI\o^?j?@AcQ@?aTAGACB_SGB?_?gA?CAGDOA`OCQGCQG?QC_JOAGDOdWEhQl?lQ?I@y@yDYcgSiShUhUgZclRc`W`AdItItJSjShUlQsGsJSiTIsJS@HSJSHU@U?oCPiPIcA_LAkQcGTiOAGs?CG?GOG?GOG?GO??_?_?_?O_?g?_?O_COcGAC@Ga?H_AG`OA?a@oHO`K?K_COLOk@ICpEGBG?OC_CGE_?S@_?QH?_G@cOAG@CoAG@cAP?GAOcWDAP_S??A_G?A?O?C@?OC@AcGPI@S_OOG`IOKc#240L_#38C???O??T?K?_#144?A???BDCCDA??A#38??AGsGBsJgQ?g#128?c^vn}~Vx}Ti|CW_#73@!4?A!4?_#112?@???CO@G?AG?_#114?@!4?H_EoCPGAc_?_#59C#101?@QCAHQLQlSmz[mynyhsmaDWsSGgs`?ApK?q_O??_OOGgO!5_??!4_??}WUoiCy[wWOoSgwAXShOElOjOZhPzAKDCZPalUhSIDgDHAPprba`b`@#114?G@?oCQ?sA?A@??B??A@A#119?@?BwNYdAGKO_@ADYcXg#132F_#128TQXq#55??O!5?@#149?G!5?_$#239?j?Ti??@!7?@???A#184!5?O#252!9?O???G_???_?O!4?_OCA@?O?_#184!26?_#202!6?_!7?A#193!11?GA?C?O!7?@???@A@AO?C_@G_ASa?Oa?h?gAJ`AC_SGPGQ_P?HQ_?EXdBX`UdUDEtEdEtEdI|UH]hUZJJZCTYlJEXIHadWie@WeQL`EIHsLSAC_?A?@?B???A#202??_!5?OC_@?A_?S@_[AHcOA@COAG@COAG@cAP?GAO!9?A_G?A?O?C@?OC@#193!9?A!6?@#203A#14A_#58H_G#142GD_I\Ok\ioG_?Cg?h_?A`?i`ktId{Js@#129C#140!4?_#125!5?A?gCAhCSa@DO!4?_#143!9?G#118!5?N^}NCN~s]pGA??_#102?DNH`Z}cwWo_#98!6?A???@?A?D?c@GATG?EhGQc?Z?Q`?AB?DKQBGDSHA@?DAGS@A?A?AD??@?CI@???@?C@???A!5?@?B??G!4?@#107!9?GK?GG???AG???A_OgSgkKxSc_?G!9?@AGO_o#73!4?g#116??@A?KrkEB@@DEd_??BJFE`$#196!5?ACgPc?IO_C#192?A?D?G??g?C?G??G?@!4?A!4?A???A!5?_??A#193!43?@A?@#242!12?C#252?O#196!10?@!6?@!14?@!6?@?CA?G?CQ?GC`?A?CA@Y@iPIPIPIPITAHu@UHccSCRiDQcXaDQTGB?PKB?D_UG`SB??H?JC`?Q?G?A@#252!8?_??A?@#240!7?O??_G#252!6?_#192_!11?OC?@?O?C??A_G?A?O?C@?OC@?_G@??O!4?_G#184O#218?O#2G#144HOK#136?AO???A???@Q?gO?Q?IgSGt#52!9?E?lQDO#132!12?BB?Eal^gtGQHA#115!21?@?CPgePWO?O#77???@ADAK_kOgOC_O#99!10?A@AACH?C@@@CAhCA@GFA?@GFQJA@CCAGCA??@??@??ACCA@?EC#134?A#103?_!4?C?CACOao_!7?O_?o?gC?K[O?SCQ?di_Ag?O?DICADO??g??O#121!4?COdYkSO_!5?@EB#140???GcLrK@?OgUgOAO?T?C?HU$#246!12?@??GPg?OaDOF?A`AT_F_}S~mLHluVLg|V\hKNjt[NJpSkjXSqilSAjXcrhluK`ZTcntUYnIbxSDQzQl|t]CUCg@QDh?JQ?S`D?Q?GQKbIKGPAS?cHOAS_?G@U@_?@?_@?_iSa_?a?w?lCIk?C_PGS_O?@?@???c!4?_?_?_?_?_?_?_#184!22?C??_?G!7?a?O???C!9?G?@#202!71?I!4?A#24??@#20O#74A?o#165??I?__O?O#58!4?G?GA?DGS?@#49!28?G?O#121??C?vGQLVi^l^znuv^{s}O_#107!9?_?@??A?CO#72!6?@A@AB??@?COCQGOGa@G`S??Y_CA_IC?d?GD_?O?_!5?_!5?_??cGCOg?aC?g?_S?GaGE@GQLC@?Q??@??GCKDO`ABCADAA@#115!4?C?G??W?OG?Qgc??`@?Q?OE@WC_?O#126!6?O__!8?C#129!9?OgCgO_GA^agOoOG$#252!12?A#202!23?_O???O!5?_O?A???G?OCaHCOAhSCaHCQ?@qC_IO?G@#184!54?C?O?C??G??@??C?A!6?A!5?@?_?_APG?OG_#239!42?O!8?A??OQ?H?A#196!81?A???A#83?C#37?C#129!6?A#141!47?o#95!77?G!9?A#77!15?_!6?_!5?oC_OGo?_Ogc?k?kOIO_a?A?Sg_WOGsSaE??@A?A?@#118O?O!10?B??A@YDvM~{B???@BAKOe\IdW_O#52!9?gCA??G?@_???G$#239!173?AO#192!43?O!8?O?G?C???G!4?A?AG@_!4?C#95!237?@#103!79?B$#114!568?C-#193~_~_TI?AT?@?_G@C?O!9?O!4?G!4?G#218?O#192??GA@#193!6?@#218!9?@#240??I@!7?H#192!8?C?@??C?@???G??AC?DG@I?ACHAC?@AS@CHQGAGQchAGQcHO??GOCI?@?@AcGO?@OCGPAcg??AGAdG?GA?@A?g?@_??I!8?GA?CG??I!5?@?C!4?G@?ACGDA?OCP?GCA!4?A?I??C?A!4?@#252?G#240!7?O??G!6?G?CGA?O#252!5?G#193G#192!22?G!20?O?I?A!4?A#239?Ca#37AP#136@?Oko!6?@!4?@JA?@DI#52!4?_!4?ho_SHQG#140!4?O!6?_#132!4?@HNGEhco`gDqDOOo_??wC?o?O?_#115!4?DGA?C@GHcbHCq_G?O#101?@?A?A@NANCNANEAN|jNH|mA^jMJTNZKkykveqnZLf\FIMTjlRFQLAdA@Q@??LI?HAKJ?dQG?GOQ?A?@!9?@?BIDAT?JPCK!4?@#118O_oO???A?A_!9?Oioo_[ug!8?@ADJ{h#81C#116??@???@O`_o_?OQ@#130???O?O$#237?D?I_TYtit}lZdMitelqzkvjSjcjcjSb_qw`Q?dCA?qkaX_uG?CGQc_I?T?i_CPC_i??@IQH?QHC?HQ?icidahciDQ`S@OlacjdiTITicjcLQDQdiUHUlQKRkRSLRkRShOHShYdjAPaDYSgPadWTiTISGa_UlYDXALaadISH?R?ISI`?gQODYshewsgPSIP__Q?LodO?grgaTitiDAKPCZSicQG_aSISjSHE?JO?JCPAG?T?I??C@AO?I?C??S?A?G?@S??CA??D?CAg?PC?AGDOAG?QGCA?G?G!4?@!8?caOGAOcQcICI@?Q?FI?o#58Ka@#142E??@msJaucmun|icwhsi?Ti^~CqnqC#116ACZ`UlADyC_hqO_w_?OO#141???G#121???GQHCOBGDifIF^{pFHvNjMnWwgO!7?O#102!4?O??@JDM}iKAogO?O_OO??o_??oo??_??_#99!6?@#103!9?O!5?G?G_O?K?K?{o?OQCOo?o??O@@??@?A?@o`?aOJEQAKS_gsgQsgPpdB?ys@]A?l?G_OG?O?o_y_hO???@#114?@#119?@UDIH!4?@ACGCBU#140???C?G~sjOCITiD$#239?Y?TI!8?A!5?C#184???C#252??O??O?G!4?G_??_W?@!6?@???A!6?O!5?S!24?G#193??O!13?G???_???__!4?_!4?Ac_A!4?g?CG?`ACGA_a?g?@aGT_??__o_SGO`AcaChc`_GTE`di_B??A@Rc_`gCJcgaGAdiAC?L!4?w_aga_`?H?@CH?@#202!6?O?G?O??OS?IOOS@IOCI?S?IS@AG@SPCI?TAO?T?OAG?PC?AG@OAG?QGCA?GQ??S?OHOCHAPCY@CAOGA?CA!4?O?O#240???@G#35C#74AKk#56GRK???_??I@@?ACO@EIOtiT_??H#165?G#129?O#128???_?tyDz^ELnTEXfGfruCOC_?O#73???A!5?_!5?_???_#118OA??HRqt{yq{_o!4?CO#77!6?@?@A?D?I?D?GC?AS?A?OK_S?oao_o!4?OC?_oW_g?ogSQcocALY@M_qBCADLqGAsNYdFG?``?@@AA@!5?@@?B?DQHAL?Ei?O__#115?GC?CAADRG``P_O?I?@?_OJ?A@?A#121?@YtegA?@AC?Oo??y_#128?Y@E#52?ICI@???__A$#196!5?_dG?I?QC#246OoPIHO@CPGOjSJCZCjSFDE]dRIh\fDOKeZHvziclZLtiitTIieXTOnisdkuxcqjuclvTZPY[UZPyk]jufQLXOYOas_TXOQohqkW@Gq_?DPc@GAOc@GaCJQ`E_OOCkGo@ADiSGB???PAPTG@???ECOHSGO@QSGSP?PSiPCGO???O@ACA??CISGSOAGITS?SOgO?O?W@AG??@?hsZShs`Ciqx|cnvsimtfjitdnjislbttjysja|pu`mi`~ixlvaynxtVmiz|tuiltvldrx|vdvvj~numzu|mzd}zXLft|jHlPtpd}nl|woC#38@#20_#144O?_#129!5?CG#38@O#130O#144!5?C#38!8?ZCODzCJCI#125!10?I?CODG?HpeoOV_?QGCO_G#112??@!8?S@?C?O#114???A@DGACAGCQHG?q!5?_#72!6?@???@!5?CA@!4?CG?CBOCOGH?OCA?A?D?A!4?@!5?@??@!4?@@#114!6?A!5?G???`!4?C??G#108!8?AGO#107G??A!4?O!4?KNnJSDYSNNcSKKM_#126!4?OFL\AK?G#107A#149!12?CG!6?S?G?G$#192!18?AG?A#202!10?OG@??COA!4?O?C??COA??O?T?I?T?Ga?CO@IO@?E?COHQ?G!50?C!5?O?O#184!9?C!7?O?A?@!4?C!4?A!7?A?D#239!6?G?O???@#184???O!11?C???CAO!8?O@#252!24?@#193@#184!62?G#0!7?@#83G#145??Q#165@?B}PJOTG??GO?O??O#127!27?@AGA?K?I?A?_!6?O#119!15?@FFekG!8?O#107?A???C?O#108!9?O#100!4?H!7?@!8?B?@??H!7?@#114!6?O!8?o_#59!12?GA!5?G#111!20?C#114??_??cOicSMCA#112!8?_?@?AO@G?_#73??Oo_?_!6?@\#38!8?OCGSILsgqtiti{$#240!51?O#184!81?@#196?C?A!14?C!5?O!9?G!4?CA??G!4?SH!4?@CAP??A?@???@?A??@A??@!7?CA!103?O#126!61?@C?BGCA?OGCG?BM?QG#103!13?@?BCRGc_@NCoi`?TO|KS_w_?_goo?O!6?O??O#102!17?o!5?G??_?_o?K?G??_?c!4?G_usMC{{ss{EEMLNswg{o_O???_!4?AKRDAG@HH!9?C@?CA#125!15?A{?wo!5?A~_}p#129!4?A@A@??GBLADADB$#202!216?O#98!237?@!7?A#108!20?O#134!4?A#115!17?G??G??O#69!28?@#119?O#132!25?O??_$#107!510?OO?_#103!57?@\ \ No newline at end of file diff --git a/ruby/setup.rb b/ruby/setup.rb deleted file mode 100644 index 27429329..00000000 --- a/ruby/setup.rb +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env ruby - -require "mkmf" -if have_header('sixel.h') and have_library('sixel') - create_makefile("Sixel") -end diff --git a/ruby/sixel.c b/ruby/sixel.c deleted file mode 100644 index ceba31c2..00000000 --- a/ruby/sixel.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * libsixel Ruby bindings - * - * Copyright (c) 2014,2015 Hayaki Saito - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.* - */ - -#include -#include - -static VALUE -get_version(VALUE self) -{ - return rb_str_new2(LIBSIXEL_VERSION); -} - - -static void -sixel_ruby_encoder_free(sixel_encoder_t *encoder) -{ - sixel_encoder_unref(encoder); -} - - -static VALUE -sixel_ruby_encoder_alloc(VALUE klass) -{ - sixel_encoder_t *encoder; - - encoder = sixel_encoder_create(); - return Data_Wrap_Struct(klass, NULL, sixel_ruby_encoder_free, encoder); -} - - -static VALUE -sixel_ruby_encoder_initialize(VALUE self) -{ - return Qnil; -} - - -static VALUE -sixel_ruby_encoder_setopt(VALUE self, VALUE option, VALUE optval) -{ - sixel_encoder_t *encoder; - SIXELSTATUS status; - - Data_Get_Struct(self, sixel_encoder_t, encoder); - - status = sixel_encoder_setopt(encoder, - *StringValueCStr(option), - StringValueCStr(optval)); - if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, - "sixel_encoder_setopt() failed: %s / %s", - sixel_helper_format_error(status), - sixel_helper_get_additional_message()); - } - - return Qnil; -} - - -static VALUE -sixel_ruby_encoder_encode(VALUE self, VALUE filename) -{ - sixel_encoder_t *encoder; - SIXELSTATUS status; - - Data_Get_Struct(self, sixel_encoder_t, encoder); - - status = sixel_encoder_encode(encoder, StringValueCStr(filename)); - if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, - "sixel_encoder_encode() failed: %s / %s", - sixel_helper_format_error(status), - sixel_helper_get_additional_message()); - } - - return Qnil; -} - - -static void -sixel_ruby_decoder_free(sixel_decoder_t *decoder) -{ - sixel_decoder_decode(decoder); -} - - -static VALUE -sixel_ruby_decoder_alloc(VALUE klass) -{ - sixel_decoder_t *decoder; - - decoder = sixel_decoder_create(); - return Data_Wrap_Struct(klass, NULL, sixel_ruby_decoder_free, decoder); -} - - -static VALUE -sixel_ruby_decoder_initialize(VALUE self) -{ - return Qnil; -} - - -static VALUE -sixel_ruby_decoder_setopt(VALUE self, VALUE option, VALUE optval) -{ - sixel_decoder_t *decoder; - SIXELSTATUS status; - - Data_Get_Struct(self, sixel_decoder_t, decoder); - - status = sixel_decoder_setopt(decoder, - *StringValueCStr(option), - StringValueCStr(optval)); - if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, - "sixel_decoder_setopt() failed: %s / %s", - sixel_helper_format_error(status), - sixel_helper_get_additional_message()); - } - - return Qnil; -} - - -static VALUE -sixel_ruby_decoder_decode(VALUE self) -{ - sixel_decoder_t *decoder; - SIXELSTATUS status; - - Data_Get_Struct(self, sixel_decoder_t, decoder); - - status = sixel_decoder_decode(decoder); - if (SIXEL_FAILED(status)) { - rb_raise(rb_eRuntimeError, - "sixel_decoder_decode() failed: %s / %s", - sixel_helper_format_error(status), - sixel_helper_get_additional_message()); - } - - return Qnil; -} - - -void -Init_Sixel() -{ - VALUE mSixel = rb_define_module("Sixel"); - - rb_define_singleton_method(mSixel, "version", get_version, 0); - - VALUE encoder_class = rb_define_class("Encoder", rb_cObject); - rb_define_alloc_func(encoder_class, sixel_ruby_encoder_alloc); - rb_define_method(encoder_class, "initialize", sixel_ruby_encoder_initialize, 0); - rb_define_method(encoder_class, "setopt", sixel_ruby_encoder_setopt, 2); - rb_define_method(encoder_class, "encode", sixel_ruby_encoder_encode, 1); - - VALUE decoder_class = rb_define_class("Decoder", rb_cObject); - rb_define_method(decoder_class, "initialize", sixel_ruby_decoder_initialize, 0); - rb_define_method(decoder_class, "setopt", sixel_ruby_decoder_setopt, 2); - rb_define_method(decoder_class, "encode", sixel_ruby_decoder_decode, 0); -} - -/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ -/* vim: set expandtab ts=4 : */ -/* EOF */ From 5275209637ca7ad6c3e07eb333e611bbb5e3ba09 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 23 Jun 2015 01:47:53 +0900 Subject: [PATCH 338/451] Add dubmodule libsixel-ruby --- .gitmodules | 3 +++ ruby | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 ruby diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..2e83ebab --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ruby"] + path = ruby + url = git://github.com/saitoha/libsixel-ruby.git diff --git a/ruby b/ruby new file mode 160000 index 00000000..9d201044 --- /dev/null +++ b/ruby @@ -0,0 +1 @@ +Subproject commit 9d2010449fd49fb806900b9bef69ea7f38ac9e89 From f0c16903d5e1684c76684b18cb15bb501db4d85b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 23 Jun 2015 02:02:07 +0900 Subject: [PATCH 339/451] Update README --- README.md | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 161d7dd3..bb6f5bdf 100644 --- a/README.md +++ b/README.md @@ -703,9 +703,32 @@ This package includes a Python module `libsixel`. ### Build and install Python interface +#### Install into the python prefixed with '/usr/local' + +``` +$ git clone https://github.com/saitoha/libsixel.git +$ cd libsixel +$ git checkout develop # now available only develop branch +$ ./configure --enable-python --prefix=/usr/local +$ make install +``` + +#### Install into only current active python + ``` +$ git clone https://github.com/saitoha/libsixel.git +$ cd libsixel +$ git checkout develop # now available only develop branch +$ ./configure --disable-python +$ make install # install libsixel $ cd python -$ python setup.py install +$ python setup.py install # install python module +``` + +or + +``` +$ easy_install libsixel-python ``` ## PHP interface @@ -721,6 +744,23 @@ $ ./configure $ make install ``` +## Ruby interface + +### Build and install Ruby interface + +``` +$ gem install libsixel-ruby +``` + +or + +``` +$ git submodule update --init +$ rake compile +$ rake build install +``` + + ## Support This software is provided "as is" without express or implied warranty. @@ -758,7 +798,7 @@ The MIT License (MIT) ## Contributers and Reviewers - @arakiken -- @elfring +- @elfring - @isaki68k - @knok - @mattn @@ -779,7 +819,7 @@ The MIT License (MIT) 4. Push to the branch (git push origin my-new-feature) 5. Create a new Pull Request - + ## Acknowledgment This software derives from the following implementations. From dc113603c643161c1a9b18caf543a09e2d35e2d6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 23 Jun 2015 02:44:32 +0900 Subject: [PATCH 340/451] Update NEWS --- NEWS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index a707d372..adb459af 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ ------------------------------ What's new in libsixel-1.5 ? ------------------------------ +* img2sixel: Add -k(--insecure) option. + * img2sixel: Add -B(--bgcolor) option. * core: Introduce new API for dither object, sixel_dither_set_transparent(). @@ -65,7 +67,7 @@ * Add Ruby interface -* Add new build helper program: libsixel-config +* Add new build helper program: libsixel-config * A lot of bug fixes and minor improvements. Thanks to @msmhrt, @ttdoda, and @msmhrt. From 2123851bbd1f2896d92d940f2c77a047d514b89c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 23 Jun 2015 23:17:05 +0900 Subject: [PATCH 341/451] Initial commit --- .gitignore | 44 +++++ CREDITS | 2 + EXPERIMENTAL | 5 + LICENSE | 68 +++++++ README | 70 +++++++ config.m4 | 63 ++++++ config.w32 | 8 + manual/Makefile | 24 +++ manual/file-entities.ent | 5 + manual/functions.xml | 0 manual/manual.xml.in | 37 ++++ manual/sixel/configure.xml | 37 ++++ manual/sixel/constants.xml | 30 +++ manual/sixel/ini.xml | 30 +++ manual/sixel/reference.xml | 62 ++++++ package.xml | 58 ++++++ package2.xml | 79 ++++++++ php_sixel.h | 130 +++++++++++++ sixel.c | 277 +++++++++++++++++++++++++++ sixel.dsp | 112 +++++++++++ sixel.xml | 96 ++++++++++ tests/SixelEncoder____construct.phpt | 14 ++ tests/SixelEncoder____destruct.phpt | 14 ++ tests/SixelEncoder__encode.phpt | 14 ++ tests/SixelEncoder__setopt.phpt | 14 ++ 25 files changed, 1293 insertions(+) create mode 100644 .gitignore create mode 100644 CREDITS create mode 100644 EXPERIMENTAL create mode 100644 LICENSE create mode 100644 README create mode 100644 config.m4 create mode 100644 config.w32 create mode 100644 manual/Makefile create mode 100644 manual/file-entities.ent create mode 100644 manual/functions.xml create mode 100644 manual/manual.xml.in create mode 100644 manual/sixel/configure.xml create mode 100644 manual/sixel/constants.xml create mode 100644 manual/sixel/ini.xml create mode 100644 manual/sixel/reference.xml create mode 100644 package.xml create mode 100644 package2.xml create mode 100644 php_sixel.h create mode 100644 sixel.c create mode 100644 sixel.dsp create mode 100644 sixel.xml create mode 100644 tests/SixelEncoder____construct.phpt create mode 100644 tests/SixelEncoder____destruct.phpt create mode 100644 tests/SixelEncoder__encode.phpt create mode 100644 tests/SixelEncoder__setopt.phpt diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0b2afde7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +*.lo +*.la +.deps +.libs +Makefile +Makefile.fragments +Makefile.global +Makefile.objects +acinclude.m4 +aclocal.m4 +autom4te.cache +build +config.cache +config.guess +config.h +config.h.in +config.log +config.nice +config.status +config.sub +configure +configure.in +conftest +conftest.c +include +install-sh +libtool +ltmain.sh +missing +mkinstalldirs +modules +scan_makefile_in.awk +*.dsw +*.plg +*.opt +*.ncb +Release +Release_inline +Debug +Release_TS +Release_TSDbg +Release_TS_inline +Debug_TS +sixel*.tgz diff --git a/CREDITS b/CREDITS new file mode 100644 index 00000000..12656d02 --- /dev/null +++ b/CREDITS @@ -0,0 +1,2 @@ +sixel +Hayaki Saito diff --git a/EXPERIMENTAL b/EXPERIMENTAL new file mode 100644 index 00000000..6443e996 --- /dev/null +++ b/EXPERIMENTAL @@ -0,0 +1,5 @@ +this extension is experimental, +its functions may change their names +or move to extension all together +so do not rely to much on them +you have been warned! diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d4335c29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,68 @@ +-------------------------------------------------------------------- + The PHP License, Version 3.0 +Copyright (c) 1999 - 2003 The PHP Group. All rights reserved. +-------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, is permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. The name "PHP" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact group@php.net. + + 4. Products derived from this software may not be called "PHP", nor + may "PHP" appear in their name, without prior written permission + from group@php.net. You may indicate that your software works in + conjunction with PHP by saying "Foo for PHP" instead of calling + it "PHP Foo" or "phpfoo" + + 5. The PHP Group may publish revised and/or new versions of the + license from time to time. Each version will be given a + distinguishing version number. + Once covered code has been published under a particular version + of the license, you may always continue to use it under the terms + of that version. You may also choose to use such covered code + under the terms of any subsequent version of the license + published by the PHP Group. No one other than the PHP Group has + the right to modify the terms applicable to covered code created + under this License. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes PHP, freely available from + ". + +THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND +ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP +DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------- + +This software consists of voluntary contributions made by many +individuals on behalf of the PHP Group. + +The PHP Group can be contacted via Email at group@php.net. + +For more information on the PHP Group and the PHP project, +please see . + +This product includes the Zend Engine, freely available at +. diff --git a/README b/README new file mode 100644 index 00000000..e31885ac --- /dev/null +++ b/README @@ -0,0 +1,70 @@ +This is a standalone PHP extension created using CodeGen_PECL 1.1.3 + +HACKING +======= + +There are two ways to modify an extension created using CodeGen_PECL: + +1) you can modify the generated code as with any other PHP extension + +2) you can add custom code to the CodeGen_PECL XML source and re-run pecl-gen + +The 2nd approach may look a bit complicated but you have be aware that any +manual changes to the generated code will be lost if you ever change the +XML specs and re-run PECL-Gen. All changes done before have to be applied +to the newly generated code again. +Adding code snippets to the XML source itself on the other hand may be a +bit more complicated but this way your custom code will always be in the +generated code no matter how often you rerun CodeGen_PECL. + + +BUILDING ON UNIX etc. +===================== + +To compile your new extension, you will have to execute the following steps: + +1. $ ./phpize +2. $ ./configure [--with-libsixel=...] +3. $ make +4. $ make test +5. $ [sudo] make install + + + +BUILDING ON WINDOWS +=================== + +The extension provides the VisualStudio V6 project file + + sixel.dsp +To compile the extension you open this file using VisualStudio, +select the apropriate configuration for your installation +(either "Release_TS" or "Debug_TS") and create "php_sixel.dll" + +After successfull compilation you have to copy the newly +created "sixel.dll" to the PHP +extension directory (default: C:\PHP\extensions). + + +TESTING +======= + +You can now load the extension using a php.ini directive + + extension="sixel.[so|dll]" + +or load it at runtime using the dl() function + + dl("sixel.[so|dll]"); + +The extension should now be available, you can test this +using the extension_loaded() function: + + if (extension_loaded("sixel")) + echo "sixel loaded :)"; + else + echo "something is wrong :("; + +The extension will also add its own block to the output +of phpinfo(); + diff --git a/config.m4 b/config.m4 new file mode 100644 index 00000000..8950a808 --- /dev/null +++ b/config.m4 @@ -0,0 +1,63 @@ +dnl +dnl $ Id: $ +dnl + +PHP_ARG_ENABLE(sixel, whether to enable sixel functions, +[ --enable-sixel Enable sixel support]) + +if test "$PHP_SIXEL" != "no"; then + +PHP_ARG_WITH(libsixel, whether libsixel is available,[ --with-libsixel[=DIR] With libsixel support]) + + + + if test -z "$PKG_CONFIG" + then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + if test "$PKG_CONFIG" = "no" + then + AC_MSG_ERROR([required utility 'pkg-config' not found]) + fi + + if ! $PKG_CONFIG --exists libsixel + then + AC_MSG_ERROR(['libsixel' not known to pkg-config]) + fi + + if ! $PKG_CONFIG --atleast-version 1.5 libsixel + then + PKG_VERSION=`$PKG_CONFIG --modversion libsixel` + AC_MSG_ERROR(['libsixel'\ is version $PKG_VERSION, 1.5 required]) + fi + + PHP_EVAL_INCLINE(`$PKG_CONFIG --cflags-only-I libsixel`) + PHP_EVAL_LIBLINE(`$PKG_CONFIG --libs libsixel`, SIXEL_SHARED_LIBADD) + + export OLD_CPPFLAGS="$CPPFLAGS" + export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_LIBSIXEL" + AC_CHECK_HEADER([sixel.h], [], AC_MSG_ERROR('sixel.h' header not found)) + export CPPFLAGS="$OLD_CPPFLAGS" + + export OLD_CPPFLAGS="$CPPFLAGS" + export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_SIXEL" + + AC_MSG_CHECKING(PHP version) + AC_TRY_COMPILE([#include ], [ +#if PHP_VERSION_ID < 50000 +#error this extension requires at least PHP version 5.0.0 +#endif +], +[AC_MSG_RESULT(ok)], +[AC_MSG_ERROR([need at least PHP 5.0.0])]) + + export CPPFLAGS="$OLD_CPPFLAGS" + + + PHP_SUBST(SIXEL_SHARED_LIBADD) + AC_DEFINE(HAVE_SIXEL, 1, [ ]) + + PHP_NEW_EXTENSION(sixel, sixel.c , $ext_shared) + +fi + diff --git a/config.w32 b/config.w32 new file mode 100644 index 00000000..004d3cc4 --- /dev/null +++ b/config.w32 @@ -0,0 +1,8 @@ +// $ Id: $ +// vim:ft=javascript + +ARG_ENABLE('sixel' , 'PHP interface to libsixel', 'no'); +if (PHP_SIXEL == "yes") { + EXTENSION("sixel", "sixel.c"); + AC_DEFINE("HAVE_SIXEL", 1, "sixel support"); +} diff --git a/manual/Makefile b/manual/Makefile new file mode 100644 index 00000000..ad244413 --- /dev/null +++ b/manual/Makefile @@ -0,0 +1,24 @@ +# +all: html + +confcheck: + @if test "x$(PHPDOC)" = "x"; then echo PHPDOC not set; exit 3; fi + +manual.xml: manual.xml.in + sed -e's:@PHPDOC@:$(PHPDOC):g' < manual.xml.in > manual.xml + +html: confcheck manual.xml + rm -rf html; mkdir html + SP_ENCODING=XML SP_CHARSET_FIXED=YES openjade -D $(PHPDOC) -wno-idref -c $(PHPDOC)/docbook/docbook-dsssl/catalog -c $(PHPDOC)/phpbook/phpbook-dsssl/defaults/catalog -d $(PHPDOC)/phpbook/phpbook-dsssl/html.dsl -V use-output-dir -t sgml $(PHPDOC)/phpbook/phpbook-xml/phpdocxml.dcl manual.xml + +bightml: confcheck manual.xml + rm -rf html; mkdir html + SP_ENCODING=XML SP_CHARSET_FIXED=YES openjade -D $(PHPDOC) -wno-idref -c $(PHPDOC)/docbook/docbook-dsssl/catalog -c $(PHPDOC)/phpbook/phpbook-dsssl/defaults/catalog -d $(PHPDOC)/phpbook/phpbook-dsssl/html.dsl -V nochunks -t sgml $(PHPDOC)/phpbook/phpbook-xml/phpdocxml.dcl manual.xml > manual.html + +tex: manual.tex + +manual.tex: confcheck manual.xml + SP_ENCODING=XML SP_CHARSET_FIXED=YES openjade -D $(PHPDOC) -wno-idref -c $(PHPDOC)/docbook/docbook-dsssl/catalog -c $(PHPDOC)/phpbook/phpbook-dsssl/defaults/catalog -d $(PHPDOC)/phpbook/phpbook-dsssl/print.dsl -t tex $(PHPDOC)/phpbook/phpbook-xml/phpdocxml.dcl manual.xml + +pdf: manual.tex + pdfjadetex manual.tex && pdfjadetex manual.tex && pdfjadetex manual.tex diff --git a/manual/file-entities.ent b/manual/file-entities.ent new file mode 100644 index 00000000..026cce52 --- /dev/null +++ b/manual/file-entities.ent @@ -0,0 +1,5 @@ + + + + + diff --git a/manual/functions.xml b/manual/functions.xml new file mode 100644 index 00000000..e69de29b diff --git a/manual/manual.xml.in b/manual/manual.xml.in new file mode 100644 index 00000000..12e9202b --- /dev/null +++ b/manual/manual.xml.in @@ -0,0 +1,37 @@ + + + + + +%language-defs; +%language-snippets; + + + + + + +%language-defs.default; +%language-snippets.default; +%extensions.default; + + + + + + + +%global.entities; +%file.entities; + + + +%missing-entities; +]> + + + &reference.sixel.reference; + diff --git a/manual/sixel/configure.xml b/manual/sixel/configure.xml new file mode 100644 index 00000000..56df4ca9 --- /dev/null +++ b/manual/sixel/configure.xml @@ -0,0 +1,37 @@ + + + +
+ &reftitle.required; + &no.requirement; + +
+ + +
+ &reftitle.install; + Requires libsixel + +
+ + + diff --git a/manual/sixel/constants.xml b/manual/sixel/constants.xml new file mode 100644 index 00000000..8b81b7fd --- /dev/null +++ b/manual/sixel/constants.xml @@ -0,0 +1,30 @@ + + +
+ &reftitle.constants; + &extension.constants; + + &no.constants; + +
+ + diff --git a/manual/sixel/ini.xml b/manual/sixel/ini.xml new file mode 100644 index 00000000..7f1e8b62 --- /dev/null +++ b/manual/sixel/ini.xml @@ -0,0 +1,30 @@ + + +
+ &reftitle.runtime; + &extension.runtime; + + &no.config; + +
+ + diff --git a/manual/sixel/reference.xml b/manual/sixel/reference.xml new file mode 100644 index 00000000..a1f874ca --- /dev/null +++ b/manual/sixel/reference.xml @@ -0,0 +1,62 @@ + + + + + + + + PHP interface to libsixel + sixel + + +
+ &reftitle.intro; + + A PHP interface to libsixel. + libsixel is a lightweight, fast implementation of DEC SIXEL graphics codec. + + +
+ +
+ &reftitle.required; + + + +
+ + &reference.sixel.configure; + &reference.extname.ini; + +
+ &reftitle.resources; + &no.resource; +
+ + &reference.extname.constants; +
+ +&reference.sixel.functions; + +
+ + diff --git a/package.xml b/package.xml new file mode 100644 index 00000000..8aa012ff --- /dev/null +++ b/package.xml @@ -0,0 +1,58 @@ + + + + + sixel + PHP interface to libsixel + + A PHP interface to libsixel. + libsixel is a lightweight, fast implementation of DEC SIXEL graphics codec. + + + PHP + + + + + + + + saitoha + Hayaki Saito + saitoha@me.com + developer + + + + + 0.0.1 + alpha + Alpha version. + + 2015-06-23 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package2.xml b/package2.xml new file mode 100644 index 00000000..4dc1e8f6 --- /dev/null +++ b/package2.xml @@ -0,0 +1,79 @@ + + + + sixel + pecl.php.net + + PHP interface to libsixel + + + A PHP interface to libsixel. + libsixel is a lightweight, fast implementation of DEC SIXEL graphics codec. + + + + Hayaki Saito + saitoha + saitoha@me.com + yes + + + 2015-06-23 + + 0.0.1 + 0.0.1 + + + alpha + alpha + + + PHP + + + Alpha version. + + + + + + + + + + + + + + + + + + + + + + + + + 5.0.0 + + + 1.4.0a1 + + + + + sixel + + + + + + diff --git a/php_sixel.h b/php_sixel.h new file mode 100644 index 00000000..dbffc7db --- /dev/null +++ b/php_sixel.h @@ -0,0 +1,130 @@ +/* + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hayaki Saito | + +----------------------------------------------------------------------+ +*/ + +/* $ Id: $ */ + +#ifndef PHP_SIXEL_H +#define PHP_SIXEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifdef HAVE_SIXEL +#define PHP_SIXEL_VERSION "0.0.1" + + +#include +#include +#include +#include +#ifdef __cplusplus +} // extern "C" +#endif +#include +#ifdef __cplusplus +extern "C" { +#endif + +extern zend_module_entry sixel_module_entry; +#define phpext_sixel_ptr &sixel_module_entry + +#ifdef PHP_WIN32 +#define PHP_SIXEL_API __declspec(dllexport) +#else +#define PHP_SIXEL_API +#endif + +PHP_MINIT_FUNCTION(sixel); +PHP_MSHUTDOWN_FUNCTION(sixel); +PHP_RINIT_FUNCTION(sixel); +PHP_RSHUTDOWN_FUNCTION(sixel); +PHP_MINFO_FUNCTION(sixel); + +#ifdef ZTS +#include "TSRM.h" +#endif + +#define FREE_RESOURCE(resource) zend_list_delete(Z_LVAL_P(resource)) + +#define PROP_GET_LONG(name) Z_LVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_LONG(name, l) zend_update_property_long(_this_ce, _this_zval, #name, strlen(#name), l TSRMLS_CC) + +#define PROP_GET_DOUBLE(name) Z_DVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_DOUBLE(name, d) zend_update_property_double(_this_ce, _this_zval, #name, strlen(#name), d TSRMLS_CC) + +#define PROP_GET_STRING(name) Z_STRVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_GET_STRLEN(name) Z_STRLEN_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_STRING(name, s) zend_update_property_string(_this_ce, _this_zval, #name, strlen(#name), s TSRMLS_CC) +#define PROP_SET_STRINGL(name, s, l) zend_update_property_stringl(_this_ce, _this_zval, #name, strlen(#name), s, l TSRMLS_CC) + + +PHP_METHOD(SixelEncoder, __construct); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder____construct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder____construct_args NULL +#endif + +PHP_METHOD(SixelEncoder, __destruct); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder____destruct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder____destruct_args NULL +#endif + +PHP_METHOD(SixelEncoder, setopt); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__setopt_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) + ZEND_ARG_INFO(0, opt) + ZEND_ARG_INFO(0, arg) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder__setopt_args NULL +#endif + +PHP_METHOD(SixelEncoder, encode); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__encode_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) + ZEND_ARG_INFO(0, filename) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SixelEncoder__encode_args NULL +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* PHP_HAVE_SIXEL */ + +#endif /* PHP_SIXEL_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/sixel.c b/sixel.c new file mode 100644 index 00000000..e82e667d --- /dev/null +++ b/sixel.c @@ -0,0 +1,277 @@ +/* + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Hayaki Saito | + +----------------------------------------------------------------------+ +*/ + +/* $ Id: $ */ + +#include "php_sixel.h" + +#if HAVE_SIXEL + +/* {{{ Class definitions */ + +/* {{{ Class SixelEncoder */ + +static zend_class_entry * SixelEncoder_ce_ptr = NULL; + +/* {{{ Methods */ + + +/* {{{ proto object __construct() + */ +PHP_METHOD(SixelEncoder, __construct) +{ + zend_class_entry * _this_ce; + zval * _this_zval; + + + + if (ZEND_NUM_ARGS()>0) { + WRONG_PARAM_COUNT; + } + + + do { + sixel_encoder_t *encoder; + encoder = sixel_encoder_create(); + if (encoder == NULL) { +#if 0 + zend_throw_exception_ex(zend_exception_get_default(), 1, + "sixel_encoder_create() failed. %s:%d", + __FILE__, __LINE__); +#endif + } else { + zval *value = emalloc(sizeof(zval)); + ZVAL_RESOURCE(value, (long)encoder); + zend_update_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, value); + } + } while (0); +} +/* }}} __construct */ + + + +/* {{{ proto object __destruct() + */ +PHP_METHOD(SixelEncoder, __destruct) +{ + zend_class_entry * _this_ce; + + zval * _this_zval = NULL; + + + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &_this_zval, SixelEncoder_ce_ptr) == FAILURE) { + return; + } + + _this_ce = Z_OBJCE_P(_this_zval); + + + do { + zval *encoder = zend_read_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, 1); + sixel_encoder_unref((sixel_encoder_t *)Z_RESVAL_P(encoder)); + efree(encoder); + } while (0); +} +/* }}} __destruct */ + + + +/* {{{ proto void setopt(string opt[, string arg]) + */ +PHP_METHOD(SixelEncoder, setopt) +{ + zend_class_entry * _this_ce; + + zval * _this_zval = NULL; + const char * opt = NULL; + int opt_len = 0; + const char * arg = NULL; + int arg_len = 0; + + + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &_this_zval, SixelEncoder_ce_ptr, &opt, &opt_len, &arg, &arg_len) == FAILURE) { + return; + } + + _this_ce = Z_OBJCE_P(_this_zval); + + + do { + zval *encoder = zend_read_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, 1); + sixel_encoder_setopt((sixel_encoder_t *)Z_RESVAL_P(encoder), *opt, arg); + } while (0); +} +/* }}} setopt */ + + + +/* {{{ proto void encode(string filename) + */ +PHP_METHOD(SixelEncoder, encode) +{ + zend_class_entry * _this_ce; + + zval * _this_zval = NULL; + const char * filename = NULL; + int filename_len = 0; + + + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &_this_zval, SixelEncoder_ce_ptr, &filename, &filename_len) == FAILURE) { + return; + } + + _this_ce = Z_OBJCE_P(_this_zval); + + + do { + zval *encoder = zend_read_property(_this_ce, getThis(), + "encoder", sizeof("encoder") - 1, 1); + int ret = sixel_encoder_encode((sixel_encoder_t *)Z_RESVAL_P(encoder), filename); +#if 0 + if (ret != 0) { + zend_throw_exception_ex(zend_exception_get_default(), 1, + "sixel_encoder_encode() failed. %s:%d", + __FILE__, __LINE__); + } +#endif + } while (0); +} +/* }}} encode */ + + +static zend_function_entry SixelEncoder_methods[] = { + PHP_ME(SixelEncoder, __construct, NULL, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) + PHP_ME(SixelEncoder, __destruct, NULL, /**/ZEND_ACC_PUBLIC) + PHP_ME(SixelEncoder, setopt, SixelEncoder__setopt_args, /**/ZEND_ACC_PUBLIC) + PHP_ME(SixelEncoder, encode, SixelEncoder__encode_args, /**/ZEND_ACC_PUBLIC) + { NULL, NULL, NULL } +}; + +/* }}} Methods */ + +static void class_init_SixelEncoder(void) +{ + zend_class_entry ce; + + INIT_CLASS_ENTRY(ce, "SixelEncoder", SixelEncoder_methods); + SixelEncoder_ce_ptr = zend_register_internal_class(&ce); +} + +/* }}} Class SixelEncoder */ + +/* }}} Class definitions*/ + +/* {{{ sixel_functions[] */ +zend_function_entry sixel_functions[] = { + { NULL, NULL, NULL } +}; +/* }}} */ + + +/* {{{ sixel_module_entry + */ +zend_module_entry sixel_module_entry = { + STANDARD_MODULE_HEADER, + "sixel", + sixel_functions, + PHP_MINIT(sixel), /* Replace with NULL if there is nothing to do at php startup */ + PHP_MSHUTDOWN(sixel), /* Replace with NULL if there is nothing to do at php shutdown */ + PHP_RINIT(sixel), /* Replace with NULL if there is nothing to do at request start */ + PHP_RSHUTDOWN(sixel), /* Replace with NULL if there is nothing to do at request end */ + PHP_MINFO(sixel), + PHP_SIXEL_VERSION, + STANDARD_MODULE_PROPERTIES +}; +/* }}} */ + +#ifdef COMPILE_DL_SIXEL +ZEND_GET_MODULE(sixel) +#endif + + +/* {{{ PHP_MINIT_FUNCTION */ +PHP_MINIT_FUNCTION(sixel) +{ + class_init_SixelEncoder(); + + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_MSHUTDOWN_FUNCTION */ +PHP_MSHUTDOWN_FUNCTION(sixel) +{ + + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_RINIT_FUNCTION */ +PHP_RINIT_FUNCTION(sixel) +{ + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_RSHUTDOWN_FUNCTION */ +PHP_RSHUTDOWN_FUNCTION(sixel) +{ + /* add your stuff here */ + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_MINFO_FUNCTION */ +PHP_MINFO_FUNCTION(sixel) +{ + php_printf("PHP interface to libsixel\n"); + php_info_print_table_start(); + php_info_print_table_row(2, "Version",PHP_SIXEL_VERSION " (alpha)"); + php_info_print_table_row(2, "Released", "2015-06-23"); + php_info_print_table_row(2, "CVS Revision", "$Id: $"); + php_info_print_table_row(2, "Authors", "Hayaki Saito 'saitoha@me.com' (developer)\n"); + php_info_print_table_end(); + /* add your stuff here */ + +} +/* }}} */ + +#endif /* HAVE_SIXEL */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/sixel.dsp b/sixel.dsp new file mode 100644 index 00000000..b5d98fc9 --- /dev/null +++ b/sixel.dsp @@ -0,0 +1,112 @@ +# Microsoft Developer Studio Project File - Name="sixel" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=sixel - Win32 Debug_TS +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "sixel.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "sixel.mak" CFG="sixel - Win32 Debug_TS" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "sixel - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "sixel - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "sixel - Win32 Release_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_TS" +# PROP BASE Intermediate_Dir "Release_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TS" +# PROP Intermediate_Dir "Release_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIXEL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_SIXEL" /D ZTS=1 /D HAVE_SIXEL=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 php4ts.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS\php_sixel.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" + +!ELSEIF "$(CFG)" == "sixel - Win32 Debug_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug_TS" +# PROP BASE Intermediate_Dir "Debug_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_TS" +# PROP Intermediate_Dir "Debug_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIXEL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_SIXEL" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_SIXEL=1 /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 php4ts_debug.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS\php_sixel.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" + +!ENDIF + +# Begin Target + +# Name "sixel - Win32 Release_TS" +# Name "sixel - Win32 Debug_TS" + +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + +# Begin Source File + +SOURCE=./sixel.c +# End Source File + +# End Group + +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" + +# Begin Source File + +SOURCE=.\php_sixel.h +# End Source File +# End Group +# End Target +# End Project diff --git a/sixel.xml b/sixel.xml new file mode 100644 index 00000000..32e95b33 --- /dev/null +++ b/sixel.xml @@ -0,0 +1,96 @@ + + + + PHP interface to libsixel + + A PHP interface to libsixel. + libsixel is a lightweight, fast implementation of DEC SIXEL graphics codec. + + + + + saitoha + Hayaki Saito + saitoha@me.com + developer + + + + PHP + + + 0.0.1 + alpha + 2015-06-23 + + Alpha version. + + + + + + + + +
+ + + + + + + object __construct() + + + + + object __destruct() + + + + + void setopt(string opt[, string arg]) + + + + + void encode(string filename) + + + + diff --git a/tests/SixelEncoder____construct.phpt b/tests/SixelEncoder____construct.phpt new file mode 100644 index 00000000..f2008764 --- /dev/null +++ b/tests/SixelEncoder____construct.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::__construct() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file diff --git a/tests/SixelEncoder____destruct.phpt b/tests/SixelEncoder____destruct.phpt new file mode 100644 index 00000000..f597a94a --- /dev/null +++ b/tests/SixelEncoder____destruct.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::__destruct() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file diff --git a/tests/SixelEncoder__encode.phpt b/tests/SixelEncoder__encode.phpt new file mode 100644 index 00000000..6135484e --- /dev/null +++ b/tests/SixelEncoder__encode.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::encode() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file diff --git a/tests/SixelEncoder__setopt.phpt b/tests/SixelEncoder__setopt.phpt new file mode 100644 index 00000000..630432b0 --- /dev/null +++ b/tests/SixelEncoder__setopt.phpt @@ -0,0 +1,14 @@ +--TEST-- +SixelEncoder::setopt() member function +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK \ No newline at end of file From e1c62f8033d6dde5ffab52d1ff0b36620025b3c0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 23 Jun 2015 02:42:58 +0900 Subject: [PATCH 342/451] core: Add SIXEL_OPTFLAG_xxx definitions --- include/sixel.h.in | 181 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/include/sixel.h.in b/include/sixel.h.in index ccc87f03..15829122 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -174,6 +174,187 @@ typedef int SIXELSTATUS; #define SIXEL_LOOP_FORCE 1 /* always enable loop */ #define SIXEL_LOOP_DISABLE 2 /* always disable loop */ +/* setopt flags */ +#define SIXEL_OPTFLAG_INPUT ('i') /* -o, --input: specify input file name. */ +#define SIXEL_OPTFLAG_OUTPUT ('o') /* -o, --output: specify output file name. */ +#define SIXEL_OPTFLAG_OUTFILE ('o') /* -o, --outfile: specify output file name. */ +#define SIXEL_OPTFLAG_7BIT_MODE ('7') /* -7, --7bit-mode: for 7bit terminals or printers (default) */ +#define SIXEL_OPTFLAG_8BIT_MODE ('8') /* -8, --8bit-mode: for 8bit terminals or printers */ +#define SIXEL_OPTFLAG_COLORS ('p') /* -p COLORS, --colors=COLORS: specify number of colors */ +#define SIXEL_OPTFLAG_MAPFILE ('m') /* -m FILE, --mapfile=FILE: specify set of colors */ +#define SIXEL_OPTFLAG_MONOCHROME ('e') /* -e, --monochrome: output monochrome sixel image */ +#define SIXEL_OPTFLAG_INSECURE ('k') /* -k, --insecure: allow to connect to SSL sites without certs */ +#define SIXEL_OPTFLAG_INVERT ('i') /* -i, --invert: assume the terminal background color */ +#define SIXEL_OPTFLAG_HIGH_COLOR ('I') /* -I, --high-color: output 15bpp sixel image */ +#define SIXEL_OPTFLAG_USE_MACRO ('u') /* -u, --use-macro: use DECDMAC and DEVINVM sequences */ +#define SIXEL_OPTFLAG_MACRO_NUMBER ('n') /* -n MACRONO, --macro-number=MACRONO: + specify macro register number */ +#define SIXEL_OPTFLAG_COMPLEXION_SCORE ('C') /* -C COMPLEXIONSCORE, --complexion-score=COMPLEXIONSCORE: + specify an number argument for the score of + complexion correction. */ +#define SIXEL_OPTFLAG_IGNORE_DELAY ('u') /* -g, --ignore-delay: render GIF animation without delay */ +#define SIXEL_OPTFLAG_STATIC ('S') /* -S, --static: render animated GIF as a static image */ +#define SIXEL_OPTFLAG_DIFFUSION ('d') /* -d DIFFUSIONTYPE, --diffusion=DIFFUSIONTYPE: + choose diffusion method which used with -p option. + DIFFUSIONTYPE is one of them: + auto -> choose diffusion type + automatically (default) + none -> do not diffuse + fs -> Floyd-Steinberg method + atkinson -> Bill Atkinson's method + jajuni -> Jarvis, Judice & Ninke + stucki -> Stucki's method + burkes -> Burkes' method + */ +#define SIXEL_OPTFLAG_FIND_LARGEST ('f') /* -f FINDTYPE, --find-largest=FINDTYPE: + choose method for finding the largest + dimension of median cut boxes for + splitting, make sense only when -p + option (color reduction) is + specified + FINDTYPE is one of them: + auto -> choose finding method + automatically (default) + norm -> simply comparing the + range in RGB space + lum -> transforming into + luminosities before the + comparison + */ +#define SIXEL_OPTFLAG_SELECT_COLOR ('s') /* -s SELECTTYPE, --select-color=SELECTTYPE + choose the method for selecting + representative color from each + median-cut box, make sense only + when -p option (color reduction) is + specified + SELECTTYPE is one of them: + auto -> choose selecting + method automatically + (default) + center -> choose the center of + the box + average -> calculate the color + average into the box + histogram -> similar with average + but considers color + histogram + */ +#define SIXEL_OPTFLAG_CROP ('c') /* -c REGION, --crop=REGION: + crop source image to fit the + specified geometry. REGION should + be formatted as '%dx%d+%d+%d' + */ +#define SIXEL_OPTFLAG_WIDTH ('w') /* -w WIDTH, --width=WIDTH: + resize image to specified width + WIDTH is represented by the + following syntax + auto -> preserving aspect + ratio (default) + % -> scale width with + given percentage + -> scale width with + pixel counts + px -> scale width with + pixel counts + */ +#define SIXEL_OPTFLAG_HEIGHT ('h') /* -h HEIGHT, --height=HEIGHT: + resize image to specified height + HEIGHT is represented by the + following syntax + auto -> preserving aspect + ratio (default) + % -> scale height with + given percentage + -> scale height with + pixel counts + px -> scale height with + pixel counts + */ +#define SIXEL_OPTFLAG_RESAMPLING ('r') /* -r RESAMPLINGTYPE, --resampling=RESAMPLINGTYPE: + choose resampling filter used + with -w or -h option (scaling) + RESAMPLINGTYPE is one of them: + nearest -> Nearest-Neighbor + method + gaussian -> Gaussian filter + hanning -> Hanning filter + hamming -> Hamming filter + bilinear -> Bilinear filter + (default) + welsh -> Welsh filter + bicubic -> Bicubic filter + lanczos2 -> Lanczos-2 filter + lanczos3 -> Lanczos-3 filter + lanczos4 -> Lanczos-4 filter + */ +#define SIXEL_OPTFLAG_QUALITY ('q') /* -q QUALITYMODE, --quality=QUALITYMODE: + select quality of color + quanlization. + auto -> decide quality mode + automatically (default) + low -> low quality and high + speed mode + high -> high quality and low + speed mode + full -> full quality and careful + speed mode + */ +#define SIXEL_OPTFLAG_LOOPMODE ('l') /* -l LOOPMODE, --loop-control=LOOPMODE: + select loop control mode for GIF + animation. + auto -> honor the setting of + GIF header (default) + force -> always enable loop + disable -> always disable loop + */ +#define SIXEL_OPTFLAG_PALETTE_TYPE ('t') /* -t PALETTETYPE, --palette-type=PALETTETYPE: + select palette color space type + auto -> choose palette type + automatically (default) + hls -> use HLS color space + rgb -> use RGB color space + */ +#define SIXEL_OPTFLAG_BUILTIN_PALETTE ('b') /* -b BUILTINPALETTE, --builtin-palette=BUILTINPALETTE: + select built-in palette type + xterm16 -> X default 16 color map + xterm256 -> X default 256 color map + vt340mono -> VT340 monochrome map + vt340color -> VT340 color map + gray1 -> 1bit grayscale map + gray2 -> 2bit grayscale map + gray4 -> 4bit grayscale map + gray8 -> 8bit grayscale map + */ +#define SIXEL_OPTFLAG_ENCODE_POLICY ('E') /* -E ENCODEPOLICY, --encode-policy=ENCODEPOLICY: + select encoding policy + auto -> choose encoding policy + automatically (default) + fast -> encode as fast as possible + size -> encode to as small sixel + sequence as possible + */ +#define SIXEL_OPTFLAG_BGCOLOR ('B') /* -B BGCOLOR, --bgcolor=BGCOLOR: + specify background color + BGCOLOR is represented by the + following syntax + #rgb + #rrggbb + #rrrgggbbb + #rrrrggggbbbb + rgb:r/g/b + rgb:rr/gg/bb + rgb:rrr/ggg/bbb + rgb:rrrr/gggg/bbbb + */ +#define SIXEL_OPTFLAG_PENETRATE ('P') /* -P, --penetrate: + penetrate GNU Screen using DCS + pass-through sequence */ +#define SIXEL_OPTFLAG_PIPE_MODE ('D') /* -D, --pipe-mode: + read source images from stdin continuously */ +#define SIXEL_OPTFLAG_VERBOSE ('v') /* -v, --verbose: show debugging info */ +#define SIXEL_OPTFLAG_VERSION ('V') /* -V, --version: show version and license info */ +#define SIXEL_OPTFLAG_HELP ('H') /* -H, --help: show this help */ + #if SIXEL_USE_DEPRECATED_SYMBOLS /* output character size */ enum characterSize { From 78f240ce2a0005d977d3f6346569213fed98b448 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 25 Jun 2015 23:38:19 +0900 Subject: [PATCH 343/451] Remove submodule directory --- .gitmodules | 3 --- ruby | 1 - 2 files changed, 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 ruby diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 2e83ebab..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "ruby"] - path = ruby - url = git://github.com/saitoha/libsixel-ruby.git diff --git a/ruby b/ruby deleted file mode 160000 index 9d201044..00000000 --- a/ruby +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9d2010449fd49fb806900b9bef69ea7f38ac9e89 From ec32230bcdda375f8875d7a45242b540ff651960 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 25 Jun 2015 23:44:10 +0900 Subject: [PATCH 344/451] Remove php extension directory --- php/README | 13 - php/sixel/.cvsignore | 44 --- php/sixel/CREDITS | 2 - php/sixel/EXPERIMENTAL | 5 - php/sixel/README | 70 ----- php/sixel/config.m4 | 63 ---- php/sixel/config.w32 | 8 - php/sixel/manual/file-entities.ent | 5 - php/sixel/manual/functions.xml | 0 php/sixel/manual/manual.xml.in | 37 --- php/sixel/manual/sixel/configure.xml | 37 --- php/sixel/manual/sixel/constants.xml | 30 -- php/sixel/manual/sixel/ini.xml | 30 -- php/sixel/manual/sixel/reference.xml | 60 ---- php/sixel/package.xml | 54 ---- php/sixel/package2.xml | 77 ----- php/sixel/php_sixel.h | 124 -------- php/sixel/sixel.c | 271 ------------------ php/sixel/sixel.dsp | 112 -------- php/sixel/sixel.xml | 67 ----- .../tests/SixelEncoder____construct.phpt | 14 - php/sixel/tests/SixelEncoder____destruct.phpt | 14 - php/sixel/tests/SixelEncoder__encode.phpt | 14 - php/sixel/tests/SixelEncoder__setopt.phpt | 14 - 24 files changed, 1165 deletions(-) delete mode 100644 php/README delete mode 100644 php/sixel/.cvsignore delete mode 100644 php/sixel/CREDITS delete mode 100644 php/sixel/EXPERIMENTAL delete mode 100644 php/sixel/README delete mode 100644 php/sixel/config.m4 delete mode 100644 php/sixel/config.w32 delete mode 100644 php/sixel/manual/file-entities.ent delete mode 100644 php/sixel/manual/functions.xml delete mode 100644 php/sixel/manual/manual.xml.in delete mode 100644 php/sixel/manual/sixel/configure.xml delete mode 100644 php/sixel/manual/sixel/constants.xml delete mode 100644 php/sixel/manual/sixel/ini.xml delete mode 100644 php/sixel/manual/sixel/reference.xml delete mode 100644 php/sixel/package.xml delete mode 100644 php/sixel/package2.xml delete mode 100644 php/sixel/php_sixel.h delete mode 100644 php/sixel/sixel.c delete mode 100644 php/sixel/sixel.dsp delete mode 100644 php/sixel/sixel.xml delete mode 100644 php/sixel/tests/SixelEncoder____construct.phpt delete mode 100644 php/sixel/tests/SixelEncoder____destruct.phpt delete mode 100644 php/sixel/tests/SixelEncoder__encode.phpt delete mode 100644 php/sixel/tests/SixelEncoder__setopt.phpt diff --git a/php/README b/php/README deleted file mode 100644 index f0f755b7..00000000 --- a/php/README +++ /dev/null @@ -1,13 +0,0 @@ -How to build php extension -========================== - -$ cd sixel -$ phpize -$ ./configure -$ make - - -Install -======= - -# make install diff --git a/php/sixel/.cvsignore b/php/sixel/.cvsignore deleted file mode 100644 index 0b2afde7..00000000 --- a/php/sixel/.cvsignore +++ /dev/null @@ -1,44 +0,0 @@ -*.lo -*.la -.deps -.libs -Makefile -Makefile.fragments -Makefile.global -Makefile.objects -acinclude.m4 -aclocal.m4 -autom4te.cache -build -config.cache -config.guess -config.h -config.h.in -config.log -config.nice -config.status -config.sub -configure -configure.in -conftest -conftest.c -include -install-sh -libtool -ltmain.sh -missing -mkinstalldirs -modules -scan_makefile_in.awk -*.dsw -*.plg -*.opt -*.ncb -Release -Release_inline -Debug -Release_TS -Release_TSDbg -Release_TS_inline -Debug_TS -sixel*.tgz diff --git a/php/sixel/CREDITS b/php/sixel/CREDITS deleted file mode 100644 index d5b8ce80..00000000 --- a/php/sixel/CREDITS +++ /dev/null @@ -1,2 +0,0 @@ -sixel -Unknown User diff --git a/php/sixel/EXPERIMENTAL b/php/sixel/EXPERIMENTAL deleted file mode 100644 index 6443e996..00000000 --- a/php/sixel/EXPERIMENTAL +++ /dev/null @@ -1,5 +0,0 @@ -this extension is experimental, -its functions may change their names -or move to extension all together -so do not rely to much on them -you have been warned! diff --git a/php/sixel/README b/php/sixel/README deleted file mode 100644 index e31885ac..00000000 --- a/php/sixel/README +++ /dev/null @@ -1,70 +0,0 @@ -This is a standalone PHP extension created using CodeGen_PECL 1.1.3 - -HACKING -======= - -There are two ways to modify an extension created using CodeGen_PECL: - -1) you can modify the generated code as with any other PHP extension - -2) you can add custom code to the CodeGen_PECL XML source and re-run pecl-gen - -The 2nd approach may look a bit complicated but you have be aware that any -manual changes to the generated code will be lost if you ever change the -XML specs and re-run PECL-Gen. All changes done before have to be applied -to the newly generated code again. -Adding code snippets to the XML source itself on the other hand may be a -bit more complicated but this way your custom code will always be in the -generated code no matter how often you rerun CodeGen_PECL. - - -BUILDING ON UNIX etc. -===================== - -To compile your new extension, you will have to execute the following steps: - -1. $ ./phpize -2. $ ./configure [--with-libsixel=...] -3. $ make -4. $ make test -5. $ [sudo] make install - - - -BUILDING ON WINDOWS -=================== - -The extension provides the VisualStudio V6 project file - - sixel.dsp -To compile the extension you open this file using VisualStudio, -select the apropriate configuration for your installation -(either "Release_TS" or "Debug_TS") and create "php_sixel.dll" - -After successfull compilation you have to copy the newly -created "sixel.dll" to the PHP -extension directory (default: C:\PHP\extensions). - - -TESTING -======= - -You can now load the extension using a php.ini directive - - extension="sixel.[so|dll]" - -or load it at runtime using the dl() function - - dl("sixel.[so|dll]"); - -The extension should now be available, you can test this -using the extension_loaded() function: - - if (extension_loaded("sixel")) - echo "sixel loaded :)"; - else - echo "something is wrong :("; - -The extension will also add its own block to the output -of phpinfo(); - diff --git a/php/sixel/config.m4 b/php/sixel/config.m4 deleted file mode 100644 index 8950a808..00000000 --- a/php/sixel/config.m4 +++ /dev/null @@ -1,63 +0,0 @@ -dnl -dnl $ Id: $ -dnl - -PHP_ARG_ENABLE(sixel, whether to enable sixel functions, -[ --enable-sixel Enable sixel support]) - -if test "$PHP_SIXEL" != "no"; then - -PHP_ARG_WITH(libsixel, whether libsixel is available,[ --with-libsixel[=DIR] With libsixel support]) - - - - if test -z "$PKG_CONFIG" - then - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - fi - if test "$PKG_CONFIG" = "no" - then - AC_MSG_ERROR([required utility 'pkg-config' not found]) - fi - - if ! $PKG_CONFIG --exists libsixel - then - AC_MSG_ERROR(['libsixel' not known to pkg-config]) - fi - - if ! $PKG_CONFIG --atleast-version 1.5 libsixel - then - PKG_VERSION=`$PKG_CONFIG --modversion libsixel` - AC_MSG_ERROR(['libsixel'\ is version $PKG_VERSION, 1.5 required]) - fi - - PHP_EVAL_INCLINE(`$PKG_CONFIG --cflags-only-I libsixel`) - PHP_EVAL_LIBLINE(`$PKG_CONFIG --libs libsixel`, SIXEL_SHARED_LIBADD) - - export OLD_CPPFLAGS="$CPPFLAGS" - export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_LIBSIXEL" - AC_CHECK_HEADER([sixel.h], [], AC_MSG_ERROR('sixel.h' header not found)) - export CPPFLAGS="$OLD_CPPFLAGS" - - export OLD_CPPFLAGS="$CPPFLAGS" - export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_SIXEL" - - AC_MSG_CHECKING(PHP version) - AC_TRY_COMPILE([#include ], [ -#if PHP_VERSION_ID < 50000 -#error this extension requires at least PHP version 5.0.0 -#endif -], -[AC_MSG_RESULT(ok)], -[AC_MSG_ERROR([need at least PHP 5.0.0])]) - - export CPPFLAGS="$OLD_CPPFLAGS" - - - PHP_SUBST(SIXEL_SHARED_LIBADD) - AC_DEFINE(HAVE_SIXEL, 1, [ ]) - - PHP_NEW_EXTENSION(sixel, sixel.c , $ext_shared) - -fi - diff --git a/php/sixel/config.w32 b/php/sixel/config.w32 deleted file mode 100644 index d41423f8..00000000 --- a/php/sixel/config.w32 +++ /dev/null @@ -1,8 +0,0 @@ -// $ Id: $ -// vim:ft=javascript - -ARG_ENABLE('sixel' , 'The unknown extension', 'no'); -if (PHP_SIXEL == "yes") { - EXTENSION("sixel", "sixel.c"); - AC_DEFINE("HAVE_SIXEL", 1, "sixel support"); -} diff --git a/php/sixel/manual/file-entities.ent b/php/sixel/manual/file-entities.ent deleted file mode 100644 index 026cce52..00000000 --- a/php/sixel/manual/file-entities.ent +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/php/sixel/manual/functions.xml b/php/sixel/manual/functions.xml deleted file mode 100644 index e69de29b..00000000 diff --git a/php/sixel/manual/manual.xml.in b/php/sixel/manual/manual.xml.in deleted file mode 100644 index 12e9202b..00000000 --- a/php/sixel/manual/manual.xml.in +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -%language-defs; -%language-snippets; - - - - - - -%language-defs.default; -%language-snippets.default; -%extensions.default; - - - - - - - -%global.entities; -%file.entities; - - - -%missing-entities; -]> - - - &reference.sixel.reference; - diff --git a/php/sixel/manual/sixel/configure.xml b/php/sixel/manual/sixel/configure.xml deleted file mode 100644 index 56df4ca9..00000000 --- a/php/sixel/manual/sixel/configure.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - -
- &reftitle.required; - &no.requirement; - -
- - -
- &reftitle.install; - Requires libsixel - -
- - - diff --git a/php/sixel/manual/sixel/constants.xml b/php/sixel/manual/sixel/constants.xml deleted file mode 100644 index 8b81b7fd..00000000 --- a/php/sixel/manual/sixel/constants.xml +++ /dev/null @@ -1,30 +0,0 @@ - - -
- &reftitle.constants; - &extension.constants; - - &no.constants; - -
- - diff --git a/php/sixel/manual/sixel/ini.xml b/php/sixel/manual/sixel/ini.xml deleted file mode 100644 index 7f1e8b62..00000000 --- a/php/sixel/manual/sixel/ini.xml +++ /dev/null @@ -1,30 +0,0 @@ - - -
- &reftitle.runtime; - &extension.runtime; - - &no.config; - -
- - diff --git a/php/sixel/manual/sixel/reference.xml b/php/sixel/manual/sixel/reference.xml deleted file mode 100644 index 792302a1..00000000 --- a/php/sixel/manual/sixel/reference.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - The unknown extension - sixel - - -
- &reftitle.intro; - -none - -
- -
- &reftitle.required; - - - -
- - &reference.sixel.configure; - &reference.extname.ini; - -
- &reftitle.resources; - &no.resource; -
- - &reference.extname.constants; -
- -&reference.sixel.functions; - -
- - diff --git a/php/sixel/package.xml b/php/sixel/package.xml deleted file mode 100644 index cc33dd92..00000000 --- a/php/sixel/package.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - sixel - The unknown extension - -none - - - - - - - - - unknown - Unknown User - unknown@example.com - lead - - - - - 0.0.1dev - devel - unknown - 2015-05-17 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/php/sixel/package2.xml b/php/sixel/package2.xml deleted file mode 100644 index aab0e5af..00000000 --- a/php/sixel/package2.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - sixel - pecl.php.net - - The unknown extension - - -none - - - - Unknown User - unknown - unknown@example.com - yes - - - 2015-05-17 - - 0.0.1dev - 0.0.1dev - - - devel - devel - - - unknown - - -none - - - - - - - - - - - - - - - - - - - - - - - - 5.0.0 - - - 1.4.0a1 - - - - - sixel - - - - - - diff --git a/php/sixel/php_sixel.h b/php/sixel/php_sixel.h deleted file mode 100644 index 8061127e..00000000 --- a/php/sixel/php_sixel.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | unknown license: | - +----------------------------------------------------------------------+ - | Authors: Unknown User | - +----------------------------------------------------------------------+ -*/ - -/* $ Id: $ */ - -#ifndef PHP_SIXEL_H -#define PHP_SIXEL_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#ifdef HAVE_SIXEL -#define PHP_SIXEL_VERSION "0.0.1dev" - - -#include -#include -#include -#include -#ifdef __cplusplus -} // extern "C" -#endif -#include -#ifdef __cplusplus -extern "C" { -#endif - -extern zend_module_entry sixel_module_entry; -#define phpext_sixel_ptr &sixel_module_entry - -#ifdef PHP_WIN32 -#define PHP_SIXEL_API __declspec(dllexport) -#else -#define PHP_SIXEL_API -#endif - -PHP_MINIT_FUNCTION(sixel); -PHP_MSHUTDOWN_FUNCTION(sixel); -PHP_RINIT_FUNCTION(sixel); -PHP_RSHUTDOWN_FUNCTION(sixel); -PHP_MINFO_FUNCTION(sixel); - -#ifdef ZTS -#include "TSRM.h" -#endif - -#define FREE_RESOURCE(resource) zend_list_delete(Z_LVAL_P(resource)) - -#define PROP_GET_LONG(name) Z_LVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) -#define PROP_SET_LONG(name, l) zend_update_property_long(_this_ce, _this_zval, #name, strlen(#name), l TSRMLS_CC) - -#define PROP_GET_DOUBLE(name) Z_DVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) -#define PROP_SET_DOUBLE(name, d) zend_update_property_double(_this_ce, _this_zval, #name, strlen(#name), d TSRMLS_CC) - -#define PROP_GET_STRING(name) Z_STRVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) -#define PROP_GET_STRLEN(name) Z_STRLEN_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) -#define PROP_SET_STRING(name, s) zend_update_property_string(_this_ce, _this_zval, #name, strlen(#name), s TSRMLS_CC) -#define PROP_SET_STRINGL(name, s, l) zend_update_property_stringl(_this_ce, _this_zval, #name, strlen(#name), s, l TSRMLS_CC) - - -PHP_METHOD(SixelEncoder, __construct); -#if (PHP_MAJOR_VERSION >= 5) -ZEND_BEGIN_ARG_INFO_EX(SixelEncoder____construct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) -ZEND_END_ARG_INFO() -#else /* PHP 4.x */ -#define SixelEncoder____construct_args NULL -#endif - -PHP_METHOD(SixelEncoder, __destruct); -#if (PHP_MAJOR_VERSION >= 5) -ZEND_BEGIN_ARG_INFO_EX(SixelEncoder____destruct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) -ZEND_END_ARG_INFO() -#else /* PHP 4.x */ -#define SixelEncoder____destruct_args NULL -#endif - -PHP_METHOD(SixelEncoder, setopt); -#if (PHP_MAJOR_VERSION >= 5) -ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__setopt_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) - ZEND_ARG_INFO(0, opt) - ZEND_ARG_INFO(0, arg) -ZEND_END_ARG_INFO() -#else /* PHP 4.x */ -#define SixelEncoder__setopt_args NULL -#endif - -PHP_METHOD(SixelEncoder, encode); -#if (PHP_MAJOR_VERSION >= 5) -ZEND_BEGIN_ARG_INFO_EX(SixelEncoder__encode_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) - ZEND_ARG_INFO(0, filename) -ZEND_END_ARG_INFO() -#else /* PHP 4.x */ -#define SixelEncoder__encode_args NULL -#endif - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif /* PHP_HAVE_SIXEL */ - -#endif /* PHP_SIXEL_H */ - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ diff --git a/php/sixel/sixel.c b/php/sixel/sixel.c deleted file mode 100644 index 81339e64..00000000 --- a/php/sixel/sixel.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | unknown license: | - +----------------------------------------------------------------------+ - | Authors: Unknown User | - +----------------------------------------------------------------------+ -*/ - -/* $ Id: $ */ - -#include "php_sixel.h" - -#if HAVE_SIXEL - -/* {{{ Class definitions */ - -/* {{{ Class SixelEncoder */ - -static zend_class_entry * SixelEncoder_ce_ptr = NULL; - -/* {{{ Methods */ - - -/* {{{ proto object __construct() - */ -PHP_METHOD(SixelEncoder, __construct) -{ - zend_class_entry * _this_ce; - zval * _this_zval; - - - - if (ZEND_NUM_ARGS()>0) { - WRONG_PARAM_COUNT; - } - - - do { - sixel_encoder_t *encoder; - encoder = sixel_encoder_create(); - if (encoder == NULL) { -#if 0 - zend_throw_exception_ex(zend_exception_get_default(), 1, - "sixel_encoder_create() failed. %s:%d", - __FILE__, __LINE__); -#endif - } else { - zval *value = emalloc(sizeof(zval)); - ZVAL_RESOURCE(value, (long)encoder); - zend_update_property(_this_ce, getThis(), - "encoder", sizeof("encoder") - 1, value); - } - } while (0); -} -/* }}} __construct */ - - - -/* {{{ proto object __destruct() - */ -PHP_METHOD(SixelEncoder, __destruct) -{ - zend_class_entry * _this_ce; - - zval * _this_zval = NULL; - - - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &_this_zval, SixelEncoder_ce_ptr) == FAILURE) { - return; - } - - _this_ce = Z_OBJCE_P(_this_zval); - - - do { - zval *encoder = zend_read_property(_this_ce, getThis(), - "encoder", sizeof("encoder") - 1, 1); - sixel_encoder_unref((sixel_encoder_t *)Z_RESVAL_P(encoder)); - efree(encoder); - } while (0); -} -/* }}} __destruct */ - - - -/* {{{ proto void setopt(string opt[, string arg]) - */ -PHP_METHOD(SixelEncoder, setopt) -{ - zend_class_entry * _this_ce; - - zval * _this_zval = NULL; - const char * opt = NULL; - int opt_len = 0; - const char * arg = NULL; - int arg_len = 0; - - - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &_this_zval, SixelEncoder_ce_ptr, &opt, &opt_len, &arg, &arg_len) == FAILURE) { - return; - } - - _this_ce = Z_OBJCE_P(_this_zval); - - - do { - zval *encoder = zend_read_property(_this_ce, getThis(), - "encoder", sizeof("encoder") - 1, 1); - sixel_encoder_setopt((sixel_encoder_t *)Z_RESVAL_P(encoder), *opt, arg); - } while (0); -} -/* }}} setopt */ - - - -/* {{{ proto void encode(string filename) - */ -PHP_METHOD(SixelEncoder, encode) -{ - zend_class_entry * _this_ce; - - zval * _this_zval = NULL; - const char * filename = NULL; - int filename_len = 0; - - - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &_this_zval, SixelEncoder_ce_ptr, &filename, &filename_len) == FAILURE) { - return; - } - - _this_ce = Z_OBJCE_P(_this_zval); - - - do { - zval *encoder = zend_read_property(_this_ce, getThis(), - "encoder", sizeof("encoder") - 1, 1); - int ret = sixel_encoder_encode((sixel_encoder_t *)Z_RESVAL_P(encoder), filename); -#if 0 - if (ret != 0) { - zend_throw_exception_ex(zend_exception_get_default(), 1, - "sixel_encoder_encode() failed. %s:%d", - __FILE__, __LINE__); - } -#endif - } while (0); -} -/* }}} encode */ - - -static zend_function_entry SixelEncoder_methods[] = { - PHP_ME(SixelEncoder, __construct, NULL, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) - PHP_ME(SixelEncoder, __destruct, NULL, /**/ZEND_ACC_PUBLIC) - PHP_ME(SixelEncoder, setopt, SixelEncoder__setopt_args, /**/ZEND_ACC_PUBLIC) - PHP_ME(SixelEncoder, encode, SixelEncoder__encode_args, /**/ZEND_ACC_PUBLIC) - { NULL, NULL, NULL } -}; - -/* }}} Methods */ - -static void class_init_SixelEncoder(void) -{ - zend_class_entry ce; - - INIT_CLASS_ENTRY(ce, "SixelEncoder", SixelEncoder_methods); - SixelEncoder_ce_ptr = zend_register_internal_class(&ce); -} - -/* }}} Class SixelEncoder */ - -/* }}} Class definitions*/ - -/* {{{ sixel_functions[] */ -zend_function_entry sixel_functions[] = { - { NULL, NULL, NULL } -}; -/* }}} */ - - -/* {{{ sixel_module_entry - */ -zend_module_entry sixel_module_entry = { - STANDARD_MODULE_HEADER, - "sixel", - sixel_functions, - PHP_MINIT(sixel), /* Replace with NULL if there is nothing to do at php startup */ - PHP_MSHUTDOWN(sixel), /* Replace with NULL if there is nothing to do at php shutdown */ - PHP_RINIT(sixel), /* Replace with NULL if there is nothing to do at request start */ - PHP_RSHUTDOWN(sixel), /* Replace with NULL if there is nothing to do at request end */ - PHP_MINFO(sixel), - PHP_SIXEL_VERSION, - STANDARD_MODULE_PROPERTIES -}; -/* }}} */ - -#ifdef COMPILE_DL_SIXEL -ZEND_GET_MODULE(sixel) -#endif - - -/* {{{ PHP_MINIT_FUNCTION */ -PHP_MINIT_FUNCTION(sixel) -{ - class_init_SixelEncoder(); - - /* add your stuff here */ - - return SUCCESS; -} -/* }}} */ - - -/* {{{ PHP_MSHUTDOWN_FUNCTION */ -PHP_MSHUTDOWN_FUNCTION(sixel) -{ - - /* add your stuff here */ - - return SUCCESS; -} -/* }}} */ - - -/* {{{ PHP_RINIT_FUNCTION */ -PHP_RINIT_FUNCTION(sixel) -{ - /* add your stuff here */ - - return SUCCESS; -} -/* }}} */ - - -/* {{{ PHP_RSHUTDOWN_FUNCTION */ -PHP_RSHUTDOWN_FUNCTION(sixel) -{ - /* add your stuff here */ - - return SUCCESS; -} -/* }}} */ - - -/* {{{ PHP_MINFO_FUNCTION */ -PHP_MINFO_FUNCTION(sixel) -{ - php_printf("The unknown extension\n"); - php_info_print_table_start(); - php_info_print_table_row(2, "Version",PHP_SIXEL_VERSION " (devel)"); - php_info_print_table_row(2, "Released", "2015-05-17"); - php_info_print_table_row(2, "CVS Revision", "$Id: $"); - php_info_print_table_row(2, "Authors", "Unknown User 'unknown@example.com' (lead)\n"); - php_info_print_table_end(); - /* add your stuff here */ - -} -/* }}} */ - -#endif /* HAVE_SIXEL */ - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ diff --git a/php/sixel/sixel.dsp b/php/sixel/sixel.dsp deleted file mode 100644 index b5d98fc9..00000000 --- a/php/sixel/sixel.dsp +++ /dev/null @@ -1,112 +0,0 @@ -# Microsoft Developer Studio Project File - Name="sixel" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=sixel - Win32 Debug_TS -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "sixel.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "sixel.mak" CFG="sixel - Win32 Debug_TS" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "sixel - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "sixel - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "sixel - Win32 Release_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release_TS" -# PROP BASE Intermediate_Dir "Release_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release_TS" -# PROP Intermediate_Dir "Release_TS" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIXEL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_SIXEL" /D ZTS=1 /D HAVE_SIXEL=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x407 /d "NDEBUG" -# ADD RSC /l 0x407 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 php4ts.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS\php_sixel.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" - -!ELSEIF "$(CFG)" == "sixel - Win32 Debug_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug_TS" -# PROP BASE Intermediate_Dir "Debug_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug_TS" -# PROP Intermediate_Dir "Debug_TS" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIXEL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_SIXEL" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_SIXEL=1 /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x407 /d "_DEBUG" -# ADD RSC /l 0x407 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 php4ts_debug.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS\php_sixel.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" - -!ENDIF - -# Begin Target - -# Name "sixel - Win32 Release_TS" -# Name "sixel - Win32 Debug_TS" - -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" - -# Begin Source File - -SOURCE=./sixel.c -# End Source File - -# End Group - -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" - -# Begin Source File - -SOURCE=.\php_sixel.h -# End Source File -# End Group -# End Target -# End Project diff --git a/php/sixel/sixel.xml b/php/sixel/sixel.xml deleted file mode 100644 index 2e119d60..00000000 --- a/php/sixel/sixel.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - -
- - - - - - - object __construct() - - - - - object __destruct() - - - - - void setopt(string opt[, string arg]) - - - - - void encode(string filename) - - - - diff --git a/php/sixel/tests/SixelEncoder____construct.phpt b/php/sixel/tests/SixelEncoder____construct.phpt deleted file mode 100644 index f2008764..00000000 --- a/php/sixel/tests/SixelEncoder____construct.phpt +++ /dev/null @@ -1,14 +0,0 @@ ---TEST-- -SixelEncoder::__construct() member function ---SKIPIF-- - ---FILE-- - ---EXPECT-- -OK \ No newline at end of file diff --git a/php/sixel/tests/SixelEncoder____destruct.phpt b/php/sixel/tests/SixelEncoder____destruct.phpt deleted file mode 100644 index f597a94a..00000000 --- a/php/sixel/tests/SixelEncoder____destruct.phpt +++ /dev/null @@ -1,14 +0,0 @@ ---TEST-- -SixelEncoder::__destruct() member function ---SKIPIF-- - ---FILE-- - ---EXPECT-- -OK \ No newline at end of file diff --git a/php/sixel/tests/SixelEncoder__encode.phpt b/php/sixel/tests/SixelEncoder__encode.phpt deleted file mode 100644 index 6135484e..00000000 --- a/php/sixel/tests/SixelEncoder__encode.phpt +++ /dev/null @@ -1,14 +0,0 @@ ---TEST-- -SixelEncoder::encode() member function ---SKIPIF-- - ---FILE-- - ---EXPECT-- -OK \ No newline at end of file diff --git a/php/sixel/tests/SixelEncoder__setopt.phpt b/php/sixel/tests/SixelEncoder__setopt.phpt deleted file mode 100644 index 630432b0..00000000 --- a/php/sixel/tests/SixelEncoder__setopt.phpt +++ /dev/null @@ -1,14 +0,0 @@ ---TEST-- -SixelEncoder::setopt() member function ---SKIPIF-- - ---FILE-- - ---EXPECT-- -OK \ No newline at end of file From 361c32e572ecbb7263b474c6f4e3b297357cc466 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 00:39:26 +0900 Subject: [PATCH 345/451] perl: change module name: Image::Sixel -> Image::LibSIXEL --- Build.PL | 6 +++--- MANIFEST | 10 +++++----- META.yml | 16 ++++++++-------- README.md | 10 +++++----- lib/Image/{Sixel.pm => LibSIXEL.pm} | 26 +++++++++++++------------- lib/Image/{Sixel.xs => LibSIXEL.xs} | 6 +++--- lib/Image/LibSIXEL/Decoder.pm | 4 ++++ lib/Image/LibSIXEL/Encoder.pm | 4 ++++ lib/Image/Sixel/Decoder.pm | 4 ---- lib/Image/Sixel/Encoder.pm | 4 ---- t/{sixel.t => libsixel.t} | 14 +++++++------- 11 files changed, 52 insertions(+), 52 deletions(-) rename lib/Image/{Sixel.pm => LibSIXEL.pm} (52%) rename lib/Image/{Sixel.xs => LibSIXEL.xs} (94%) create mode 100644 lib/Image/LibSIXEL/Decoder.pm create mode 100644 lib/Image/LibSIXEL/Encoder.pm delete mode 100644 lib/Image/Sixel/Decoder.pm delete mode 100644 lib/Image/Sixel/Encoder.pm rename t/{sixel.t => libsixel.t} (77%) diff --git a/Build.PL b/Build.PL index 68a5229e..b5d0fbaf 100644 --- a/Build.PL +++ b/Build.PL @@ -1,7 +1,7 @@ use Module::Build; my $builder = Module::Build->new ( - module_name => 'Image::Sixel', + module_name => 'Image::LibSIXEL', license => 'mit', dist_abstract => 'libsixel binding for Perl', @@ -15,8 +15,8 @@ my $builder = Module::Build->new ( script_files => [ ], - extra_compiler_flags => scalar `pkg-config libsixel --cflags` . ' -Wall -Wextra', - extra_linker_flags => scalar `pkg-config libsixel --libs`, + extra_compiler_flags => scalar `libsixel-config --cflags` . ' -Wall -Wextra', + extra_linker_flags => scalar `libsixel-config --libs`, create_makefile_pl => 'passthrough', ); diff --git a/MANIFEST b/MANIFEST index 484d5a8f..443804b0 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,9 +1,9 @@ Build.PL -lib/Image/Sixel.xs -lib/Image/Sixel.pm -lib/Image/Sixel/Encoder.pm -lib/Image/Sixel/Decoder.pm -t/sixel.t +lib/Image/LibSIXEL.xs +lib/Image/LibSIXEL.pm +lib/Image/LibSIXEL/Encoder.pm +lib/Image/LibSIXEL/Decoder.pm +t/libsixel.t Makefile.PL MANIFEST This list of files MANIFEST.SKIP diff --git a/META.yml b/META.yml index bcca4ae1..83d0f9ca 100644 --- a/META.yml +++ b/META.yml @@ -1,7 +1,7 @@ --- abstract: 'libsixel binding for Perl' author: - - unknown + - Hayaki Saito build_requires: ExtUtils::CBuilder: 0 Test::More: 0 @@ -11,14 +11,14 @@ license: mit meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 -name: Image-Sixel +name: Image-LibSIXEL provides: - Image::Sixel: - file: lib/Image/Sixel.pm - version: 0.0_1 - Image::Sixel::Encoder: - file: lib/Image/Sixel/Encoder.pm + Image::LibSIXEL: + file: lib/Image/LibSIXEL.pm + version: 0.01 + Image::LibSIXEL::Encoder: + file: lib/Image/LibSIXEL/Encoder.pm version: 0 resources: license: http://opensource.org/licenses/mit-license.php -version: 0.0_1 +version: 0.01 diff --git a/README.md b/README.md index 69d42edb..456411b5 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@ # NAME -Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) +Image::LibSIXEL - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) # SYNOPSIS ```perl -use Image::Sixel; +use Image::LibSIXEL; -$encoder = Image::Sixel::Encoder->new(); +$encoder = Image::LibSIXEL::Encoder->new(); $encoder->setopt("w", 400); $encoder->setopt("p", 16); $encoder->encode("images/egret.jpg"); ``` ```perl -use Image::Sixel; +use Image::LibSIXEL; -$decoder = Image::Sixel::Decoder->new(); +$decoder = Image::LibSIXEL::Decoder->new(); $decoder->setopt("i", "images/egret.six"); $decoder->setopt("o", "egret.png"); $decoder->decode(); diff --git a/lib/Image/Sixel.pm b/lib/Image/LibSIXEL.pm similarity index 52% rename from lib/Image/Sixel.pm rename to lib/Image/LibSIXEL.pm index 3335b359..4f58006c 100644 --- a/lib/Image/Sixel.pm +++ b/lib/Image/LibSIXEL.pm @@ -1,9 +1,9 @@ -package Image::Sixel; +package Image::LibSIXEL; use 5.012001; -our $VERSION = '0.0_1'; +our $VERSION = '0.01'; require XSLoader; -XSLoader::load('Image::Sixel', $VERSION); +XSLoader::load('Image::LibSIXEL', $VERSION); 1; @@ -11,18 +11,18 @@ __END__ =head1 NAME -Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) +Image::LibSIXEL - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) =head1 SYNOPSIS - use Image::Sixel; + use Image::LibSIXEL; - $encoder = Image::Sixel::Encoder->new(); + $encoder = Image::LibSIXEL::Encoder->new(); $encoder->setopt("w", 400); $encoder->setopt("p", 16); $encoder->encode("images/egret.jpg"); - $decoder = Image::Sixel::Decoder->new(); + $decoder = Image::LibSIXEL::Decoder->new(); $decoder->setopt("i", "images/egret.six"); $decoder->setopt("o", "egret.png"); $decoder->decode(); @@ -34,23 +34,23 @@ http://saitoha.github.io/libsixel/ =head2 Class Methods -=Image::Sixel::Encoder->new +=Image::LibSIXEL::Encoder->new Create Encoder object -=Image::Sixel::Decoder->new +=Image::LibSIXEL::Decoder->new Create Decoder object =head2 Object Methods -=Image::Sixel::Encoder->setopt +=Image::LibSIXEL::Encoder->setopt -=Image::Sixel::Encoder->encode +=Image::LibSIXEL::Encoder->encode -=Image::Sixel::Decoder->setopt +=Image::LibSIXEL::Decoder->setopt -=Image::Sixel::Decoder->decode +=Image::LibSIXEL::Decoder->decode =head1 AUTHOR diff --git a/lib/Image/Sixel.xs b/lib/Image/LibSIXEL.xs similarity index 94% rename from lib/Image/Sixel.xs rename to lib/Image/LibSIXEL.xs index 1e56940e..e005447e 100644 --- a/lib/Image/Sixel.xs +++ b/lib/Image/LibSIXEL.xs @@ -6,7 +6,7 @@ #include "ppport.h" #include -MODULE = Image::Sixel PACKAGE = Image::Sixel +MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL void _sixel(...) @@ -16,7 +16,7 @@ PPCODE: XSRETURN(0); } -MODULE = Image::Sixel PACKAGE = Image::Sixel::Encoder PREFIX = encoder_ +MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Encoder PREFIX = encoder_ SV * encoder_new(void) @@ -101,7 +101,7 @@ encoder_DESTROY(...) -MODULE = Image::Sixel PACKAGE = Image::Sixel::Decoder PREFIX = decoder_ +MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Decoder PREFIX = decoder_ SV * decoder_new(void) diff --git a/lib/Image/LibSIXEL/Decoder.pm b/lib/Image/LibSIXEL/Decoder.pm new file mode 100644 index 00000000..cfcf6432 --- /dev/null +++ b/lib/Image/LibSIXEL/Decoder.pm @@ -0,0 +1,4 @@ +package Image::LibSIXEL::Decoder; +use Image::LibSIXEL; + +1; diff --git a/lib/Image/LibSIXEL/Encoder.pm b/lib/Image/LibSIXEL/Encoder.pm new file mode 100644 index 00000000..0c1fc3d6 --- /dev/null +++ b/lib/Image/LibSIXEL/Encoder.pm @@ -0,0 +1,4 @@ +package Image::LibSIXEL::Encoder; +use Image::LibSIXEL; + +1; diff --git a/lib/Image/Sixel/Decoder.pm b/lib/Image/Sixel/Decoder.pm deleted file mode 100644 index 6c78a052..00000000 --- a/lib/Image/Sixel/Decoder.pm +++ /dev/null @@ -1,4 +0,0 @@ -package Image::Sixel::Decoder; -use Image::Sixel; - -1; diff --git a/lib/Image/Sixel/Encoder.pm b/lib/Image/Sixel/Encoder.pm deleted file mode 100644 index a21ba473..00000000 --- a/lib/Image/Sixel/Encoder.pm +++ /dev/null @@ -1,4 +0,0 @@ -package Image::Sixel::Encoder; -use Image::Sixel; - -1; diff --git a/t/sixel.t b/t/libsixel.t similarity index 77% rename from t/sixel.t rename to t/libsixel.t index 02f29a15..cc6f5cb5 100644 --- a/t/sixel.t +++ b/t/libsixel.t @@ -10,7 +10,7 @@ use warnings; use Test::More; #use Test::More; -BEGIN { use_ok('Image::Sixel') }; +BEGIN { use_ok('Image::LibSIXEL') }; BEGIN { unlink "egret.six", "egret.png"; }; @@ -21,9 +21,9 @@ BEGIN { # its man page ( perldoc Test::More ) for help writing this test script. subtest 'encoder' => sub { - use Image::Sixel; - my $encoder = Image::Sixel::Encoder->new(); - isa_ok $encoder, 'Image::Sixel::Encoder'; + use Image::LibSIXEL; + my $encoder = Image::LibSIXEL::Encoder->new(); + isa_ok $encoder, 'Image::LibSIXEL::Encoder'; can_ok $encoder, 'setopt', 'encode'; $encoder->setopt("o", "egret.six"); $encoder->setopt("w", "200"); @@ -32,9 +32,9 @@ subtest 'encoder' => sub { }; subtest 'decoder' => sub { - use Image::Sixel; - my $decoder = Image::Sixel::Decoder->new; - isa_ok $decoder, 'Image::Sixel::Decoder'; + use Image::LibSIXEL; + my $decoder = Image::LibSIXEL::Decoder->new; + isa_ok $decoder, 'Image::LibSIXEL::Decoder'; can_ok $decoder, 'setopt', 'decode'; $decoder->setopt("i", "images/egret.six"); $decoder->setopt("o", "egret.png"); From 307873fe513f9ffb0cecc1a45f13f88a06facc8d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 00:39:26 +0900 Subject: [PATCH 346/451] perl: change module name: Image::Sixel -> Image::LibSIXEL --- perl/Build.PL | 6 +++--- perl/MANIFEST | 10 ++++----- perl/META.yml | 16 +++++++-------- perl/README.md | 10 ++++----- perl/lib/Image/{Sixel.pm => LibSIXEL.pm} | 26 ++++++++++++------------ perl/lib/Image/{Sixel.xs => LibSIXEL.xs} | 6 +++--- perl/lib/Image/LibSIXEL/Decoder.pm | 4 ++++ perl/lib/Image/LibSIXEL/Encoder.pm | 4 ++++ perl/lib/Image/Sixel/Decoder.pm | 4 ---- perl/lib/Image/Sixel/Encoder.pm | 4 ---- perl/t/{sixel.t => libsixel.t} | 14 ++++++------- 11 files changed, 52 insertions(+), 52 deletions(-) rename perl/lib/Image/{Sixel.pm => LibSIXEL.pm} (52%) rename perl/lib/Image/{Sixel.xs => LibSIXEL.xs} (94%) create mode 100644 perl/lib/Image/LibSIXEL/Decoder.pm create mode 100644 perl/lib/Image/LibSIXEL/Encoder.pm delete mode 100644 perl/lib/Image/Sixel/Decoder.pm delete mode 100644 perl/lib/Image/Sixel/Encoder.pm rename perl/t/{sixel.t => libsixel.t} (77%) diff --git a/perl/Build.PL b/perl/Build.PL index 68a5229e..b5d0fbaf 100644 --- a/perl/Build.PL +++ b/perl/Build.PL @@ -1,7 +1,7 @@ use Module::Build; my $builder = Module::Build->new ( - module_name => 'Image::Sixel', + module_name => 'Image::LibSIXEL', license => 'mit', dist_abstract => 'libsixel binding for Perl', @@ -15,8 +15,8 @@ my $builder = Module::Build->new ( script_files => [ ], - extra_compiler_flags => scalar `pkg-config libsixel --cflags` . ' -Wall -Wextra', - extra_linker_flags => scalar `pkg-config libsixel --libs`, + extra_compiler_flags => scalar `libsixel-config --cflags` . ' -Wall -Wextra', + extra_linker_flags => scalar `libsixel-config --libs`, create_makefile_pl => 'passthrough', ); diff --git a/perl/MANIFEST b/perl/MANIFEST index 484d5a8f..443804b0 100644 --- a/perl/MANIFEST +++ b/perl/MANIFEST @@ -1,9 +1,9 @@ Build.PL -lib/Image/Sixel.xs -lib/Image/Sixel.pm -lib/Image/Sixel/Encoder.pm -lib/Image/Sixel/Decoder.pm -t/sixel.t +lib/Image/LibSIXEL.xs +lib/Image/LibSIXEL.pm +lib/Image/LibSIXEL/Encoder.pm +lib/Image/LibSIXEL/Decoder.pm +t/libsixel.t Makefile.PL MANIFEST This list of files MANIFEST.SKIP diff --git a/perl/META.yml b/perl/META.yml index bcca4ae1..83d0f9ca 100644 --- a/perl/META.yml +++ b/perl/META.yml @@ -1,7 +1,7 @@ --- abstract: 'libsixel binding for Perl' author: - - unknown + - Hayaki Saito build_requires: ExtUtils::CBuilder: 0 Test::More: 0 @@ -11,14 +11,14 @@ license: mit meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 -name: Image-Sixel +name: Image-LibSIXEL provides: - Image::Sixel: - file: lib/Image/Sixel.pm - version: 0.0_1 - Image::Sixel::Encoder: - file: lib/Image/Sixel/Encoder.pm + Image::LibSIXEL: + file: lib/Image/LibSIXEL.pm + version: 0.01 + Image::LibSIXEL::Encoder: + file: lib/Image/LibSIXEL/Encoder.pm version: 0 resources: license: http://opensource.org/licenses/mit-license.php -version: 0.0_1 +version: 0.01 diff --git a/perl/README.md b/perl/README.md index 69d42edb..456411b5 100644 --- a/perl/README.md +++ b/perl/README.md @@ -1,22 +1,22 @@ # NAME -Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) +Image::LibSIXEL - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) # SYNOPSIS ```perl -use Image::Sixel; +use Image::LibSIXEL; -$encoder = Image::Sixel::Encoder->new(); +$encoder = Image::LibSIXEL::Encoder->new(); $encoder->setopt("w", 400); $encoder->setopt("p", 16); $encoder->encode("images/egret.jpg"); ``` ```perl -use Image::Sixel; +use Image::LibSIXEL; -$decoder = Image::Sixel::Decoder->new(); +$decoder = Image::LibSIXEL::Decoder->new(); $decoder->setopt("i", "images/egret.six"); $decoder->setopt("o", "egret.png"); $decoder->decode(); diff --git a/perl/lib/Image/Sixel.pm b/perl/lib/Image/LibSIXEL.pm similarity index 52% rename from perl/lib/Image/Sixel.pm rename to perl/lib/Image/LibSIXEL.pm index 3335b359..4f58006c 100644 --- a/perl/lib/Image/Sixel.pm +++ b/perl/lib/Image/LibSIXEL.pm @@ -1,9 +1,9 @@ -package Image::Sixel; +package Image::LibSIXEL; use 5.012001; -our $VERSION = '0.0_1'; +our $VERSION = '0.01'; require XSLoader; -XSLoader::load('Image::Sixel', $VERSION); +XSLoader::load('Image::LibSIXEL', $VERSION); 1; @@ -11,18 +11,18 @@ __END__ =head1 NAME -Image::Sixel - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) +Image::LibSIXEL - The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec) =head1 SYNOPSIS - use Image::Sixel; + use Image::LibSIXEL; - $encoder = Image::Sixel::Encoder->new(); + $encoder = Image::LibSIXEL::Encoder->new(); $encoder->setopt("w", 400); $encoder->setopt("p", 16); $encoder->encode("images/egret.jpg"); - $decoder = Image::Sixel::Decoder->new(); + $decoder = Image::LibSIXEL::Decoder->new(); $decoder->setopt("i", "images/egret.six"); $decoder->setopt("o", "egret.png"); $decoder->decode(); @@ -34,23 +34,23 @@ http://saitoha.github.io/libsixel/ =head2 Class Methods -=Image::Sixel::Encoder->new +=Image::LibSIXEL::Encoder->new Create Encoder object -=Image::Sixel::Decoder->new +=Image::LibSIXEL::Decoder->new Create Decoder object =head2 Object Methods -=Image::Sixel::Encoder->setopt +=Image::LibSIXEL::Encoder->setopt -=Image::Sixel::Encoder->encode +=Image::LibSIXEL::Encoder->encode -=Image::Sixel::Decoder->setopt +=Image::LibSIXEL::Decoder->setopt -=Image::Sixel::Decoder->decode +=Image::LibSIXEL::Decoder->decode =head1 AUTHOR diff --git a/perl/lib/Image/Sixel.xs b/perl/lib/Image/LibSIXEL.xs similarity index 94% rename from perl/lib/Image/Sixel.xs rename to perl/lib/Image/LibSIXEL.xs index 1e56940e..e005447e 100644 --- a/perl/lib/Image/Sixel.xs +++ b/perl/lib/Image/LibSIXEL.xs @@ -6,7 +6,7 @@ #include "ppport.h" #include -MODULE = Image::Sixel PACKAGE = Image::Sixel +MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL void _sixel(...) @@ -16,7 +16,7 @@ PPCODE: XSRETURN(0); } -MODULE = Image::Sixel PACKAGE = Image::Sixel::Encoder PREFIX = encoder_ +MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Encoder PREFIX = encoder_ SV * encoder_new(void) @@ -101,7 +101,7 @@ encoder_DESTROY(...) -MODULE = Image::Sixel PACKAGE = Image::Sixel::Decoder PREFIX = decoder_ +MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Decoder PREFIX = decoder_ SV * decoder_new(void) diff --git a/perl/lib/Image/LibSIXEL/Decoder.pm b/perl/lib/Image/LibSIXEL/Decoder.pm new file mode 100644 index 00000000..cfcf6432 --- /dev/null +++ b/perl/lib/Image/LibSIXEL/Decoder.pm @@ -0,0 +1,4 @@ +package Image::LibSIXEL::Decoder; +use Image::LibSIXEL; + +1; diff --git a/perl/lib/Image/LibSIXEL/Encoder.pm b/perl/lib/Image/LibSIXEL/Encoder.pm new file mode 100644 index 00000000..0c1fc3d6 --- /dev/null +++ b/perl/lib/Image/LibSIXEL/Encoder.pm @@ -0,0 +1,4 @@ +package Image::LibSIXEL::Encoder; +use Image::LibSIXEL; + +1; diff --git a/perl/lib/Image/Sixel/Decoder.pm b/perl/lib/Image/Sixel/Decoder.pm deleted file mode 100644 index 6c78a052..00000000 --- a/perl/lib/Image/Sixel/Decoder.pm +++ /dev/null @@ -1,4 +0,0 @@ -package Image::Sixel::Decoder; -use Image::Sixel; - -1; diff --git a/perl/lib/Image/Sixel/Encoder.pm b/perl/lib/Image/Sixel/Encoder.pm deleted file mode 100644 index a21ba473..00000000 --- a/perl/lib/Image/Sixel/Encoder.pm +++ /dev/null @@ -1,4 +0,0 @@ -package Image::Sixel::Encoder; -use Image::Sixel; - -1; diff --git a/perl/t/sixel.t b/perl/t/libsixel.t similarity index 77% rename from perl/t/sixel.t rename to perl/t/libsixel.t index 02f29a15..cc6f5cb5 100644 --- a/perl/t/sixel.t +++ b/perl/t/libsixel.t @@ -10,7 +10,7 @@ use warnings; use Test::More; #use Test::More; -BEGIN { use_ok('Image::Sixel') }; +BEGIN { use_ok('Image::LibSIXEL') }; BEGIN { unlink "egret.six", "egret.png"; }; @@ -21,9 +21,9 @@ BEGIN { # its man page ( perldoc Test::More ) for help writing this test script. subtest 'encoder' => sub { - use Image::Sixel; - my $encoder = Image::Sixel::Encoder->new(); - isa_ok $encoder, 'Image::Sixel::Encoder'; + use Image::LibSIXEL; + my $encoder = Image::LibSIXEL::Encoder->new(); + isa_ok $encoder, 'Image::LibSIXEL::Encoder'; can_ok $encoder, 'setopt', 'encode'; $encoder->setopt("o", "egret.six"); $encoder->setopt("w", "200"); @@ -32,9 +32,9 @@ subtest 'encoder' => sub { }; subtest 'decoder' => sub { - use Image::Sixel; - my $decoder = Image::Sixel::Decoder->new; - isa_ok $decoder, 'Image::Sixel::Decoder'; + use Image::LibSIXEL; + my $decoder = Image::LibSIXEL::Decoder->new; + isa_ok $decoder, 'Image::LibSIXEL::Decoder'; can_ok $decoder, 'setopt', 'decode'; $decoder->setopt("i", "images/egret.six"); $decoder->setopt("o", "egret.png"); From 41b7f1ce350e5c7a6de3dafed3214ff07c07e140 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 02:16:08 +0900 Subject: [PATCH 347/451] Add missing files: minil.toml and Changes --- Build.PL | 27 +++++++-------------- Changes | 6 +++++ META.json | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 57 +++++++++++++++++++------------------------- minil.toml | 4 ++++ 5 files changed, 113 insertions(+), 51 deletions(-) create mode 100644 Changes create mode 100644 META.json create mode 100644 minil.toml diff --git a/Build.PL b/Build.PL index b5d0fbaf..16855c4c 100644 --- a/Build.PL +++ b/Build.PL @@ -1,23 +1,12 @@ -use Module::Build; +# ========================================================================= +# THIS FILE IS AUTOMATICALLY GENERATED BY MINILLA. +# DO NOT EDIT DIRECTLY. +# ========================================================================= -my $builder = Module::Build->new ( - module_name => 'Image::LibSIXEL', - license => 'mit', - dist_abstract => 'libsixel binding for Perl', +use 5.008_001; +use strict; - requires => { - }, +use Module::Build::Tiny 0.035; - build_requires => { - 'Test::More' => 0, - }, +Build_PL(); - script_files => [ - ], - - extra_compiler_flags => scalar `libsixel-config --cflags` . ' -Wall -Wextra', - extra_linker_flags => scalar `libsixel-config --libs`, - create_makefile_pl => 'passthrough', -); - -$builder->create_build_script(); diff --git a/Changes b/Changes new file mode 100644 index 00000000..6148196c --- /dev/null +++ b/Changes @@ -0,0 +1,6 @@ +Revision history for Perl extension Image::LibSIXEL + +{{$NEXT}} + + - initial version + diff --git a/META.json b/META.json new file mode 100644 index 00000000..be0c94d6 --- /dev/null +++ b/META.json @@ -0,0 +1,70 @@ +{ + "abstract" : "The Perl interface for libsixel (A lightweight, fast implementation of DEC SIXEL graphics codec)", + "author" : [ + "Hayaki Saito " + ], + "dynamic_config" : 0, + "generated_by" : "Minilla/v2.4.1, CPAN::Meta::Converter version 2.150001", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Image-LibSIXEL", + "no_index" : { + "directory" : [ + "t", + "xt", + "inc", + "share", + "eg", + "examples", + "author", + "builder" + ] + }, + "prereqs" : { + "configure" : { + "requires" : { + "Module::Build::Tiny" : "0.035" + } + }, + "develop" : { + "requires" : { + "Test::CPAN::Meta" : "0", + "Test::MinimumVersion::Fast" : "0.04", + "Test::PAUSE::Permissions" : "0.04", + "Test::Pod" : "1.41", + "Test::Spellunker" : "v0.2.7" + } + }, + "runtime" : { + "requires" : { + "perl" : "5.012001" + } + }, + "test" : { + "requires" : { + "Test::More" : "0.98" + } + } + }, + "release_status" : "unstable", + "resources" : { + "bugtracker" : { + "web" : "https://github.com/saitoha/libsixel-perl/issues" + }, + "homepage" : "https://github.com/saitoha/libsixel-perl", + "repository" : { + "type" : "git", + "url" : "git://github.com/saitoha/libsixel-perl.git", + "web" : "https://github.com/saitoha/libsixel-perl" + } + }, + "version" : "0.01", + "x_contributors" : [ + "Hayaki Saito " + ] +} diff --git a/README.md b/README.md index 456411b5..0e46785e 100644 --- a/README.md +++ b/README.md @@ -4,52 +4,45 @@ Image::LibSIXEL - The Perl interface for libsixel (A lightweight, fast implement # SYNOPSIS -```perl -use Image::LibSIXEL; + use Image::LibSIXEL; + + $encoder = Image::LibSIXEL::Encoder->new(); + $encoder->setopt("w", 400); + $encoder->setopt("p", 16); + $encoder->encode("images/egret.jpg"); + + $decoder = Image::LibSIXEL::Decoder->new(); + $decoder->setopt("i", "images/egret.six"); + $decoder->setopt("o", "egret.png"); + $decoder->decode(); -$encoder = Image::LibSIXEL::Encoder->new(); -$encoder->setopt("w", 400); -$encoder->setopt("p", 16); -$encoder->encode("images/egret.jpg"); -``` +# DESCRIPTION -```perl -use Image::LibSIXEL; +This perl module provides wrapper objects for part of libsixel interface. +http://saitoha.github.io/libsixel/ -$decoder = Image::LibSIXEL::Decoder->new(); -$decoder->setopt("i", "images/egret.six"); -$decoder->setopt("o", "egret.png"); -$decoder->decode(); -``` +## Class Methods -# DESCRIPTION +=Image::LibSIXEL::Encoder->new -This perl module provides wrapper objects for part of [libsixel](http://saitoha.github.io/libsixel/) interface. +Create Encoder object +=Image::LibSIXEL::Decoder->new -# LICENSE +Create Decoder object -Copyright (c) 2014,2015 Hayaki Saito +## Object Methods -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +=Image::LibSIXEL::Encoder->setopt -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +=Image::LibSIXEL::Encoder->encode -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +=Image::LibSIXEL::Decoder->setopt +=Image::LibSIXEL::Decoder->decode # AUTHOR Hayaki Saito +# SEE ALSO diff --git a/minil.toml b/minil.toml new file mode 100644 index 00000000..565d777b --- /dev/null +++ b/minil.toml @@ -0,0 +1,4 @@ +name = "Image-LibSIXEL" +# badges = ["travis"] +module_maker="ModuleBuildTiny" + From 63a2beb1e93e48360caae91f1ce95bea4adf392a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 02:33:53 +0900 Subject: [PATCH 348/451] Remove include derective "ppport.h" --- lib/Image/LibSIXEL.xs | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Image/LibSIXEL.xs b/lib/Image/LibSIXEL.xs index e005447e..0bba9252 100644 --- a/lib/Image/LibSIXEL.xs +++ b/lib/Image/LibSIXEL.xs @@ -3,7 +3,6 @@ #include "perl.h" #include "XSUB.h" -#include "ppport.h" #include MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL From 5a8bb91896e25512efa2ce2aee5198e102622c76 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 02:35:32 +0900 Subject: [PATCH 349/451] Remove debugging code --- lib/Image/LibSIXEL.xs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib/Image/LibSIXEL.xs b/lib/Image/LibSIXEL.xs index 0bba9252..bc441630 100644 --- a/lib/Image/LibSIXEL.xs +++ b/lib/Image/LibSIXEL.xs @@ -5,16 +5,6 @@ #include -MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL - -void -_sixel(...) -PPCODE: -{ - PerlIO_printf(PerlIO_stdout(), "Hello, world!\n"); - XSRETURN(0); -} - MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Encoder PREFIX = encoder_ SV * From 647243befd78568265e9759261f9a1d804b90855 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 02:37:13 +0900 Subject: [PATCH 350/451] Update Build.PL for linking to libsixel --- Build.PL | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Build.PL b/Build.PL index 16855c4c..fa223e7b 100644 --- a/Build.PL +++ b/Build.PL @@ -6,7 +6,27 @@ use 5.008_001; use strict; -use Module::Build::Tiny 0.035; +use Module::Build; -Build_PL(); +my $builder = Module::Build->new ( + module_name => 'Image::LibSIXEL', + license => 'mit', + dist_abstract => 'libsixel binding for Perl', + + requires => { + }, + + build_requires => { + 'Test::More' => 0, + }, + + script_files => [ + ], + + extra_compiler_flags => scalar `libsixel-config --cflags` . ' -Wall -Wextra', + extra_linker_flags => scalar `libsixel-config --libs`, + create_makefile_pl => 'passthrough', +); + +$builder->create_build_script(); From 8039d47115c7395376b2727dcd30a1718fa80fbd Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 26 Jun 2015 02:46:05 +0900 Subject: [PATCH 351/451] Update META.json/META.yml --- META.json | 6 ++++++ META.yml | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/META.json b/META.json index be0c94d6..eb6959bc 100644 --- a/META.json +++ b/META.json @@ -31,6 +31,12 @@ "Module::Build::Tiny" : "0.035" } }, + "build" : { + "requires" : { + "ExtUtils::CBuilder" : "0", + "Test::More" : "0" + } + }, "develop" : { "requires" : { "Test::CPAN::Meta" : "0", diff --git a/META.yml b/META.yml index 83d0f9ca..6bd906ef 100644 --- a/META.yml +++ b/META.yml @@ -20,5 +20,9 @@ provides: file: lib/Image/LibSIXEL/Encoder.pm version: 0 resources: + bugtracker: https://github.com/saitoha/libsixel-perl/issues + homepage: https://github.com/saitoha/libsixel-perl license: http://opensource.org/licenses/mit-license.php version: 0.01 +x_contributors: + - 'Hayaki Saito ' From 2f7478d0f05fa26a64d679bc39b58fc5d3a834c7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 27 Jun 2015 22:50:02 +0900 Subject: [PATCH 352/451] Use builtin functions instead of sprintf() --- src/tosixel.c | 177 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 108 insertions(+), 69 deletions(-) diff --git a/src/tosixel.c b/src/tosixel.c index a375509d..f238bdfa 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -89,6 +89,41 @@ sixel_advance(sixel_output_t *context, int nwrite) } +static void +sixel_putc(char *buffer, unsigned char value) +{ + *buffer = value; +} + + +static void +sixel_puts(char *buffer, char *value, int size) +{ + memcpy(buffer, value, size); +} + + +static int +sixel_putnum_impl(char *buffer, long value, int pos) +{ + ldiv_t r; + + r = ldiv(value, 10); + if (r.quot > 0) { + pos = sixel_putnum_impl(buffer, r.quot, pos); + } + *(buffer + pos) = '0' + r.rem; + return pos + 1; +} + + +static int +sixel_putnum(char *buffer, unsigned int value) +{ + return sixel_putnum_impl(buffer, value, 0); +} + + static SIXELSTATUS sixel_put_flash(sixel_output_t *const context) { @@ -97,24 +132,22 @@ sixel_put_flash(sixel_output_t *const context) #if defined(USE_VT240) /* VT240 Max 255 ? */ while (context->save_count > 255) { - nwrite = spritf((char *)context->buffer + context->pos, - "!255%c", context->save_pixel); - if (nwrite <= 0) { - return (-1); - } - sixel_advance(context, nwrite); + sixel_putstr(context->buffer + context->pos, "!255", 4); + sixel_advance(context, 4); + sixel_putc((char *)context->buffer + context->pos, context->save_pixel); + sixel_advance(context, 1); context->save_count -= 255; } #endif /* defined(USE_VT240) */ if (context->save_count > 3) { /* DECGRI Graphics Repeat Introducer ! Pn Ch */ - nwrite = sprintf((char *)context->buffer + context->pos, - "!%d%c", context->save_count, context->save_pixel); - if (nwrite <= 0) { - return (-1); - } + sixel_putc((char *)context->buffer + context->pos, '!'); + sixel_advance(context, 1); + nwrite = sixel_putnum((char *)context->buffer + context->pos, context->save_count); sixel_advance(context, nwrite); + sixel_putc((char *)context->buffer + context->pos, context->save_pixel); + sixel_advance(context, 1); } else { for (n = 0; n < context->save_count; n++) { context->buffer[context->pos] = (char)context->save_pixel; @@ -193,11 +226,9 @@ sixel_put_node(sixel_output_t *const context, if (ncolors != 2 || keycolor == -1) { /* designate palette index */ if (context->active_palette != np->pal) { - nwrite = sprintf((char *)context->buffer + context->pos, - "#%d", np->pal); - if (nwrite <= 0) { - return status; - } + sixel_putc((char *)context->buffer + context->pos, '#'); + sixel_advance(context, 1); + nwrite = sixel_putnum((char *)context->buffer + context->pos, np->pal); sixel_advance(context, nwrite); context->active_palette = np->pal; } @@ -244,14 +275,14 @@ sixel_encode_header(int width, int height, sixel_output_t *context) if (!context->skip_dcs_envelope) { if (context->has_8bit_control) { - nwrite = sprintf((char *)context->buffer, DCS_START_8BIT); + sixel_puts((char *)context->buffer + context->pos, + DCS_START_8BIT, DCS_START_8BIT_SIZE); + sixel_advance(context, DCS_START_8BIT_SIZE); } else { - nwrite = sprintf((char *)context->buffer, DCS_START_7BIT); + sixel_puts((char *)context->buffer + context->pos, + DCS_START_7BIT, DCS_START_7BIT_SIZE); + sixel_advance(context, DCS_START_7BIT_SIZE); } - if (nwrite <= 0) { - return status; - } - sixel_advance(context, nwrite); } if (p[2] == 0) { @@ -265,42 +296,33 @@ sixel_encode_header(int width, int height, sixel_output_t *context) } if (pcount > 0) { - nwrite = sprintf((char *)context->buffer + context->pos, - "%d", p[0]); - if (nwrite <= 0) { - return status; - } + nwrite = sixel_putnum((char *)context->buffer + context->pos, p[0]); sixel_advance(context, nwrite); if (pcount > 1) { - nwrite = sprintf((char *)context->buffer + context->pos, - ";%d", p[1]); - if (nwrite <= 0) { - return status; - } + sixel_putc((char *)context->buffer + context->pos, ';'); + sixel_advance(context, 1); + nwrite = sixel_putnum((char *)context->buffer + context->pos, p[1]); sixel_advance(context, nwrite); if (pcount > 2) { - nwrite = sprintf((char *)context->buffer + context->pos, - ";%d", p[2]); - if (nwrite <= 0) { - return status; - } + sixel_putc((char *)context->buffer + context->pos, ';'); + sixel_advance(context, 1); + nwrite = sixel_putnum((char *)context->buffer + context->pos, p[2]); sixel_advance(context, nwrite); } } } - nwrite = sprintf((char *)context->buffer + context->pos, "q"); - if (nwrite <= 0) { - return status; - } - sixel_advance(context, nwrite); + sixel_putc((char *)context->buffer + context->pos, 'q'); + sixel_advance(context, 1); if (use_raster_attributes) { - nwrite = sprintf((char *)context->buffer + context->pos, - "\"1;1;%d;%d", width, height); - if (nwrite <= 0) { - return status; - } + sixel_puts((char *)context->buffer + context->pos, "\"1;1;", 5); + sixel_advance(context, 5); + nwrite = sixel_putnum((char *)context->buffer + context->pos, width); + sixel_advance(context, nwrite); + sixel_putc((char *)context->buffer + context->pos, ';'); + sixel_advance(context, 1); + nwrite = sixel_putnum((char *)context->buffer + context->pos, height); sixel_advance(context, nwrite); } @@ -323,15 +345,24 @@ output_rgb_palette_definition( if (n != keycolor) { /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ - nwrite = sprintf((char *)output->buffer + output->pos, - "#%d;2;%d;%d;%d", - n, - (palette[n * 3 + 0] * 100 + 127) / 255, - (palette[n * 3 + 1] * 100 + 127) / 255, - (palette[n * 3 + 2] * 100 + 127) / 255); - if (nwrite <= 0) { - return status; - } + sixel_putc((char *)output->buffer + output->pos, '#'); + sixel_advance(output, 1); + nwrite = sixel_putnum((char *)output->buffer + output->pos, n); + sixel_advance(output, nwrite); + sixel_puts((char *)output->buffer + output->pos, ";2;", 3); + sixel_advance(output, 3); + nwrite = sixel_putnum((char *)output->buffer + output->pos, + (palette[n * 3 + 0] * 100 + 127) / 255); + sixel_advance(output, nwrite); + sixel_putc((char *)output->buffer + output->pos, ';'); + sixel_advance(output, 1); + nwrite = sixel_putnum((char *)output->buffer + output->pos, + (palette[n * 3 + 1] * 100 + 127) / 255); + sixel_advance(output, nwrite); + sixel_putc((char *)output->buffer + output->pos, ';'); + sixel_advance(output, 1); + nwrite = sixel_putnum((char *)output->buffer + output->pos, + (palette[n * 3 + 2] * 100 + 127) / 255); sixel_advance(output, nwrite); } @@ -386,11 +417,21 @@ output_hls_palette_definition( } } /* DECGCI Graphics Color Introducer # Pc ; Pu; Px; Py; Pz */ - nwrite = sprintf((char *)output->buffer + output->pos, - "#%d;1;%d;%d;%d", n, h, l, s); - if (nwrite <= 0) { - return status; - } + sixel_putc((char *)output->buffer + output->pos, '#'); + sixel_advance(output, 1); + nwrite = sixel_putnum((char *)output->buffer + output->pos, n); + sixel_advance(output, nwrite); + sixel_puts((char *)output->buffer + output->pos, ";1;", 3); + sixel_advance(output, 3); + nwrite = sixel_putnum((char *)output->buffer + output->pos, h); + sixel_advance(output, nwrite); + sixel_putc((char *)output->buffer + output->pos, ';'); + sixel_advance(output, 1); + nwrite = sixel_putnum((char *)output->buffer + output->pos, l); + sixel_advance(output, nwrite); + sixel_putc((char *)output->buffer + output->pos, ';'); + sixel_advance(output, 1); + nwrite = sixel_putnum((char *)output->buffer + output->pos, s); sixel_advance(output, nwrite); } @@ -624,18 +665,17 @@ static SIXELSTATUS sixel_encode_footer(sixel_output_t *context) { SIXELSTATUS status = SIXEL_FALSE; - int nwrite; if (!context->skip_dcs_envelope && !context->penetrate_multiplexer) { if (context->has_8bit_control) { - nwrite = sprintf((char *)context->buffer + context->pos, DCS_END_8BIT); + sixel_puts((char *)context->buffer + context->pos, + DCS_END_8BIT, DCS_END_8BIT_SIZE); + sixel_advance(context, DCS_END_8BIT_SIZE); } else { - nwrite = sprintf((char *)context->buffer + context->pos, DCS_END_7BIT); - } - if (nwrite <= 0) { - goto end; + sixel_puts((char *)context->buffer + context->pos, + DCS_END_7BIT, DCS_END_7BIT_SIZE); + sixel_advance(context, DCS_END_7BIT_SIZE); } - sixel_advance(context, nwrite); } /* flush buffer */ @@ -655,7 +695,6 @@ sixel_encode_footer(sixel_output_t *context) status = SIXEL_OK; -end: return status; } From a4d4f9ec6daab2da59e61748f06c66d3ac064073 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 27 Jun 2015 23:19:08 +0900 Subject: [PATCH 353/451] Fix regression of returning invalid status when using libjpeg --- src/loader.c | 6 ++++-- src/status.c | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/loader.c b/src/loader.c index 3dc3439a..07092b81 100644 --- a/src/loader.c +++ b/src/loader.c @@ -369,7 +369,7 @@ load_jpeg(unsigned char **result, int *pheight, int *ppixelformat) { - SIXELSTATUS status = SIXEL_FALSE; + SIXELSTATUS status = SIXEL_JPEG_ERROR; int row_stride, size; JSAMPARRAY buffer; struct jpeg_decompress_struct cinfo; @@ -405,7 +405,6 @@ load_jpeg(unsigned char **result, status = SIXEL_BAD_ALLOCATION; goto end; } - row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1); @@ -414,6 +413,8 @@ load_jpeg(unsigned char **result, memcpy(*result + (cinfo.output_scanline - 1) * row_stride, buffer[0], row_stride); } + status = SIXEL_OK; + end: jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); @@ -995,6 +996,7 @@ load_with_builtin( &frame->width, &frame->height, &frame->pixelformat); + if (SIXEL_FAILED(status)) { goto error; } diff --git a/src/status.c b/src/status.c index 1aeb4f5d..86f42e00 100644 --- a/src/status.c +++ b/src/status.c @@ -144,6 +144,9 @@ sixel_helper_format_error( case SIXEL_STBIW_ERROR: error_string = "stb_image_write error"; break; + case SIXEL_FALSE: + error_string = "unknown error (SIXEL_FALSE)"; + break; default: error_string = "unknown error"; break; From 7d1a418a4140684b1790e79721462e659161315b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 27 Jun 2015 23:45:54 +0900 Subject: [PATCH 354/451] Set pixelformat to dither context when input format is grayscale --- src/encoder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index 4335f09c..b4ba305d 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -444,7 +444,8 @@ prepare_palette(sixel_dither_t **dither, if (sixel_frame_get_transparent(frame) != (-1)) { sixel_dither_set_transparent(*dither, sixel_frame_get_transparent(frame)); } - } else if (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_PALETTE) { + } else if (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_GRAYSCALE) { + sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); switch (sixel_frame_get_pixelformat(frame)) { case SIXEL_PIXELFORMAT_G1: *dither = sixel_dither_get(SIXEL_BUILTIN_G1); From e315ee28bde5ad70b2cd411b3500df1d643fb76e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 27 Jun 2015 23:49:12 +0900 Subject: [PATCH 355/451] Ammend fix --- src/encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index b4ba305d..d6502f79 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -445,7 +445,6 @@ prepare_palette(sixel_dither_t **dither, sixel_dither_set_transparent(*dither, sixel_frame_get_transparent(frame)); } } else if (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_GRAYSCALE) { - sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); switch (sixel_frame_get_pixelformat(frame)) { case SIXEL_PIXELFORMAT_G1: *dither = sixel_dither_get(SIXEL_BUILTIN_G1); @@ -462,6 +461,7 @@ prepare_palette(sixel_dither_t **dither, default: return SIXEL_LOGIC_ERROR; } + sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); } else { if (former_dither) { sixel_dither_unref(former_dither); From ab59a641fc07426d1d3d51d08ab276b13cddd952 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 00:04:19 +0900 Subject: [PATCH 356/451] Check ldiv() availability with ./configure script --- Makefile.in | 4 ++-- config.h.in | 6 ++++++ configure | 3 ++- configure.ac | 3 ++- src/tosixel.c | 12 +++++++++++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Makefile.in b/Makefile.in index 40c907f2..d966ad45 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing py-compile + ChangeLog NEWS compile config.guess config.sub install-sh \ + ltmain.sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/config.h.in b/config.h.in index fa2fb9ef..50594a09 100644 --- a/config.h.in +++ b/config.h.in @@ -108,6 +108,9 @@ /* whether jpeg codec library is available */ #undef HAVE_JPEG +/* Define to 1 if you have the `ldiv' function. */ +#undef HAVE_LDIV + /* whether libcurl is available */ #undef HAVE_LIBCURL @@ -164,6 +167,9 @@ /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H diff --git a/configure b/configure index 68478609..f4297ec6 100755 --- a/configure +++ b/configure @@ -13610,7 +13610,8 @@ for ac_func in memcpy \ stat \ setjmp \ strerror \ - isatty + isatty \ + ldiv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/configure.ac b/configure.ac index 5eced85f..6fbe025d 100644 --- a/configure.ac +++ b/configure.ac @@ -218,7 +218,8 @@ AC_CHECK_FUNCS([memcpy \ stat \ setjmp \ strerror \ - isatty]) + isatty \ + ldiv]) # for HDR AC_CHECK_FUNCS([strtol pow]) diff --git a/src/tosixel.c b/src/tosixel.c index f238bdfa..889529fe 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -103,6 +103,7 @@ sixel_puts(char *buffer, char *value, int size) } +#if HAVE_LDIV static int sixel_putnum_impl(char *buffer, long value, int pos) { @@ -115,12 +116,21 @@ sixel_putnum_impl(char *buffer, long value, int pos) *(buffer + pos) = '0' + r.rem; return pos + 1; } +#endif /* HAVE_LDIV */ static int sixel_putnum(char *buffer, unsigned int value) { - return sixel_putnum_impl(buffer, value, 0); + int pos; + +#if HAVE_LDIV + pos = sixel_putnum_impl(buffer, value, 0); +#else + pos = sprintf(buffer, "%d", value); +#endif /* HAVE_LDIV */ + + return pos; } From ffff4b7ba866d55428a9ab005cfac30d81e5e92a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 00:12:54 +0900 Subject: [PATCH 357/451] Add tests for -B option --- converters/Makefile.am | 4 +++- converters/Makefile.in | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index b734e3c8..66c27490 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -61,6 +61,8 @@ if WANT_IMG2SIXEL test ! $$($(WINE) ./img2sixel -B \#ffff ../images/map8.png) test ! $$($(WINE) ./img2sixel -B \#0000000000000 ../images/map8.png) test ! $$($(WINE) ./img2sixel -B \#00G) + test ! $$($(WINE) ./img2sixel -B test) + test ! $$($(WINE) ./img2sixel -B rgb:11/11) test ! $$($(WINE) ./img2sixel -%) test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) @@ -79,7 +81,7 @@ if WANT_IMG2SIXEL $(WINE) ./img2sixel -H $(WINE) ./img2sixel -V $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel - $(WINE) ./img2sixel -w50% -h150% -dfs -thls -shistogram < ../images/snake.jpg | tee snake2.sixel + $(WINE) ./img2sixel -w50% -h150% -dfs -Bblue -thls -shistogram < ../images/snake.jpg | tee snake2.sixel $(WINE) ./img2sixel -w2100 -h2100 -djajuni -bxterm256 -o snake3.sixel < ../images/snake.jpg $(WINE) ./img2sixel -w105% -h100 -B\#000000000 -rnearest < ../images/snake.gif $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga diff --git a/converters/Makefile.in b/converters/Makefile.in index e09f7e3f..8420aebb 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1027,6 +1027,8 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#ffff ../images/map8.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#0000000000000 ../images/map8.png) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B \#00G) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B test) +@WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -B rgb:11/11) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -%) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m invalid_filename ../images/snake.jpg) @WANT_IMG2SIXEL_TRUE@ test ! $$($(WINE) ./img2sixel -m ../images/map8.png -p 8 ../images/snake.jpg) @@ -1045,7 +1047,7 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -H @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -V @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel ../images/snake.jpg -datkinson -flum -saverage | ./img2sixel | tee snake.sixel -@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -thls -shistogram < ../images/snake.jpg | tee snake2.sixel +@WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w50% -h150% -dfs -Bblue -thls -shistogram < ../images/snake.jpg | tee snake2.sixel @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w2100 -h2100 -djajuni -bxterm256 -o snake3.sixel < ../images/snake.jpg @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -w105% -h100 -B\#000000000 -rnearest < ../images/snake.gif @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -7 -sauto -w100 -rgaussian -qauto -dburkes -tauto ../images/snake.tga From 9a3a0186d1b01b6bb800fabfa7c0aa0edc1f1fc1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 00:24:51 +0900 Subject: [PATCH 358/451] Fix segmentation error when set -e option with loading 1/2/4 bpp grayscale image --- src/loader.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/loader.c b/src/loader.c index 07092b81..af200469 100644 --- a/src/loader.c +++ b/src/loader.c @@ -639,29 +639,36 @@ load_png(unsigned char *buffer, case 1: case 2: case 4: + if (ppalette) { # if HAVE_DECL_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 # if HAVE_DEBUG - fprintf(stderr, "expand %u bpp to 8bpp format...\n", - (unsigned int)bitdepth); + fprintf(stderr, "expand %u bpp to 8bpp format...\n", + (unsigned int)bitdepth); # endif - png_set_expand_gray_1_2_4_to_8(png_ptr); - *pixelformat = SIXEL_PIXELFORMAT_G8; + png_set_expand_gray_1_2_4_to_8(png_ptr); + *pixelformat = SIXEL_PIXELFORMAT_G8; # elif HAVE_DECL_PNG_SET_GRAY_1_2_4_TO_8 # if HAVE_DEBUG - fprintf(stderr, "expand %u bpp to 8bpp format...\n", - (unsigned int)bitdepth); + fprintf(stderr, "expand %u bpp to 8bpp format...\n", + (unsigned int)bitdepth); # endif - png_set_gray_1_2_4_to_8(png_ptr); - *pixelformat = SIXEL_PIXELFORMAT_G8; + png_set_gray_1_2_4_to_8(png_ptr); + *pixelformat = SIXEL_PIXELFORMAT_G8; # else # if HAVE_DEBUG - fprintf(stderr, "expand into RGB format...\n"); + fprintf(stderr, "expand into RGB format...\n"); # endif - png_set_background(png_ptr, &background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - png_set_gray_to_rgb(png_ptr); - *pixelformat = SIXEL_PIXELFORMAT_RGB888; + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + png_set_gray_to_rgb(png_ptr); + *pixelformat = SIXEL_PIXELFORMAT_RGB888; # endif + } else { + png_set_background(png_ptr, &background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + png_set_gray_to_rgb(png_ptr); + *pixelformat = SIXEL_PIXELFORMAT_RGB888; + } break; case 8: if (ppalette) { From bb6988025d2e6be94dada31178afb4662a45adb5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 00:28:19 +0900 Subject: [PATCH 359/451] Update ChangeLog --- ChangeLog | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0070a3d8..61ee8299 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,137 @@ +2015-06-28 Hayaki Saito + + * src/loader.c: Fix segmentation error when set -e option with loading 1/2/4 + bpp grayscale image + + * converters/Makefile.am, converters/Makefile.in: Add tests for -B option + + * Makefile.in, config.h.in, configure, configure.ac, src/tosixel.c: Check + ldiv() availability with ./configure script + +2015-06-27 Hayaki Saito + + * src/encoder.c: Ammend fix + + * src/encoder.c: Set pixelformat to dither context when input format is + grayscale + + * src/loader.c, src/status.c: Fix regression of returning invalid status when + using libjpeg + + * src/tosixel.c: Use builtin functions instead of sprintf() + +2015-06-26 Hayaki Saito + + * perl/Build.PL, perl/MANIFEST, perl/META.yml, perl/README.md, + perl/lib/Image/LibSIXEL.pm, perl/lib/Image/LibSIXEL.xs, + perl/lib/Image/LibSIXEL/Decoder.pm, perl/lib/Image/LibSIXEL/Encoder.pm, + perl/lib/Image/Sixel.pm, perl/lib/Image/Sixel.xs, + perl/lib/Image/Sixel/Decoder.pm, perl/lib/Image/Sixel/Encoder.pm, + perl/t/libsixel.t, perl/t/sixel.t: perl: change module name: Image::Sixel -> + Image::LibSIXEL + +2015-06-25 Hayaki Saito + + * php/README, php/sixel/.cvsignore, php/sixel/CREDITS, + php/sixel/EXPERIMENTAL, php/sixel/README, php/sixel/config.m4, + php/sixel/config.w32, php/sixel/manual/file-entities.ent, + php/sixel/manual/functions.xml, php/sixel/manual/manual.xml.in, + php/sixel/manual/sixel/configure.xml, php/sixel/manual/sixel/constants.xml, + php/sixel/manual/sixel/ini.xml, php/sixel/manual/sixel/reference.xml, + php/sixel/package.xml, php/sixel/package2.xml, php/sixel/php_sixel.h, + php/sixel/sixel.c, php/sixel/sixel.dsp, php/sixel/sixel.xml, + php/sixel/tests/SixelEncoder____construct.phpt, + php/sixel/tests/SixelEncoder____destruct.phpt, + php/sixel/tests/SixelEncoder__encode.phpt, + php/sixel/tests/SixelEncoder__setopt.phpt: Remove php extension directory + + * .gitmodules, ruby: Remove submodule directory + +2015-06-23 Hayaki Saito + + * include/sixel.h.in: core: Add SIXEL_OPTFLAG_xxx definitions + + * NEWS: Update NEWS + + * .gitmodules, ruby: Add dubmodule libsixel-ruby + +2015-06-22 Hayaki Saito + + * ruby/README, ruby/images/egret.jpg, ruby/images/egret.six, ruby/setup.rb, + ruby/sixel.c: Drop Ruby interface + +2015-06-16 Hayaki Saito + + * src/writer.c: Fix build error caused by calling undeclared function + + * ruby/sixel.c: ruby: show detailed error messages + + * NEWS: Update NEWS + + * ruby/sixel.c: Minor fix + + * src/status.c: Add missing file: src/status.c + + * converters/img2sixel.c, include/sixel.h.in, src/decoder.c, src/encoder.c, + src/loader.c, src/writer.c: Improve error handling + + * Makefile.in, configure, configure.ac, converters/img2sixel.c, + include/sixel.h.in, src/Makefile.am, src/Makefile.in, src/loader.c: Introduce + newv APIs for semantic error handling: - + sixel_helper_set_additional_message() - sixel_helper_get_additional_message() + - sixel_helper_format_error() + +2015-06-15 Hayaki Saito + + * src/loader.c: Supperss uninitialized warnings caused by MinGW gcc + +2015-06-14 Hayaki Saito + + * ruby/README, ruby/images/egret.jpg, ruby/images/egret.six, ruby/setup.rb, + ruby/sixel.c: Add initial implementation of ruby interface + + * src/decoder.c, src/encoder.c: Handle some ignored allocation errors + + * converters/img2sixel.c, converters/sixel2png.c: Do semantic error handling + (on progress) + + * src/loader.c: Suppress unused-label GCC warning + + * src/encoder.c: Do semantic error handling (on progress) + + * include/sixel.h.in, src/loader.c: Handle curl errors + + * src/encoder.c, src/loader.c: Do semantic error handling (on progress) + + * src/loader.c: Fix compile errors caused by missing symbol + + * README.md, converters/Makefile.am, converters/Makefile.in, + converters/img2sixel.c, converters/shell-completion/bash/img2sixel, + converters/shell-completion/zsh/_img2sixel, src/encoder.c: Add new -b option + values: gray1/2/4/8 + + * include/sixel.h.in, src/dither.c, src/encoder.c: Add new built-in palette + profiles, gray1/2/4/8 + + * src/encoder.c, src/loader.c: Do semantic error handling (on progress) + + * examples/opengl/main.c, include/sixel.h.in, src/dither.c, src/tosixel.c: Do + semantic error handling (on progress) + +2015-06-13 Hayaki Saito + + * src/dither.c, src/encoder.c: Do semantic error handling (on progress) + + * include/sixel.h.in, src/encoder.c, src/fromgif.c, src/loader.c: Introduce + SIXELSTATUS and related macros + + * include/sixel.h.in: Define LIBSIXEL_VERSION and LIBSIXEL_ABI_VERSION as + string + + * include/sixel.h.in: Correct typoed version macro + + * include/sixel.h.in: Correct typoed version macro + 2015-06-11 Hayaki Saito * src/Makefile.am, src/Makefile.in: Add rgblookup.gprf to distributed files @@ -172,6 +306,9 @@ * src/pixelformat.c: Add more tests for pixelformat.c + * configure.ac: Evaluate arguments of --with-xxx option of ./configure more + strictly + 2015-05-18 Hayaki Saito * src/pixelformat.h: Add missing header file pixelformat.h @@ -274,6 +411,8 @@ * src/fromgif.c: Fix leaks around GIF loader + * converters/img2sixel.c: Stop memory leaks + 2015-05-11 Hayaki Saito * php/README, php/sixel/.cvsignore, php/sixel/CREDITS, From 64ddb07996073425f415c244dadef6bcf8b073f5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 01:49:20 +0900 Subject: [PATCH 360/451] Add more tests --- src/Makefile.am | 1 + src/Makefile.in | 1 + src/status.c | 83 +++++++++++++++++++++++++++++++++++++++++++------ src/status.h | 34 ++++++++++++++++++++ src/tests.c | 8 +++++ src/writer.c | 12 +++---- 6 files changed, 124 insertions(+), 15 deletions(-) create mode 100644 src/status.h diff --git a/src/Makefile.am b/src/Makefile.am index 329ff960..8ff1c211 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -35,6 +35,7 @@ libsixel_la_SOURCES = \ stb_image_write.c \ stb_image_write.h \ status.c \ + status.h \ rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ diff --git a/src/Makefile.in b/src/Makefile.in index d264fb3a..139ea010 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -407,6 +407,7 @@ libsixel_la_SOURCES = \ stb_image_write.c \ stb_image_write.h \ status.c \ + status.h \ rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ diff --git a/src/status.c b/src/status.c index 86f42e00..9a91419b 100644 --- a/src/status.c +++ b/src/status.c @@ -37,6 +37,18 @@ # include #endif +#include "status.h" + +#define SIXEL_MESSAGE_OK ("succeeded") +#define SIXEL_MESSAGE_INTERRUPTED ("interrupted by a signal") +#define SIXEL_MESSAGE_BAD_ALLOCATION ("runtime error: bad allocation error") +#define SIXEL_MESSAGE_BAD_ARGUMENT ("runtime error: bad argument detected") +#define SIXEL_MESSAGE_BAD_INPUT ("runtime error: bad input detected") +#define SIXEL_MESSAGE_RUNTIME_ERROR ("runtime error") +#define SIXEL_MESSAGE_LOGIC_ERROR ("logic error") +#define SIXEL_MESSAGE_NOT_IMPLEMENTED ("feature error: not implemented") +#define SIXEL_MESSAGE_FEATURE_ERROR ("feature error") + static char g_buffer[1024] = { 0x0 }; SIXELAPI void @@ -74,11 +86,11 @@ sixel_helper_format_error( case SIXEL_OK: switch (status) { case SIXEL_INTERRUPTED: - error_string = "interrupted by a signal"; + error_string = SIXEL_MESSAGE_INTERRUPTED; break; case SIXEL_OK: default: - error_string = "succeeded"; + error_string = SIXEL_MESSAGE_OK; break; } break; @@ -87,29 +99,29 @@ sixel_helper_format_error( case SIXEL_RUNTIME_ERROR: switch (status) { case SIXEL_BAD_ALLOCATION: - error_string = "runtime error: bad allocation error"; + error_string = SIXEL_MESSAGE_BAD_ALLOCATION; break; case SIXEL_BAD_ARGUMENT: - error_string = "runtime error: bad argument detected"; + error_string = SIXEL_MESSAGE_BAD_ARGUMENT; break; case SIXEL_BAD_INPUT: - error_string = "runtime error: bad input detected"; + error_string = SIXEL_MESSAGE_BAD_INPUT; break; default: - error_string = "runtime error"; + error_string = SIXEL_MESSAGE_RUNTIME_ERROR; break; } break; case SIXEL_LOGIC_ERROR: - error_string = "logic error"; + error_string = SIXEL_MESSAGE_LOGIC_ERROR; break; case SIXEL_FEATURE_ERROR: switch (status) { case SIXEL_NOT_IMPLEMENTED: - error_string = "feature error: not implemented"; + error_string = SIXEL_MESSAGE_NOT_IMPLEMENTED; break; default: - error_string = "feature error"; + error_string = SIXEL_MESSAGE_FEATURE_ERROR; break; } break; @@ -169,6 +181,58 @@ test1(void) if (strcmp(sixel_helper_format_error(SIXEL_OK), "succeeded") == 0) { goto error; } + if (strcmp(sixel_helper_format_error(SIXEL_INTERRUPTED), "interrupted by a signal") == 0) { + goto error; + } + return EXIT_SUCCESS; +error: + perror("test1"); + return nret; +} + + +static int +test2(void) +{ + int nret = EXIT_FAILURE; + + if (strcmp(sixel_helper_format_error(SIXEL_BAD_ALLOCATION), SIXEL_MESSAGE_BAD_ALLOCATION == 0) { + goto error; + } + if (strcmp(sixel_helper_format_error(SIXEL_BAD_ARGUMENT), SIXEL_MESSAGE_BAD_ARGUMENT) == 0) { + goto error; + } + if (strcmp(sixel_helper_format_error(SIXEL_BAD_INPUT), SIXEL_MESSAGE_BAD_INPUT) == 0) { + goto error; + } + if (strcmp(sixel_helper_format_error(SIXEL_RUNTIME_ERROR), SIXEL_MESSAGE_RUNTIME_ERROR) == 0) { + goto error; + } + if (strcmp(sixel_helper_format_error(SIXEL_LOGIC_ERROR), SIXEL_MESSAGE_LOGIC_ERROR) == 0) { + goto error; + } + if (strcmp(sixel_helper_format_error(SIXEL_NOT_IMPLEMENTED), SIXEL_MESSAGE_NOT_IMPLEMENTED) == 0) { + goto error; + } + if (strcmp(sixel_helper_format_error(SIXEL_FEATURE_ERROR), SIXEL_MESSAGE_FEATURE_ERROR) == 0) { + goto error; + } + + return EXIT_SUCCESS; +error: + perror("test1"); + return nret; +} + + +static int +test3(void) +{ + int nret = EXIT_FAILURE; + + if (strcmp(sixel_helper_format_error(SIXEL_INTERRUPTED), "interrupted by a signal") == 0) { + goto error; + } return EXIT_SUCCESS; error: perror("test1"); @@ -185,6 +249,7 @@ sixel_status_tests_main(void) static testcase const testcases[] = { test1, + test2, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { diff --git a/src/status.h b/src/status.h new file mode 100644 index 00000000..b4e19129 --- /dev/null +++ b/src/status.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_STATUS_H +#define LIBSIXEL_STATUS_H + +#if HAVE_TESTS +int +sixel_status_tests_main(void); +#endif + +#endif /* LIBSIXEL_STATUS_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/tests.c b/src/tests.c index 75727c6c..eeaf6999 100644 --- a/src/tests.c +++ b/src/tests.c @@ -37,6 +37,7 @@ #include "pixelformat.h" #include "writer.h" #include "encoder.h" +#include "status.h" #include #if HAVE_TESTS @@ -90,6 +91,13 @@ main(int argc, char *argv[]) } puts("done."); + + nret = sixel_status_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("done."); error: return nret; } diff --git a/src/writer.c b/src/writer.c index d372ac35..43b7a61e 100644 --- a/src/writer.c +++ b/src/writer.c @@ -271,13 +271,13 @@ static int test1(void) { int nret = EXIT_FAILURE; - int ret; + SIXELSTATUS status; unsigned char pixels[] = {0xff, 0xff, 0xff}; - ret = sixel_helper_write_image_file( + status = sixel_helper_write_image_file( pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); - if (ret != (-1)) { + if (SIXEL_FAILED(status)) { goto error; } nret = EXIT_SUCCESS; @@ -291,13 +291,13 @@ static int test2(void) { int nret = EXIT_FAILURE; - int ret; + SIXELSTATUS status; unsigned char pixels[] = {0xff, 0xff, 0xff}; - ret = sixel_helper_write_image_file( + status = sixel_helper_write_image_file( pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); - if (ret != 0) { + if (SIXEL_FAILED(status)) { goto error; } nret = EXIT_SUCCESS; From 718a3df79440487c98431422472fe87cca3b28ec Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 01:58:01 +0900 Subject: [PATCH 361/451] Update tests --- src/status.c | 34 +++++++++------------------------- src/writer.c | 2 +- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/status.c b/src/status.c index 9a91419b..9580ec63 100644 --- a/src/status.c +++ b/src/status.c @@ -178,10 +178,10 @@ test1(void) { int nret = EXIT_FAILURE; - if (strcmp(sixel_helper_format_error(SIXEL_OK), "succeeded") == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_OK), SIXEL_MESSAGE_OK) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_INTERRUPTED), "interrupted by a signal") == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_INTERRUPTED), SIXEL_MESSAGE_INTERRUPTED) != 0) { goto error; } return EXIT_SUCCESS; @@ -195,26 +195,25 @@ static int test2(void) { int nret = EXIT_FAILURE; - - if (strcmp(sixel_helper_format_error(SIXEL_BAD_ALLOCATION), SIXEL_MESSAGE_BAD_ALLOCATION == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_BAD_ALLOCATION), SIXEL_MESSAGE_BAD_ALLOCATION) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_BAD_ARGUMENT), SIXEL_MESSAGE_BAD_ARGUMENT) == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_BAD_ARGUMENT), SIXEL_MESSAGE_BAD_ARGUMENT) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_BAD_INPUT), SIXEL_MESSAGE_BAD_INPUT) == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_BAD_INPUT), SIXEL_MESSAGE_BAD_INPUT) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_RUNTIME_ERROR), SIXEL_MESSAGE_RUNTIME_ERROR) == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_RUNTIME_ERROR), SIXEL_MESSAGE_RUNTIME_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_LOGIC_ERROR), SIXEL_MESSAGE_LOGIC_ERROR) == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_LOGIC_ERROR), SIXEL_MESSAGE_LOGIC_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_NOT_IMPLEMENTED), SIXEL_MESSAGE_NOT_IMPLEMENTED) == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_NOT_IMPLEMENTED), SIXEL_MESSAGE_NOT_IMPLEMENTED) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_FEATURE_ERROR), SIXEL_MESSAGE_FEATURE_ERROR) == 0) { + if (strcmp(sixel_helper_format_error(SIXEL_FEATURE_ERROR), SIXEL_MESSAGE_FEATURE_ERROR) != 0) { goto error; } @@ -225,21 +224,6 @@ test2(void) } -static int -test3(void) -{ - int nret = EXIT_FAILURE; - - if (strcmp(sixel_helper_format_error(SIXEL_INTERRUPTED), "interrupted by a signal") == 0) { - goto error; - } - return EXIT_SUCCESS; -error: - perror("test1"); - return nret; -} - - int sixel_status_tests_main(void) { diff --git a/src/writer.c b/src/writer.c index 43b7a61e..e715811a 100644 --- a/src/writer.c +++ b/src/writer.c @@ -277,7 +277,7 @@ test1(void) status = sixel_helper_write_image_file( pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); - if (SIXEL_FAILED(status)) { + if (!SIXEL_FAILED(status)) { goto error; } nret = EXIT_SUCCESS; From 46196e6ae5a80712bb61c3ca619a717df9b77940 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 12:46:32 +0900 Subject: [PATCH 362/451] Update tests in status.c --- src/status.c | 116 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 97 insertions(+), 19 deletions(-) diff --git a/src/status.c b/src/status.c index 9580ec63..bd40fbfc 100644 --- a/src/status.c +++ b/src/status.c @@ -40,6 +40,8 @@ #include "status.h" #define SIXEL_MESSAGE_OK ("succeeded") +#define SIXEL_MESSAGE_FALSE ("unexpected error (SIXEL_FALSE)"); +#define SIXEL_MESSAGE_UNEXPECTED ("unexpected error") #define SIXEL_MESSAGE_INTERRUPTED ("interrupted by a signal") #define SIXEL_MESSAGE_BAD_ALLOCATION ("runtime error: bad allocation error") #define SIXEL_MESSAGE_BAD_ARGUMENT ("runtime error: bad argument detected") @@ -48,6 +50,13 @@ #define SIXEL_MESSAGE_LOGIC_ERROR ("logic error") #define SIXEL_MESSAGE_NOT_IMPLEMENTED ("feature error: not implemented") #define SIXEL_MESSAGE_FEATURE_ERROR ("feature error") +#define SIXEL_MESSAGE_STBI_ERROR ("stb_image error") +#define SIXEL_MESSAGE_STBIW_ERROR ("stb_image_write error") +#define SIXEL_MESSAGE_JPEG_ERROR ("libjpeg error") +#define SIXEL_MESSAGE_PNG_ERROR ("libpng error") +#define SIXEL_MESSAGE_GDK_ERROR ("GDK error") +#define SIXEL_MESSAGE_GD_ERROR ("GD error") + static char g_buffer[1024] = { 0x0 }; @@ -138,34 +147,42 @@ sixel_helper_format_error( error_string = curl_easy_strerror(status & 0xff); break; #endif +#ifdef HAVE_LIBJPEG case SIXEL_JPEG_ERROR: - error_string = "jpeg error"; + error_string = SIXEL_MESSAGE_LIBJPEG_ERROR; break; +#endif +#ifdef HAVE_LIBPNG case SIXEL_PNG_ERROR: - error_string = "png error"; + error_string = SIXEL_MESSAGE_PNG_ERROR; break; +#endif +#ifdef HAVE_GDK_PIXBUF2 case SIXEL_GDK_ERROR: - error_string = "gdk error"; + error_string = SIXEL_MESSAGE_GDK_ERROR"; break; +#endif +#ifdef HAVE_GD case SIXEL_GD_ERROR: - error_string = "gd error"; + error_string = SIXEL_MESSAGE_GD_ERROR; break; +#endif case SIXEL_STBI_ERROR: - error_string = "stb_image error"; + error_string = SIXEL_MESSAGE_STBI_ERROR; break; case SIXEL_STBIW_ERROR: - error_string = "stb_image_write error"; + error_string = SIXEL_MESSAGE_STBIW_ERROR; break; case SIXEL_FALSE: - error_string = "unknown error (SIXEL_FALSE)"; + error_string = SIXEL_MESSAGE_FALSE; break; default: - error_string = "unknown error"; + error_string = SIXEL_MESSAGE_UNEXPECTED; break; } break; default: - error_string = "unknown error"; + error_string = SIXEL_MESSAGE_UNEXPECTED; break; } return error_string; @@ -177,11 +194,15 @@ static int test1(void) { int nret = EXIT_FAILURE; + char const *message; - if (strcmp(sixel_helper_format_error(SIXEL_OK), SIXEL_MESSAGE_OK) != 0) { + message = sixel_helper_format_error(SIXEL_OK); + if (strcmp(message, SIXEL_MESSAGE_OK) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_INTERRUPTED), SIXEL_MESSAGE_INTERRUPTED) != 0) { + + message = sixel_helper_format_error(SIXEL_INTERRUPTED); + if (strcmp(message, SIXEL_MESSAGE_INTERRUPTED) != 0) { goto error; } return EXIT_SUCCESS; @@ -195,31 +216,88 @@ static int test2(void) { int nret = EXIT_FAILURE; - if (strcmp(sixel_helper_format_error(SIXEL_BAD_ALLOCATION), SIXEL_MESSAGE_BAD_ALLOCATION) != 0) { + char const *message; + + message = sixel_helper_format_error(SIXEL_BAD_ALLOCATION); + if (strcmp(message, SIXEL_MESSAGE_BAD_ALLOCATION) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_BAD_ARGUMENT); + if (strcmp(message, SIXEL_MESSAGE_BAD_ARGUMENT) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_BAD_INPUT); + if (strcmp(message, SIXEL_MESSAGE_BAD_INPUT) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_RUNTIME_ERROR); + if (strcmp(message, SIXEL_MESSAGE_RUNTIME_ERROR) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_LOGIC_ERROR); + if (strcmp(message, SIXEL_MESSAGE_LOGIC_ERROR) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_NOT_IMPLEMENTED); + if (strcmp(message, SIXEL_MESSAGE_NOT_IMPLEMENTED) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_FEATURE_ERROR); + if (strcmp(message, SIXEL_MESSAGE_FEATURE_ERROR) != 0) { + goto error; + } + + message = sixel_helper_format_error(SIXEL_LIBC_ERROR); + if (strcmp(message, SIXEL_MESSAGE_UNEXPECTED) == 0) { + goto error; + } + +#ifdef HAVE_LIBCURL + message = sixel_helper_format_error(SIXEL_CURL_ERROR); + if (strcmp(message, SIXEL_MESSAGE_UNEXPECTED) == 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_BAD_ARGUMENT), SIXEL_MESSAGE_BAD_ARGUMENT) != 0) { +#endif + + message = sixel_helper_format_error(SIXEL_JPEG_ERROR); + if (strcmp(message, SIXEL_MESSAGE_JPEG_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_BAD_INPUT), SIXEL_MESSAGE_BAD_INPUT) != 0) { + + message = sixel_helper_format_error(SIXEL_PNG_ERROR); + if (strcmp(message, SIXEL_MESSAGE_PNG_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_RUNTIME_ERROR), SIXEL_MESSAGE_RUNTIME_ERROR) != 0) { + + message = sixel_helper_format_error(SIXEL_GD_ERROR); + if (strcmp(message, SIXEL_MESSAGE_GD_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_LOGIC_ERROR), SIXEL_MESSAGE_LOGIC_ERROR) != 0) { + + message = sixel_helper_format_error(SIXEL_GDK_ERROR); + if (strcmp(message, SIXEL_MESSAGE_GDK_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_NOT_IMPLEMENTED), SIXEL_MESSAGE_NOT_IMPLEMENTED) != 0) { + + message = sixel_helper_format_error(SIXEL_STBI_ERROR); + if (strcmp(message, SIXEL_MESSAGE_STBI_ERROR) != 0) { goto error; } - if (strcmp(sixel_helper_format_error(SIXEL_FEATURE_ERROR), SIXEL_MESSAGE_FEATURE_ERROR) != 0) { + + message = sixel_helper_format_error(SIXEL_STBIW_ERROR); + if (strcmp(message, SIXEL_MESSAGE_STBIW_ERROR) != 0) { goto error; } return EXIT_SUCCESS; error: - perror("test1"); + perror("test2"); return nret; } From 00029b3931270f0abef3055c074985eebe198f5d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 13:13:25 +0900 Subject: [PATCH 363/451] Add more error handling and tests to writer.c --- src/writer.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/src/writer.c b/src/writer.c index e715811a..826472ae 100644 --- a/src/writer.c +++ b/src/writer.c @@ -92,7 +92,17 @@ write_png_to_file( case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: + if (palette == NULL) { + status = SIXEL_BAD_ARGUMENT; + sixel_helper_set_additional_message( + "write_png_to_file: no palette is given"); + return status; + } new_pixels = malloc(width * height * 4); + if (new_pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; + return status; + } src = new_pixels + width * height * 3; dst = pixels = new_pixels; status = sixel_helper_normalize_pixelformat(src, @@ -110,8 +120,18 @@ write_png_to_file( } break; case SIXEL_PIXELFORMAT_PAL8: + if (palette == NULL) { + status = SIXEL_BAD_ARGUMENT; + sixel_helper_set_additional_message( + "write_png_to_file: no palette is given"); + return status; + } src = data; dst = pixels = new_pixels = malloc(width * height * 3); + if (new_pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; + return status; + } for (i = 0; i < width * height; ++i, ++src) { *dst++ = *(palette + *src * 3 + 0); *dst++ = *(palette + *src * 3 + 1); @@ -122,6 +142,26 @@ write_png_to_file( pixels = data; break; case SIXEL_PIXELFORMAT_G8: + src = data; + dst = pixels = new_pixels = malloc(width * height * 3); + if (new_pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; + return status; + } + if (palette) { + for (i = 0; i < width * height; ++i, ++src) { + *dst++ = *(palette + *src * 3 + 0); + *dst++ = *(palette + *src * 3 + 1); + *dst++ = *(palette + *src * 3 + 2); + } + } else { + for (i = 0; i < width * height; ++i, ++src) { + *dst++ = *src; + *dst++ = *src; + *dst++ = *src; + } + } + break; case SIXEL_PIXELFORMAT_RGB565: case SIXEL_PIXELFORMAT_RGB555: case SIXEL_PIXELFORMAT_BGR565: @@ -132,6 +172,10 @@ write_png_to_file( case SIXEL_PIXELFORMAT_RGBA8888: case SIXEL_PIXELFORMAT_ARGB8888: pixels = new_pixels = malloc(width * height * 3); + if (new_pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; + return status; + } status = sixel_helper_normalize_pixelformat(pixels, &pixelformat, data, @@ -165,6 +209,10 @@ write_png_to_file( #if HAVE_LIBPNG rows = malloc(height * sizeof(unsigned char *)); + if (rows == NULL) { + status = SIXEL_BAD_ALLOCATION; + return status; + } for (y = 0; y < height; ++y) { rows[y] = pixels + width * 3 * y; } @@ -307,6 +355,57 @@ test2(void) } +static int +test3(void) +{ + int nret = EXIT_FAILURE; + SIXELSTATUS status; + unsigned char pixels[] = {0x00, 0x7f, 0xff}; + sixel_dither_t *dither = sixel_dither_get(SIXEL_BUILTIN_G8); + + status = sixel_helper_write_image_file( + pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_G8, "test-output.png", FORMAT_PNG); + + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_helper_write_image_file( + pixels, 1, 1, sixel_dither_get_palette(dither), + SIXEL_PIXELFORMAT_G8, "test-output.png", FORMAT_PNG); + + if (SIXEL_FAILED(status)) { + goto error; + } + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +static int +test4(void) +{ + int nret = EXIT_FAILURE; + SIXELSTATUS status; + unsigned char pixels[] = {0xa0}; + sixel_dither_t *dither = sixel_dither_get(SIXEL_BUILTIN_MONO_DARK); + + status = sixel_helper_write_image_file( + pixels, 1, 1, sixel_dither_get_palette(dither), + SIXEL_PIXELFORMAT_PAL1, "test-output.png", FORMAT_PNG); + + if (SIXEL_FAILED(status)) { + goto error; + } + nret = EXIT_SUCCESS; + +error: + return nret; +} + + int sixel_writer_tests_main(void) { @@ -317,6 +416,8 @@ sixel_writer_tests_main(void) static testcase const testcases[] = { test1, test2, + test3, + test4, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From b60d07ca755c54afc2169a77b3c65161cceeca66 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 13:18:30 +0900 Subject: [PATCH 364/451] Update tests --- src/status.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/status.c b/src/status.c index bd40fbfc..b20a5679 100644 --- a/src/status.c +++ b/src/status.c @@ -147,9 +147,9 @@ sixel_helper_format_error( error_string = curl_easy_strerror(status & 0xff); break; #endif -#ifdef HAVE_LIBJPEG +#ifdef HAVE_JPEG case SIXEL_JPEG_ERROR: - error_string = SIXEL_MESSAGE_LIBJPEG_ERROR; + error_string = SIXEL_MESSAGE_JPEG_ERROR; break; #endif #ifdef HAVE_LIBPNG @@ -265,25 +265,33 @@ test2(void) } #endif +#if HAVE_JPEG message = sixel_helper_format_error(SIXEL_JPEG_ERROR); if (strcmp(message, SIXEL_MESSAGE_JPEG_ERROR) != 0) { goto error; } +#endif +#if HAVE_LIBPNG message = sixel_helper_format_error(SIXEL_PNG_ERROR); if (strcmp(message, SIXEL_MESSAGE_PNG_ERROR) != 0) { goto error; } +#endif +#if HAVE_GD message = sixel_helper_format_error(SIXEL_GD_ERROR); if (strcmp(message, SIXEL_MESSAGE_GD_ERROR) != 0) { goto error; } +#endif +#if HAVE_GDK_PIXBUF2 message = sixel_helper_format_error(SIXEL_GDK_ERROR); if (strcmp(message, SIXEL_MESSAGE_GDK_ERROR) != 0) { goto error; } +#endif message = sixel_helper_format_error(SIXEL_STBI_ERROR); if (strcmp(message, SIXEL_MESSAGE_STBI_ERROR) != 0) { From ef978edd41184f25f4807e4656913e81495b827f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 13:32:49 +0900 Subject: [PATCH 365/451] Strip extra '"' character --- src/status.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/status.c b/src/status.c index b20a5679..81e4cd7f 100644 --- a/src/status.c +++ b/src/status.c @@ -159,7 +159,7 @@ sixel_helper_format_error( #endif #ifdef HAVE_GDK_PIXBUF2 case SIXEL_GDK_ERROR: - error_string = SIXEL_MESSAGE_GDK_ERROR"; + error_string = SIXEL_MESSAGE_GDK_ERROR; break; #endif #ifdef HAVE_GD From 5007f4508558e382bf3f0020193ec618452ebbad Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 14:59:00 +0900 Subject: [PATCH 366/451] Strip extra free() call --- src/status.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/status.c b/src/status.c index 81e4cd7f..7e3cde42 100644 --- a/src/status.c +++ b/src/status.c @@ -139,7 +139,6 @@ sixel_helper_format_error( len = strlen(p) + 1; memcpy(buffer, p, len < sizeof(buffer) ? len: sizeof(buffer) - 1); buffer[sizeof(buffer) - 1] = 0; - free((char *)p); error_string = buffer; break; #ifdef HAVE_LIBCURL From 5bd486834357666480f899e0ea10dd134a6e9129 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 15:21:54 +0900 Subject: [PATCH 367/451] Add more tests for status.c --- src/writer.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/writer.c b/src/writer.c index 826472ae..8c6c7793 100644 --- a/src/writer.c +++ b/src/writer.c @@ -395,6 +395,63 @@ test4(void) status = sixel_helper_write_image_file( pixels, 1, 1, sixel_dither_get_palette(dither), SIXEL_PIXELFORMAT_PAL1, "test-output.png", FORMAT_PNG); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_helper_write_image_file( + pixels, 1, 1, NULL, + SIXEL_PIXELFORMAT_PAL1, "test-output.png", FORMAT_PNG); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +static int +test5(void) +{ + int nret = EXIT_FAILURE; + SIXELSTATUS status; + unsigned char pixels[] = {0x00}; + sixel_dither_t *dither = sixel_dither_get(SIXEL_BUILTIN_XTERM256); + + status = sixel_helper_write_image_file( + pixels, 1, 1, sixel_dither_get_palette(dither), + SIXEL_PIXELFORMAT_PAL8, "test-output.png", FORMAT_PNG); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_helper_write_image_file( + pixels, 1, 1, NULL, + SIXEL_PIXELFORMAT_PAL8, "test-output.png", FORMAT_PNG); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +static int +test6(void) +{ + int nret = EXIT_FAILURE; + SIXELSTATUS status; + unsigned char pixels[] = {0x00, 0x7f, 0xff}; + + status = sixel_helper_write_image_file( + pixels, 1, 1, NULL, + SIXEL_PIXELFORMAT_BGR888, "test-output.png", FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; @@ -418,6 +475,8 @@ sixel_writer_tests_main(void) test2, test3, test4, + test5, + test6, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From 028014b74e97a96ff64d9766f60ef8329276d64b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 28 Jun 2015 23:07:26 +0900 Subject: [PATCH 368/451] Minor improvements --- src/encoder.c | 14 +++- src/frame.c | 208 ++++++++++++++++++++++++++++------------------ src/loader.c | 51 +++++++----- src/pixelformat.c | 63 ++++++++++---- 4 files changed, 214 insertions(+), 122 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index d6502f79..62934c85 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -630,6 +630,8 @@ output_sixel_without_macro( int dulation = 0; static unsigned char *p; int depth; + char message[256]; + int nwrite; #if HAVE_USLEEP int lag = 0; # if HAVE_CLOCK @@ -642,8 +644,15 @@ output_sixel_without_macro( } depth = sixel_helper_compute_depth(pixelformat); - if (depth == (-1)) { - status = SIXEL_FALSE; + if (depth < 0) { + status = SIXEL_LOGIC_ERROR; + nwrite = sprintf(message, + "output_sixel_without_macro: " + "sixel_helper_compute_depth(%08x) failed.", + pixelformat); + if (nwrite > 0) { + sixel_helper_set_additional_message(message); + } goto end; } @@ -1541,6 +1550,7 @@ sixel_encoder_encode( } reload: + status = sixel_helper_load_image_file(filename, encoder->fstatic, fuse_palette, diff --git a/src/frame.c b/src/frame.c index 83c4bd03..fefb0e63 100644 --- a/src/frame.c +++ b/src/frame.c @@ -251,12 +251,12 @@ sixel_frame_strip_alpha( } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *normalized_pixels = NULL; int size; - int nret = 0; unsigned char *dst; unsigned char *src; unsigned char *p; @@ -269,15 +269,15 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) normalized_pixels = malloc(size); src = normalized_pixels + frame->width * frame->height * 3; dst = normalized_pixels; - nret = sixel_helper_normalize_pixelformat(src, - &frame->pixelformat, - frame->pixels, - frame->pixelformat, - frame->width, - frame->height); - if (nret != 0) { + status = sixel_helper_normalize_pixelformat(src, + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + if (SIXEL_FAILED(status)) { free(normalized_pixels); - return nret; + goto end; } for (p = src; dst < src; ++p) { *dst++ = *(frame->palette + *p * 3 + 0); @@ -316,29 +316,34 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) /* normalize pixelformat */ size = frame->width * frame->height * 3; normalized_pixels = malloc(size); - nret = sixel_helper_normalize_pixelformat(normalized_pixels, - &frame->pixelformat, - frame->pixels, - frame->pixelformat, - frame->width, - frame->height); - if (nret != 0) { - free(normalized_pixels); - return nret; + status = sixel_helper_normalize_pixelformat(normalized_pixels, + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + if (SIXEL_FAILED(status)) { + free(normalized_pixels); + goto end; } free(frame->pixels); frame->pixels = normalized_pixels; break; default: - fprintf(stderr, "do_resize: invalid pixelformat.\n"); - return (-1); + status = SIXEL_LOGIC_ERROR; + sixel_helper_set_additional_message( + "do_resize: invalid pixelformat."); + goto end; } - return nret; + status = SIXEL_OK; + +end: + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_resize( sixel_frame_t *frame, int width, @@ -346,41 +351,44 @@ sixel_frame_resize( int method_for_resampling ) { + SIXELSTATUS status = SIXEL_FALSE; int size; unsigned char *scaled_frame = NULL; - int nret; - nret = sixel_frame_convert_to_rgb888(frame); - if (nret != 0) { - return nret; + status = sixel_frame_convert_to_rgb888(frame); + if (SIXEL_FAILED(status)) { + goto end; } size = width * height * 3; scaled_frame = malloc(size); - if (scaled_frame == NULL) { - return (-1); + status = SIXEL_BAD_ALLOCATION; + goto end; } - nret = sixel_helper_scale_image( + status = sixel_helper_scale_image( scaled_frame, frame->pixels, frame->width, frame->height, 3, width, height, method_for_resampling); - if (nret != 0) { - return nret; + if (SIXEL_FAILED(status)) { + goto end; } free(frame->pixels); frame->pixels = scaled_frame; frame->width = width; frame->height = height; - return nret; + status = SIXEL_OK; + +end: + return status; } -static int +static SIXELSTATUS clip(unsigned char *pixels, int sx, int sy, @@ -390,10 +398,13 @@ clip(unsigned char *pixels, int cw, int ch) { + SIXELSTATUS status = SIXEL_FALSE; int y; unsigned char *src; unsigned char *dst; - int depth = sixel_helper_compute_depth(pixelformat); + int depth; + char message[256]; + int nwrite; /* unused */ (void) sx; /* unused */ (void) sy; @@ -403,6 +414,19 @@ clip(unsigned char *pixels, case SIXEL_PIXELFORMAT_PAL8: case SIXEL_PIXELFORMAT_G8: case SIXEL_PIXELFORMAT_RGB888: + depth = sixel_helper_compute_depth(pixelformat); + if (depth < 0) { + status = SIXEL_LOGIC_ERROR; + nwrite = sprintf(message, + "clip: " + "sixel_helper_compute_depth(%08x) failed.", + pixelformat); + if (nwrite > 0) { + sixel_helper_set_additional_message(message); + } + goto end; + } + dst = pixels; src = pixels + cy * sx * depth + cx * depth; for (y = 0; y < ch; y++) { @@ -410,16 +434,28 @@ clip(unsigned char *pixels, dst += (cw * depth); src += (sx * depth); } + + status = SIXEL_OK; + break; default: - return (-1); + status = SIXEL_BAD_ARGUMENT; + nwrite = sprintf(message, + "clip: " + "invalid pixelformat(%08x) is specified.", + pixelformat); + if (nwrite > 0) { + sixel_helper_set_additional_message(message); + } + break; } - return 0; +end: + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_clip( sixel_frame_t *frame, int x, @@ -428,23 +464,26 @@ sixel_frame_clip( int height ) { - int ret = 0; + SIXELSTATUS status = SIXEL_FALSE; unsigned char *normalized_pixels; switch (frame->pixelformat) { case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_G1: + case SIXEL_PIXELFORMAT_G2: + case SIXEL_PIXELFORMAT_G4: normalized_pixels = malloc(frame->width * frame->height); - ret = sixel_helper_normalize_pixelformat(normalized_pixels, - &frame->pixelformat, - frame->pixels, - frame->pixelformat, - frame->width, - frame->height); - if (ret != 0) { + status = sixel_helper_normalize_pixelformat(normalized_pixels, + &frame->pixelformat, + frame->pixels, + frame->pixelformat, + frame->width, + frame->height); + if (SIXEL_FAILED(status)) { free(normalized_pixels); - return ret; + goto end; } free(frame->pixels); frame->pixels = normalized_pixels; @@ -453,21 +492,24 @@ sixel_frame_clip( break; } - ret = clip(frame->pixels, - frame->width, - frame->height, - frame->pixelformat, - x, - y, - width, - height); - if (ret != 0) { - return ret; + status = clip(frame->pixels, + frame->width, + frame->height, + frame->pixelformat, + x, + y, + width, + height); + if (SIXEL_FAILED(status)) { + goto end; } frame->width = width; frame->height = height; - return ret; + status = SIXEL_OK; + +end: + return status; } @@ -499,7 +541,7 @@ test2(void) int nret = EXIT_FAILURE; unsigned char *pixels = malloc(4); unsigned char *bgcolor = malloc(3); - int ret; + SIXELSTATUS status; pixels[0] = 0x43; pixels[1] = 0x89; @@ -513,13 +555,13 @@ test2(void) goto error; } - ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); - if (ret != 0) { + status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); + if (SIXEL_FAILED(status)) { goto error; } - ret = sixel_frame_strip_alpha(frame, bgcolor); - if (ret != 0) { + status = sixel_frame_strip_alpha(frame, bgcolor); + if (SIXEL_FAILED(status)) { goto error; } @@ -553,7 +595,7 @@ test3(void) sixel_frame_t *frame = NULL; int nret = EXIT_FAILURE; unsigned char *pixels = malloc(4); - int ret; + SIXELSTATUS status; pixels[0] = 0x43; pixels[1] = 0x89; @@ -565,13 +607,13 @@ test3(void) goto error; } - ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); - if (ret != 0) { + status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); + if (SIXEL_FAILED(status)) { goto error; } - ret = sixel_frame_strip_alpha(frame, NULL); - if (ret != 0) { + status = sixel_frame_strip_alpha(frame, NULL); + if (SIXEL_FAILED(status)) { goto error; } @@ -605,7 +647,7 @@ test4(void) sixel_frame_t *frame = NULL; int nret = EXIT_FAILURE; unsigned char *pixels = malloc(4); - int ret; + SIXELSTATUS status; pixels[0] = 0x43; pixels[1] = 0x89; @@ -617,13 +659,13 @@ test4(void) goto error; } - ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_ARGB8888, NULL, 0); - if (ret != 0) { + status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_ARGB8888, NULL, 0); + if (SIXEL_FAILED(status)) { goto error; } - ret = sixel_frame_strip_alpha(frame, NULL); - if (ret != 0) { + status = sixel_frame_strip_alpha(frame, NULL); + if (SIXEL_FAILED(status)) { goto error; } @@ -658,7 +700,7 @@ test5(void) int nret = EXIT_FAILURE; unsigned char *pixels = malloc(1); unsigned char *palette = malloc(3); - int ret; + SIXELSTATUS status; palette[0] = 0x43; palette[1] = 0x89; @@ -671,13 +713,13 @@ test5(void) goto error; } - ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL8, palette, 1); - if (ret != 0) { + status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL8, palette, 1); + if (SIXEL_FAILED(status)) { goto error; } - ret = sixel_frame_convert_to_rgb888(frame); - if (ret != 0) { + status = sixel_frame_convert_to_rgb888(frame); + if (SIXEL_FAILED(status)) { goto error; } @@ -712,7 +754,7 @@ test6(void) int nret = EXIT_FAILURE; unsigned char *pixels = malloc(6); unsigned char *palette = malloc(3); - int ret; + SIXELSTATUS status; palette[0] = 0x43; palette[1] = 0x89; @@ -725,13 +767,13 @@ test6(void) goto error; } - ret = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL1, palette, 1); - if (ret != 0) { + status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL1, palette, 1); + if (SIXEL_FAILED(status)) { goto error; } - ret = sixel_frame_convert_to_rgb888(frame); - if (ret != 0) { + status = sixel_frame_convert_to_rgb888(frame); + if (SIXEL_FAILED(status)) { goto error; } diff --git a/src/loader.c b/src/loader.c index af200469..92e4f58e 100644 --- a/src/loader.c +++ b/src/loader.c @@ -478,9 +478,9 @@ read_palette(png_structp png_ptr, } - -static unsigned char * -load_png(unsigned char *buffer, +static SIXELSTATUS +load_png(unsigned char **result, + unsigned char *buffer, int size, int *psx, int *psy, @@ -491,13 +491,13 @@ load_png(unsigned char *buffer, unsigned char *bgcolor, int *transparent) { + SIXELSTATUS status = SIXEL_FALSE; chunk_t read_chunk; png_uint_32 bitdepth; png_uint_32 png_status; png_structp png_ptr; png_infop info_ptr; unsigned char **rows = NULL; - unsigned char *result = NULL; png_color *png_palette = NULL; png_color_16 background; png_color_16p default_background; @@ -730,12 +730,14 @@ load_png(unsigned char *buffer, goto cleanup; } depth = sixel_helper_compute_depth(*pixelformat); - result = malloc(*psx * *psy * depth); - if (result == NULL) { + *result = malloc(*psx * *psy * depth); + if (*result == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } rows = malloc(*psy * sizeof(unsigned char *)); if (rows == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } switch (*pixelformat) { @@ -743,28 +745,32 @@ load_png(unsigned char *buffer, case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: for (i = 0; i < *psy; ++i) { - rows[i] = result + (depth * *psx * bitdepth + 7) / 8 * i; + rows[i] = *result + (depth * *psx * bitdepth + 7) / 8 * i; } break; default: for (i = 0; i < *psy; ++i) { - rows[i] = result + depth * *psx * i; + rows[i] = *result + depth * *psx * i; } break; } #if USE_SETJMP && HAVE_SETJMP if (setjmp(png_jmpbuf(png_ptr))) { - free(result); - result = NULL; + free(*result); + *result = NULL; + status = SIXEL_PNG_ERROR; goto cleanup; } #endif /* HAVE_SETJMP */ png_read_image(png_ptr, rows); + + status = SIXEL_OK; + cleanup: png_destroy_read_struct(&png_ptr, &info_ptr,(png_infopp)0); free(rows); - return result; + return status; } # endif /* HAVE_PNG */ @@ -1016,17 +1022,18 @@ load_with_builtin( status = SIXEL_BAD_ALLOCATION; goto error; } - frame->pixels = load_png(pchunk->buffer, - pchunk->size, - &frame->width, - &frame->height, - fuse_palette ? &frame->palette: NULL, - &frame->ncolors, - reqcolors, - &frame->pixelformat, - bgcolor, - &frame->transparent); - if (frame->pixels == NULL) { + status = load_png(&frame->pixels, + pchunk->buffer, + pchunk->size, + &frame->width, + &frame->height, + fuse_palette ? &frame->palette: NULL, + &frame->ncolors, + reqcolors, + &frame->pixelformat, + bgcolor, + &frame->transparent); + if (SIXEL_FAILED(status)) { goto error; } } diff --git a/src/pixelformat.c b/src/pixelformat.c index 84cee865..a98c1f15 100644 --- a/src/pixelformat.c +++ b/src/pixelformat.c @@ -133,6 +133,9 @@ sixel_helper_compute_depth(int pixelformat) case SIXEL_PIXELFORMAT_GA88: depth = 2; break; + case SIXEL_PIXELFORMAT_G1: + case SIXEL_PIXELFORMAT_G2: + case SIXEL_PIXELFORMAT_G4: case SIXEL_PIXELFORMAT_G8: case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: @@ -148,7 +151,7 @@ sixel_helper_compute_depth(int pixelformat) } -static int +static void expand_rgb(unsigned char *dst, unsigned char const *src, int width, int height, @@ -171,15 +174,14 @@ expand_rgb(unsigned char *dst, *(dst + dst_offset + 2) = b; } } - - return 0; } -static int +static SIXELSTATUS expand_palette(unsigned char *dst, unsigned char const *src, int width, int height, int const pixelformat) { + SIXELSTATUS status = SIXEL_FALSE; int x; int y; int i; @@ -187,21 +189,29 @@ expand_palette(unsigned char *dst, unsigned char const *src, switch (pixelformat) { case SIXEL_PIXELFORMAT_PAL1: + case SIXEL_PIXELFORMAT_G1: bpp = 1; break; case SIXEL_PIXELFORMAT_PAL2: + case SIXEL_PIXELFORMAT_G2: bpp = 2; break; case SIXEL_PIXELFORMAT_PAL4: + case SIXEL_PIXELFORMAT_G4: bpp = 4; break; case SIXEL_PIXELFORMAT_PAL8: + case SIXEL_PIXELFORMAT_G8: for (i = 0; i < width * height; ++i, ++src) { *dst++ = *src; } - return 0; + status = SIXEL_OK; + goto end; default: - return (-1); + status = SIXEL_BAD_ARGUMENT; + sixel_helper_set_additional_message( + "expand_palette: invalid pixelformat."); + goto end; } #if HAVE_DEBUG @@ -223,11 +233,15 @@ expand_palette(unsigned char *dst, unsigned char const *src, src++; } } - return 0; + + status = SIXEL_OK; + +end: + return status; } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_helper_normalize_pixelformat( unsigned char /* out */ *dst, /* destination buffer */ int /* out */ *dst_pixelformat, /* converted pixelformat */ @@ -236,9 +250,11 @@ sixel_helper_normalize_pixelformat( int /* in */ width, /* width of source image */ int /* in */ height) /* height of source image */ { + SIXELSTATUS status = SIXEL_FALSE; + switch (src_pixelformat) { case SIXEL_PIXELFORMAT_G8: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 1); + expand_rgb(dst, src, width, height, src_pixelformat, 1); *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case SIXEL_PIXELFORMAT_RGB565: @@ -247,33 +263,50 @@ sixel_helper_normalize_pixelformat( case SIXEL_PIXELFORMAT_BGR555: case SIXEL_PIXELFORMAT_GA88: case SIXEL_PIXELFORMAT_AG88: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 2); + expand_rgb(dst, src, width, height, src_pixelformat, 2); *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case SIXEL_PIXELFORMAT_RGB888: case SIXEL_PIXELFORMAT_BGR888: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 3); + expand_rgb(dst, src, width, height, src_pixelformat, 3); *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case SIXEL_PIXELFORMAT_RGBA8888: case SIXEL_PIXELFORMAT_ARGB8888: - (void) expand_rgb(dst, src, width, height, src_pixelformat, 4); + expand_rgb(dst, src, width, height, src_pixelformat, 4); *dst_pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: *dst_pixelformat = SIXEL_PIXELFORMAT_PAL8; - return expand_palette(dst, src, width, height, src_pixelformat); + status = expand_palette(dst, src, width, height, src_pixelformat); + if (SIXEL_FAILED(status)) { + goto end; + } + break; + case SIXEL_PIXELFORMAT_G1: + case SIXEL_PIXELFORMAT_G2: + case SIXEL_PIXELFORMAT_G4: + *dst_pixelformat = SIXEL_PIXELFORMAT_G8; + status = expand_palette(dst, src, width, height, src_pixelformat); + if (SIXEL_FAILED(status)) { + goto end; + } + break; case SIXEL_PIXELFORMAT_PAL8: memcpy(dst, src, width * height); *dst_pixelformat = src_pixelformat; break; default: - return (-1); + status = SIXEL_BAD_ARGUMENT; + goto end; } - return 0; + status = SIXEL_OK; + +end: + return status; } From 1a1c013ced0719a8d946a0104f6ad211d7819dcf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Jun 2015 13:55:18 +0900 Subject: [PATCH 369/451] Minor improvements --- src/decoder.c | 2 - src/dither.c | 132 +++++++++++++++++++++++++++++++------------------- src/encoder.c | 79 ++++++++++++++++++++---------- src/loader.c | 18 +++++-- 4 files changed, 148 insertions(+), 83 deletions(-) diff --git a/src/decoder.c b/src/decoder.c index 5499055c..583bcdc4 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -237,7 +237,6 @@ sixel_decoder_decode( &sx, &sy, &palette, &ncolors, malloc); if (SIXEL_FAILED(status)) { - fprintf(stderr, "sixel_decode failed.\n"); goto end; } @@ -247,7 +246,6 @@ sixel_decoder_decode( SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { - fprintf(stderr, "sixel_helper_write_image_file failed.\n"); goto end; } diff --git a/src/dither.c b/src/dither.c index c677d5be..a96e28e0 100644 --- a/src/dither.c +++ b/src/dither.c @@ -249,7 +249,8 @@ static const unsigned char pal_vt340_color[] = { SIXELAPI sixel_dither_t * -sixel_dither_create(int ncolors) +sixel_dither_create( + int /* in */ ncolors) { sixel_dither_t *dither; int headsize; @@ -274,32 +275,32 @@ sixel_dither_create(int ncolors) wholesize = headsize + datasize; dither = malloc(wholesize); - if (dither == NULL) { - return NULL; + if (dither != NULL) { + dither->ref = 1; + dither->palette = (unsigned char*)(dither + 1); + dither->cachetable = NULL; + dither->reqcolors = ncolors; + dither->ncolors = ncolors; + dither->origcolors = (-1); + dither->keycolor = (-1); + dither->optimized = 0; + dither->optimize_palette = 0; + dither->complexion = 1; + dither->bodyonly = 0; + dither->method_for_largest = SIXEL_LARGE_NORM; + dither->method_for_rep = SIXEL_REP_CENTER_BOX; + dither->method_for_diffuse = SIXEL_DIFFUSE_FS; + dither->quality_mode = quality_mode; + dither->pixelformat = SIXEL_PIXELFORMAT_RGB888; } - dither->ref = 1; - dither->palette = (unsigned char*)(dither + 1); - dither->cachetable = NULL; - dither->reqcolors = ncolors; - dither->ncolors = ncolors; - dither->origcolors = (-1); - dither->keycolor = (-1); - dither->optimized = 0; - dither->optimize_palette = 0; - dither->complexion = 1; - dither->bodyonly = 0; - dither->method_for_largest = SIXEL_LARGE_NORM; - dither->method_for_rep = SIXEL_REP_CENTER_BOX; - dither->method_for_diffuse = SIXEL_DIFFUSE_FS; - dither->quality_mode = quality_mode; - dither->pixelformat = SIXEL_PIXELFORMAT_RGB888; return dither; } SIXELAPI void -sixel_dither_destroy(sixel_dither_t *dither) +sixel_dither_destroy( + sixel_dither_t /* in */ *dither) { if (dither) { free(dither->cachetable); @@ -309,7 +310,8 @@ sixel_dither_destroy(sixel_dither_t *dither) SIXELAPI void -sixel_dither_ref(sixel_dither_t *dither) +sixel_dither_ref( + sixel_dither_t /* in */ *dither) { /* TODO: be thread safe */ ++dither->ref; @@ -317,7 +319,8 @@ sixel_dither_ref(sixel_dither_t *dither) SIXELAPI void -sixel_dither_unref(sixel_dither_t *dither) +sixel_dither_unref( + sixel_dither_t /* in */ *dither) { /* TODO: be thread safe */ if (dither != NULL && --dither->ref == 0) { @@ -327,12 +330,13 @@ sixel_dither_unref(sixel_dither_t *dither) SIXELAPI sixel_dither_t * -sixel_dither_get(int builtin_dither) +sixel_dither_get( + int /* in */ builtin_dither) { unsigned char *palette; int ncolors; int keycolor; - sixel_dither_t *dither; + sixel_dither_t *dither = NULL; switch (builtin_dither) { case SIXEL_BUILTIN_MONO_DARK: @@ -386,7 +390,7 @@ sixel_dither_get(int builtin_dither) keycolor = (-1); break; default: - return NULL; + goto end; } dither = sixel_dither_create(ncolors); @@ -397,12 +401,15 @@ sixel_dither_get(int builtin_dither) dither->optimize_palette = 0; } +end: return dither; } static void -sixel_dither_set_method_for_largest(sixel_dither_t *dither, int method_for_largest) +sixel_dither_set_method_for_largest( + sixel_dither_t /* in */ *dither, + int /* in */ method_for_largest) { if (method_for_largest == SIXEL_LARGE_AUTO) { method_for_largest = SIXEL_LARGE_NORM; @@ -412,7 +419,9 @@ sixel_dither_set_method_for_largest(sixel_dither_t *dither, int method_for_large static void -sixel_dither_set_method_for_rep(sixel_dither_t *dither, int method_for_rep) +sixel_dither_set_method_for_rep( + sixel_dither_t /* in */ *dither, + int /* in */ method_for_rep) { if (method_for_rep == SIXEL_REP_AUTO) { method_for_rep = SIXEL_REP_CENTER_BOX; @@ -422,7 +431,9 @@ sixel_dither_set_method_for_rep(sixel_dither_t *dither, int method_for_rep) static void -sixel_dither_set_quality_mode(sixel_dither_t *dither, int quality_mode) +sixel_dither_set_quality_mode( + sixel_dither_t /* in */ *dither, + int /* in */ quality_mode) { if (quality_mode == SIXEL_QUALITY_AUTO) { if (dither->ncolors <= 8) { @@ -436,10 +447,15 @@ sixel_dither_set_quality_mode(sixel_dither_t *dither, int quality_mode) SIXELAPI SIXELSTATUS -sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, - int width, int height, int pixelformat, - int method_for_largest, int method_for_rep, - int quality_mode) +sixel_dither_initialize( + sixel_dither_t /* in */ *dither, + unsigned char /* in */ *data, + int /* in */ width, + int /* in */ height, + int /* in */ pixelformat, + int /* in */ method_for_largest, + int /* in */ method_for_rep, + int /* in */ quality_mode) { unsigned char *buf = NULL; unsigned char *normalized_pixels = NULL; @@ -456,10 +472,13 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, goto end; } - status = sixel_helper_normalize_pixelformat(normalized_pixels, - &pixelformat, - data, pixelformat, - width, height); + status = sixel_helper_normalize_pixelformat( + normalized_pixels, + &pixelformat, + data, + pixelformat, + width, + height); if (SIXEL_FAILED(status)) { goto end; } @@ -475,7 +494,8 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, buf = sixel_quant_make_palette(input_pixels, width * height * 3, SIXEL_PIXELFORMAT_RGB888, - dither->reqcolors, &dither->ncolors, + dither->reqcolors, + &dither->ncolors, &dither->origcolors, dither->method_for_largest, dither->method_for_rep, @@ -500,7 +520,9 @@ sixel_dither_initialize(sixel_dither_t *dither, unsigned char *data, SIXELAPI void -sixel_dither_set_diffusion_type(sixel_dither_t *dither, int method_for_diffuse) +sixel_dither_set_diffusion_type( + sixel_dither_t /* in */ *dither, + int /* in */ method_for_diffuse) { if (method_for_diffuse == SIXEL_DIFFUSE_AUTO) { if (dither->ncolors > 16) { @@ -514,7 +536,8 @@ sixel_dither_set_diffusion_type(sixel_dither_t *dither, int method_for_diffuse) SIXELAPI int -sixel_dither_get_num_of_palette_colors(sixel_dither_t *dither) +sixel_dither_get_num_of_palette_colors( + sixel_dither_t /* in */ *dither) { return dither->ncolors; } @@ -522,7 +545,8 @@ sixel_dither_get_num_of_palette_colors(sixel_dither_t *dither) /* get number of histogram colors */ SIXELAPI int -sixel_dither_get_num_of_histogram_colors(sixel_dither_t /* in */ *dither) /* dither context object */ +sixel_dither_get_num_of_histogram_colors( + sixel_dither_t /* in */ *dither) /* dither context object */ { return dither->origcolors; } @@ -530,14 +554,16 @@ sixel_dither_get_num_of_histogram_colors(sixel_dither_t /* in */ *dither) /* di /* typoed: remained for keeping compatibility */ SIXELAPI int -sixel_dither_get_num_of_histgram_colors(sixel_dither_t /* in */ *dither) /* dither context object */ +sixel_dither_get_num_of_histgram_colors( + sixel_dither_t /* in */ *dither) /* dither context object */ { return sixel_dither_get_num_of_histogram_colors(dither); } SIXELAPI unsigned char * -sixel_dither_get_palette(sixel_dither_t /* in */ *dither) /* dither context object */ +sixel_dither_get_palette( + sixel_dither_t /* in */ *dither) /* dither context object */ { return dither->palette; } @@ -554,17 +580,19 @@ sixel_dither_set_palette( SIXELAPI void -sixel_dither_set_complexion_score(sixel_dither_t /* in */ *dither, /* dither context object */ - int /* in */ score) /* complexion score (>= 1) */ +sixel_dither_set_complexion_score( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ score) /* complexion score (>= 1) */ { dither->complexion = score; } SIXELAPI void -sixel_dither_set_body_only(sixel_dither_t /* in */ *dither, /* dither context object */ - int /* in */ bodyonly) /* 0: output palette section - 1: do not output palette section */ +sixel_dither_set_body_only( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ bodyonly) /* 0: output palette section + 1: do not output palette section */ { dither->bodyonly = bodyonly; } @@ -599,9 +627,11 @@ sixel_dither_set_transparent( SIXELAPI unsigned char * -sixel_dither_apply_palette(sixel_dither_t *dither, - unsigned char *pixels, - int width, int height) +sixel_dither_apply_palette( + sixel_dither_t /* in */ *dither, + unsigned char /* in */ *pixels, + int /* in */ width, + int /* in */ height) { int ret; int bufsize; @@ -614,7 +644,7 @@ sixel_dither_apply_palette(sixel_dither_t *dither, bufsize = width * height * sizeof(unsigned char); dest = malloc(bufsize); if (dest == NULL) { - return NULL; + goto end; } /* if quality_mode is full, do not use palette caching */ diff --git a/src/encoder.c b/src/encoder.c index 62934c85..1d714707 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -245,36 +245,43 @@ sixel_hex_write_callback(char *data, int size, void *priv) } -static sixel_dither_t * -prepare_monochrome_palette(int finvert) +static SIXELSTATUS +prepare_monochrome_palette(sixel_dither_t **dither, int finvert) { - sixel_dither_t *dither; + SIXELSTATUS status = SIXEL_FALSE; if (finvert) { - dither = sixel_dither_get(SIXEL_BUILTIN_MONO_LIGHT); + *dither = sixel_dither_get(SIXEL_BUILTIN_MONO_LIGHT); } else { - dither = sixel_dither_get(SIXEL_BUILTIN_MONO_DARK); + *dither = sixel_dither_get(SIXEL_BUILTIN_MONO_DARK); } - if (dither == NULL) { - return NULL; + if (*dither == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; } - return dither; + status = SIXEL_OK; + +end: + return status; } -static sixel_dither_t * -prepare_builtin_palette(int builtin_palette) +static SIXELSTATUS +prepare_builtin_palette( + sixel_dither_t /* out */ **dither, + int /* in */ builtin_palette) { - sixel_dither_t *dither; - - dither = sixel_dither_get(builtin_palette); + SIXELSTATUS status = SIXEL_FALSE; - if (dither == NULL) { - return NULL; + *dither = sixel_dither_get(builtin_palette); + if (*dither == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; } - return dither; +end: + return status; } @@ -301,7 +308,8 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) status = SIXEL_LOGIC_ERROR; goto end; } - callback_context->dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); + callback_context->dither + = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (callback_context->dither == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -327,7 +335,8 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) status = SIXEL_OK; break; default: - callback_context->dither = sixel_dither_create(callback_context->reqcolors); + callback_context->dither + = sixel_dither_create(callback_context->reqcolors); if (callback_context->dither == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -398,7 +407,7 @@ prepare_palette(sixel_dither_t **dither, sixel_frame_t *frame, sixel_encoder_t *encoder) { - SIXELSTATUS status = SIXEL_OK; + SIXELSTATUS status = SIXEL_FALSE; int histogram_colors; if (encoder->highcolor) { @@ -406,12 +415,20 @@ prepare_palette(sixel_dither_t **dither, *dither = former_dither; } else { *dither = sixel_dither_create(-1); + if (*dither == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } } } else if (encoder->monochrome) { if (former_dither) { *dither = former_dither; } else { - *dither = prepare_monochrome_palette(encoder->finvert); + status = prepare_monochrome_palette(dither, + encoder->finvert); + if (status != SIXEL_OK) { + goto end; + } } } else if (encoder->mapfile) { if (former_dither) { @@ -424,20 +441,25 @@ prepare_palette(sixel_dither_t **dither, encoder->finsecure, encoder->cancel_flag); if (status != SIXEL_OK) { - return status; + goto end; } } } else if (encoder->builtin_palette) { if (former_dither) { *dither = former_dither; } else { - *dither = prepare_builtin_palette(encoder->builtin_palette); + status = prepare_builtin_palette( + dither, encoder->builtin_palette); + if (SIXEL_FAILED(status)) { + goto end; + } } } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_PALETTE)) { *dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); if (!*dither) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto end; } sixel_dither_set_palette(*dither, sixel_frame_get_palette(frame)); sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); @@ -459,7 +481,8 @@ prepare_palette(sixel_dither_t **dither, *dither = sixel_dither_get(SIXEL_BUILTIN_G8); break; default: - return SIXEL_LOGIC_ERROR; + status = SIXEL_LOGIC_ERROR; + goto end; } sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); } else { @@ -468,7 +491,8 @@ prepare_palette(sixel_dither_t **dither, } *dither = sixel_dither_create(encoder->reqcolors); if (*dither == NULL) { - return SIXEL_BAD_ALLOCATION; + status = SIXEL_BAD_ALLOCATION; + goto end; } status = sixel_dither_initialize(*dither, sixel_frame_get_pixels(frame), @@ -480,7 +504,7 @@ prepare_palette(sixel_dither_t **dither, encoder->quality_mode); if (SIXEL_FAILED(status)) { sixel_dither_unref(*dither); - return SIXEL_FALSE; + goto end; } histogram_colors = sixel_dither_get_num_of_histogram_colors(*dither); if (histogram_colors <= encoder->reqcolors) { @@ -489,6 +513,9 @@ prepare_palette(sixel_dither_t **dither, sixel_dither_set_pixelformat(*dither, sixel_frame_get_pixelformat(frame)); } + status = SIXEL_OK; + +end: return status; } diff --git a/src/loader.c b/src/loader.c index 92e4f58e..920a8bc0 100644 --- a/src/loader.c +++ b/src/loader.c @@ -388,7 +388,7 @@ load_jpeg(unsigned char **result, if (cinfo.output_components != 3) { sixel_helper_set_additional_message( - "load_jpeg: malloc() failed (unknown format)."); + "load_jpeg: unknown pixel format."); status = SIXEL_BAD_INPUT; goto end; } @@ -400,9 +400,9 @@ load_jpeg(unsigned char **result, size = *pwidth * *pheight * cinfo.output_components; *result = (unsigned char *)malloc(size); if (*result == NULL) { + status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( "load_jpeg: malloc() failed."); - status = SIXEL_BAD_ALLOCATION; goto end; } row_stride = cinfo.output_width * cinfo.output_components; @@ -577,6 +577,7 @@ load_png(unsigned char **result, case 1: *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, @@ -586,6 +587,7 @@ load_png(unsigned char **result, case 2: *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, @@ -595,6 +597,7 @@ load_png(unsigned char **result, case 4: *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, @@ -604,6 +607,7 @@ load_png(unsigned char **result, case 8: *ppalette = malloc(*pncolors * 3); if (*ppalette == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } read_palette(png_ptr, info_ptr, *ppalette, @@ -803,6 +807,7 @@ load_sixel(unsigned char **result, *ppixelformat = SIXEL_PIXELFORMAT_RGB888; *result = malloc(*psx * *psy * 3); if (*result == NULL) { + status = SIXEL_BAD_ALLOCATION; goto cleanup; } for (i = 0; i < *psx * *psy; ++i) { @@ -1155,6 +1160,7 @@ load_with_gdkpixbuf( stride = gdk_pixbuf_get_rowstride(pixbuf); frame->pixels = malloc(frame->height * stride); if (frame->pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } if (gdk_pixbuf_get_has_alpha(pixbuf)) { @@ -1200,6 +1206,7 @@ load_with_gdkpixbuf( stride = gdk_pixbuf_get_rowstride(pixbuf); frame->pixels = malloc(frame->height * stride); if (frame->pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } if (gdk_pixbuf_get_has_alpha(pixbuf)) { @@ -1319,7 +1326,7 @@ detect_file_format(int len, unsigned char *data) } -static int +static SIXELSTATUS load_with_gd( chunk_t const /* in */ *pchunk, /* image data */ int /* in */ fstatic, /* static */ @@ -1331,6 +1338,7 @@ load_with_gd( void /* in/out */ *context /* private data for callback */ ) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *p; gdImagePtr im; int x, y; @@ -1345,7 +1353,8 @@ load_with_gd( frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + status = SIXEL_BAD_ALLOCATION; + goto end; } switch(detect_file_format(pchunk->size, pchunk->buffer)) { @@ -1416,6 +1425,7 @@ load_with_gd( frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; p = frame->pixels = malloc(frame->width * frame->height * 3); if (frame->pixels == NULL) { + status = SIXEL_BAD_ALLOCATION; gdImageDestroy(im); return SIXEL_BAD_ALLOCATION; } From be882d02359599755d5c6dcecb0116a21a8cfa94 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 29 Jun 2015 15:49:38 +0900 Subject: [PATCH 370/451] Use sixel_helper_set_additional_message() instead of using stderr printing --- src/encoder.c | 118 +++++++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 1d714707..c86e08e8 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1117,7 +1117,8 @@ sixel_encoder_setopt( switch(arg) { case 'o': if (*optarg == '\0') { - fprintf(stderr, "Invalid file name.\n"); + sixel_helper_set_additional_message( + "no file name specified."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1173,8 +1174,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "gray8") == 0) { encoder->builtin_palette = SIXEL_BUILTIN_G8; } else { - fprintf(stderr, - "Cannot parse builtin palette option.\n"); + sixel_helper_set_additional_message( + "cannot parse builtin palette option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1196,9 +1197,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "burkes") == 0) { encoder->method_for_diffuse = SIXEL_DIFFUSE_BURKES; } else { - fprintf(stderr, - "Diffusion method '%s' is not supported.\n", - optarg); + sixel_helper_set_additional_message( + "specified diffusion method is not supported."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1213,9 +1213,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "lum") == 0) { encoder->method_for_largest = SIXEL_LARGE_LUM; } else { - fprintf(stderr, - "Finding method '%s' is not supported.\n", - optarg); + sixel_helper_set_additional_message( + "specified finding method is not supported."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1233,9 +1232,8 @@ sixel_encoder_setopt( (strcmp(optarg, "histgram") == 0)) { encoder->method_for_rep = SIXEL_REP_AVERAGE_PIXELS; } else { - fprintf(stderr, - "Finding method '%s' is not supported.\n", - optarg); + sixel_helper_set_additional_message( + "specified finding method is not supported."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1270,8 +1268,8 @@ sixel_encoder_setopt( encoder->pixelwidth = (-1); encoder->percentwidth = (-1); } else { - fprintf(stderr, - "Cannot parse -w/--width option.\n"); + sixel_helper_set_additional_message( + "cannot parse -w/--width option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1291,8 +1289,8 @@ sixel_encoder_setopt( encoder->pixelheight = (-1); encoder->percentheight = (-1); } else { - fprintf(stderr, - "Cannot parse -h/--height option.\n"); + sixel_helper_set_additional_message( + "cannot parse -h/--height option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1323,9 +1321,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "lanczos4") == 0) { encoder->method_for_resampling = SIXEL_RES_LANCZOS4; } else { - fprintf(stderr, - "Resampling method '%s' is not supported.\n", - optarg); + sixel_helper_set_additional_message( + "specified desampling method is not supported."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1341,8 +1338,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "full") == 0) { encoder->quality_mode = SIXEL_QUALITY_FULL; } else { - fprintf(stderr, - "Cannot parse quality option.\n"); + sixel_helper_set_additional_message( + "cannot parse quality option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1356,8 +1353,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "disable") == 0) { encoder->loop_mode = SIXEL_LOOP_DISABLE; } else { - fprintf(stderr, - "Cannot parse loop-control option.\n"); + sixel_helper_set_additional_message( + "cannot parse loop-control option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1371,8 +1368,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "rgb") == 0) { encoder->palette_type = SIXEL_PALETTETYPE_RGB; } else { - fprintf(stderr, - "Cannot parse palette type option.\n"); + sixel_helper_set_additional_message( + "cannot parse palette type option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1383,8 +1380,8 @@ sixel_encoder_setopt( free(encoder->bgcolor); } if (parse_x_colorspec(optarg, &encoder->bgcolor) != 0) { - fprintf(stderr, - "Cannot parse bgcolor option.\n"); + sixel_helper_set_additional_message( + "cannot parse bgcolor option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1425,8 +1422,8 @@ sixel_encoder_setopt( } else if (strcmp(optarg, "size") == 0) { encoder->encode_policy = SIXEL_ENCODEPOLICY_SIZE; } else { - fprintf(stderr, - "Cannot parse encode policy option.\n"); + sixel_helper_set_additional_message( + "cannot parse encode policy option."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1434,8 +1431,8 @@ sixel_encoder_setopt( case 'C': encoder->complexion = atoi(optarg); if (encoder->complexion < 1) { - fprintf(stderr, - "complexion parameter must be 1 or more.\n"); + sixel_helper_set_additional_message( + "complexion parameter must be 1 or more."); status = SIXEL_BAD_ARGUMENT; goto end; } @@ -1446,76 +1443,87 @@ sixel_encoder_setopt( case '?': /* unknown option */ default: /* exit if unknown options are specified */ - fprintf(stderr, - "Unknwon option '-%c' is specified.\n", arg); + sixel_helper_set_additional_message( + "unknwon option is specified."); status = SIXEL_BAD_ARGUMENT; goto end; } /* detects arguments conflictions */ if (encoder->reqcolors != -1 && encoder->mapfile) { - fprintf(stderr, "option -p, --colors conflicts " - "with -m, --mapfile.\n"); + sixel_helper_set_additional_message( + "option -p, --colors conflicts " + "with -m, --mapfile."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->mapfile && encoder->monochrome) { - fprintf(stderr, "option -m, --mapfile conflicts " - "with -e, --monochrome.\n"); + sixel_helper_set_additional_message( + "option -m, --mapfile conflicts " + "with -e, --monochrome."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->monochrome && encoder->reqcolors != (-1)) { - fprintf(stderr, "option -e, --monochrome conflicts" - " with -p, --colors.\n"); + sixel_helper_set_additional_message( + "option -e, --monochrome conflicts" + " with -p, --colors."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->monochrome && encoder->highcolor) { - fprintf(stderr, "option -e, --monochrome conflicts" - " with -I, --high-color.\n"); + sixel_helper_set_additional_message( + "option -e, --monochrome conflicts" + " with -I, --high-color."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->reqcolors != (-1) && encoder->highcolor) { - fprintf(stderr, "option -p, --colors conflicts" - " with -I, --high-color.\n"); + sixel_helper_set_additional_message( + "option -p, --colors conflicts" + " with -I, --high-color."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->mapfile && encoder->highcolor) { - fprintf(stderr, "option -m, --mapfile conflicts" - " with -I, --high-color.\n"); + sixel_helper_set_additional_message( + "option -m, --mapfile conflicts" + " with -I, --high-color."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->builtin_palette && encoder->highcolor) { - fprintf(stderr, "option -b, --builtin-palette conflicts" - " with -I, --high-color.\n"); + sixel_helper_set_additional_message( + "option -b, --builtin-palette conflicts" + " with -I, --high-color."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->monochrome && encoder->builtin_palette) { - fprintf(stderr, "option -e, --monochrome conflicts" - " with -b, --builtin-palette.\n"); + sixel_helper_set_additional_message( + "option -e, --monochrome conflicts" + " with -b, --builtin-palette."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->mapfile && encoder->builtin_palette) { - fprintf(stderr, "option -m, --mapfile conflicts" - " with -b, --builtin-palette.\n"); + sixel_helper_set_additional_message( + "option -m, --mapfile conflicts" + " with -b, --builtin-palette."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->reqcolors != (-1) && encoder->builtin_palette) { - fprintf(stderr, "option -p, --colors conflicts" - " with -b, --builtin-palette.\n"); + sixel_helper_set_additional_message( + "option -p, --colors conflicts" + " with -b, --builtin-palette."); status = SIXEL_BAD_ARGUMENT; goto end; } if (encoder->f8bit && encoder->penetrate_multiplexer) { - fprintf(stderr, "option -8 --8bit-mode conflicts" - " with -P, --penetrate.\n"); + sixel_helper_set_additional_message( + "option -8 --8bit-mode conflicts" + " with -P, --penetrate."); status = SIXEL_BAD_ARGUMENT; goto end; } From b455cd840af5acf44a6bc88fe68f6a7a66e7ad26 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 30 Jun 2015 11:17:35 +0900 Subject: [PATCH 371/451] Minor improvements --- src/fromgif.c | 104 ++++++++++++++++--------- src/loader.c | 93 +++++++++++++++-------- src/quant.c | 206 +++++++++++++++++++++++++++++++++----------------- 3 files changed, 267 insertions(+), 136 deletions(-) diff --git a/src/fromgif.c b/src/fromgif.c index c116e007..6df9fcbc 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -203,7 +203,7 @@ gif_load_header( } -static int +static SIXELSTATUS gif_init_frame( sixel_frame_t /* in */ *frame, gif_t /* in */ *pg, @@ -211,6 +211,7 @@ gif_init_frame( int /* in */ reqcolors, int /* in */ fuse_palette) { + SIXELSTATUS status = SIXEL_OK; int i; int ncolors; @@ -222,14 +223,21 @@ gif_init_frame( free(frame->palette); frame->palette = malloc(ncolors * 3); } - frame->ncolors = ncolors; if (frame->palette == NULL) { - return (-1); + status = SIXEL_BAD_ALLOCATION; + goto end; } + frame->ncolors = ncolors; if (frame->ncolors <= reqcolors && fuse_palette) { frame->pixelformat = SIXEL_PIXELFORMAT_PAL8; free(frame->pixels); frame->pixels = malloc(frame->width * frame->height); + if (frame->pixels == NULL) { + sixel_helper_set_additional_message( + "malloc() failed in gif_init_frame()."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } memcpy(frame->pixels, pg->out, frame->width * frame->height); for (i = 0; i < frame->ncolors; ++i) { @@ -261,19 +269,24 @@ gif_init_frame( } else { frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; frame->pixels = malloc(pg->w * pg->h * 3); + if (frame->pixels == NULL) { + sixel_helper_set_additional_message( + "malloc() failed in gif_init_frame()."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } for (i = 0; i < pg->w * pg->h; ++i) { frame->pixels[i * 3 + 0] = pg->color_table[pg->out[i] * 3 + 2]; frame->pixels[i * 3 + 1] = pg->color_table[pg->out[i] * 3 + 1]; frame->pixels[i * 3 + 2] = pg->color_table[pg->out[i] * 3 + 0]; } } - if (frame->pixels == NULL) { - fprintf(stderr, "gif_init_frame() failed.\n"); - return (-1); - } frame->multiframe = (pg->loop_count != (-1)); - return 0; + status = SIXEL_OK; + +end: + return status; } @@ -309,12 +322,13 @@ gif_out_code( } -static int +static SIXELSTATUS gif_process_raster( gif_context_t /* in */ *s, gif_t /* in */ *g ) { + SIXELSTATUS status = SIXEL_FALSE; uint8_t lzw_cs; int32_t len, code; uint32_t first; @@ -351,7 +365,7 @@ gif_process_raster( bits |= (int32_t) gif_get8(s) << valid_bits; valid_bits += 8; } else { - int32_t code = bits & codemask; + code = bits & codemask; bits >>= codesize; valid_bits -= codesize; /* @OPTIMIZE: is there some way we can accelerate the non-clear path? */ @@ -369,24 +383,27 @@ gif_process_raster( return SIXEL_OK; } else if (code <= avail) { if (first) { - fprintf(stderr, - "Corrupt GIF\n" "reason: no clear code\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF (reason: no clear code)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } if (oldcode >= 0) { p = &g->codes[avail++]; if (avail > 4096) { - fprintf(stderr, - "Corrupt GIF\n" "reason: too many codes\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF(reason: too many codes)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } p->prefix = (int16_t) oldcode; p->first = g->codes[oldcode].first; p->suffix = (code == avail) ? p->first : g->codes[code].first; } else if (code == avail) { - fprintf(stderr, - "Corrupt GIF\n" "reason: illegal code in raster\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF (reason: illegal code in raster)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } gif_out_code(g, (uint16_t) code); @@ -398,23 +415,30 @@ gif_process_raster( oldcode = code; } else { - fprintf(stderr, - "Corrupt GIF\n" "reason: illegal code in raster\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF (reason: illegal code in raster)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } } } + + status = SIXEL_OK; + +end: + return status; } /* this function is ported from stb_image.h */ -static int +static SIXELSTATUS gif_load_next( gif_context_t /* in */ *s, gif_t /* in */ *g, uint8_t /* in */ *bgcolor ) { + SIXELSTATUS status = SIXEL_FALSE; uint8_t buffer[256]; for (;;) { @@ -428,9 +452,10 @@ gif_load_next( w = gif_get16le(s); h = gif_get16le(s); if (((x + w) > (g->w)) || ((y + h) > (g->h))) { - fprintf(stderr, - "Corrupt GIF.\n" "reason: bad Image Descriptor.\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF (reason: bad Image Descriptor)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } g->line_size = g->w; @@ -466,12 +491,16 @@ gif_load_next( } g->color_table = (uint8_t *)g->pal; } else { - fprintf(stderr, - "Corrupt GIF.\n" "reason: missing color table.\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF (reason: missing color table)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } - return gif_process_raster(s, g); + status = gif_process_raster(s, g); + if (SIXEL_FAILED(status)) { + goto end; + } } case 0x21: /* Comment Extension. */ @@ -522,16 +551,21 @@ gif_load_next( case 0x3B: /* gif stream termination code */ g->is_terminated = 1; - return SIXEL_OK; + status = SIXEL_OK; + goto end; default: - fprintf(stderr, - "Corrupt GIF.\n" "reason: unknown code.\n"); - return SIXEL_FALSE; + sixel_helper_set_additional_message( + "corrupt GIF (reason: unknown code)."); + status = SIXEL_RUNTIME_ERROR; + goto end; } } - return SIXEL_OK; + status = SIXEL_OK; + +end: + return status; } diff --git a/src/loader.c b/src/loader.c index 920a8bc0..ff5e9da5 100644 --- a/src/loader.c +++ b/src/loader.c @@ -506,12 +506,16 @@ load_png(unsigned char **result, png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { - fprintf(stderr, "png_create_read_struct failed.\n"); + sixel_helper_set_additional_message( + "png_create_read_struct() failed."); + status = SIXEL_PNG_ERROR; goto cleanup; } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { - fprintf(stderr, "png_create_info_struct failed.\n"); + sixel_helper_set_additional_message( + "png_create_info_struct() failed."); + status = SIXEL_PNG_ERROR; png_destroy_read_struct(&png_ptr, (png_infopp)0, (png_infopp)0); goto cleanup; } @@ -554,7 +558,9 @@ load_png(unsigned char **result, png_status = png_get_PLTE(png_ptr, info_ptr, &png_palette, pncolors); if (png_status != PNG_INFO_PLTE || png_palette == NULL) { - fprintf(stderr, "PLTE chunk not found\n"); + sixel_helper_set_additional_message( + "PLTE chunk not found"); + status = SIXEL_PNG_ERROR; goto cleanup; } # if HAVE_DEBUG @@ -801,14 +807,14 @@ load_sixel(unsigned char **result, &p, psx, psy, &palette, &colors, malloc); if (SIXEL_FAILED(status)) { - return status; + goto end; } if (ppalette == NULL || colors > reqcolors) { *ppixelformat = SIXEL_PIXELFORMAT_RGB888; *result = malloc(*psx * *psy * 3); if (*result == NULL) { status = SIXEL_BAD_ALLOCATION; - goto cleanup; + goto end; } for (i = 0; i < *psx * *psy; ++i) { (*result)[i * 3 + 0] = palette[p[i] * 3 + 0]; @@ -824,7 +830,7 @@ load_sixel(unsigned char **result, palette = NULL; } -cleanup: +end: free(palette); free(p); @@ -962,12 +968,16 @@ load_with_builtin( { SIXELSTATUS status = SIXEL_FALSE; sixel_frame_t *frame = NULL; + char message[256]; + int nwrite; if (chunk_is_sixel(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { + sixel_helper_set_additional_message( + "malloc() failed in load_with_builtin()."); status = SIXEL_BAD_ALLOCATION; - goto error; + goto end; } status = load_sixel(&frame->pixels, pchunk->buffer, @@ -979,13 +989,13 @@ load_with_builtin( reqcolors, &frame->pixelformat); if (SIXEL_FAILED(status)) { - goto error; + goto end; } } else if (chunk_is_pnm(pchunk)) { frame = sixel_frame_create(); if (frame == NULL) { status = SIXEL_BAD_ALLOCATION; - goto error; + goto end; } /* pnm */ frame->pixels = load_pnm(pchunk->buffer, @@ -998,7 +1008,7 @@ load_with_builtin( if (!frame->pixels) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message("load_pnm() failed."); - goto error; + goto end; } } #if HAVE_JPEG @@ -1006,7 +1016,7 @@ load_with_builtin( frame = sixel_frame_create(); if (frame == NULL) { status = SIXEL_BAD_ALLOCATION; - goto error; + goto end; } status = load_jpeg(&frame->pixels, pchunk->buffer, @@ -1016,7 +1026,7 @@ load_with_builtin( &frame->pixelformat); if (SIXEL_FAILED(status)) { - goto error; + goto end; } } #endif /* HAVE_JPEG */ @@ -1025,7 +1035,7 @@ load_with_builtin( frame = sixel_frame_create(); if (frame == NULL) { status = SIXEL_BAD_ALLOCATION; - goto error; + goto end; } status = load_png(&frame->pixels, pchunk->buffer, @@ -1039,7 +1049,7 @@ load_with_builtin( bgcolor, &frame->transparent); if (SIXEL_FAILED(status)) { - goto error; + goto end; } } #endif /* HAVE_LIBPNG */ @@ -1054,7 +1064,7 @@ load_with_builtin( fn_load, context); if (SIXEL_FAILED(status)) { - goto error; + goto end; } goto end; } else { @@ -1064,14 +1074,14 @@ load_with_builtin( frame = sixel_frame_create(); if (frame == NULL) { status = SIXEL_BAD_ALLOCATION; - goto error; + goto end; } stbi__start_mem(&s, pchunk->buffer, pchunk->size); frame->pixels = stbi__load_main(&s, &frame->width, &frame->height, &depth, 3); if (!frame->pixels) { - fprintf(stderr, "stbi_load_from_file failed.\n" "reason: %s.\n", - stbi_failure_reason()); - goto error; + sixel_helper_set_additional_message(stbi_failure_reason()); + status = SIXEL_STBI_ERROR; + goto end; } frame->loop_count = 1; @@ -1082,23 +1092,27 @@ load_with_builtin( frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; default: - fprintf(stderr, "load_with_builtin() failed.\n" - "reason: unknown pixel-format.(depth: %d)\n", depth); - goto error; + nwrite = sprintf(message, + "load_with_builtin() failed.\n" + "reason: unknown pixel-format.(depth: %d)\n", + depth); + if (nwrite > 0) { + sixel_helper_set_additional_message(message); + } + goto end; } } status = sixel_frame_strip_alpha(frame, bgcolor); if (SIXEL_FAILED(status)) { - goto error; + goto end; } status = fn_load(frame, context); if (SIXEL_FAILED(status)) { - goto error; + goto end; } -error: end: sixel_frame_unref(frame); @@ -1403,20 +1417,29 @@ load_with_gd( break; #endif /* HAVE_DECL_GDIMAGECREATEFROMGD2PTR */ default: - return SIXEL_FALSE; + status = SIXEL_GD_ERROR; + sixel_helper_set_additional_message( + "unexpected image format detected."); + goto end; } if (im == NULL) { - return SIXEL_FALSE; + status = SIXEL_GD_ERROR; + /* TODO: retrieve error detail */ + goto end; } if (!gdImageTrueColor(im)) { #if HAVE_DECL_GDIMAGEPALETTETOTRUECOLOR if (!gdImagePaletteToTrueColor(im)) { - return SIXEL_FALSE; + status = SIXEL_GD_ERROR; + /* TODO: retrieve error detail */ + goto end; } #else - return SIXEL_FALSE; + status = SIXEL_GD_ERROR; + /* TODO: retrieve error detail */ + goto end; #endif } @@ -1427,7 +1450,7 @@ load_with_gd( if (frame->pixels == NULL) { status = SIXEL_BAD_ALLOCATION; gdImageDestroy(im); - return SIXEL_BAD_ALLOCATION; + goto end; } for (y = 0; y < frame->height; y++) { for (x = 0; x < frame->width; x++) { @@ -1439,7 +1462,15 @@ load_with_gd( } gdImageDestroy(im); - return fn_load(frame, context); + status = fn_load(frame, context); + if (SIXEL_FAILED(status)) { + goto end; + } + + status = SIXEL_OK; + +end: + return status; } #endif /* HAVE_GD */ diff --git a/src/quant.c b/src/quant.c index 5abf0fc7..78f6d11c 100644 --- a/src/quant.c +++ b/src/quant.c @@ -124,16 +124,29 @@ compareplane(const void * const arg1, static int sumcompare(const void * const b1, const void * const b2) { - return(((boxVector)b2)->sum - ((boxVector)b1)->sum); + return ((boxVector)b2)->sum - ((boxVector)b1)->sum; } -static tupletable -alloctupletable(unsigned int const depth, unsigned int const size) +static SIXELSTATUS +alloctupletable( + tupletable /* out */ *result, + unsigned int const /* in */ depth, + unsigned int const /* in */ size) { + SIXELSTATUS status = SIXEL_FALSE; + char message[256]; + int nwrite; + if (UINT_MAX / sizeof(struct tupleint) < size) { - quant_trace(stderr, "size %u is too big for arithmetic\n", size); - return NULL; + nwrite = sprintf(message, + "size %u is too big for arithmetic", + size); + if (nwrite > 0) { + sixel_helper_set_additional_message(message); + } + status = SIXEL_RUNTIME_ERROR; + goto end; } unsigned int const mainTableSize = size * sizeof(struct tupleint *); @@ -146,19 +159,28 @@ alloctupletable(unsigned int const depth, unsigned int const size) as a single malloc block and suballocate internally. */ if ((UINT_MAX - mainTableSize) / tupleIntSize < size) { - quant_trace(stderr, "size %u is too big for arithmetic\n", size); - return NULL; + nwrite = sprintf(message, + "size %u is too big for arithmetic", + size); + if (nwrite > 0) { + sixel_helper_set_additional_message(message); + } + status = SIXEL_RUNTIME_ERROR; + goto end; } unsigned int const allocSize = mainTableSize + size * tupleIntSize; void * pool; pool = malloc(allocSize); - - if (!pool) { - quant_trace(stderr, "Unable to allocate %u bytes for a %u-entry " - "tuple table\n", allocSize, size); - return NULL; + if (pool == NULL) { + sprintf(message, + "unable to allocate %u bytes for a %u-entry " + "tuple table", + allocSize, size); + sixel_helper_set_additional_message(message); + status = SIXEL_BAD_ALLOCATION; + goto end; } tupletable const tbl = (tupletable) pool; @@ -168,9 +190,13 @@ alloctupletable(unsigned int const depth, unsigned int const size) tbl[i] = (struct tupleint *) ((char*)pool + mainTableSize + i * tupleIntSize); - return tbl; -} + *result = tbl; + status = SIXEL_OK; + +end: + return status; +} /* @@ -182,11 +208,15 @@ alloctupletable(unsigned int const depth, unsigned int const size) static tupletable2 newColorMap(unsigned int const newcolors, unsigned int const depth) { + SIXELSTATUS status = SIXEL_FALSE; tupletable2 colormap; unsigned int i; colormap.size = 0; - colormap.table = alloctupletable(depth, newcolors); + status = alloctupletable(&colormap.table, depth, newcolors); + if (SIXEL_FAILED(status)) { + goto end; + } if (colormap.table) { for (i = 0; i < newcolors; ++i) { unsigned int plane; @@ -196,6 +226,7 @@ newColorMap(unsigned int const newcolors, unsigned int const depth) colormap.size = newcolors; } +end: return colormap; } @@ -448,7 +479,7 @@ colormapFromBv(unsigned int const newcolors, } -static int +static SIXELSTATUS splitBox(boxVector const bv, unsigned int *const boxesP, unsigned int const bi, @@ -465,6 +496,7 @@ splitBox(boxVector const bv, Assume the box contains at least two colors. -----------------------------------------------------------------------------*/ + SIXELSTATUS status = SIXEL_FALSE; unsigned int const boxStart = bv[bi].ind; unsigned int const boxSize = bv[bi].colors; unsigned int const sm = bv[bi].sum; @@ -497,9 +529,10 @@ splitBox(boxVector const bv, largestDimension = largestByLuminosity(minval, maxval, depth); break; default: - quant_trace(stderr, "Internal error: invalid value of methodForLargest: %d\n", - methodForLargest); - return -1; + sixel_helper_set_additional_message( + "Internal error: invalid value of methodForLargest."); + status = SIXEL_LOGIC_ERROR; + goto end; } /* TODO: I think this sort should go after creating a box, @@ -537,12 +570,16 @@ splitBox(boxVector const bv, bv[*boxesP].sum = sm - lowersum; ++(*boxesP); qsort((char*) bv, *boxesP, sizeof(struct box), sumcompare); - return 0; + + status = SIXEL_OK; + +end: + return status; } -static int +static SIXELSTATUS mediancut(tupletable2 const colorfreqtable, unsigned int const depth, unsigned int const newcolors, @@ -565,7 +602,7 @@ mediancut(tupletable2 const colorfreqtable, int multicolorBoxesExist; unsigned int i; unsigned int sum; - int nret = (-1); + SIXELSTATUS status = SIXEL_FALSE; sum = 0; @@ -576,29 +613,38 @@ mediancut(tupletable2 const colorfreqtable, /* There is at least one box that contains at least 2 colors; ergo, there is more splitting we can do. */ bv = newBoxVector(colorfreqtable.size, sum, newcolors); - if (bv) { - boxes = 1; - multicolorBoxesExist = (colorfreqtable.size > 1); - - /* Main loop: split boxes until we have enough. */ - while (boxes < newcolors && multicolorBoxesExist) { - /* Find the first splittable box. */ - for (bi = 0; bi < boxes && bv[bi].colors < 2; ++bi) - ; - if (bi >= boxes) { - multicolorBoxesExist = 0; - } else { - splitBox(bv, &boxes, bi, colorfreqtable, depth, methodForLargest); + if (bv == NULL) { + goto end; + } + boxes = 1; + multicolorBoxesExist = (colorfreqtable.size > 1); + + /* Main loop: split boxes until we have enough. */ + while (boxes < newcolors && multicolorBoxesExist) { + /* Find the first splittable box. */ + for (bi = 0; bi < boxes && bv[bi].colors < 2; ++bi) + ; + if (bi >= boxes) { + multicolorBoxesExist = 0; + } else { + status = splitBox(bv, &boxes, bi, + colorfreqtable, depth, + methodForLargest); + if (SIXEL_FAILED(status)) { + goto end; } } - *colormapP = colormapFromBv(newcolors, bv, boxes, - colorfreqtable, depth, - methodForRep); - - free(bv); - nret = 0; } - return nret; + *colormapP = colormapFromBv(newcolors, bv, boxes, + colorfreqtable, depth, + methodForRep); + + free(bv); + + status = SIXEL_OK; + +end: + return status; } @@ -616,17 +662,18 @@ computeHash(unsigned char const *data, int const depth) } -static int -computeHistogram(unsigned char const *data, - unsigned int length, - unsigned long const depth, - tupletable2 * const colorfreqtableP, - int const qualityMode) +static SIXELSTATUS +computeHistogram(unsigned char const /* in */ *data, + unsigned int /* in */ length, + unsigned long const /* in */ depth, + tupletable2 * const /* out */ colorfreqtableP, + int const /* in */ qualityMode) { + SIXELSTATUS status = SIXEL_FALSE; typedef unsigned short unit_t; unsigned int i, n; - unit_t *histogram; - unit_t *refmap; + unit_t *histogram = NULL; + unit_t *refmap = NULL; unit_t *ref; unit_t *it; unsigned int index; @@ -664,17 +711,21 @@ computeHistogram(unsigned char const *data, #else histogram = malloc((1 << depth * 5) * sizeof(unit_t)); #endif - if (!histogram) { - quant_trace(stderr, "Unable to allocate memory for histogram.\n"); - return (-1); + if (histogram == NULL) { + sixel_helper_set_additional_message( + "unable to allocate memory for histogram."); + status = SIXEL_BAD_ALLOCATION; + goto end; } #if !HAVE_CALLOC memset(histogram, 0, (1 << depth * 5) * sizeof(unit_t)); #endif it = ref = refmap = (unsigned short *)malloc((1 << depth * 5) * sizeof(unit_t)); if (!it) { - quant_trace(stderr, "Unable to allocate memory for lookup table.\n"); - return (-1); + sixel_helper_set_additional_message( + "unable to allocate memory for lookup table."); + status = SIXEL_BAD_ALLOCATION; + goto end; } for (i = 0; i < length - depth; i += step) { @@ -688,7 +739,10 @@ computeHistogram(unsigned char const *data, } colorfreqtableP->size = ref - refmap; - colorfreqtableP->table = alloctupletable(depth, ref - refmap); + status = alloctupletable(&colorfreqtableP->table, depth, ref - refmap); + if (SIXEL_FAILED(status)) { + goto end; + } for (i = 0; i < colorfreqtableP->size; ++i) { if (histogram[refmap[i]] > 0) { colorfreqtableP->table[i]->value = histogram[refmap[i]]; @@ -700,11 +754,15 @@ computeHistogram(unsigned char const *data, it++; } + quant_trace(stderr, "%u colors found\n", colorfreqtableP->size); + + status = SIXEL_OK; + +end: free(refmap); free(histogram); - quant_trace(stderr, "%u colors found\n", colorfreqtableP->size); - return 0; + return status; } @@ -738,14 +796,15 @@ computeColorMapFromInput(unsigned char const *data, *formatP and *freqPamP. (This information is not really relevant to our colormap mission; just a fringe benefit). -----------------------------------------------------------------------------*/ - tupletable2 colorfreqtable; + SIXELSTATUS status = SIXEL_FALSE; + tupletable2 colorfreqtable = {0, NULL}; unsigned int i; unsigned int n; - int ret; - ret = computeHistogram(data, length, depth, &colorfreqtable, qualityMode); - if (ret != 0) { - return (-1); + status = computeHistogram(data, length, depth, + &colorfreqtable, qualityMode); + if (SIXEL_FAILED(status)) { + goto end; } if (origcolors) { *origcolors = colorfreqtable.size; @@ -756,7 +815,10 @@ computeColorMapFromInput(unsigned char const *data, "Keeping same colors.\n", reqColors); /* *colormapP = colorfreqtable; */ colormapP->size = colorfreqtable.size; - colormapP->table = alloctupletable(depth, colorfreqtable.size); + status = alloctupletable(&colormapP->table, depth, colorfreqtable.size); + if (SIXEL_FAILED(status)) { + goto end; + } for (i = 0; i < colorfreqtable.size; ++i) { colormapP->table[i]->value = colorfreqtable.table[i]->value; for (n = 0; n < depth; ++n) { @@ -765,16 +827,19 @@ computeColorMapFromInput(unsigned char const *data, } } else { quant_trace(stderr, "choosing %d colors...\n", reqColors); - ret = mediancut(colorfreqtable, depth, reqColors, - methodForLargest, methodForRep, colormapP); - if (ret != 0) { - return (-1); + status = mediancut(colorfreqtable, depth, reqColors, + methodForLargest, methodForRep, colormapP); + if (SIXEL_FAILED(status)) { + goto end; } quant_trace(stderr, "%d colors are choosed.\n", colorfreqtable.size); } + status = SIXEL_OK; + +end: free(colorfreqtable.table); - return 0; + return status; } @@ -1095,7 +1160,8 @@ sixel_quant_make_palette(unsigned char const *data, int methodForRep, int qualityMode) { - int i, n; + int i; + int n; int ret; unsigned char *palette; tupletable2 colormap; From ee2e517e12eea5e4a594a3a76ddff7777902ebda Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 1 Jul 2015 00:40:14 +0900 Subject: [PATCH 372/451] Fix a bug of returning wrong status in prepare_builtin_palette() --- src/encoder.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/encoder.c b/src/encoder.c index c86e08e8..db42467d 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -280,6 +280,8 @@ prepare_builtin_palette( goto end; } + status = SIXEL_OK; + end: return status; } From b090f2de53f15afa2a3bde999c96e875eab0dff9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 00:54:38 +0900 Subject: [PATCH 373/451] Minor fixes --- converters/img2sixel.c | 6 +++--- examples/opengl/main.c | 3 +++ src/encoder.c | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 62dc43b9..f2430924 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -410,9 +410,9 @@ main(int argc, char *argv[]) "for more details, type: 'img2sixel -H'.\n"); error: - fprintf(stderr, "%s\nreason: %s\n", - sixel_helper_get_additional_message(), - sixel_helper_format_error(status)); + fprintf(stderr, "%s\n%s\n", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); end: sixel_encoder_unref(encoder); return status; diff --git a/examples/opengl/main.c b/examples/opengl/main.c index 71884a80..800e45d7 100644 --- a/examples/opengl/main.c +++ b/examples/opengl/main.c @@ -496,6 +496,9 @@ int main(int argc, char** argv) status = output_sixel(pixbuf, width, height, ncolors, SIXEL_PIXELFORMAT_RGB888); if (SIXEL_FAILED(status)) { + fprintf(stderr, "%s\n%s\n", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); break; } } diff --git a/src/encoder.c b/src/encoder.c index db42467d..03148416 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1542,7 +1542,7 @@ sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, char const /* in */ *filename) { - SIXELSTATUS status = (-1); + SIXELSTATUS status = SIXEL_FALSE; int fuse_palette = 1; if (encoder == NULL) { From bfc96ce7877aaffd491fc078b1aef95603a1a873 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 00:55:54 +0900 Subject: [PATCH 374/451] Update ChangeLog --- ChangeLog | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/ChangeLog b/ChangeLog index 61ee8299..db3114e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,46 @@ +2015-07-05 Hayaki Saito + + * converters/img2sixel.c, examples/opengl/main.c, src/encoder.c: Minor fixes + +2015-07-01 Hayaki Saito + + * src/encoder.c: Fix a bug of returning wrong status in + prepare_builtin_palette() + +2015-06-30 Hayaki Saito + + * src/fromgif.c, src/loader.c, src/quant.c: Minor improvements + +2015-06-29 Hayaki Saito + + * src/encoder.c: Use sixel_helper_set_additional_message() instead of using + stderr printing + + * src/decoder.c, src/dither.c, src/encoder.c, src/loader.c: Minor + improvements + 2015-06-28 Hayaki Saito + * src/encoder.c, src/frame.c, src/loader.c, src/pixelformat.c: Minor + improvements + + * src/writer.c: Add more tests for status.c + + * src/status.c: Strip extra free() call + + * src/status.c: Strip extra '"' character + + * src/status.c: Update tests + + * src/writer.c: Add more error handling and tests to writer.c + + * src/status.c: Update tests in status.c + + * src/status.c, src/writer.c: Update tests + + * src/Makefile.am, src/Makefile.in, src/status.c, src/status.h, src/tests.c, + src/writer.c: Add more tests + * src/loader.c: Fix segmentation error when set -e option with loading 1/2/4 bpp grayscale image From f6c1a768d47816778c8217119067b770532f8936 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 01:58:15 +0900 Subject: [PATCH 375/451] Checks availability of #pragma GCC diagnostic ignored "-Wtypedef-redefinition" --- Makefile.in | 4 +-- config.h.in | 3 ++ configure | 30 +++++++++++++++++++- configure.ac | 19 ++++++++++++- src/frame.c | 50 ++++++++++++++++++++++++++------- src/loader.c | 63 +++++++++++++++++++++++++----------------- src/writer.c | 78 ++++++++++++++++++++++++++++++++++++++++++---------- 7 files changed, 193 insertions(+), 54 deletions(-) diff --git a/Makefile.in b/Makefile.in index d966ad45..40c907f2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub install-sh \ - ltmain.sh missing py-compile + ChangeLog NEWS compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/config.h.in b/config.h.in index 50594a09..c44ae5eb 100644 --- a/config.h.in +++ b/config.h.in @@ -72,6 +72,9 @@ don't. */ #undef HAVE_DECL_SIGTERM +/* define 1 if GCC supports -Wtypedef-redefinition */ +#undef HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION + /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H diff --git a/configure b/configure index f4297ec6..c60b5e46 100755 --- a/configure +++ b/configure @@ -12216,6 +12216,34 @@ if test x$ax_cv_have_func_attribute_deprecated != x; then fi +CFLAGS_BACKUP=$CFLAGS +CFLAGS="$CFLAGS -Werror" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #pragma GCC diagnostic push + #pragma GCC diagnostic pop + #pragma GCC diagnostic ignored "-Wtypedef-redefinition" + +int +main () +{ + + typedef int foo; + typedef int foo; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS=$CFLAGS_BACKUP + # Options # Check whether --enable-img2sixel was given. if test "${enable_img2sixel+set}" = set; then : @@ -14600,7 +14628,7 @@ if test x$with_libcurl != xno; then ADDED_CFLAGS="-I${with_libcurl}/include" ADDED_LIBS="-L${with_libcurl}/lib -lcurl" else - if test x${prefix} != x -a x${prefix} != xNONE; then + if test x${prefix} != x -a x${prefix} != xNONE; then ADDED_CFLAGS="-I${prefix}/include" ADDED_LIBS="-L${prefix}/lib -lcurl" else diff --git a/configure.ac b/configure.ac index 6fbe025d..ecbb750b 100644 --- a/configure.ac +++ b/configure.ac @@ -29,6 +29,23 @@ if test x$ax_cv_have_func_attribute_deprecated != x; then AC_SUBST(attr_func_deprecated, [__attribute__\(\(deprecated\)\)]) fi +CFLAGS_BACKUP=$CFLAGS +CFLAGS="$CFLAGS -Werror" +AC_TRY_COMPILE( + [ + #pragma GCC diagnostic push + #pragma GCC diagnostic pop + #pragma GCC diagnostic ignored "-Wtypedef-redefinition" + ], + [ + typedef int foo; + typedef int foo; + ], + [AC_DEFINE(HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION, + 1, + [define 1 if GCC supports -Wtypedef-redefinition])]) +CFLAGS=$CFLAGS_BACKUP + # Options AC_ARG_ENABLE([img2sixel], [AS_HELP_STRING([--disable-img2sixel], @@ -384,7 +401,7 @@ if test x$with_libcurl != xno; then ADDED_CFLAGS="-I${with_libcurl}/include" ADDED_LIBS="-L${with_libcurl}/lib -lcurl" else - if test x${prefix} != x -a x${prefix} != xNONE; then + if test x${prefix} != x -a x${prefix} != xNONE; then ADDED_CFLAGS="-I${prefix}/include" ADDED_LIBS="-L${prefix}/lib -lcurl" else diff --git a/src/frame.c b/src/frame.c index fefb0e63..cc5ec586 100644 --- a/src/frame.c +++ b/src/frame.c @@ -555,7 +555,13 @@ test2(void) goto error; } - status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); + status = sixel_frame_init(frame, + pixels, + 1, + 1, + SIXEL_PIXELFORMAT_RGBA8888, + NULL, + 0); if (SIXEL_FAILED(status)) { goto error; } @@ -565,7 +571,7 @@ test2(void) goto error; } - if (frame->pixelformat != PIXELFORMAT_RGB888) { + if (frame->pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } @@ -607,7 +613,13 @@ test3(void) goto error; } - status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_RGBA8888, NULL, 0); + status = sixel_frame_init(frame, + pixels, + 1, + 1, + SIXEL_PIXELFORMAT_RGBA8888, + NULL, + 0); if (SIXEL_FAILED(status)) { goto error; } @@ -617,7 +629,7 @@ test3(void) goto error; } - if (frame->pixelformat != PIXELFORMAT_RGB888) { + if (frame->pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } @@ -659,7 +671,13 @@ test4(void) goto error; } - status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_ARGB8888, NULL, 0); + status = sixel_frame_init(frame, + pixels, + 1, + 1, + SIXEL_PIXELFORMAT_ARGB8888, + NULL, + 0); if (SIXEL_FAILED(status)) { goto error; } @@ -669,7 +687,7 @@ test4(void) goto error; } - if (frame->pixelformat != PIXELFORMAT_RGB888) { + if (frame->pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } @@ -713,7 +731,13 @@ test5(void) goto error; } - status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL8, palette, 1); + status = sixel_frame_init(frame, + pixels, + 1, + 1, + SIXEL_PIXELFORMAT_PAL8, + palette, + 1); if (SIXEL_FAILED(status)) { goto error; } @@ -723,7 +747,7 @@ test5(void) goto error; } - if (frame->pixelformat != PIXELFORMAT_RGB888) { + if (frame->pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } @@ -767,7 +791,13 @@ test6(void) goto error; } - status = sixel_frame_init(frame, pixels, 1, 1, PIXELFORMAT_PAL1, palette, 1); + status = sixel_frame_init(frame, + pixels, + 1, + 1, + SIXEL_PIXELFORMAT_PAL1, + palette, + 1); if (SIXEL_FAILED(status)) { goto error; } @@ -777,7 +807,7 @@ test6(void) goto error; } - if (frame->pixelformat != PIXELFORMAT_RGB888) { + if (frame->pixelformat != SIXEL_PIXELFORMAT_RGB888) { goto error; } diff --git a/src/loader.c b/src/loader.c index ff5e9da5..ad996e29 100644 --- a/src/loader.c +++ b/src/loader.c @@ -63,7 +63,14 @@ #include "stb_image.h" #ifdef HAVE_GDK_PIXBUF2 +# if HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wtypedef-redefinition" +# endif # include +# if HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION +# pragma GCC diagnostic pop +# endif #endif #ifdef HAVE_GD @@ -127,12 +134,18 @@ memory_write(void *ptr, } chunk = (chunk_t *)memory; + if (chunk->buffer == NULL) { + return 0; + } if (chunk->max_size <= chunk->size + nbytes) { do { chunk->max_size *= 2; } while (chunk->max_size <= chunk->size + nbytes); chunk->buffer = (unsigned char*)realloc(chunk->buffer, chunk->max_size); + if (chunk->buffer == NULL) { + return 0; + } } memcpy(chunk->buffer + chunk->size, ptr, nbytes); @@ -1252,11 +1265,11 @@ load_with_gdkpixbuf( ++frame->loop_count; - if (loop_control == LOOP_DISABLE || frame->frame_no == 1) { + if (loop_control == SIXEL_LOOP_DISABLE || frame->frame_no == 1) { break; } /* TODO: get loop property */ - if (loop_control == LOOP_AUTO && frame->loop_count == 1) { + if (loop_control == SIXEL_LOOP_AUTO && frame->loop_count == 1) { break; } } @@ -1281,59 +1294,59 @@ static int detect_file_format(int len, unsigned char *data) { if (memcmp("TRUEVISION", data + len - 18, 10) == 0) { - return FORMAT_TGA; + return SIXEL_FORMAT_TGA; } if (memcmp("GIF", data, 3) == 0) { - return FORMAT_GIF; + return SIXEL_FORMAT_GIF; } if (memcmp("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", data, 8) == 0) { - return FORMAT_PNG; + return SIXEL_FORMAT_PNG; } if (memcmp("BM", data, 2) == 0) { - return FORMAT_BMP; + return SIXEL_FORMAT_BMP; } if (memcmp("\xFF\xD8", data, 2) == 0) { - return FORMAT_JPG; + return SIXEL_FORMAT_JPG; } if (memcmp("\x00\x00", data, 2) == 0) { - return FORMAT_WBMP; + return SIXEL_FORMAT_WBMP; } if (memcmp("\x4D\x4D", data, 2) == 0) { - return FORMAT_TIFF; + return SIXEL_FORMAT_TIFF; } if (memcmp("\x49\x49", data, 2) == 0) { - return FORMAT_TIFF; + return SIXEL_FORMAT_TIFF; } if (memcmp("\033P", data, 2) == 0) { - return FORMAT_SIXEL; + return SIXEL_FORMAT_SIXEL; } if (data[0] == 0x90 && (data[len-1] == 0x9C || data[len-2] == 0x9C)) { - return FORMAT_SIXEL; + return SIXEL_FORMAT_SIXEL; } if (data[0] == 'P' && data[1] >= '1' && data[1] <= '6') { - return FORMAT_PNM; + return SIXEL_FORMAT_PNM; } if (memcmp("gd2", data, 3) == 0) { - return FORMAT_GD2; + return SIXEL_FORMAT_GD2; } if (memcmp("8BPS", data, 4) == 0) { - return FORMAT_PSD; + return SIXEL_FORMAT_PSD; } if (memcmp("#?RADIANCE\n", data, 11) == 0) { - return FORMAT_HDR; + return SIXEL_FORMAT_HDR; } return (-1); @@ -1371,25 +1384,25 @@ load_with_gd( goto end; } - switch(detect_file_format(pchunk->size, pchunk->buffer)) { + switch (detect_file_format(pchunk->size, pchunk->buffer)) { #if 0 # if HAVE_DECL_GDIMAGECREATEFROMGIFPTR - case FORMAT_GIF: + case SIXEL_FORMAT_GIF: im = gdImageCreateFromGifPtr(pchunk->size, pchunk->buffer); break; # endif /* HAVE_DECL_GDIMAGECREATEFROMGIFPTR */ #endif #if HAVE_DECL_GDIMAGECREATEFROMPNGPTR - case FORMAT_PNG: + case SIXEL_FORMAT_PNG: im = gdImageCreateFromPngPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMPNGPTR */ #if HAVE_DECL_GDIMAGECREATEFROMBMPPTR - case FORMAT_BMP: + case SIXEL_FORMAT_BMP: im = gdImageCreateFromBmpPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMBMPPTR */ - case FORMAT_JPG: + case SIXEL_FORMAT_JPG: #if HAVE_DECL_GDIMAGECREATEFROMJPEGPTREX im = gdImageCreateFromJpegPtrEx(pchunk->size, pchunk->buffer, 1); #elif HAVE_DECL_GDIMAGECREATEFROMJPEGPTR @@ -1397,22 +1410,22 @@ load_with_gd( #endif /* HAVE_DECL_GDIMAGECREATEFROMJPEGPTREX */ break; #if HAVE_DECL_GDIMAGECREATEFROMTGAPTR - case FORMAT_TGA: + case SIXEL_FORMAT_TGA: im = gdImageCreateFromTgaPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMTGAPTR */ #if HAVE_DECL_GDIMAGECREATEFROMWBMPPTR - case FORMAT_WBMP: + case SIXEL_FORMAT_WBMP: im = gdImageCreateFromWBMPPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMWBMPPTR */ #if HAVE_DECL_GDIMAGECREATEFROMTIFFPTR - case FORMAT_TIFF: + case SIXEL_FORMAT_TIFF: im = gdImageCreateFromTiffPtr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMTIFFPTR */ #if HAVE_DECL_GDIMAGECREATEFROMGD2PTR - case FORMAT_GD2: + case SIXEL_FORMAT_GD2: im = gdImageCreateFromGd2Ptr(pchunk->size, pchunk->buffer); break; #endif /* HAVE_DECL_GDIMAGECREATEFROMGD2PTR */ diff --git a/src/writer.c b/src/writer.c index 8c6c7793..0e2fec83 100644 --- a/src/writer.c +++ b/src/writer.c @@ -323,7 +323,13 @@ test1(void) unsigned char pixels[] = {0xff, 0xff, 0xff}; status = sixel_helper_write_image_file( - pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "output.gif", FORMAT_GIF); + pixels, + 1, + 1, + NULL, + SIXEL_PIXELFORMAT_RGB888, + "output.gif", + SIXEL_FORMAT_GIF); if (!SIXEL_FAILED(status)) { goto error; @@ -343,7 +349,13 @@ test2(void) unsigned char pixels[] = {0xff, 0xff, 0xff}; status = sixel_helper_write_image_file( - pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_RGB888, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + NULL, + SIXEL_PIXELFORMAT_RGB888, + "test-output.png", + SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; @@ -364,15 +376,26 @@ test3(void) sixel_dither_t *dither = sixel_dither_get(SIXEL_BUILTIN_G8); status = sixel_helper_write_image_file( - pixels, 1, 1, NULL, SIXEL_PIXELFORMAT_G8, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + NULL, + SIXEL_PIXELFORMAT_G8, + "test-output.png", + SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; } status = sixel_helper_write_image_file( - pixels, 1, 1, sixel_dither_get_palette(dither), - SIXEL_PIXELFORMAT_G8, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + sixel_dither_get_palette(dither), + SIXEL_PIXELFORMAT_G8, + "test-output.png", + SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; @@ -393,15 +416,25 @@ test4(void) sixel_dither_t *dither = sixel_dither_get(SIXEL_BUILTIN_MONO_DARK); status = sixel_helper_write_image_file( - pixels, 1, 1, sixel_dither_get_palette(dither), - SIXEL_PIXELFORMAT_PAL1, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + sixel_dither_get_palette(dither), + SIXEL_PIXELFORMAT_PAL1, + "test-output.png", + SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; } status = sixel_helper_write_image_file( - pixels, 1, 1, NULL, - SIXEL_PIXELFORMAT_PAL1, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + NULL, + SIXEL_PIXELFORMAT_PAL1, + "test-output.png", + SIXEL_FORMAT_PNG); if (status != SIXEL_BAD_ARGUMENT) { goto error; } @@ -422,15 +455,25 @@ test5(void) sixel_dither_t *dither = sixel_dither_get(SIXEL_BUILTIN_XTERM256); status = sixel_helper_write_image_file( - pixels, 1, 1, sixel_dither_get_palette(dither), - SIXEL_PIXELFORMAT_PAL8, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + sixel_dither_get_palette(dither), + SIXEL_PIXELFORMAT_PAL8, + "test-output.png", + SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; } status = sixel_helper_write_image_file( - pixels, 1, 1, NULL, - SIXEL_PIXELFORMAT_PAL8, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + NULL, + SIXEL_PIXELFORMAT_PAL8, + "test-output.png", + SIXEL_FORMAT_PNG); if (status != SIXEL_BAD_ARGUMENT) { goto error; } @@ -450,8 +493,13 @@ test6(void) unsigned char pixels[] = {0x00, 0x7f, 0xff}; status = sixel_helper_write_image_file( - pixels, 1, 1, NULL, - SIXEL_PIXELFORMAT_BGR888, "test-output.png", FORMAT_PNG); + pixels, + 1, + 1, + NULL, + SIXEL_PIXELFORMAT_BGR888, + "test-output.png", + SIXEL_FORMAT_PNG); if (SIXEL_FAILED(status)) { goto error; From 914d7556edb3469aac878f59da0fc6e7eaf93eeb Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 04:44:47 +0900 Subject: [PATCH 376/451] Add initial tests for loader.c --- include/sixel.h.in | 8 +++--- src/Makefile.am | 1 + src/decoder.h | 6 ++--- src/encoder.h | 6 ++--- src/loader.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++ src/loader.h | 34 +++++++++++++++++++++++++ src/tests.c | 22 ++++++++++------ 7 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 src/loader.h diff --git a/include/sixel.h.in b/include/sixel.h.in index 15829122..d8575d40 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -896,12 +896,12 @@ sixel_helper_write_image_file( /* easy encoder API */ -#ifndef LIBSIXEL_EASY_ENCODE_H +#ifndef LIBSIXEL_ENCODER_H /* handle type of dither context object */ typedef struct sixel_encoder { int dummy; } sixel_encoder_t; -#endif /* LIBSIXEL_EASY_ENCODE_H */ +#endif /* LIBSIXEL_ENCODER_H */ #ifdef __cplusplus extern "C" { @@ -940,12 +940,12 @@ sixel_encoder_encode( /* easy encoder API */ -#ifndef LIBSIXEL_EASY_DECODE_H +#ifndef LIBSIXEL_DECODER_H /* handle type of dither context object */ typedef struct sixel_decoder { int dummy; } sixel_decoder_t; -#endif /* LIBSIXEL_EASY_ENCODE_H */ +#endif /* LIBSIXEL_DECODER_H */ #ifdef __cplusplus extern "C" { diff --git a/src/Makefile.am b/src/Makefile.am index 8ff1c211..9c141644 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,6 +21,7 @@ libsixel_la_SOURCES = \ pixelformat.h \ scale.c \ loader.c \ + loader.h \ frompnm.c \ frompnm.h \ fromgif.c \ diff --git a/src/decoder.h b/src/decoder.h index eabeb6d2..c12037c7 100644 --- a/src/decoder.h +++ b/src/decoder.h @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef LIBSIXEL_EASY_DECODE_H -#define LIBSIXEL_EASY_DECODE_H +#ifndef LIBSIXEL_DECODER_H +#define LIBSIXEL_DECODER_H /* encode settings object */ typedef struct sixel_decoder { @@ -29,7 +29,7 @@ typedef struct sixel_decoder { char *output; } sixel_decoder_t; -#endif /* LIBSIXEL_EASY_DECODE_H */ +#endif /* LIBSIXEL_DECODER_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ diff --git a/src/encoder.h b/src/encoder.h index 2ae1eb1f..e85dba28 100644 --- a/src/encoder.h +++ b/src/encoder.h @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef LIBSIXEL_EASY_ENCODE_H -#define LIBSIXEL_EASY_ENCODE_H +#ifndef LIBSIXEL_ENCODER_H +#define LIBSIXEL_ENCODER_H /* encoder object */ typedef struct sixel_encoder { @@ -69,7 +69,7 @@ int sixel_encoder_tests_main(void); #endif -#endif /* LIBSIXEL_EASY_ENCODE_H */ +#endif /* LIBSIXEL_ENCODER_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ diff --git a/src/loader.c b/src/loader.c index ad996e29..95cf15b4 100644 --- a/src/loader.c +++ b/src/loader.c @@ -128,6 +128,9 @@ memory_write(void *ptr, size_t nbytes; chunk_t *chunk; + if (ptr == NULL || memory == NULL) { + return 0; + } nbytes = size * len; if (nbytes == 0) { return 0; @@ -1572,6 +1575,65 @@ sixel_helper_load_image_file( return status; } + +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + chunk_t chunk = {0, 0, 0}; + unsigned char *ptr = malloc(16); + int nread; + + nread = memory_write(NULL, 1, 1, NULL); + if (nread != 0) { + goto error; + } + + nread = memory_write(ptr, 1, 1, &chunk); + if (nread != 0) { + goto error; + } + + nread = memory_write(ptr, 0, 1, &chunk); + if (nread != 0) { + goto error; + } + nret = EXIT_SUCCESS; + +error: + free(ptr); + return nret; +} + + +int +sixel_loader_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/loader.h b/src/loader.h new file mode 100644 index 00000000..4f1e7e57 --- /dev/null +++ b/src/loader.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_LOADER_H +#define LIBSIXEL_LOADER_H + +#if HAVE_TESTS +int +sixel_loader_tests_main(void); +#endif + +#endif /* LIBSIXEL_LOADER_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/tests.c b/src/tests.c index eeaf6999..2cde7cc3 100644 --- a/src/tests.c +++ b/src/tests.c @@ -38,6 +38,7 @@ #include "writer.h" #include "encoder.h" #include "status.h" +#include "loader.h" #include #if HAVE_TESTS @@ -50,54 +51,61 @@ main(int argc, char *argv[]) (void) argc; (void) argv; + nret = sixel_loader_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("loader ok."); + nret = sixel_dither_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("dither ok."); nret = sixel_pixelformat_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("pixelformat ok."); nret = sixel_frame_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("frame ok."); nret = sixel_writer_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("writer ok."); nret = sixel_quant_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("quant ok."); nret = sixel_encoder_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("encoder ok."); nret = sixel_status_tests_main(); if (nret != EXIT_SUCCESS) { goto error; } - puts("done."); + puts("status ok."); error: return nret; } From 1da9c10127e173474ded85ef05274cfc5fd677c8 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 05:38:26 +0900 Subject: [PATCH 377/451] Add tests for encoder.c --- include/sixel.h.in | 29 +++++---- src/encoder.c | 147 ++++++++++++++++++++++++++++++++------------- src/frame.h | 4 -- 3 files changed, 122 insertions(+), 58 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index d8575d40..d506a322 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -776,25 +776,28 @@ typedef struct sixel_frame { int dummy; } sixel_frame_t; extern "C" { #endif +/* create frame object */ +sixel_frame_t * +sixel_frame_create(void); + SIXELAPI unsigned char * -sixel_frame_get_pixels(sixel_frame_t *frame); +sixel_frame_get_pixels(sixel_frame_t /* in */ *frame); SIXELAPI void -sixel_frame_ref(sixel_frame_t *frame); +sixel_frame_ref(sixel_frame_t /* in */ *frame); SIXELAPI void -sixel_frame_unref(sixel_frame_t *frame); +sixel_frame_unref(sixel_frame_t /* in */ *frame); SIXELAPI SIXELSTATUS sixel_frame_init( - sixel_frame_t *frame, - unsigned char *pixels, - int width, - int height, - int pixelformat, - unsigned char *palette, - int ncolors -); + sixel_frame_t /* in */ *frame, + unsigned char /* in */ *pixels, + int /* in */ width, + int /* in */ height, + int /* in */ pixelformat, + unsigned char /* in */ *palette, + int /* in */ ncolors); /* get pixels */ SIXELAPI unsigned char * @@ -912,10 +915,10 @@ SIXELAPI sixel_encoder_t * sixel_encoder_create(void); SIXELAPI void -sixel_encoder_ref(sixel_encoder_t *encoder); +sixel_encoder_ref(sixel_encoder_t /* in */ *encoder); SIXELAPI void -sixel_encoder_unref(sixel_encoder_t *encoder); +sixel_encoder_unref(sixel_encoder_t /* in */ *encoder); SIXELAPI SIXELSTATUS sixel_encoder_set_cancel_flag( diff --git a/src/encoder.c b/src/encoder.c index 03148416..31d21d56 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -792,9 +792,12 @@ output_sixel_with_macro( } -static void -scroll_on_demand(sixel_encoder_t *encoder, sixel_frame_t *frame) +static SIXELSTATUS +scroll_on_demand( + sixel_encoder_t /* in */ *encoder, + sixel_frame_t /* in */ *frame) { + SIXELSTATUS status = SIXEL_FALSE; #if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY struct winsize size = {0, 0, 0, 0}; struct termios old_termios; @@ -805,51 +808,69 @@ scroll_on_demand(sixel_encoder_t *encoder, sixel_frame_t *frame) int cellheight; int scroll; char buffer[256]; + int result; - if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { - ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); - if (size.ws_ypixel > 0) { - if (sixel_frame_get_loop_no(frame) == 0 && sixel_frame_get_frame_no(frame) == 0) { - /* set the terminal to cbreak mode */ - tcgetattr(STDIN_FILENO, &old_termios); - memcpy(&new_termios, &old_termios, sizeof(old_termios)); - new_termios.c_lflag &= ~(ECHO | ICANON); - new_termios.c_cc[VMIN] = 1; - new_termios.c_cc[VTIME] = 0; - tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); - - /* request cursor position report */ - sixel_write_callback("\033[6n", 4, &encoder->outfd); - if (wait_stdin(1000 * 1000) != (-1)) { /* wait 1 sec */ - if (scanf("\033[%d;%dR", &row, &col) == 2) { - tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); - pixelheight = sixel_frame_get_height(frame); - cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; - scroll = cellheight + row - size.ws_row + 1; - if (scroll > 0) { - sprintf(buffer, "\033[%dS\033[%dA", scroll, scroll); - sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); - } - sixel_write_callback("\0337", 2, &encoder->outfd); - } else { - sixel_write_callback("\033[H", 3, &encoder->outfd); - } - } else { - sixel_write_callback("\033[H", 3, &encoder->outfd); - } - } else { - sixel_write_callback("\0338", 2, &encoder->outfd); - } - } else { - sixel_write_callback("\033[H", 3, &encoder->outfd); - } - } else { + if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) { + sixel_write_callback("\033[H", 3, &encoder->outfd); + status = SIXEL_OK; + goto end; + } +puts("a1");fflush(0); + result = ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); + if (result != 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message("ioctl() failed."); + goto end; + } + if (size.ws_ypixel <= 0) { sixel_write_callback("\033[H", 3, &encoder->outfd); + status = SIXEL_OK; + goto end; + } + if (sixel_frame_get_loop_no(frame) != 0 || + sixel_frame_get_frame_no(frame) != 0) { + sixel_write_callback("\0338", 2, &encoder->outfd); + status = SIXEL_OK; + goto end; + } + /* set the terminal to cbreak mode */ + tcgetattr(STDIN_FILENO, &old_termios); + memcpy(&new_termios, &old_termios, sizeof(old_termios)); + new_termios.c_lflag &= ~(ECHO | ICANON); + new_termios.c_cc[VMIN] = 1; + new_termios.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + + /* request cursor position report */ + sixel_write_callback("\033[6n", 4, &encoder->outfd); + if (wait_stdin(1000 * 1000) == (-1)) { /* wait 1 sec */ + sixel_write_callback("\033[H", 3, &encoder->outfd); + status = SIXEL_OK; + goto end; } + if (scanf("\033[%d;%dR", &row, &col) != 2) { + sixel_write_callback("\033[H", 3, &encoder->outfd); + status = SIXEL_OK; + goto end; + } + tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); + pixelheight = sixel_frame_get_height(frame); + cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; + scroll = cellheight + row - size.ws_row + 1; + if (scroll > 0) { + sprintf(buffer, "\033[%dS\033[%dA", scroll, scroll); + sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); + } + sixel_write_callback("\0337", 2, &encoder->outfd); #else (void) frame; sixel_write_callback("\033[H", 3, &encoder->outfd); #endif + + status = SIXEL_OK; + +end: + return status; } @@ -932,7 +953,7 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_output_set_encode_policy(output, encoder->encode_policy); if (sixel_frame_get_multiframe(frame) && !encoder->fstatic) { - scroll_on_demand(encoder, frame); + (void) scroll_on_demand(encoder, frame); } if (encoder->cancel_flag && *encoder->cancel_flag) { @@ -1648,6 +1669,49 @@ test1(void) } +static int +test2(void) +{ + int nret = EXIT_FAILURE; + SIXELSTATUS status; + sixel_encoder_t *encoder = NULL; + sixel_frame_t *frame = NULL; + + encoder = sixel_encoder_create(); + if (encoder == NULL) { + goto error; + } + + frame = sixel_frame_create(); + if (encoder == NULL) { + goto error; + } + + status = sixel_frame_init(frame, + malloc(3), + 1, + 1, + SIXEL_PIXELFORMAT_RGB888, + NULL, + 0); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = scroll_on_demand(encoder, frame); + if (SIXEL_FAILED(status)) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + sixel_encoder_unref(encoder); + sixel_frame_unref(frame); + return nret; +} + + int sixel_encoder_tests_main(void) { @@ -1657,6 +1721,7 @@ sixel_encoder_tests_main(void) static testcase const testcases[] = { test1, + test2 }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { diff --git a/src/frame.h b/src/frame.h index e3d7fa93..92e2ed02 100644 --- a/src/frame.h +++ b/src/frame.h @@ -38,10 +38,6 @@ typedef struct sixel_frame { int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ } sixel_frame_t; -/* create frame object */ -sixel_frame_t * -sixel_frame_create(void); - #if HAVE_TESTS int sixel_dither_tests_main(void); From 5b8f53bab14c554b925cbdea35f7200277a0f87c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 06:18:57 +0900 Subject: [PATCH 378/451] Add more tests for encoder.c --- src/encoder.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 31d21d56..513f3adc 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -810,13 +810,12 @@ scroll_on_demand( char buffer[256]; int result; - if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) { + if (!isatty(STDIN_FILENO) || !isatty(encoder->outfd)) { sixel_write_callback("\033[H", 3, &encoder->outfd); status = SIXEL_OK; goto end; } -puts("a1");fflush(0); - result = ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); + result = ioctl(encoder->outfd, TIOCGWINSZ, &size); if (result != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message("ioctl() failed."); @@ -1712,6 +1711,24 @@ test2(void) } +static int +test3(void) +{ + int nret = EXIT_FAILURE; + int result; + + result = wait_stdin(1000); + if (result != 0) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} + + int sixel_encoder_tests_main(void) { @@ -1721,7 +1738,8 @@ sixel_encoder_tests_main(void) static testcase const testcases[] = { test1, - test2 + test2, + test3 }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From 0e34872317f4811521b6278efea30e0657a470de Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 06:44:42 +0900 Subject: [PATCH 379/451] Add more tests for encoder.c --- include/sixel.h.in | 2 +- src/encoder.c | 89 +++++++++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index d506a322..825f6352 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -192,7 +192,7 @@ typedef int SIXELSTATUS; #define SIXEL_OPTFLAG_COMPLEXION_SCORE ('C') /* -C COMPLEXIONSCORE, --complexion-score=COMPLEXIONSCORE: specify an number argument for the score of complexion correction. */ -#define SIXEL_OPTFLAG_IGNORE_DELAY ('u') /* -g, --ignore-delay: render GIF animation without delay */ +#define SIXEL_OPTFLAG_IGNORE_DELAY ('g') /* -g, --ignore-delay: render GIF animation without delay */ #define SIXEL_OPTFLAG_STATIC ('S') /* -S, --static: render animated GIF as a static image */ #define SIXEL_OPTFLAG_DIFFUSION ('d') /* -d DIFFUSIONTYPE, --diffusion=DIFFUSIONTYPE: choose diffusion method which used with -p option. diff --git a/src/encoder.c b/src/encoder.c index 513f3adc..ccb4d6c9 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1137,7 +1137,7 @@ sixel_encoder_setopt( char unit[32]; switch(arg) { - case 'o': + case SIXEL_OPTFLAG_OUTFILE: /* o */ if (*optarg == '\0') { sixel_helper_set_additional_message( "no file name specified."); @@ -1153,16 +1153,16 @@ sixel_encoder_setopt( S_IREAD|S_IWRITE); } break; - case '7': + case SIXEL_OPTFLAG_7BIT_MODE: /* 7 */ encoder->f8bit = 0; break; - case '8': + case SIXEL_OPTFLAG_8BIT_MODE: /* 8 */ encoder->f8bit = 1; break; - case 'p': + case SIXEL_OPTFLAG_COLORS: /* p */ encoder->reqcolors = atoi(optarg); break; - case 'm': + case SIXEL_OPTFLAG_MAPFILE: /* m */ if (encoder->mapfile) { free(encoder->mapfile); } @@ -1172,13 +1172,13 @@ sixel_encoder_setopt( goto end; } break; - case 'e': + case SIXEL_OPTFLAG_MONOCHROME: /* e */ encoder->monochrome = 1; break; - case 'I': + case SIXEL_OPTFLAG_HIGH_COLOR: /* I */ encoder->highcolor = 1; break; - case 'b': + case SIXEL_OPTFLAG_BUILTIN_PALETTE: /* b */ if (strcmp(optarg, "xterm16") == 0) { encoder->builtin_palette = SIXEL_BUILTIN_XTERM16; } else if (strcmp(optarg, "xterm256") == 0) { @@ -1202,7 +1202,7 @@ sixel_encoder_setopt( goto end; } break; - case 'd': + case SIXEL_OPTFLAG_DIFFUSION: /* d */ /* parse --diffusion option */ if (strcmp(optarg, "auto") == 0) { encoder->method_for_diffuse = SIXEL_DIFFUSE_AUTO; @@ -1225,7 +1225,7 @@ sixel_encoder_setopt( goto end; } break; - case 'f': + case SIXEL_OPTFLAG_FIND_LARGEST: /* f */ /* parse --find-largest option */ if (optarg) { if (strcmp(optarg, "auto") == 0) { @@ -1242,7 +1242,7 @@ sixel_encoder_setopt( } } break; - case 's': + case SIXEL_OPTFLAG_SELECT_COLOR: /* s */ /* parse --select-color option */ if (strcmp(optarg, "auto") == 0) { encoder->method_for_rep = SIXEL_REP_AUTO; @@ -1260,7 +1260,7 @@ sixel_encoder_setopt( goto end; } break; - case 'c': + case SIXEL_OPTFLAG_CROP: /* c */ number = sscanf(optarg, "%dx%d+%d+%d", &encoder->clipwidth, &encoder->clipheight, &encoder->clipx, &encoder->clipy); @@ -1278,7 +1278,7 @@ sixel_encoder_setopt( } encoder->clipfirst = 0; break; - case 'w': + case SIXEL_OPTFLAG_WIDTH: /* w */ parsed = sscanf(optarg, "%d%2s", &number, unit); if (parsed == 2 && strcmp(unit, "%") == 0) { encoder->pixelwidth = (-1); @@ -1299,7 +1299,7 @@ sixel_encoder_setopt( encoder->clipfirst = 1; } break; - case 'h': + case SIXEL_OPTFLAG_HEIGHT: /* h */ parsed = sscanf(optarg, "%d%2s", &number, unit); if (parsed == 2 && strcmp(unit, "%") == 0) { encoder->pixelheight = (-1); @@ -1320,7 +1320,7 @@ sixel_encoder_setopt( encoder->clipfirst = 1; } break; - case 'r': + case SIXEL_OPTFLAG_RESAMPLING: /* r */ /* parse --resampling option */ if (strcmp(optarg, "nearest") == 0) { encoder->method_for_resampling = SIXEL_RES_NEAREST; @@ -1349,7 +1349,7 @@ sixel_encoder_setopt( goto end; } break; - case 'q': + case SIXEL_OPTFLAG_QUALITY: /* q */ /* parse --quality option */ if (strcmp(optarg, "auto") == 0) { encoder->quality_mode = SIXEL_QUALITY_AUTO; @@ -1366,7 +1366,7 @@ sixel_encoder_setopt( goto end; } break; - case 'l': + case SIXEL_OPTFLAG_LOOPMODE: /* l */ /* parse --loop-control option */ if (strcmp(optarg, "auto") == 0) { encoder->loop_mode = SIXEL_LOOP_AUTO; @@ -1381,7 +1381,7 @@ sixel_encoder_setopt( goto end; } break; - case 't': + case SIXEL_OPTFLAG_PALETTE_TYPE: /* t */ /* parse --palette-type option */ if (strcmp(optarg, "auto") == 0) { encoder->palette_type = SIXEL_PALETTETYPE_AUTO; @@ -1396,7 +1396,7 @@ sixel_encoder_setopt( goto end; } break; - case 'B': + case SIXEL_OPTFLAG_BGCOLOR: /* B */ /* parse --bgcolor option */ if (encoder->bgcolor) { free(encoder->bgcolor); @@ -1408,35 +1408,35 @@ sixel_encoder_setopt( goto end; } break; - case 'k': + case SIXEL_OPTFLAG_INSECURE: /* k */ encoder->finsecure = 1; break; - case 'i': + case SIXEL_OPTFLAG_INVERT: /* i */ encoder->finvert = 1; break; - case 'u': + case SIXEL_OPTFLAG_USE_MACRO: /* u */ encoder->fuse_macro = 1; break; - case 'n': + case SIXEL_OPTFLAG_MACRO_NUMBER: /* n */ encoder->macro_number = atoi(optarg); if (encoder->macro_number < 0) { status = SIXEL_BAD_ARGUMENT; goto end; } break; - case 'g': + case SIXEL_OPTFLAG_IGNORE_DELAY: /* g */ encoder->fignore_delay = 1; break; - case 'v': + case SIXEL_OPTFLAG_VERBOSE: /* v */ encoder->verbose = 1; break; - case 'S': + case SIXEL_OPTFLAG_STATIC: /* S */ encoder->fstatic = 1; break; - case 'P': + case SIXEL_OPTFLAG_PENETRATE: /* P */ encoder->penetrate_multiplexer = 1; break; - case 'E': + case SIXEL_OPTFLAG_ENCODE_POLICY: /* E */ if (strcmp(optarg, "auto") == 0) { encoder->encode_policy = SIXEL_ENCODEPOLICY_AUTO; } else if (strcmp(optarg, "fast") == 0) { @@ -1450,7 +1450,7 @@ sixel_encoder_setopt( goto end; } break; - case 'C': + case SIXEL_OPTFLAG_COMPLEXION_SCORE: /* C */ encoder->complexion = atoi(optarg); if (encoder->complexion < 1) { sixel_helper_set_additional_message( @@ -1459,7 +1459,7 @@ sixel_encoder_setopt( goto end; } break; - case 'D': + case SIXEL_OPTFLAG_PIPE_MODE: /* D */ encoder->pipe_mode = 1; break; case '?': /* unknown option */ @@ -1651,8 +1651,8 @@ sixel_encoder_encode( static int test1(void) { - sixel_encoder_t *encoder = NULL; int nret = EXIT_FAILURE; + sixel_encoder_t *encoder = NULL; encoder = sixel_encoder_create(); if (encoder == NULL) { @@ -1729,6 +1729,30 @@ test3(void) } +static int +test4(void) +{ + int nret = EXIT_FAILURE; + sixel_encoder_t *encoder = NULL; + SIXELSTATUS status; + + encoder = sixel_encoder_create(); + if (encoder == NULL) { + goto error; + } + + status = sixel_encoder_setopt(encoder, + SIXEL_OPTFLAG_LOOPMODE, + "force"); + + nret = EXIT_SUCCESS; + +error: + sixel_encoder_unref(encoder); + return nret; +} + + int sixel_encoder_tests_main(void) { @@ -1739,7 +1763,8 @@ sixel_encoder_tests_main(void) static testcase const testcases[] = { test1, test2, - test3 + test3, + test4 }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From 1d6174f719076fabc8423f498c7437ececd19c5e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 20:59:02 +0900 Subject: [PATCH 380/451] Minor fixes --- src/encoder.c | 10 +++ src/fromgif.c | 194 +++++++++++++++++++++++++++++--------------------- src/fromgif.h | 9 ++- src/quant.c | 3 +- src/tests.c | 8 +++ 5 files changed, 141 insertions(+), 83 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index ccb4d6c9..d3d1b7d6 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1744,6 +1744,16 @@ test4(void) status = sixel_encoder_setopt(encoder, SIXEL_OPTFLAG_LOOPMODE, "force"); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_encoder_setopt(encoder, + SIXEL_OPTFLAG_PIPE_MODE, + "force"); + if (SIXEL_FAILED(status)) { + goto error; + } nret = EXIT_SUCCESS; diff --git a/src/fromgif.c b/src/fromgif.c index 6df9fcbc..ee9b125c 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -32,16 +32,6 @@ #include "frame.h" #include -#if HAVE_STDINT_H -# include -#else -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef signed short int16_t; -typedef unsigned int uint32_t; -typedef signed int int32_t; -#endif - /* * gif_context_t struct and start_xxx functions * @@ -50,32 +40,32 @@ typedef signed int int32_t; */ typedef struct { - uint32_t img_x, img_y; + unsigned int img_x, img_y; int img_n, img_out_n; int buflen; - uint8_t buffer_start[128]; + unsigned char buffer_start[128]; - uint8_t *img_buffer, *img_buffer_end; - uint8_t *img_buffer_original; + unsigned char *img_buffer, *img_buffer_end; + unsigned char *img_buffer_original; } gif_context_t; typedef struct { - int16_t prefix; - uint8_t first; - uint8_t suffix; + signed short prefix; + unsigned char first; + unsigned char suffix; } gif_lzw; typedef struct { int w, h; - uint8_t *out; /* output buffer (always 4 components) */ + unsigned char *out; /* output buffer (always 4 components) */ int flags, bgindex, ratio, transparent, eflags; - uint8_t pal[256][3]; - uint8_t lpal[256][3]; + unsigned char pal[256][3]; + unsigned char lpal[256][3]; gif_lzw codes[4096]; - uint8_t *color_table; + unsigned char *color_table; int parse, step; int lflags; int start_x, start_y; @@ -89,17 +79,16 @@ typedef struct } gif_t; - /* initialize a memory-decode context */ static void -gif_start_mem(gif_context_t *s, uint8_t const *buffer, int len) +gif_start_mem(gif_context_t *s, unsigned char const *buffer, int len) { - s->img_buffer = s->img_buffer_original = (uint8_t *) buffer; - s->img_buffer_end = (uint8_t *) buffer+len; + s->img_buffer = s->img_buffer_original = (unsigned char *) buffer; + s->img_buffer_end = (unsigned char *) buffer+len; } -static uint8_t +static unsigned char gif_get8(gif_context_t *s) { if (s->img_buffer < s->img_buffer_end) { @@ -117,18 +106,6 @@ gif_get16le(gif_context_t *s) } -static int -gif_getn(gif_context_t *s, uint8_t *buffer, int n) -{ - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} - - static void gif_skip(gif_context_t *s, int n) { @@ -146,7 +123,7 @@ gif_rewind(gif_context_t *s) static void gif_parse_colortable( gif_context_t /* in */ *s, - uint8_t /* in */ pal[256][3], + unsigned char /* in */ pal[256][3], int /* in */ num_entries) { int i; @@ -159,32 +136,33 @@ gif_parse_colortable( } -static int +static SIXELSTATUS gif_load_header( gif_context_t /* in */ *s, gif_t /* in */ *g) { - uint8_t version; + SIXELSTATUS status = SIXEL_FALSE; + unsigned char version; if (gif_get8(s) != 'G') { - return (-1); + goto end; } if (gif_get8(s) != 'I') { - return (-1); + goto end; } if (gif_get8(s) != 'F') { - return (-1); + goto end; } if (gif_get8(s) != '8') { - return (-1); + goto end; } version = gif_get8(s); if (version != '7' && version != '9') { - return (-1); + goto end; } if (gif_get8(s) != 'a') { - return (-1); + goto end; } g->w = gif_get16le(s); @@ -192,14 +170,17 @@ gif_load_header( g->flags = gif_get8(s); g->bgindex = gif_get8(s); g->ratio = gif_get8(s); - g->transparent = -1; - g->loop_count = -1; + g->transparent = (-1); + g->loop_count = (-1); if (g->flags & 0x80) { gif_parse_colortable(s,g->pal, 2 << (g->flags & 7)); } - return 0; + status = SIXEL_OK; + +end: + return status; } @@ -292,8 +273,8 @@ gif_init_frame( static void gif_out_code( - gif_t /* in */ *g, - uint16_t /* in */ code + gif_t /* in */ *g, + unsigned short /* in */ code ) { /* recurse to decode the prefixes, since the linked-list is backwards, @@ -329,10 +310,10 @@ gif_process_raster( ) { SIXELSTATUS status = SIXEL_FALSE; - uint8_t lzw_cs; - int32_t len, code; - uint32_t first; - int32_t codesize, codemask, avail, oldcode, bits, valid_bits, clear; + unsigned char lzw_cs; + signed int len, code; + unsigned int first; + signed int codesize, codemask, avail, oldcode, bits, valid_bits, clear; gif_lzw *p; lzw_cs = gif_get8(s); @@ -344,13 +325,13 @@ gif_process_raster( valid_bits = 0; for (code = 0; code < clear; code++) { g->codes[code].prefix = -1; - g->codes[code].first = (uint8_t) code; - g->codes[code].suffix = (uint8_t) code; + g->codes[code].first = (unsigned char) code; + g->codes[code].suffix = (unsigned char) code; } /* support no starting clear code */ avail = clear + 2; - oldcode = -1; + oldcode = (-1); len = 0; for(;;) { @@ -362,7 +343,7 @@ gif_process_raster( } } --len; - bits |= (int32_t) gif_get8(s) << valid_bits; + bits |= (signed int) gif_get8(s) << valid_bits; valid_bits += 8; } else { code = bits & codemask; @@ -396,7 +377,7 @@ gif_process_raster( status = SIXEL_RUNTIME_ERROR; goto end; } - p->prefix = (int16_t) oldcode; + p->prefix = (signed short) oldcode; p->first = g->codes[oldcode].first; p->suffix = (code == avail) ? p->first : g->codes[code].first; } else if (code == avail) { @@ -406,7 +387,7 @@ gif_process_raster( goto end; } - gif_out_code(g, (uint16_t) code); + gif_out_code(g, (unsigned short) code); if ((avail & codemask) == 0 && avail <= 0x0FFF) { codesize++; @@ -435,18 +416,20 @@ static SIXELSTATUS gif_load_next( gif_context_t /* in */ *s, gif_t /* in */ *g, - uint8_t /* in */ *bgcolor + unsigned char /* in */ *bgcolor ) { SIXELSTATUS status = SIXEL_FALSE; - uint8_t buffer[256]; + unsigned char buffer[256]; + int x; + int y; + int w; + int h; + int len; for (;;) { switch (gif_get8(s)) { case 0x2C: /* Image Descriptor */ - { - int32_t x, y, w, h; - x = gif_get16le(s); y = gif_get16le(s); w = gif_get16le(s); @@ -480,7 +463,7 @@ gif_load_next( gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7)); - g->color_table = (uint8_t *) g->lpal; + g->color_table = (unsigned char *) g->lpal; } else if (g->flags & 0x80) { if (g->transparent >= 0 && (g->eflags & 0x01)) { if (bgcolor) { @@ -489,7 +472,7 @@ gif_load_next( g->pal[g->transparent][2] = bgcolor[0]; } } - g->color_table = (uint8_t *)g->pal; + g->color_table = (unsigned char *)g->pal; } else { sixel_helper_set_additional_message( "corrupt GIF (reason: missing color table)."); @@ -501,11 +484,9 @@ gif_load_next( if (SIXEL_FAILED(status)) { goto end; } - } + break; case 0x21: /* Comment Extension. */ - { - int len; switch (gif_get8(s)) { case 0x01: /* Plain Text Extension */ break; @@ -524,7 +505,12 @@ gif_load_next( break; case 0xFF: /* Application Extension */ len = gif_get8(s); /* block size */ - gif_getn(s, buffer, len); + if (s->img_buffer + len <= s->img_buffer_end) { + status = SIXEL_RUNTIME_ERROR; + goto end; + } + memcpy(buffer, s->img_buffer, len); + s->img_buffer += len; buffer[len] = 0; if (len == 11 && strcmp((char *)buffer, "NETSCAPE2.0") == 0) { if (gif_get8(s) == 0x03) { @@ -547,7 +533,6 @@ gif_load_next( gif_skip(s, len); } break; - } case 0x3B: /* gif stream termination code */ g->is_terminated = 1; @@ -584,12 +569,14 @@ load_gif( { gif_context_t s; gif_t g; - SIXELSTATUS status; + SIXELSTATUS status = SIXEL_FALSE; sixel_frame_t *frame; + g.out = NULL; + frame = sixel_frame_create(); if (frame == NULL) { - return SIXEL_FALSE; + goto end; } gif_start_mem(&s, buffer, size); memset(&g, 0, sizeof(g)); @@ -599,8 +586,9 @@ load_gif( } frame->width = g.w, frame->height = g.h, - g.out = (uint8_t *)malloc(g.w * g.h); + g.out = (unsigned char *)malloc(g.w * g.h); if (g.out == NULL) { + status = SIXEL_BAD_ALLOCATION; goto end; } @@ -645,14 +633,16 @@ load_gif( ++frame->loop_count; - if (g.loop_count == (-1)) { + if (g.loop_count < 0) { break; } if (loop_control == SIXEL_LOOP_DISABLE || frame->frame_no == 1) { break; } - if (loop_control == SIXEL_LOOP_AUTO && frame->loop_count == g.loop_count) { - break; + if (loop_control == SIXEL_LOOP_AUTO) { + if (frame->loop_count == g.loop_count) { + break; + } } } @@ -660,9 +650,51 @@ load_gif( sixel_frame_unref(frame); free(g.out); - return 0; + return status; } + +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +int +sixel_fromgif_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/fromgif.h b/src/fromgif.h index ee71b8a8..587c7339 100644 --- a/src/fromgif.h +++ b/src/fromgif.h @@ -40,11 +40,18 @@ load_gif( void /* in */ *context /* private data for callback */ ); + +#if HAVE_TESTS +int +sixel_fromgif_tests_main(void); +#endif + + #ifdef __cplusplus } #endif -#endif /* LIBSIXEL_FROMGIF */ +#endif /* LIBSIXEL_FROMGIF_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ diff --git a/src/quant.c b/src/quant.c index 78f6d11c..d7c32094 100644 --- a/src/quant.c +++ b/src/quant.c @@ -811,7 +811,8 @@ computeColorMapFromInput(unsigned char const *data, } if (colorfreqtable.size <= reqColors) { - quant_trace(stderr, "Image already has few enough colors (<=%d). " + quant_trace(stderr, + "Image already has few enough colors (<=%d). " "Keeping same colors.\n", reqColors); /* *colormapP = colorfreqtable; */ colormapP->size = colorfreqtable.size; diff --git a/src/tests.c b/src/tests.c index 2cde7cc3..4ff05a36 100644 --- a/src/tests.c +++ b/src/tests.c @@ -39,6 +39,7 @@ #include "encoder.h" #include "status.h" #include "loader.h" +#include "fromgif.h" #include #if HAVE_TESTS @@ -51,6 +52,13 @@ main(int argc, char *argv[]) (void) argc; (void) argv; + nret = sixel_fromgif_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("fromgif ok."); + nret = sixel_loader_tests_main(); if (nret != EXIT_SUCCESS) { goto error; From bcc11fa3189964858d74759150b2d73e73c0de46 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 21:07:10 +0900 Subject: [PATCH 381/451] Add missing "config.h" inclusion to fromgif.c --- src/fromgif.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fromgif.c b/src/fromgif.c index ee9b125c..159c8725 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -25,6 +25,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include "config.h" #include #include #include From fa4dba4de93db0fa96d65352558c10a5e2eab292 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 22:46:15 +0900 Subject: [PATCH 382/451] Don't test memory_write() function if libcurl integration is not enabled --- src/loader.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/loader.c b/src/loader.c index 95cf15b4..06e391b9 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1585,6 +1585,7 @@ test1(void) unsigned char *ptr = malloc(16); int nread; +#ifdef HAVE_LIBCURL nread = memory_write(NULL, 1, 1, NULL); if (nread != 0) { goto error; @@ -1599,6 +1600,7 @@ test1(void) if (nread != 0) { goto error; } +#endif /* HAVE_LIBCURL */ nret = EXIT_SUCCESS; error: From d2ca456beb8ca5bf17621c46519b19aac033460b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 23:07:34 +0900 Subject: [PATCH 383/451] Suppress gcc warnings --- src/loader.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/loader.c b/src/loader.c index 06e391b9..7e822dff 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1581,11 +1581,12 @@ static int test1(void) { int nret = EXIT_FAILURE; - chunk_t chunk = {0, 0, 0}; unsigned char *ptr = malloc(16); - int nread; #ifdef HAVE_LIBCURL + chunk_t chunk = {0, 0, 0}; + int nread; + nread = memory_write(NULL, 1, 1, NULL); if (nread != 0) { goto error; @@ -1600,6 +1601,9 @@ test1(void) if (nread != 0) { goto error; } +#else + nret = EXIT_SUCCESS; + goto error; #endif /* HAVE_LIBCURL */ nret = EXIT_SUCCESS; From c6e3bef68834a5b5d0ed648513fc65025646d7de Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 5 Jul 2015 23:27:07 +0900 Subject: [PATCH 384/451] Minor fixes --- src/fromgif.c | 40 ++++++++-------------------------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/src/fromgif.c b/src/fromgif.c index 159c8725..c5101efe 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -81,14 +81,6 @@ typedef struct /* initialize a memory-decode context */ -static void -gif_start_mem(gif_context_t *s, unsigned char const *buffer, int len) -{ - s->img_buffer = s->img_buffer_original = (unsigned char *) buffer; - s->img_buffer_end = (unsigned char *) buffer+len; -} - - static unsigned char gif_get8(gif_context_t *s) { @@ -107,20 +99,6 @@ gif_get16le(gif_context_t *s) } -static void -gif_skip(gif_context_t *s, int n) -{ - s->img_buffer += n; -} - - -static void -gif_rewind(gif_context_t *s) -{ - s->img_buffer = s->img_buffer_original; -} - - static void gif_parse_colortable( gif_context_t /* in */ *s, @@ -175,7 +153,7 @@ gif_load_header( g->loop_count = (-1); if (g->flags & 0x80) { - gif_parse_colortable(s,g->pal, 2 << (g->flags & 7)); + gif_parse_colortable(s, g->pal, 2 << (g->flags & 7)); } status = SIXEL_OK; @@ -358,9 +336,9 @@ gif_process_raster( oldcode = -1; first = 0; } else if (code == clear + 1) { /* end of stream code */ - gif_skip(s, len); + s->img_buffer += len; while ((len = gif_get8(s)) > 0) { - gif_skip(s,len); + s->img_buffer += len; } return SIXEL_OK; } else if (code <= avail) { @@ -500,7 +478,7 @@ gif_load_next( g->delay = gif_get16le(s); /* delay */ g->transparent = gif_get8(s); } else { - gif_skip(s, len); + s->img_buffer += len; break; } break; @@ -531,7 +509,7 @@ gif_load_next( break; } while ((len = gif_get8(s)) != 0) { - gif_skip(s, len); + s->img_buffer += len; } break; @@ -579,7 +557,8 @@ load_gif( if (frame == NULL) { goto end; } - gif_start_mem(&s, buffer, size); + s.img_buffer = s.img_buffer_original = (unsigned char *)buffer; + s.img_buffer_end = (unsigned char *)buffer + size; memset(&g, 0, sizeof(g)); status = gif_load_header(&s, &g); if (status != SIXEL_OK) { @@ -599,7 +578,7 @@ load_gif( frame->frame_no = 0; - gif_rewind(&s); + s.img_buffer = s.img_buffer_original; status = gif_load_header(&s, &g); if (status != SIXEL_OK) { goto end; @@ -663,7 +642,6 @@ test1(void) nret = EXIT_SUCCESS; -error: return nret; } @@ -694,8 +672,6 @@ sixel_fromgif_tests_main(void) #endif /* HAVE_TESTS */ - - /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ From a6c5f176ae1a8eb5a0e04b2e2db93c7a702f8dd0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Jul 2015 01:39:53 +0900 Subject: [PATCH 385/451] Fix broken GIF loader --- src/fromgif.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fromgif.c b/src/fromgif.c index c5101efe..ba3f5818 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -463,7 +463,7 @@ gif_load_next( if (SIXEL_FAILED(status)) { goto end; } - break; + goto end; case 0x21: /* Comment Extension. */ switch (gif_get8(s)) { @@ -484,7 +484,7 @@ gif_load_next( break; case 0xFF: /* Application Extension */ len = gif_get8(s); /* block size */ - if (s->img_buffer + len <= s->img_buffer_end) { + if (s->img_buffer + len > s->img_buffer_end) { status = SIXEL_RUNTIME_ERROR; goto end; } From 808caf969dc6d3d9ba3c306f87c656df673120f0 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 11 Jul 2015 01:43:20 +0900 Subject: [PATCH 386/451] Minor fixes --- src/frame.c | 7 +++++-- src/loader.c | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/frame.c b/src/frame.c index cc5ec586..bc3d173f 100644 --- a/src/frame.c +++ b/src/frame.c @@ -203,12 +203,13 @@ sixel_frame_get_loop_no(sixel_frame_t /* in */ *frame) /* frame object */ } -SIXELAPI int +SIXELAPI SIXELSTATUS sixel_frame_strip_alpha( sixel_frame_t /* in */ *frame, unsigned char /* in */ *bgcolor ) { + SIXELSTATUS status = SIXEL_FALSE; int x; int y; unsigned char *src; @@ -247,7 +248,9 @@ sixel_frame_strip_alpha( break; } - return 0; + status = SIXEL_OK; + + return status; } diff --git a/src/loader.c b/src/loader.c index 7e822dff..a1631bf6 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1053,6 +1053,7 @@ load_with_builtin( status = SIXEL_BAD_ALLOCATION; goto end; } + status = load_png(&frame->pixels, pchunk->buffer, pchunk->size, @@ -1193,7 +1194,7 @@ load_with_gdkpixbuf( status = SIXEL_BAD_ALLOCATION; goto end; } - if (gdk_pixbuf_get_has_alpha(pixbuf)) { + if (stride / frame->width == 4) { frame->pixelformat = SIXEL_PIXELFORMAT_RGBA8888; depth = 4; } else { @@ -1211,7 +1212,6 @@ load_with_gdkpixbuf( frame->width * depth); } } - status = fn_load(frame, context); if (status != SIXEL_OK) { goto end; From 34af6baa6e9c81516b09c20ab906987fa7c235ad Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 00:22:39 +0900 Subject: [PATCH 387/451] Add error handling for sixel_write_callback() and sprintf() --- src/encoder.c | 131 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 114 insertions(+), 17 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index d3d1b7d6..b1c1d34b 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -742,6 +742,7 @@ output_sixel_with_macro( SIXELSTATUS status = SIXEL_OK; int dulation = 0; char buffer[256]; + int nwrite; #if HAVE_USLEEP int lag = 0; # if HAVE_CLOCK @@ -754,22 +755,51 @@ output_sixel_with_macro( #endif if (loop_count == 0) { if (encoder->macro_number >= 0) { - sprintf(buffer, "\033P%d;0;1!z", encoder->macro_number); + nwrite = sprintf(buffer, "\033P%d;0;1!z", encoder->macro_number); } else { - sprintf(buffer, "\033P%d;0;1!z", frame_no); + nwrite = sprintf(buffer, "\033P%d;0;1!z", frame_no); + } + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "load_image_callback: sprintf() failed."); + goto end; + } + nwrite = sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "output_sixel_with_macro: sixel_write_callback() failed."); + goto end; } - sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); status = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); if (SIXEL_FAILED(status)) { goto end; } - sixel_write_callback("\033\\", 2, &encoder->outfd); + nwrite = sixel_write_callback("\033\\", 2, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "output_sixel_with_macro: sixel_write_callback() failed."); + goto end; + } } if (encoder->macro_number < 0) { - sprintf(buffer, "\033[%d*z", frame_no); - sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); + nwrite = sprintf(buffer, "\033[%d*z", frame_no); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "output_sixel_with_macro: sprintf() failed."); + } + nwrite = sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "output_sixel_with_macro: sixel_write_callback() failed."); + goto end; + } #if HAVE_USLEEP if (delay > 0 && !encoder->fignore_delay) { # if HAVE_CLOCK @@ -809,9 +839,16 @@ scroll_on_demand( int scroll; char buffer[256]; int result; + int nwrite; if (!isatty(STDIN_FILENO) || !isatty(encoder->outfd)) { - sixel_write_callback("\033[H", 3, &encoder->outfd); + nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } status = SIXEL_OK; goto end; } @@ -822,13 +859,25 @@ scroll_on_demand( goto end; } if (size.ws_ypixel <= 0) { - sixel_write_callback("\033[H", 3, &encoder->outfd); + nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } status = SIXEL_OK; goto end; } if (sixel_frame_get_loop_no(frame) != 0 || sixel_frame_get_frame_no(frame) != 0) { - sixel_write_callback("\0338", 2, &encoder->outfd); + nwrite = sixel_write_callback("\0338", 2, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } status = SIXEL_OK; goto end; } @@ -841,14 +890,32 @@ scroll_on_demand( tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); /* request cursor position report */ - sixel_write_callback("\033[6n", 4, &encoder->outfd); + nwrite = sixel_write_callback("\033[6n", 4, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } if (wait_stdin(1000 * 1000) == (-1)) { /* wait 1 sec */ - sixel_write_callback("\033[H", 3, &encoder->outfd); + nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } status = SIXEL_OK; goto end; } if (scanf("\033[%d;%dR", &row, &col) != 2) { - sixel_write_callback("\033[H", 3, &encoder->outfd); + nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } status = SIXEL_OK; goto end; } @@ -857,13 +924,36 @@ scroll_on_demand( cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; scroll = cellheight + row - size.ws_row + 1; if (scroll > 0) { - sprintf(buffer, "\033[%dS\033[%dA", scroll, scroll); - sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); + nwrite = sprintf(buffer, "\033[%dS\033[%dA", scroll, scroll); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sprintf() failed."); + } + nwrite = sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } + } + nwrite = sixel_write_callback("\0337", 2, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; } - sixel_write_callback("\0337", 2, &encoder->outfd); #else (void) frame; - sixel_write_callback("\033[H", 3, &encoder->outfd); + nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "scroll_on_demand: sixel_write_callback() failed."); + goto end; + } #endif status = SIXEL_OK; @@ -880,6 +970,7 @@ load_image_callback(sixel_frame_t *frame, void *data) sixel_encoder_t *encoder; sixel_dither_t *dither = NULL; sixel_output_t *output = NULL; + int nwrite; encoder = (sixel_encoder_t *)data; @@ -996,7 +1087,13 @@ load_image_callback(sixel_frame_t *frame, void *data) } if (encoder->cancel_flag && *encoder->cancel_flag) { - sixel_write_callback("\x18\033\\", 3, &encoder->outfd); + nwrite = sixel_write_callback("\x18\033\\", 3, &encoder->outfd); + if (nwrite < 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "load_image_callback: sixel_write_callback() failed."); + goto end; + } status = SIXEL_INTERRUPTED; } From a1a3e390445fd59fa64640b76b0c68ace9c80454 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 02:29:05 +0900 Subject: [PATCH 388/451] Build fix for MinGW environment --- src/encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index b1c1d34b..a609dee1 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -828,6 +828,7 @@ scroll_on_demand( sixel_frame_t /* in */ *frame) { SIXELSTATUS status = SIXEL_FALSE; + int nwrite; #if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY struct winsize size = {0, 0, 0, 0}; struct termios old_termios; @@ -839,7 +840,6 @@ scroll_on_demand( int scroll; char buffer[256]; int result; - int nwrite; if (!isatty(STDIN_FILENO) || !isatty(encoder->outfd)) { nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); From 2428d08708354ca6fc3f1ff87fecf7c84d170b20 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 20:39:57 +0900 Subject: [PATCH 389/451] Add missing header: _setmode() requires inclusion --- config.h.in | 3 +++ configure | 1 + configure.ac | 1 + src/loader.c | 4 ++++ 4 files changed, 9 insertions(+) diff --git a/config.h.in b/config.h.in index c44ae5eb..b49c4587 100644 --- a/config.h.in +++ b/config.h.in @@ -105,6 +105,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_IO_H + /* Define to 1 if you have the `isatty' function. */ #undef HAVE_ISATTY diff --git a/configure b/configure index c60b5e46..40abe41e 100755 --- a/configure +++ b/configure @@ -13426,6 +13426,7 @@ for ac_header in memory.h \ sys/types.h \ sys/stat.h \ fcntl.h \ + io.h \ errno.h \ limits.h \ sys/time.h \ diff --git a/configure.ac b/configure.ac index ecbb750b..7b10866c 100644 --- a/configure.ac +++ b/configure.ac @@ -191,6 +191,7 @@ AC_CHECK_HEADERS([memory.h \ sys/types.h \ sys/stat.h \ fcntl.h \ + io.h \ errno.h \ limits.h \ sys/time.h \ diff --git a/src/loader.c b/src/loader.c index a1631bf6..806f356e 100644 --- a/src/loader.c +++ b/src/loader.c @@ -45,6 +45,10 @@ # include #endif +#if HAVE_IO_H +# include +#endif + #if !defined(HAVE_MEMCPY) # define memcpy(d, s, n) (bcopy ((s), (d), (n))) #endif From 3e109c8cc21acb2932a6eb8f20ee72db19bc3e4e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 20:46:03 +0900 Subject: [PATCH 390/451] Rebuild --- Makefile.in | 4 ++-- src/Makefile.in | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index 40c907f2..d966ad45 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing py-compile + ChangeLog NEWS compile config.guess config.sub install-sh \ + ltmain.sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/src/Makefile.in b/src/Makefile.in index 139ea010..7c6a1f93 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -393,6 +393,7 @@ libsixel_la_SOURCES = \ pixelformat.h \ scale.c \ loader.c \ + loader.h \ frompnm.c \ frompnm.h \ fromgif.c \ From 87538b4b202fef7843ea5d73be9a298be28cc930 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 21:48:33 +0900 Subject: [PATCH 391/451] Add missing header io.h to decoder.c --- src/decoder.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/decoder.c b/src/decoder.c index 583bcdc4..2f454268 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -56,6 +56,9 @@ #if HAVE_SYS_IOCTL_H # include #endif +#if HAVE_IO_H +# include +#endif #include "decoder.h" #include From 5dce26d7f6c8fe00d91242070d71753f11bce856 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 23:07:42 +0900 Subject: [PATCH 392/451] Add documentation of the environment variables $SIXEL_BGCOLOR --- README.md | 14 ++++++++++++++ converters/img2sixel.1 | 29 +++++++++++++++++++++++++++++ converters/img2sixel.c | 14 ++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/README.md b/README.md index bb6f5bdf..9882fac4 100644 --- a/README.md +++ b/README.md @@ -473,6 +473,20 @@ Options: -v, --verbose show debugging info -V, --version show version and license info -H, --help show this help + +Environment variables: +SIXEL_BGCOLOR specify background color. + overrided by -B(--bgcolor) option. + represented by the following + syntax: + #rgb + #rrggbb + #rrrgggbbb + #rrrrggggbbbb + rgb:r/g/b + rgb:rr/gg/bb + rgb:rrr/ggg/bbb + rgb:rrrr/gggg/bbbb ``` Convert a jpeg image file into a sixel file diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index c9baa7a5..57cd5215 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -264,6 +264,35 @@ show version and license info. .B \-H, \-\-help print help. +.SH "ENVIRONMENT VARIABLES" +\fIimg2sixel\fP has the following command-line options: +.TP 5 +.B SIXEL_BGCOLOR +.br +specify background color. +.br +overrided by -B(--bgcolor) option. +.br +represented by the following syntax: +.br +#rgb +.br +#rrggbb +.br +#rrrgggbbb +.br +#rrrrggggbbbb +.br +rgb:r/g/b +.br +rgb:rr/gg/bb +.br +rgb:rrr/ggg/bbb +.br +rgb:rrrr/gggg/bbbb +.br + + .SH "SEE ALSO" sixel(5) sixel2png(1) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index f2430924..d9554b45 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -262,6 +262,20 @@ void show_help(void) "-v, --verbose show debugging info\n" "-V, --version show version and license info\n" "-H, --help show this help\n" + "\n" + "Environment variables:\n" + "SIXEL_BGCOLOR specify background color.\n" + " overrided by -B(--bgcolor) option.\n" + " represented by the following\n" + " syntax:\n" + " #rgb\n" + " #rrggbb\n" + " #rrrgggbbb\n" + " #rrrrggggbbbb\n" + " rgb:r/g/b\n" + " rgb:rr/gg/bb\n" + " rgb:rrr/ggg/bbb\n" + " rgb:rrrr/gggg/bbbb\n" ); } From f2f3831433c74e9ef810fa2345a81ff12257c3b7 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 12 Jul 2015 23:27:52 +0900 Subject: [PATCH 393/451] Minor fixes --- src/writer.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/writer.c b/src/writer.c index 0e2fec83..b1fb966b 100644 --- a/src/writer.c +++ b/src/writer.c @@ -96,12 +96,14 @@ write_png_to_file( status = SIXEL_BAD_ARGUMENT; sixel_helper_set_additional_message( "write_png_to_file: no palette is given"); - return status; + goto end; } new_pixels = malloc(width * height * 4); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; - return status; + sixel_helper_set_additional_message( + "write_png_to_file: malloc() failed"); + goto end; } src = new_pixels + width * height * 3; dst = pixels = new_pixels; @@ -124,13 +126,15 @@ write_png_to_file( status = SIXEL_BAD_ARGUMENT; sixel_helper_set_additional_message( "write_png_to_file: no palette is given"); - return status; + goto end; } src = data; dst = pixels = new_pixels = malloc(width * height * 3); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; - return status; + sixel_helper_set_additional_message( + "write_png_to_file: malloc() failed"); + goto end; } for (i = 0; i < width * height; ++i, ++src) { *dst++ = *(palette + *src * 3 + 0); @@ -146,7 +150,9 @@ write_png_to_file( dst = pixels = new_pixels = malloc(width * height * 3); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; - return status; + sixel_helper_set_additional_message( + "write_png_to_file: malloc() failed"); + goto end; } if (palette) { for (i = 0; i < width * height; ++i, ++src) { @@ -174,7 +180,9 @@ write_png_to_file( pixels = new_pixels = malloc(width * height * 3); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; - return status; + sixel_helper_set_additional_message( + "write_png_to_file: malloc() failed"); + goto end; } status = sixel_helper_normalize_pixelformat(pixels, &pixelformat, @@ -211,7 +219,9 @@ write_png_to_file( rows = malloc(height * sizeof(unsigned char *)); if (rows == NULL) { status = SIXEL_BAD_ALLOCATION; - return status; + sixel_helper_set_additional_message( + "write_png_to_file: malloc() failed"); + goto end; } for (y = 0; y < height; ++y) { rows[y] = pixels + width * 3 * y; @@ -267,7 +277,9 @@ write_png_to_file( } #if HAVE_LIBPNG free(rows); - png_destroy_write_struct(&png_ptr, &info_ptr); + if (png_ptr) { + png_destroy_write_struct(&png_ptr, &info_ptr); + } #else free(png_data); #endif /* HAVE_LIBPNG */ From e630015de2d537ae8b1481da0b375c1ad238ff51 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Jul 2015 00:06:40 +0900 Subject: [PATCH 394/451] Minor fixes around sixel_chunk_t --- src/loader.c | 149 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 58 deletions(-) diff --git a/src/loader.c b/src/loader.c index 806f356e..5b9291ac 100644 --- a/src/loader.c +++ b/src/loader.c @@ -104,21 +104,48 @@ #include "stb_image.h" -typedef struct chunk +typedef struct sixel_chunk { unsigned char *buffer; size_t size; size_t max_size; -} chunk_t; +} sixel_chunk_t; -static void -chunk_init(chunk_t * const pchunk, - size_t initial_size) +static SIXELSTATUS +sixel_chunk_init( + sixel_chunk_t * const /* in */ pchunk, + size_t /* in */ initial_size) { + SIXELSTATUS status = SIXEL_FALSE; + pchunk->max_size = initial_size; pchunk->size = 0; pchunk->buffer = (unsigned char *)malloc(pchunk->max_size); + + if (pchunk->buffer == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_init: malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + status = SIXEL_OK; + +end: + return status; +} + + +static void +sixel_chunk_destroy( + sixel_chunk_t * const /* in */ pchunk) +{ + if (pchunk) { + free(pchunk->buffer); + pchunk->buffer = NULL; + } + free(pchunk); } @@ -130,7 +157,7 @@ memory_write(void *ptr, void *memory) { size_t nbytes; - chunk_t *chunk; + sixel_chunk_t *chunk; if (ptr == NULL || memory == NULL) { return 0; @@ -140,7 +167,7 @@ memory_write(void *ptr, return 0; } - chunk = (chunk_t *)memory; + chunk = (sixel_chunk_t *)memory; if (chunk->buffer == NULL) { return 0; } @@ -250,10 +277,10 @@ open_binary_file(FILE **f, char const *filename) static SIXELSTATUS -get_chunk_from_file( - char const *filename, - chunk_t *pchunk, - int const *cancel_flag +sixel_chunk_from_file( + char const /* in */ *filename, + sixel_chunk_t /* in */ *pchunk, + int const /* in */ *cancel_flag ) { SIXELSTATUS status = SIXEL_FALSE; @@ -266,14 +293,6 @@ get_chunk_from_file( goto end; } - chunk_init(pchunk, 64 * 1024); - if (pchunk->buffer == NULL) { - sixel_helper_set_additional_message( - "get_chunk_from_file: malloc() failed."); - status = SIXEL_BAD_ALLOCATION; - goto end; - } - for (;;) { if (pchunk->max_size - pchunk->size < 4096) { pchunk->max_size *= 2; @@ -281,7 +300,7 @@ get_chunk_from_file( pchunk->max_size); if (pchunk->buffer == NULL) { sixel_helper_set_additional_message( - "get_chunk_from_file: realloc() failed."); + "sixel_chunk_from_file: realloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -322,9 +341,9 @@ get_chunk_from_file( static SIXELSTATUS -get_chunk_from_url( +sixel_chunk_from_url( char const *url, - chunk_t *pchunk, + sixel_chunk_t *pchunk, int finsecure) { SIXELSTATUS status = SIXEL_FALSE; @@ -334,13 +353,6 @@ get_chunk_from_url( CURLcode code; char buffer[1024]; - chunk_init(pchunk, 1024); - if (pchunk->buffer == NULL) { - sixel_helper_set_additional_message( - "get_chunk_from_url: malloc() failed."); - status = SIXEL_BAD_ALLOCATION; - goto end; - } curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); @@ -450,7 +462,7 @@ read_png(png_structp png_ptr, png_bytep data, png_size_t length) { - chunk_t *pchunk = png_get_io_ptr(png_ptr); + sixel_chunk_t *pchunk = png_get_io_ptr(png_ptr); if (length > pchunk->size) { length = pchunk->size; } @@ -512,7 +524,7 @@ load_png(unsigned char **result, int *transparent) { SIXELSTATUS status = SIXEL_FALSE; - chunk_t read_chunk; + sixel_chunk_t read_chunk; png_uint_32 bitdepth; png_uint_32 png_status; png_structp png_ptr; @@ -859,23 +871,46 @@ load_sixel(unsigned char **result, static SIXELSTATUS -get_chunk( - char const *filename, - chunk_t *pchunk, - int finsecure, - int const *cancel_flag +sixel_chunk_new( + sixel_chunk_t /* out */ **ppchunk, + char const /* in */ *filename, + int /* in */ finsecure, + int const /* in */ *cancel_flag ) { + SIXELSTATUS status = SIXEL_FALSE; + + *ppchunk = (sixel_chunk_t *)malloc(sizeof(sixel_chunk_t)); + if (*ppchunk == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_new: malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + status = sixel_chunk_init(*ppchunk, 1024 * 32); + if (SIXEL_FAILED(status)) { + goto end; + } + if (filename != NULL && strstr(filename, "://")) { - return get_chunk_from_url(filename, pchunk, finsecure); + status = sixel_chunk_from_url(filename, *ppchunk, finsecure); + } else { + status = sixel_chunk_from_file(filename, *ppchunk, cancel_flag); + } + if (SIXEL_FAILED(status)) { + goto end; } - return get_chunk_from_file(filename, pchunk, cancel_flag); + status = SIXEL_OK; + +end: + return status; } static int -chunk_is_sixel(chunk_t const *chunk) +chunk_is_sixel(sixel_chunk_t const *chunk) { unsigned char *p; unsigned char *end; @@ -911,7 +946,7 @@ chunk_is_sixel(chunk_t const *chunk) static int -chunk_is_pnm(chunk_t const *chunk) +chunk_is_pnm(sixel_chunk_t const *chunk) { if (chunk->size < 2) { return 0; @@ -927,7 +962,7 @@ chunk_is_pnm(chunk_t const *chunk) #if HAVE_LIBPNG static int -chunk_is_png(chunk_t const *chunk) +chunk_is_png(sixel_chunk_t const *chunk) { if (chunk->size < 8) { return 0; @@ -941,7 +976,7 @@ chunk_is_png(chunk_t const *chunk) static int -chunk_is_gif(chunk_t const *chunk) +chunk_is_gif(sixel_chunk_t const *chunk) { if (chunk->size < 6) { return 0; @@ -960,7 +995,7 @@ chunk_is_gif(chunk_t const *chunk) #if HAVE_JPEG static int -chunk_is_jpeg(chunk_t const *chunk) +chunk_is_jpeg(sixel_chunk_t const *chunk) { if (chunk->size < 2) { return 0; @@ -976,7 +1011,7 @@ chunk_is_jpeg(chunk_t const *chunk) static SIXELSTATUS load_with_builtin( - chunk_t const /* in */ *pchunk, /* image data */ + sixel_chunk_t const /* in */ *pchunk, /* image data */ int /* in */ fstatic, /* static */ int /* in */ fuse_palette, /* whether to use palette if possible */ int /* in */ reqcolors, /* reqcolors */ @@ -1144,7 +1179,7 @@ load_with_builtin( #ifdef HAVE_GDK_PIXBUF2 static SIXELSTATUS load_with_gdkpixbuf( - chunk_t const /* in */ *pchunk, /* image data */ + sixel_chunk_t const /* in */ *pchunk, /* image data */ int /* in */ fstatic, /* static */ int /* in */ fuse_palette, /* whether to use palette if possible */ int /* in */ reqcolors, /* reqcolors */ @@ -1362,7 +1397,7 @@ detect_file_format(int len, unsigned char *data) static SIXELSTATUS load_with_gd( - chunk_t const /* in */ *pchunk, /* image data */ + sixel_chunk_t const /* in */ *pchunk, /* image data */ int /* in */ fstatic, /* static */ int /* in */ fuse_palette, /* whether to use palette if possible */ int /* in */ reqcolors, /* reqcolors */ @@ -1513,23 +1548,21 @@ sixel_helper_load_image_file( ) { SIXELSTATUS status = SIXEL_FALSE; - chunk_t chunk; - chunk.buffer = NULL; - chunk.size = chunk.max_size = 0; + sixel_chunk_t *pchunk = NULL; - status = get_chunk(filename, &chunk, finsecure, cancel_flag); + status = sixel_chunk_new(&pchunk, filename, finsecure, cancel_flag); if (status != SIXEL_OK) { goto end; } /* if input date is empty or 1 byte LF, ignore it and return successfully */ - if (chunk.size == 0 || (chunk.size == 1 && *chunk.buffer == '\n')) { + if (pchunk->size == 0 || (pchunk->size == 1 && *pchunk->buffer == '\n')) { status = SIXEL_OK; goto end; } /* assertion */ - if (chunk.buffer == NULL || chunk.max_size == 0) { + if (pchunk->buffer == NULL || pchunk->max_size == 0) { status = SIXEL_LOGIC_ERROR; goto end; } @@ -1537,7 +1570,7 @@ sixel_helper_load_image_file( status = SIXEL_FALSE; #ifdef HAVE_GDK_PIXBUF2 if (SIXEL_FAILED(status)) { - status = load_with_gdkpixbuf(&chunk, + status = load_with_gdkpixbuf(pchunk, fstatic, fuse_palette, reqcolors, @@ -1549,7 +1582,7 @@ sixel_helper_load_image_file( #endif /* HAVE_GDK_PIXBUF2 */ #if HAVE_GD if (SIXEL_FAILED(status)) { - status = load_with_gd(&chunk, + status = load_with_gd(pchunk, fstatic, fuse_palette, reqcolors, @@ -1560,7 +1593,7 @@ sixel_helper_load_image_file( } #endif /* HAVE_GD */ if (SIXEL_FAILED(status)) { - status = load_with_builtin(&chunk, + status = load_with_builtin(pchunk, fstatic, fuse_palette, reqcolors, @@ -1569,13 +1602,13 @@ sixel_helper_load_image_file( fn_load, context); } - free(chunk.buffer); - if (SIXEL_FAILED(status)) { goto end; } end: + sixel_chunk_destroy(pchunk); + return status; } @@ -1588,7 +1621,7 @@ test1(void) unsigned char *ptr = malloc(16); #ifdef HAVE_LIBCURL - chunk_t chunk = {0, 0, 0}; + sixel_chunk_t chunk = {0, 0, 0}; int nread; nread = memory_write(NULL, 1, 1, NULL); From acdef60b96ae6d83e8671b775def74df7de79dea Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Jul 2015 00:35:21 +0900 Subject: [PATCH 395/451] Add chunk.c/chunk.h --- src/Makefile.am | 2 + src/Makefile.in | 20 ++- src/chunk.c | 391 ++++++++++++++++++++++++++++++++++++++++++++++++ src/chunk.h | 57 +++++++ src/frame.h | 4 + src/loader.c | 373 ++------------------------------------------- 6 files changed, 479 insertions(+), 368 deletions(-) create mode 100644 src/chunk.c create mode 100644 src/chunk.h diff --git a/src/Makefile.am b/src/Makefile.am index 9c141644..8723f342 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,6 +20,8 @@ libsixel_la_SOURCES = \ pixelformat.c \ pixelformat.h \ scale.c \ + chunk.c \ + chunk.h \ loader.c \ loader.h \ frompnm.c \ diff --git a/src/Makefile.in b/src/Makefile.in index 7c6a1f93..480c305b 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -141,11 +141,11 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-fromsixel.lo libsixel_la-tosixel.lo \ libsixel_la-quant.lo libsixel_la-dither.lo \ libsixel_la-frame.lo libsixel_la-pixelformat.lo \ - libsixel_la-scale.lo libsixel_la-loader.lo \ - libsixel_la-frompnm.lo libsixel_la-fromgif.lo \ - libsixel_la-encoder.lo libsixel_la-decoder.lo \ - libsixel_la-writer.lo libsixel_la-stb_image_write.lo \ - libsixel_la-status.lo + libsixel_la-scale.lo libsixel_la-chunk.lo \ + libsixel_la-loader.lo libsixel_la-frompnm.lo \ + libsixel_la-fromgif.lo libsixel_la-encoder.lo \ + libsixel_la-decoder.lo libsixel_la-writer.lo \ + libsixel_la-stb_image_write.lo libsixel_la-status.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -392,6 +392,8 @@ libsixel_la_SOURCES = \ pixelformat.c \ pixelformat.h \ scale.c \ + chunk.c \ + chunk.h \ loader.c \ loader.h \ frompnm.c \ @@ -526,6 +528,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-chunk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-decoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-encoder.Plo@am__quote@ @@ -621,6 +624,13 @@ libsixel_la-scale.lo: scale.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-scale.lo `test -f 'scale.c' || echo '$(srcdir)/'`scale.c +libsixel_la-chunk.lo: chunk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-chunk.lo -MD -MP -MF $(DEPDIR)/libsixel_la-chunk.Tpo -c -o libsixel_la-chunk.lo `test -f 'chunk.c' || echo '$(srcdir)/'`chunk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-chunk.Tpo $(DEPDIR)/libsixel_la-chunk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='chunk.c' object='libsixel_la-chunk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-chunk.lo `test -f 'chunk.c' || echo '$(srcdir)/'`chunk.c + libsixel_la-loader.lo: loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-loader.lo -MD -MP -MF $(DEPDIR)/libsixel_la-loader.Tpo -c -o libsixel_la-loader.lo `test -f 'loader.c' || echo '$(srcdir)/'`loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-loader.Tpo $(DEPDIR)/libsixel_la-loader.Plo diff --git a/src/chunk.c b/src/chunk.c new file mode 100644 index 00000000..2d3142a1 --- /dev/null +++ b/src/chunk.c @@ -0,0 +1,391 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include + +#if HAVE_SYS_TYPES_H +# include +#endif + +#if HAVE_SYS_STAT_H +# include +#endif + +#if HAVE_UNISTD_H +# include +#endif + +#if HAVE_FCNTL_H +# include +#endif + +#if HAVE_IO_H +# include +#endif + +#ifdef HAVE_ERRNO_H +# include +#endif + +#ifdef HAVE_LIBCURL +# include +#endif + +#if !defined(HAVE_MEMCPY) +# define memcpy(d, s, n) (bcopy ((s), (d), (n))) +#endif + +#if !defined(HAVE_MEMMOVE) +# define memmove(d, s, n) (bcopy ((s), (d), (n))) +#endif + +#if !defined(O_BINARY) && defined(_O_BINARY) +# define O_BINARY _O_BINARY +#endif /* !defined(O_BINARY) && !defined(_O_BINARY) */ + +#include +#include "chunk.h" + +static SIXELSTATUS +sixel_chunk_init( + sixel_chunk_t * const /* in */ pchunk, + size_t /* in */ initial_size) +{ + SIXELSTATUS status = SIXEL_FALSE; + + pchunk->max_size = initial_size; + pchunk->size = 0; + pchunk->buffer = (unsigned char *)malloc(pchunk->max_size); + + if (pchunk->buffer == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_init: malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + status = SIXEL_OK; + +end: + return status; +} + + +# ifdef HAVE_LIBCURL +static size_t +memory_write(void *ptr, + size_t size, + size_t len, + void *memory) +{ + size_t nbytes; + sixel_chunk_t *chunk; + + if (ptr == NULL || memory == NULL) { + return 0; + } + nbytes = size * len; + if (nbytes == 0) { + return 0; + } + + chunk = (sixel_chunk_t *)memory; + if (chunk->buffer == NULL) { + return 0; + } + + if (chunk->max_size <= chunk->size + nbytes) { + do { + chunk->max_size *= 2; + } while (chunk->max_size <= chunk->size + nbytes); + chunk->buffer = (unsigned char*)realloc(chunk->buffer, chunk->max_size); + if (chunk->buffer == NULL) { + return 0; + } + } + + memcpy(chunk->buffer + chunk->size, ptr, nbytes); + chunk->size += nbytes; + + return nbytes; +} +# endif + + +static int +wait_file(int fd, int usec) +{ +#if HAVE_SYS_SELECT_H + fd_set rfds; + struct timeval tv; +#endif /* HAVE_SYS_SELECT_H */ + int ret = 1; + +#if HAVE_SYS_SELECT_H + tv.tv_sec = usec / 1000000; + tv.tv_usec = usec % 1000000; + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + ret = select(fd + 1, &rfds, NULL, NULL, &tv); +#else + (void) fd; + (void) usec; +#endif /* HAVE_SYS_SELECT_H */ + if (ret == 0) { + return (1); + } + if (ret < 0) { + return ret; + } + + return (0); +} + + +static SIXELSTATUS +open_binary_file(FILE **f, char const *filename) +{ + SIXELSTATUS status = SIXEL_FALSE; + char buffer[1024]; +#if HAVE_STAT + struct stat sb; +#endif /* HAVE_STAT */ + + if (filename == NULL || strcmp(filename, "-") == 0) { + /* for windows */ +#if defined(O_BINARY) +# if HAVE__SETMODE + _setmode(fileno(stdin), O_BINARY); +# elif HAVE_SETMODE + setmode(fileno(stdin), O_BINARY); +# endif /* HAVE_SETMODE */ +#endif /* defined(O_BINARY) */ + *f = stdin; + + status = SIXEL_OK; + goto end; + } + +#if HAVE_STAT + if (stat(filename, &sb) != 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + if (sprintf(buffer, "stat('%s') failed.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } + goto end; + } + if ((sb.st_mode & S_IFMT) == S_IFDIR) { + status = SIXEL_BAD_INPUT; + if (sprintf(buffer, "'%s' is directory.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } + goto end; + } +#endif /* HAVE_STAT */ + + *f = fopen(filename, "rb"); + if (!*f) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + if (sprintf(buffer, "fopen('%s') failed.", filename) != EOF) { + sixel_helper_set_additional_message(buffer); + } + goto end; + } + + status = SIXEL_OK; +end: + return status; +} + + +static SIXELSTATUS +sixel_chunk_from_file( + char const /* in */ *filename, + sixel_chunk_t /* in */ *pchunk, + int const /* in */ *cancel_flag +) +{ + SIXELSTATUS status = SIXEL_FALSE; + int ret; + FILE *f; + int n; + + status = open_binary_file(&f, filename); + if (SIXEL_FAILED(status)) { + goto end; + } + + for (;;) { + if (pchunk->max_size - pchunk->size < 4096) { + pchunk->max_size *= 2; + pchunk->buffer = (unsigned char *)realloc(pchunk->buffer, + pchunk->max_size); + if (pchunk->buffer == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_from_file: realloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + } + + if (isatty(fileno(f))) { + for (;;) { + if (*cancel_flag) { + status = SIXEL_INTERRUPTED; + goto end; + } + ret = wait_file(fileno(f), 10000); + if (ret < 0) { + status = SIXEL_RUNTIME_ERROR; + goto end; + } + if (ret == 0) { + break; + } + } + } + n = fread(pchunk->buffer + pchunk->size, 1, 4096, f); + if (n <= 0) { + break; + } + pchunk->size += n; + } + + if (f != stdin) { + fclose(f); + } + + status = SIXEL_OK; + +end: + return status; +} + + +static SIXELSTATUS +sixel_chunk_from_url( + char const *url, + sixel_chunk_t *pchunk, + int finsecure) +{ + SIXELSTATUS status = SIXEL_FALSE; + +# ifdef HAVE_LIBCURL + CURL *curl; + CURLcode code; + char buffer[1024]; + + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + if (finsecure && strncmp(url, "https://", 8) == 0) { + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + } + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memory_write); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)pchunk); + code = curl_easy_perform(curl); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + if (sprintf(buffer, "curl_easy_perform('%s') failed.", url) != EOF) { + sixel_helper_set_additional_message(buffer); + } + curl_easy_cleanup(curl); + goto end; + } + curl_easy_cleanup(curl); + + status = SIXEL_OK; +# else + (void) url; + (void) pchunk; + (void) finsecure; + sixel_helper_set_additional_message( + "To specify URI schemes, you have to " + "configure this program with --with-libcurl " + "option at compile time.\n"); + status = SIXEL_NOT_IMPLEMENTED; + goto end; +# endif /* HAVE_LIBCURL */ + +end: + return status; +} + + +SIXELSTATUS +sixel_chunk_new( + sixel_chunk_t /* out */ **ppchunk, + char const /* in */ *filename, + int /* in */ finsecure, + int const /* in */ *cancel_flag +) +{ + SIXELSTATUS status = SIXEL_FALSE; + + *ppchunk = (sixel_chunk_t *)malloc(sizeof(sixel_chunk_t)); + if (*ppchunk == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_new: malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + status = sixel_chunk_init(*ppchunk, 1024 * 32); + if (SIXEL_FAILED(status)) { + goto end; + } + + if (filename != NULL && strstr(filename, "://")) { + status = sixel_chunk_from_url(filename, *ppchunk, finsecure); + } else { + status = sixel_chunk_from_file(filename, *ppchunk, cancel_flag); + } + if (SIXEL_FAILED(status)) { + goto end; + } + + status = SIXEL_OK; + +end: + return status; +} + + +void +sixel_chunk_destroy( + sixel_chunk_t * const /* in */ pchunk) +{ + if (pchunk) { + free(pchunk->buffer); + pchunk->buffer = NULL; + } + free(pchunk); +} + + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/chunk.h b/src/chunk.h new file mode 100644 index 00000000..6230f60c --- /dev/null +++ b/src/chunk.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_CHUNK_H +#define LIBSIXEL_CHUNK_H + +/* chunk object */ +typedef struct sixel_chunk +{ + unsigned char *buffer; + size_t size; + size_t max_size; +} sixel_chunk_t; + +#ifdef __cplusplus +extern "C" { +#endif + +SIXELSTATUS +sixel_chunk_new( + sixel_chunk_t /* out */ **ppchunk, + char const /* in */ *filename, + int /* in */ finsecure, + int const /* in */ *cancel_flag); + + +void +sixel_chunk_destroy( + sixel_chunk_t * const /* in */ pchunk); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSIXEL_CHUNK_H */ + +/* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/frame.h b/src/frame.h index 92e2ed02..a2a65bd0 100644 --- a/src/frame.h +++ b/src/frame.h @@ -38,6 +38,10 @@ typedef struct sixel_frame { int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ } sixel_frame_t; +#ifdef __cplusplus +extern "C" { +#endif + #if HAVE_TESTS int sixel_dither_tests_main(void); diff --git a/src/loader.c b/src/loader.c index 5b9291ac..3a18c61a 100644 --- a/src/loader.c +++ b/src/loader.c @@ -24,29 +24,12 @@ #include #include -#if HAVE_JPEG -# include -# include -#endif /* HAVE_JPEG */ - -#if HAVE_SYS_TYPES_H -# include -#endif - -#if HAVE_SYS_STAT_H -# include -#endif - #if HAVE_UNISTD_H # include #endif -#if HAVE_FCNTL_H -# include -#endif - -#if HAVE_IO_H -# include +#ifdef HAVE_ERRNO_H +# include #endif #if !defined(HAVE_MEMCPY) @@ -57,12 +40,6 @@ # define memmove(d, s, n) (bcopy ((s), (d), (n))) #endif -#if !defined(O_BINARY) && defined(_O_BINARY) -# define O_BINARY _O_BINARY -#endif /* !defined(O_BINARY) && !defined(_O_BINARY) */ - -#include - #define STBI_NO_STDIO 1 #include "stb_image.h" @@ -81,316 +58,26 @@ # include #endif -#ifdef HAVE_LIBCURL -# include -#endif - -#ifdef HAVE_ERRNO_H -# include -#endif - #ifdef HAVE_LIBPNG # include #endif /* HAVE_LIBPNG */ -#include -#include "frompnm.h" -#include "fromgif.h" +#if HAVE_JPEG +# include +# include +#endif /* HAVE_JPEG */ + #include "frame.h" #include +#include "chunk.h" +#include "frompnm.h" +#include "fromgif.h" #define STBI_NO_STDIO 1 #define STB_IMAGE_IMPLEMENTATION 1 #include "stb_image.h" -typedef struct sixel_chunk -{ - unsigned char *buffer; - size_t size; - size_t max_size; -} sixel_chunk_t; - - -static SIXELSTATUS -sixel_chunk_init( - sixel_chunk_t * const /* in */ pchunk, - size_t /* in */ initial_size) -{ - SIXELSTATUS status = SIXEL_FALSE; - - pchunk->max_size = initial_size; - pchunk->size = 0; - pchunk->buffer = (unsigned char *)malloc(pchunk->max_size); - - if (pchunk->buffer == NULL) { - sixel_helper_set_additional_message( - "sixel_chunk_init: malloc() failed."); - status = SIXEL_BAD_ALLOCATION; - goto end; - } - - status = SIXEL_OK; - -end: - return status; -} - - -static void -sixel_chunk_destroy( - sixel_chunk_t * const /* in */ pchunk) -{ - if (pchunk) { - free(pchunk->buffer); - pchunk->buffer = NULL; - } - free(pchunk); -} - - -# ifdef HAVE_LIBCURL -static size_t -memory_write(void *ptr, - size_t size, - size_t len, - void *memory) -{ - size_t nbytes; - sixel_chunk_t *chunk; - - if (ptr == NULL || memory == NULL) { - return 0; - } - nbytes = size * len; - if (nbytes == 0) { - return 0; - } - - chunk = (sixel_chunk_t *)memory; - if (chunk->buffer == NULL) { - return 0; - } - - if (chunk->max_size <= chunk->size + nbytes) { - do { - chunk->max_size *= 2; - } while (chunk->max_size <= chunk->size + nbytes); - chunk->buffer = (unsigned char*)realloc(chunk->buffer, chunk->max_size); - if (chunk->buffer == NULL) { - return 0; - } - } - - memcpy(chunk->buffer + chunk->size, ptr, nbytes); - chunk->size += nbytes; - - return nbytes; -} -# endif - - -static int -wait_file(int fd, int usec) -{ -#if HAVE_SYS_SELECT_H - fd_set rfds; - struct timeval tv; -#endif /* HAVE_SYS_SELECT_H */ - int ret = 1; - -#if HAVE_SYS_SELECT_H - tv.tv_sec = usec / 1000000; - tv.tv_usec = usec % 1000000; - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - ret = select(fd + 1, &rfds, NULL, NULL, &tv); -#else - (void) fd; - (void) usec; -#endif /* HAVE_SYS_SELECT_H */ - if (ret == 0) { - return (1); - } - if (ret < 0) { - return ret; - } - - return (0); -} - - -static SIXELSTATUS -open_binary_file(FILE **f, char const *filename) -{ - SIXELSTATUS status = SIXEL_FALSE; - char buffer[1024]; -#if HAVE_STAT - struct stat sb; -#endif /* HAVE_STAT */ - - if (filename == NULL || strcmp(filename, "-") == 0) { - /* for windows */ -#if defined(O_BINARY) -# if HAVE__SETMODE - _setmode(fileno(stdin), O_BINARY); -# elif HAVE_SETMODE - setmode(fileno(stdin), O_BINARY); -# endif /* HAVE_SETMODE */ -#endif /* defined(O_BINARY) */ - *f = stdin; - - status = SIXEL_OK; - goto end; - } - -#if HAVE_STAT - if (stat(filename, &sb) != 0) { - status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - if (sprintf(buffer, "stat('%s') failed.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } - goto end; - } - if ((sb.st_mode & S_IFMT) == S_IFDIR) { - status = SIXEL_BAD_INPUT; - if (sprintf(buffer, "'%s' is directory.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } - goto end; - } -#endif /* HAVE_STAT */ - - *f = fopen(filename, "rb"); - if (!*f) { - status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - if (sprintf(buffer, "fopen('%s') failed.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } - goto end; - } - - status = SIXEL_OK; -end: - return status; -} - - -static SIXELSTATUS -sixel_chunk_from_file( - char const /* in */ *filename, - sixel_chunk_t /* in */ *pchunk, - int const /* in */ *cancel_flag -) -{ - SIXELSTATUS status = SIXEL_FALSE; - int ret; - FILE *f; - int n; - - status = open_binary_file(&f, filename); - if (SIXEL_FAILED(status)) { - goto end; - } - - for (;;) { - if (pchunk->max_size - pchunk->size < 4096) { - pchunk->max_size *= 2; - pchunk->buffer = (unsigned char *)realloc(pchunk->buffer, - pchunk->max_size); - if (pchunk->buffer == NULL) { - sixel_helper_set_additional_message( - "sixel_chunk_from_file: realloc() failed."); - status = SIXEL_BAD_ALLOCATION; - goto end; - } - } - - if (isatty(fileno(f))) { - for (;;) { - if (*cancel_flag) { - status = SIXEL_INTERRUPTED; - goto end; - } - ret = wait_file(fileno(f), 10000); - if (ret < 0) { - status = SIXEL_RUNTIME_ERROR; - goto end; - } - if (ret == 0) { - break; - } - } - } - n = fread(pchunk->buffer + pchunk->size, 1, 4096, f); - if (n <= 0) { - break; - } - pchunk->size += n; - } - - if (f != stdin) { - fclose(f); - } - - status = SIXEL_OK; - -end: - return status; -} - - -static SIXELSTATUS -sixel_chunk_from_url( - char const *url, - sixel_chunk_t *pchunk, - int finsecure) -{ - SIXELSTATUS status = SIXEL_FALSE; - -# ifdef HAVE_LIBCURL - CURL *curl; - CURLcode code; - char buffer[1024]; - - curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - if (finsecure && strncmp(url, "https://", 8) == 0) { - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); - } - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memory_write); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)pchunk); - code = curl_easy_perform(curl); - if (code != CURLE_OK) { - status = SIXEL_CURL_ERROR & (code & 0xff); - if (sprintf(buffer, "curl_easy_perform('%s') failed.", url) != EOF) { - sixel_helper_set_additional_message(buffer); - } - curl_easy_cleanup(curl); - goto end; - } - curl_easy_cleanup(curl); - - status = SIXEL_OK; -# else - (void) url; - (void) pchunk; - (void) finsecure; - sixel_helper_set_additional_message( - "To specify URI schemes, you have to " - "configure this program with --with-libcurl " - "option at compile time.\n"); - status = SIXEL_NOT_IMPLEMENTED; - goto end; -# endif /* HAVE_LIBCURL */ - -end: - return status; -} - - # if HAVE_JPEG /* import from @uobikiemukot's sdump loader.h */ static SIXELSTATUS @@ -870,45 +557,6 @@ load_sixel(unsigned char **result, } -static SIXELSTATUS -sixel_chunk_new( - sixel_chunk_t /* out */ **ppchunk, - char const /* in */ *filename, - int /* in */ finsecure, - int const /* in */ *cancel_flag -) -{ - SIXELSTATUS status = SIXEL_FALSE; - - *ppchunk = (sixel_chunk_t *)malloc(sizeof(sixel_chunk_t)); - if (*ppchunk == NULL) { - sixel_helper_set_additional_message( - "sixel_chunk_new: malloc() failed."); - status = SIXEL_BAD_ALLOCATION; - goto end; - } - - status = sixel_chunk_init(*ppchunk, 1024 * 32); - if (SIXEL_FAILED(status)) { - goto end; - } - - if (filename != NULL && strstr(filename, "://")) { - status = sixel_chunk_from_url(filename, *ppchunk, finsecure); - } else { - status = sixel_chunk_from_file(filename, *ppchunk, cancel_flag); - } - if (SIXEL_FAILED(status)) { - goto end; - } - - status = SIXEL_OK; - -end: - return status; -} - - static int chunk_is_sixel(sixel_chunk_t const *chunk) { @@ -1676,7 +1324,6 @@ sixel_loader_tests_main(void) #endif /* HAVE_TESTS */ - /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ From 5045fcb39fdfdf644d0a6cd6f8aa54c5936c0129 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 13 Jul 2015 12:32:08 +0900 Subject: [PATCH 396/451] Add missing stdio.h inclusion to loader.c --- src/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/loader.c b/src/loader.c index 3a18c61a..b6c77837 100644 --- a/src/loader.c +++ b/src/loader.c @@ -21,6 +21,7 @@ #include "config.h" +#include #include #include From 8cf90b73ba89170364734e35826ab0417c368777 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 14 Jul 2015 19:34:07 +0900 Subject: [PATCH 397/451] Minor fixes --- src/dither.c | 12 ++++++------ src/encoder.c | 14 +++++++------- src/frame.c | 12 ++++++------ src/fromgif.c | 8 ++++---- src/fromgif.h | 2 -- src/frompnm.c | 2 +- src/frompnm.h | 3 --- src/fromsixel.c | 46 ++++++++++++++++++++++++++++++---------------- src/loader.c | 18 +++++++++--------- src/loader.h | 8 ++++++++ src/output.c | 3 ++- src/output.h | 8 -------- src/quant.c | 34 ++++++++++++++++++---------------- src/scale.c | 2 +- src/status.h | 8 ++++++++ src/tosixel.c | 44 ++++++++++++++++++++++++++------------------ 16 files changed, 126 insertions(+), 98 deletions(-) diff --git a/src/dither.c b/src/dither.c index a96e28e0..73bf7310 100644 --- a/src/dither.c +++ b/src/dither.c @@ -274,7 +274,7 @@ sixel_dither_create( datasize = ncolors * 3; wholesize = headsize + datasize; - dither = malloc(wholesize); + dither = (sixel_dither_t *)malloc(wholesize); if (dither != NULL) { dither->ref = 1; dither->palette = (unsigned char*)(dither + 1); @@ -467,7 +467,7 @@ sixel_dither_initialize( if (pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ - normalized_pixels = malloc(width * height * 3); + normalized_pixels = (unsigned char *)malloc(width * height * 3); if (normalized_pixels == NULL) { goto end; } @@ -642,7 +642,7 @@ sixel_dither_apply_palette( unsigned char *input_pixels; bufsize = width * height * sizeof(unsigned char); - dest = malloc(bufsize); + dest = (unsigned char *)malloc(bufsize); if (dest == NULL) { goto end; } @@ -656,9 +656,9 @@ sixel_dither_apply_palette( if (dither->palette != pal_mono_dark && dither->palette != pal_mono_light) { cachesize = (1 << 3 * 5) * sizeof(unsigned short); #if HAVE_CALLOC - dither->cachetable = calloc(cachesize, 1); + dither->cachetable = (unsigned short *)calloc(cachesize, 1); #else - dither->cachetable = malloc(cachesize); + dither->cachetable = (unsigned short *)malloc(cachesize); memset(dither->cachetable, 0, cachesize); #endif } @@ -666,7 +666,7 @@ sixel_dither_apply_palette( if (dither->pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ - normalized_pixels = malloc(width * height * 3); + normalized_pixels = (unsigned char *)malloc(width * height * 3); if (normalized_pixels == NULL) { goto end; } diff --git a/src/encoder.c b/src/encoder.c index a609dee1..35d1f186 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -73,7 +73,7 @@ arg_strdup(char const *s) { char *p; - p = malloc(strlen(s) + 1); + p = (char *)malloc(strlen(s) + 1); if (p) { strcpy(p, s); } @@ -94,7 +94,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) struct color const *pcolor; pcolor = lookup_rgb(s, strlen(s)); if (pcolor) { - *bgcolor = malloc(3); + *bgcolor = (unsigned char *)malloc(3); if (*bgcolor == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -145,7 +145,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) status = SIXEL_BAD_ARGUMENT; goto end; } - *bgcolor = malloc(3); + *bgcolor = (unsigned char *)malloc(3); if (*bgcolor == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -177,7 +177,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) status = SIXEL_BAD_ARGUMENT; goto end; } - *bgcolor = malloc(3); + *bgcolor = (unsigned char *)malloc(3); if (*bgcolor == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -685,7 +685,7 @@ output_sixel_without_macro( goto end; } - p = malloc(width * height * depth); + p = (unsigned char *)malloc(width * height * depth); if (p == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -1120,7 +1120,7 @@ sixel_encoder_create(void) sixel_encoder_t *encoder; char const *default_color; - encoder = malloc(sizeof(sixel_encoder_t)); + encoder = (sixel_encoder_t *)malloc(sizeof(sixel_encoder_t)); if (encoder == NULL) { return NULL; } @@ -1784,7 +1784,7 @@ test2(void) } status = sixel_frame_init(frame, - malloc(3), + (unsigned char *)malloc(3), 1, 1, SIXEL_PIXELFORMAT_RGB888, diff --git a/src/frame.c b/src/frame.c index bc3d173f..274577e2 100644 --- a/src/frame.c +++ b/src/frame.c @@ -43,7 +43,7 @@ sixel_frame_create(void) { sixel_frame_t *frame; - frame = malloc(sizeof(sixel_frame_t)); + frame = (sixel_frame_t *)malloc(sizeof(sixel_frame_t)); if (frame == NULL) { return NULL; } @@ -269,7 +269,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: size = frame->width * frame->height * 4; - normalized_pixels = malloc(size); + normalized_pixels = (unsigned char *)malloc(size); src = normalized_pixels + frame->width * frame->height * 3; dst = normalized_pixels; status = sixel_helper_normalize_pixelformat(src, @@ -293,7 +293,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) break; case SIXEL_PIXELFORMAT_PAL8: size = frame->width * frame->height * 3; - normalized_pixels = malloc(size); + normalized_pixels = (unsigned char *)malloc(size); src = frame->pixels; dst = normalized_pixels; for (; dst != normalized_pixels + size; ++src) { @@ -318,7 +318,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) case SIXEL_PIXELFORMAT_ARGB8888: /* normalize pixelformat */ size = frame->width * frame->height * 3; - normalized_pixels = malloc(size); + normalized_pixels = (unsigned char *)malloc(size); status = sixel_helper_normalize_pixelformat(normalized_pixels, &frame->pixelformat, frame->pixels, @@ -364,7 +364,7 @@ sixel_frame_resize( } size = width * height * 3; - scaled_frame = malloc(size); + scaled_frame = (unsigned char *)malloc(size); if (scaled_frame == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -477,7 +477,7 @@ sixel_frame_clip( case SIXEL_PIXELFORMAT_G1: case SIXEL_PIXELFORMAT_G2: case SIXEL_PIXELFORMAT_G4: - normalized_pixels = malloc(frame->width * frame->height); + normalized_pixels = (unsigned char *)malloc(frame->width * frame->height); status = sixel_helper_normalize_pixelformat(normalized_pixels, &frame->pixelformat, frame->pixels, diff --git a/src/fromgif.c b/src/fromgif.c index ba3f5818..13aec16a 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -178,10 +178,10 @@ gif_init_frame( frame->delay = pg->delay; ncolors = 2 << (pg->flags & 7); if (frame->palette == NULL) { - frame->palette = malloc(ncolors * 3); + frame->palette = (unsigned char *)malloc(ncolors * 3); } else if (frame->ncolors < ncolors) { free(frame->palette); - frame->palette = malloc(ncolors * 3); + frame->palette = (unsigned char *)malloc(ncolors * 3); } if (frame->palette == NULL) { status = SIXEL_BAD_ALLOCATION; @@ -191,7 +191,7 @@ gif_init_frame( if (frame->ncolors <= reqcolors && fuse_palette) { frame->pixelformat = SIXEL_PIXELFORMAT_PAL8; free(frame->pixels); - frame->pixels = malloc(frame->width * frame->height); + frame->pixels = (unsigned char *)malloc(frame->width * frame->height); if (frame->pixels == NULL) { sixel_helper_set_additional_message( "malloc() failed in gif_init_frame()."); @@ -228,7 +228,7 @@ gif_init_frame( } } else { frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; - frame->pixels = malloc(pg->w * pg->h * 3); + frame->pixels = (unsigned char *)malloc(pg->w * pg->h * 3); if (frame->pixels == NULL) { sixel_helper_set_additional_message( "malloc() failed in gif_init_frame()."); diff --git a/src/fromgif.h b/src/fromgif.h index 587c7339..d121fa1b 100644 --- a/src/fromgif.h +++ b/src/fromgif.h @@ -40,13 +40,11 @@ load_gif( void /* in */ *context /* private data for callback */ ); - #if HAVE_TESTS int sixel_fromgif_tests_main(void); #endif - #ifdef __cplusplus } #endif diff --git a/src/frompnm.c b/src/frompnm.c index 3ce9d222..ba2e0cfd 100644 --- a/src/frompnm.c +++ b/src/frompnm.c @@ -136,7 +136,7 @@ load_pnm(unsigned char *p, int length, return NULL; } - result = malloc(width * height * 3 + 1); + result = (unsigned char *)malloc(width * height * 3 + 1); if (result == NULL) { return NULL; } diff --git a/src/frompnm.h b/src/frompnm.h index f408e94e..2b1f8b0b 100644 --- a/src/frompnm.h +++ b/src/frompnm.h @@ -27,9 +27,6 @@ extern "C" { #endif /* exported functions */ - -/* image scaling api */ - unsigned char * load_pnm(unsigned char *p, int len, int *psx, int *psy, diff --git a/src/fromsixel.c b/src/fromsixel.c index c10473d4..f82ce6c3 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -217,19 +217,33 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ int /* out */ *ncolors, /* palette size (<= 256) */ sixel_allocator_function /* out */ allocator) /* malloc function */ { - int n, i, r, g, b, sixel_vertical_mask, c; - int posision_x, posision_y; - int max_x, max_y; - int attributed_pan, attributed_pad; - int attributed_ph, attributed_pv; - int repeat_count, color_index; + int n; + int i; + int r; + int g; + int b; + int sixel_vertical_mask; + int c; + int posision_x; + int posision_y; + int max_x; + int max_y; + int attributed_pan; + int attributed_pad; + int attributed_ph; + int attributed_pv; + int repeat_count; + int color_index; int max_color_index; int background_color_index; int param[10]; int sixel_palet[SIXEL_PALETTE_MAX]; - unsigned char *imbuf, *dmbuf; - int imsx, imsy; - int dmsx, dmsy; + unsigned char *imbuf; + unsigned char *dmbuf; + int imsx; + int imsy; + int dmsx; + int dmsy; int y; (void) len; @@ -246,7 +260,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ imsx = 2048; imsy = 2048; - imbuf = malloc(imsx * imsy); + imbuf = (unsigned char *)malloc(imsx * imsy); if (imbuf == NULL) { return (-1); @@ -361,7 +375,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ if (imsx < attributed_ph || imsy < attributed_pv) { dmsx = imsx > attributed_ph ? imsx : attributed_ph; dmsy = imsy > attributed_pv ? imsy : attributed_pv; - dmbuf = malloc(dmsx * dmsy); + dmbuf = (unsigned char *)malloc(dmsx * dmsy); if (dmbuf == NULL) { free(imbuf); return (-1); @@ -435,7 +449,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ dmsx = nx; dmsy = ny; - dmbuf = malloc(dmsx * dmsy); + dmbuf = (unsigned char *)malloc(dmsx * dmsy); if (dmbuf == NULL) { free(imbuf); return (-1); @@ -518,7 +532,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ if (imsx > max_x || imsy > max_y) { dmsx = max_x; dmsy = max_y; - if ((dmbuf = malloc(dmsx * dmsy)) == NULL) { + if ((dmbuf = (unsigned char *)malloc(dmsx * dmsy)) == NULL) { free(imbuf); return (-1); } @@ -535,13 +549,13 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ *pheight = imsy; *ncolors = max_color_index + 1; if (allocator) { - *pixels = allocator(imsx * imsy); + *pixels = (unsigned char *)allocator(imsx * imsy); memcpy(*pixels, imbuf, imsx * imsy); free(imbuf); - *palette = allocator(*ncolors * 3); + *palette = (unsigned char *)allocator(*ncolors * 3); } else { *pixels = imbuf; - *palette = malloc(*ncolors * 3); + *palette = (unsigned char *)malloc(*ncolors * 3); } for (n = 0; n < *ncolors; ++n) { (*palette)[n * 3 + 0] = sixel_palet[n] >> 16 & 0xff; diff --git a/src/loader.c b/src/loader.c index b6c77837..47d552fe 100644 --- a/src/loader.c +++ b/src/loader.c @@ -150,7 +150,7 @@ read_png(png_structp png_ptr, png_bytep data, png_size_t length) { - sixel_chunk_t *pchunk = png_get_io_ptr(png_ptr); + sixel_chunk_t *pchunk = (sixel_chunk_t *)png_get_io_ptr(png_ptr); if (length > pchunk->size) { length = pchunk->size; } @@ -301,7 +301,7 @@ load_png(unsigned char **result, } else { switch (bitdepth) { case 1: - *ppalette = malloc(*pncolors * 3); + *ppalette = (unsigned char *)malloc(*pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -311,7 +311,7 @@ load_png(unsigned char **result, *pixelformat = SIXEL_PIXELFORMAT_PAL1; break; case 2: - *ppalette = malloc(*pncolors * 3); + *ppalette = (unsigned char *)malloc(*pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -321,7 +321,7 @@ load_png(unsigned char **result, *pixelformat = SIXEL_PIXELFORMAT_PAL2; break; case 4: - *ppalette = malloc(*pncolors * 3); + *ppalette = (unsigned char *)malloc(*pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -331,7 +331,7 @@ load_png(unsigned char **result, *pixelformat = SIXEL_PIXELFORMAT_PAL4; break; case 8: - *ppalette = malloc(*pncolors * 3); + *ppalette = (unsigned char *)malloc(*pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -460,12 +460,12 @@ load_png(unsigned char **result, goto cleanup; } depth = sixel_helper_compute_depth(*pixelformat); - *result = malloc(*psx * *psy * depth); + *result = (unsigned char *)malloc(*psx * *psy * depth); if (*result == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; } - rows = malloc(*psy * sizeof(unsigned char *)); + rows = (unsigned char **)malloc(*psy * sizeof(unsigned char *)); if (rows == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -531,7 +531,7 @@ load_sixel(unsigned char **result, } if (ppalette == NULL || colors > reqcolors) { *ppixelformat = SIXEL_PIXELFORMAT_RGB888; - *result = malloc(*psx * *psy * 3); + *result = (unsigned char *)malloc(*psx * *psy * 3); if (*result == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -766,7 +766,7 @@ load_with_builtin( fuse_palette, fstatic, loop_control, - fn_load, + (void *)fn_load, context); if (SIXEL_FAILED(status)) { goto end; diff --git a/src/loader.h b/src/loader.h index 4f1e7e57..64e4decc 100644 --- a/src/loader.h +++ b/src/loader.h @@ -22,11 +22,19 @@ #ifndef LIBSIXEL_LOADER_H #define LIBSIXEL_LOADER_H +#ifdef __cplusplus +extern "C" { +#endif + #if HAVE_TESTS int sixel_loader_tests_main(void); #endif +#ifdef __cplusplus +} +#endif + #endif /* LIBSIXEL_LOADER_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/output.c b/src/output.c index 6cc10cfa..4d037e1f 100644 --- a/src/output.c +++ b/src/output.c @@ -30,8 +30,9 @@ SIXELAPI sixel_output_t * sixel_output_create(sixel_write_function fn_write, void *priv) { sixel_output_t *output; + size_t size = sizeof(sixel_output_t) + SIXEL_OUTPUT_PACKET_SIZE * 2; - output = malloc(sizeof(sixel_output_t) + SIXEL_OUTPUT_PACKET_SIZE * 2); + output = (sixel_output_t *)malloc(size); if (output) { output->ref = 1; output->has_8bit_control = 0; diff --git a/src/output.h b/src/output.h index 316edb62..d1ab445b 100644 --- a/src/output.h +++ b/src/output.h @@ -22,10 +22,6 @@ #ifndef LIBSIXEL_OUTPUT_H #define LIBSIXEL_OUTPUT_H -#ifdef __cplusplus -extern "C" { -#endif - typedef struct sixel_node { struct sixel_node *next; int pal; @@ -81,10 +77,6 @@ typedef struct sixel_output { } sixel_output_t; -#ifdef __cplusplus -} -#endif - #endif /* LIBSIXEL_OUTPUT_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/quant.c b/src/quant.c index d7c32094..244163e1 100644 --- a/src/quant.c +++ b/src/quant.c @@ -112,9 +112,9 @@ static int compareplane(const void * const arg1, const void * const arg2) { - - const struct tupleint * const * const comparandPP = arg1; - const struct tupleint * const * const comparatorPP = arg2; + typedef const struct tupleint * const * const sortarg; + sortarg comparandPP = (sortarg) arg1; + sortarg comparatorPP = (sortarg) arg2; return (*comparandPP)->tuple[compareplanePlane] - (*comparatorPP)->tuple[compareplanePlane]; @@ -137,6 +137,12 @@ alloctupletable( SIXELSTATUS status = SIXEL_FALSE; char message[256]; int nwrite; + unsigned int mainTableSize; + unsigned int tupleIntSize; + unsigned int allocSize; + void * pool; + tupletable tbl; + unsigned int i; if (UINT_MAX / sizeof(struct tupleint) < size) { nwrite = sprintf(message, @@ -149,9 +155,8 @@ alloctupletable( goto end; } - unsigned int const mainTableSize = size * sizeof(struct tupleint *); - unsigned int const tupleIntSize = - sizeof(struct tupleint) - sizeof(sample) + mainTableSize = size * sizeof(struct tupleint *); + tupleIntSize = sizeof(struct tupleint) - sizeof(sample) + depth * sizeof(sample); /* To save the enormous amount of time it could take to allocate @@ -169,8 +174,7 @@ alloctupletable( goto end; } - unsigned int const allocSize = mainTableSize + size * tupleIntSize; - void * pool; + allocSize = mainTableSize + size * tupleIntSize; pool = malloc(allocSize); if (pool == NULL) { @@ -182,9 +186,7 @@ alloctupletable( status = SIXEL_BAD_ALLOCATION; goto end; } - tupletable const tbl = (tupletable) pool; - - unsigned int i; + tbl = (tupletable) pool; for (i = 0; i < size; ++i) tbl[i] = (struct tupleint *) @@ -707,9 +709,9 @@ computeHistogram(unsigned char const /* in */ *data, quant_trace(stderr, "making histogram...\n"); #if HAVE_CALLOC - histogram = calloc(1 << depth * 5, sizeof(unit_t)); + histogram = (unit_t *)calloc(1 << depth * 5, sizeof(unit_t)); #else - histogram = malloc((1 << depth * 5) * sizeof(unit_t)); + histogram = (unit_t *)malloc((1 << depth * 5) * sizeof(unit_t)); #endif if (histogram == NULL) { sixel_helper_set_additional_message( @@ -1181,7 +1183,7 @@ sixel_quant_make_palette(unsigned char const *data, } *ncolors = colormap.size; quant_trace(stderr, "tupletable size: %d\n", *ncolors); - palette = malloc(*ncolors * depth); + palette = (unsigned char *)malloc(*ncolors * depth); for (i = 0; i < *ncolors; i++) { for (n = 0; n < depth; ++n) { palette[i * depth + n] = colormap.table[i]->tuple[n]; @@ -1282,9 +1284,9 @@ sixel_quant_apply_palette(unsigned char *data, indextable = cachetable; if (cachetable == NULL && f_lookup == lookup_fast) { #if !HAVE_CALLOC - indextable = malloc((1 << depth * 5) * sizeof(unsigned short)); + indextable = (unsigned short *)malloc((1 << depth * 5) * sizeof(unsigned short)); #else - indextable = calloc(1 << depth * 5, sizeof(unsigned short)); + indextable = (unsigned short *)calloc(1 << depth * 5, sizeof(unsigned short)); #endif if (!indextable) { quant_trace(stderr, "Unable to allocate memory for indextable.\n"); diff --git a/src/scale.c b/src/scale.c index df60c8cc..a836ff9b 100644 --- a/src/scale.c +++ b/src/scale.c @@ -320,7 +320,7 @@ sixel_helper_scale_image( int new_pixelformat; if (depth != 3) { - new_src = malloc(srcw * srch * 3); + new_src = (unsigned char *)malloc(srcw * srch * 3); if (new_src == NULL) { return (-1); } diff --git a/src/status.h b/src/status.h index b4e19129..bed23e25 100644 --- a/src/status.h +++ b/src/status.h @@ -22,11 +22,19 @@ #ifndef LIBSIXEL_STATUS_H #define LIBSIXEL_STATUS_H +#ifdef __cplusplus +extern "C" { +#endif + #if HAVE_TESTS int sixel_status_tests_main(void); #endif +#ifdef __cplusplus +} +#endif + #endif /* LIBSIXEL_STATUS_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/tosixel.c b/src/tosixel.c index 889529fe..af6c1376 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -50,9 +50,10 @@ enum { /* implementation */ static void -penetrate(sixel_output_t *context, int nwrite, - char *dcs_start, - char *dcs_end, +penetrate(sixel_output_t *context, + int nwrite, + char const *dcs_start, + char const *dcs_end, int const dcs_start_size, int const dcs_end_size) { @@ -61,11 +62,11 @@ penetrate(sixel_output_t *context, int nwrite, - dcs_start_size - dcs_end_size; for (pos = 0; pos < nwrite; pos += splitsize) { - context->fn_write(dcs_start, dcs_end_size, context->priv); + context->fn_write((char *)dcs_start, dcs_end_size, context->priv); context->fn_write(((char *)context->buffer) + pos, nwrite - pos < splitsize ? nwrite - pos: splitsize, context->priv); - context->fn_write(dcs_end, dcs_end_size, context->priv); + context->fn_write((char *)dcs_end, dcs_end_size, context->priv); } } @@ -75,9 +76,12 @@ sixel_advance(sixel_output_t *context, int nwrite) { if ((context->pos += nwrite) >= SIXEL_OUTPUT_PACKET_SIZE) { if (context->penetrate_multiplexer) { - penetrate(context, SIXEL_OUTPUT_PACKET_SIZE, - DCS_START_7BIT, DCS_END_7BIT, - DCS_START_7BIT_SIZE, DCS_END_7BIT_SIZE); + penetrate(context, + SIXEL_OUTPUT_PACKET_SIZE, + DCS_START_7BIT, + DCS_END_7BIT, + DCS_START_7BIT_SIZE, + DCS_END_7BIT_SIZE); } else { context->fn_write((char *)context->buffer, SIXEL_OUTPUT_PACKET_SIZE, context->priv); @@ -97,9 +101,9 @@ sixel_putc(char *buffer, unsigned char value) static void -sixel_puts(char *buffer, char *value, int size) +sixel_puts(char *buffer, char const *value, int size) { - memcpy(buffer, value, size); + memcpy(buffer, (void *)value, size); } @@ -286,11 +290,13 @@ sixel_encode_header(int width, int height, sixel_output_t *context) if (!context->skip_dcs_envelope) { if (context->has_8bit_control) { sixel_puts((char *)context->buffer + context->pos, - DCS_START_8BIT, DCS_START_8BIT_SIZE); + DCS_START_8BIT, + DCS_START_8BIT_SIZE); sixel_advance(context, DCS_START_8BIT_SIZE); } else { sixel_puts((char *)context->buffer + context->pos, - DCS_START_7BIT, DCS_START_7BIT_SIZE); + DCS_START_7BIT, + DCS_START_7BIT_SIZE); sixel_advance(context, DCS_START_7BIT_SIZE); } } @@ -692,9 +698,11 @@ sixel_encode_footer(sixel_output_t *context) if (context->pos > 0) { if (context->penetrate_multiplexer) { penetrate(context, context->pos, - DCS_START_7BIT, DCS_END_7BIT, - DCS_START_7BIT_SIZE, DCS_END_7BIT_SIZE); - context->fn_write(DCS_7BIT("\033") DCS_7BIT("\\"), + DCS_START_7BIT, + DCS_END_7BIT, + DCS_START_7BIT_SIZE, + DCS_END_7BIT_SIZE); + context->fn_write((char *)DCS_7BIT("\033") DCS_7BIT("\\"), (DCS_START_7BIT_SIZE + 1 + DCS_END_7BIT_SIZE) * 2, context->priv); } @@ -721,7 +729,7 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: - paletted_pixels = malloc(width * height * 3); + paletted_pixels = (unsigned char *)malloc(width * height * 3); if (paletted_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -1189,7 +1197,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, if (dither->pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelfromat */ - normalized_pixels = malloc(width * height * 3); + normalized_pixels = (unsigned char *)malloc(width * height * 3); if (normalized_pixels == NULL) { goto error; } @@ -1336,7 +1344,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, } if (++mod_y == 6) { - mptr = memset(marks, 0, width * 6); + mptr = (unsigned char *)memset(marks, 0, width * 6); mod_y = 0; } } From e973ca59aaf97d90e2562b1a9dc035a33df0d041 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 18 Jul 2015 22:45:09 +0900 Subject: [PATCH 398/451] Minor fixes for encoder.c --- src/encoder.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 9 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 35d1f186..2bf203da 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -822,6 +822,62 @@ output_sixel_with_macro( } +static SIXELSTATUS +tty_cbreak(struct termios *old_termios, struct termios *new_termios) +{ + SIXELSTATUS status = SIXEL_FALSE; + int ret; + + /* set the terminal to cbreak mode */ + ret = tcgetattr(STDIN_FILENO, &old_termios); + if (ret != 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "tty_cbreak: tcgetattr() failed."); + goto end; + } + + (void) memcpy(&new_termios, &old_termios, sizeof(old_termios)); + new_termios.c_lflag &= ~(ECHO | ICANON); + new_termios.c_cc[VMIN] = 1; + new_termios.c_cc[VTIME] = 0; + + ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + if (ret != 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "tty_cbreak: tcsetattr() failed."); + goto end; + } + + status = SIXEL_OK; + +end: + return status; +} + + +static SIXELSTATUS +tty_restore(struct termios *old_termios) +{ + SIXELSTATUS status = SIXEL_FALSE; + int ret; + + ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + if (ret != 0) { + status = (SIXEL_LIBC_ERROR | (errno & 0xff)); + sixel_helper_set_additional_message( + "tty_restore: tcsetattr() failed."); + goto end; + } + + status = SIXEL_OK; + +end: + return status; +} + + static SIXELSTATUS scroll_on_demand( sixel_encoder_t /* in */ *encoder, @@ -841,6 +897,7 @@ scroll_on_demand( char buffer[256]; int result; + /* confirm I/O file descriptors are tty devices */ if (!isatty(STDIN_FILENO) || !isatty(encoder->outfd)) { nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); if (nwrite < 0) { @@ -852,12 +909,17 @@ scroll_on_demand( status = SIXEL_OK; goto end; } + + /* request terminal size to tty device with TIOCGWINSZ ioctl */ result = ioctl(encoder->outfd, TIOCGWINSZ, &size); if (result != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message("ioctl() failed."); goto end; } + + /* if we can not retrieve terminal pixel size over TIOCGWINSZ ioctl, + return immediatly */ if (size.ws_ypixel <= 0) { nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); if (nwrite < 0) { @@ -869,6 +931,9 @@ scroll_on_demand( status = SIXEL_OK; goto end; } + + /* if input source is animation and frame No. is more than 1, + output DECSC sequence */ if (sixel_frame_get_loop_no(frame) != 0 || sixel_frame_get_frame_no(frame) != 0) { nwrite = sixel_write_callback("\0338", 2, &encoder->outfd); @@ -881,13 +946,12 @@ scroll_on_demand( status = SIXEL_OK; goto end; } + /* set the terminal to cbreak mode */ - tcgetattr(STDIN_FILENO, &old_termios); - memcpy(&new_termios, &old_termios, sizeof(old_termios)); - new_termios.c_lflag &= ~(ECHO | ICANON); - new_termios.c_cc[VMIN] = 1; - new_termios.c_cc[VTIME] = 0; - tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + status = tty_cbreak(&old_termios, &new_termios) + if (SIXEL_FAILED(status)) { + goto end; + } /* request cursor position report */ nwrite = sixel_write_callback("\033[6n", 4, &encoder->outfd); @@ -897,7 +961,9 @@ scroll_on_demand( "scroll_on_demand: sixel_write_callback() failed."); goto end; } - if (wait_stdin(1000 * 1000) == (-1)) { /* wait 1 sec */ + + /* wait cursor position report */ + if (wait_stdin(1000 * 1000) == (-1)) { /* wait up to 1 sec */ nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); if (nwrite < 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); @@ -908,6 +974,8 @@ scroll_on_demand( status = SIXEL_OK; goto end; } + + /* scan cursor position report */ if (scanf("\033[%d;%dR", &row, &col) != 2) { nwrite = sixel_write_callback("\033[H", 3, &encoder->outfd); if (nwrite < 0) { @@ -919,7 +987,14 @@ scroll_on_demand( status = SIXEL_OK; goto end; } - tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_termios); + + /* restore the terminal mode */ + status = tty_restore(&old_termios) + if (SIXEL_FAILED(status)) { + goto end; + } + + /* calculate scrolling amount in pixels */ pixelheight = sixel_frame_get_height(frame); cellheight = pixelheight * size.ws_row / size.ws_ypixel + 1; scroll = cellheight + row - size.ws_row + 1; @@ -938,6 +1013,8 @@ scroll_on_demand( goto end; } } + + /* emit DECSC sequence */ nwrite = sixel_write_callback("\0337", 2, &encoder->outfd); if (nwrite < 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); @@ -963,6 +1040,7 @@ scroll_on_demand( } +/* called when image loader component load a image frame */ static SIXELSTATUS load_image_callback(sixel_frame_t *frame, void *data) { @@ -1173,7 +1251,7 @@ sixel_encoder_create(void) } -SIXELAPI void +static void sixel_encoder_destroy(sixel_encoder_t *encoder) { if (encoder) { From c5721c7f60021bc3110469016fb94af5b48ecffa Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 18 Jul 2015 22:48:37 +0900 Subject: [PATCH 399/451] Minor fixes --- src/encoder.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index 2bf203da..e8491c26 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -822,6 +822,7 @@ output_sixel_with_macro( } +#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY static SIXELSTATUS tty_cbreak(struct termios *old_termios, struct termios *new_termios) { @@ -855,8 +856,10 @@ tty_cbreak(struct termios *old_termios, struct termios *new_termios) end: return status; } +#endif /* HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY */ +#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY static SIXELSTATUS tty_restore(struct termios *old_termios) { @@ -876,6 +879,7 @@ tty_restore(struct termios *old_termios) end: return status; } +#endif /* HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY */ static SIXELSTATUS @@ -1031,7 +1035,7 @@ scroll_on_demand( "scroll_on_demand: sixel_write_callback() failed."); goto end; } -#endif +#endif /* HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_ISATTY */ status = SIXEL_OK; From 2120a26b619bbd0d98ebcdb745e1009fc5a241ce Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 18 Jul 2015 22:51:54 +0900 Subject: [PATCH 400/451] Ammend fixes --- src/encoder.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index e8491c26..45fc27a0 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -830,7 +830,7 @@ tty_cbreak(struct termios *old_termios, struct termios *new_termios) int ret; /* set the terminal to cbreak mode */ - ret = tcgetattr(STDIN_FILENO, &old_termios); + ret = tcgetattr(STDIN_FILENO, old_termios); if (ret != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message( @@ -838,12 +838,12 @@ tty_cbreak(struct termios *old_termios, struct termios *new_termios) goto end; } - (void) memcpy(&new_termios, &old_termios, sizeof(old_termios)); - new_termios.c_lflag &= ~(ECHO | ICANON); - new_termios.c_cc[VMIN] = 1; - new_termios.c_cc[VTIME] = 0; + (void) memcpy(new_termios, old_termios, sizeof(*old_termios)); + new_termios->c_lflag &= ~(ECHO | ICANON); + new_termios->c_cc[VMIN] = 1; + new_termios->c_cc[VTIME] = 0; - ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, new_termios); if (ret != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message( @@ -866,7 +866,7 @@ tty_restore(struct termios *old_termios) SIXELSTATUS status = SIXEL_FALSE; int ret; - ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, old_termios); if (ret != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message( @@ -952,7 +952,7 @@ scroll_on_demand( } /* set the terminal to cbreak mode */ - status = tty_cbreak(&old_termios, &new_termios) + status = tty_cbreak(&old_termios, &new_termios); if (SIXEL_FAILED(status)) { goto end; } @@ -993,7 +993,7 @@ scroll_on_demand( } /* restore the terminal mode */ - status = tty_restore(&old_termios) + status = tty_restore(&old_termios); if (SIXEL_FAILED(status)) { goto end; } From cf4b8beee625a73e84fd949b53dd6d6c6e09e474 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 19 Jul 2015 02:47:42 +0900 Subject: [PATCH 401/451] Minor fix --- converters/img2sixel.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index d9554b45..4ea324b5 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -388,13 +388,13 @@ main(int argc, char *argv[]) # if HAVE_DECL_SIGHUP signal(SIGHUP, signal_handler); # endif -#else - (void) signal_handler; -#endif status = sixel_encoder_set_cancel_flag(encoder, &signaled); if (SIXEL_FAILED(status)) { goto error; } +#else + (void) signal_handler; +#endif if (optind == argc) { status = sixel_encoder_encode(encoder, NULL); From ee6999b45459d751994543a5a69612c88479f0ab Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 19 Jul 2015 03:26:24 +0900 Subject: [PATCH 402/451] Introduce SIXEL_COLORS environment (for Issue #27) --- src/encoder.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 45fc27a0..a142f08c 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1200,7 +1200,9 @@ SIXELAPI sixel_encoder_t * sixel_encoder_create(void) { sixel_encoder_t *encoder; - char const *default_color; + char const *env_default_bgcolor; + char const *env_default_ncolors; + int ncolors; encoder = (sixel_encoder_t *)malloc(sizeof(sixel_encoder_t)); if (encoder == NULL) { @@ -1246,9 +1248,17 @@ sixel_encoder_create(void) encoder->cancel_flag = NULL; encoder->dither_cache = NULL; - default_color = getenv("SIXEL_BGCOLOR"); - if (default_color) { - (void) parse_x_colorspec(default_color, &encoder->bgcolor); + env_default_bgcolor = getenv("SIXEL_BGCOLOR"); + if (env_default_bgcolor) { + (void) parse_x_colorspec(env_default_bgcolor, &encoder->bgcolor); + } + + env_default_ncolors = getenv("SIXEL_COLORS"); + if (env_default_ncolors) { + ncolors = atoi(env_default_ncolors); + if (ncolors > 1 && ncolors <= 256) { + encoder->reqcolors = ncolors; + } } return encoder; From c024ae0239c85afb9a789031e02a424dd0754b00 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 19 Jul 2015 03:29:09 +0900 Subject: [PATCH 403/451] Add documentation for the environment variables $SIXEL_COLORS --- converters/img2sixel.1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/converters/img2sixel.1 b/converters/img2sixel.1 index 57cd5215..26b679b7 100644 --- a/converters/img2sixel.1 +++ b/converters/img2sixel.1 @@ -291,6 +291,13 @@ rgb:rrr/ggg/bbb .br rgb:rrrr/gggg/bbbb .br +.TP 5 +.B SIXEL_NCOLORS +.br +specify number of colors to reduce the image to (default=256). +.br +overrided by -p(--colors) option. +.br .SH "SEE ALSO" From bb21081fa2a8007a7d6cb4d5e83538660332f237 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 19 Jul 2015 23:08:18 +0900 Subject: [PATCH 404/451] Add license notice of src/fromgif.c --- LICENSE.stb | 1 + 1 file changed, 1 insertion(+) diff --git a/LICENSE.stb b/LICENSE.stb index 848baf1b..74f3a6b1 100644 --- a/LICENSE.stb +++ b/LICENSE.stb @@ -3,6 +3,7 @@ This software includes some part of stb(https://github.com/nothings/stb), - src/stb_image.h: public domain JPEG/PNG reader. - src/stb_image_write.h: public domain PNG/BMP/TGA writer. +- src/fromgif.c: derived from stb_image.h These great works is written by Sean Barrett(@nothings) and some contributers. From 5c49d5f7e8349017cebf7f332bf25dbd1d233dc1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 19 Jul 2015 23:52:28 +0900 Subject: [PATCH 405/451] Try to fix broken travis build --- converters/Makefile.am | 3 ++- converters/Makefile.in | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 66c27490..6755daea 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -239,8 +239,9 @@ endif rm -f sixel.pipe if test "$(WINE)" = "" && which mkfifo; then \ mkfifo sixel.pipe; \ - test -e sixel.pipe && ($(WINE) ./img2sixel -D < sixel.pipe&); \ + ($(WINE) ./img2sixel -D < sixel.pipe&); \ cat ../images/snake.jpg > sixel.pipe; \ + sleep 1; \ echo -n > sixel.pipe; \ sleep 1; \ rm -f sixel.pipe; \ diff --git a/converters/Makefile.in b/converters/Makefile.in index 8420aebb..e5a8563c 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1199,8 +1199,9 @@ test_impl: @WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe @WANT_IMG2SIXEL_TRUE@ if test "$(WINE)" = "" && which mkfifo; then \ @WANT_IMG2SIXEL_TRUE@ mkfifo sixel.pipe; \ -@WANT_IMG2SIXEL_TRUE@ test -e sixel.pipe && ($(WINE) ./img2sixel -D < sixel.pipe&); \ +@WANT_IMG2SIXEL_TRUE@ ($(WINE) ./img2sixel -D < sixel.pipe&); \ @WANT_IMG2SIXEL_TRUE@ cat ../images/snake.jpg > sixel.pipe; \ +@WANT_IMG2SIXEL_TRUE@ sleep 1; \ @WANT_IMG2SIXEL_TRUE@ echo -n > sixel.pipe; \ @WANT_IMG2SIXEL_TRUE@ sleep 1; \ @WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe; \ From 15671a9f669ebf28f4770bb7ded3193806d4acbf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 20 Jul 2015 01:00:34 +0900 Subject: [PATCH 406/451] Fix travis build again --- converters/Makefile.am | 6 +++--- converters/Makefile.in | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/converters/Makefile.am b/converters/Makefile.am index 6755daea..d87e4805 100644 --- a/converters/Makefile.am +++ b/converters/Makefile.am @@ -237,15 +237,15 @@ if WANT_SIXEL2PNG endif $(WINE) ./img2sixel -H| grep ^\ \*\-|sed 's/^\ *//'| cut -f1 -d' '| cut -f1 -d, > options1.txt rm -f sixel.pipe - if test "$(WINE)" = "" && which mkfifo; then \ + if test "$(WINE)" = "" && which mkfifo && which pkill; then \ mkfifo sixel.pipe; \ ($(WINE) ./img2sixel -D < sixel.pipe&); \ cat ../images/snake.jpg > sixel.pipe; \ - sleep 1; \ echo -n > sixel.pipe; \ sleep 1; \ rm -f sixel.pipe; \ - fi + pkill img2sixel; \ + fi || true grep ^\.B img2sixel.1 | cut -f2 -d " " | grep "^\\\\" | tr -d '\\' | tr -d , > options2.txt grep ' --' shell-completion/bash/img2sixel| grep -v "' "| sed 's/.* \(-.\) .*/\1/' > options3.txt grep '{-' shell-completion/zsh/_img2sixel|cut -f1 -d,|cut -f2 -d'{' > options4.txt diff --git a/converters/Makefile.in b/converters/Makefile.in index e5a8563c..17969f0b 100644 --- a/converters/Makefile.in +++ b/converters/Makefile.in @@ -1197,15 +1197,15 @@ test_impl: @WANT_IMG2SIXEL_TRUE@@WANT_SIXEL2PNG_TRUE@ $(WINE) ./sixel2png -i snake.sixel -o snake4.png @WANT_IMG2SIXEL_TRUE@ $(WINE) ./img2sixel -H| grep ^\ \*\-|sed 's/^\ *//'| cut -f1 -d' '| cut -f1 -d, > options1.txt @WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe -@WANT_IMG2SIXEL_TRUE@ if test "$(WINE)" = "" && which mkfifo; then \ +@WANT_IMG2SIXEL_TRUE@ if test "$(WINE)" = "" && which mkfifo && which pkill; then \ @WANT_IMG2SIXEL_TRUE@ mkfifo sixel.pipe; \ @WANT_IMG2SIXEL_TRUE@ ($(WINE) ./img2sixel -D < sixel.pipe&); \ @WANT_IMG2SIXEL_TRUE@ cat ../images/snake.jpg > sixel.pipe; \ -@WANT_IMG2SIXEL_TRUE@ sleep 1; \ @WANT_IMG2SIXEL_TRUE@ echo -n > sixel.pipe; \ @WANT_IMG2SIXEL_TRUE@ sleep 1; \ @WANT_IMG2SIXEL_TRUE@ rm -f sixel.pipe; \ -@WANT_IMG2SIXEL_TRUE@ fi +@WANT_IMG2SIXEL_TRUE@ pkill img2sixel; \ +@WANT_IMG2SIXEL_TRUE@ fi || true @WANT_IMG2SIXEL_TRUE@ grep ^\.B img2sixel.1 | cut -f2 -d " " | grep "^\\\\" | tr -d '\\' | tr -d , > options2.txt @WANT_IMG2SIXEL_TRUE@ grep ' --' shell-completion/bash/img2sixel| grep -v "' "| sed 's/.* \(-.\) .*/\1/' > options3.txt @WANT_IMG2SIXEL_TRUE@ grep '{-' shell-completion/zsh/_img2sixel|cut -f1 -d,|cut -f2 -d'{' > options4.txt From 9a1ff7a978bb15f42e9a35dbb60b5699691e0cef Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 20 Jul 2015 01:53:31 +0900 Subject: [PATCH 407/451] Suppress build warning: implicit-function-declaration --- src/chunk.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/chunk.h | 6 +++++ src/loader.c | 21 +----------------- src/tests.c | 1 + 4 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/chunk.c b/src/chunk.c index 2d3142a1..5699aa21 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -386,6 +386,69 @@ sixel_chunk_destroy( } +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + unsigned char *ptr = malloc(16); + +#ifdef HAVE_LIBCURL + sixel_chunk_t chunk = {0, 0, 0}; + int nread; + + nread = memory_write(NULL, 1, 1, NULL); + if (nread != 0) { + goto error; + } + + nread = memory_write(ptr, 1, 1, &chunk); + if (nread != 0) { + goto error; + } + + nread = memory_write(ptr, 0, 1, &chunk); + if (nread != 0) { + goto error; + } +#else + nret = EXIT_SUCCESS; + goto error; +#endif /* HAVE_LIBCURL */ + nret = EXIT_SUCCESS; + +error: + free(ptr); + return nret; +} + + +int +sixel_chunk_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + + /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ /* EOF */ diff --git a/src/chunk.h b/src/chunk.h index 6230f60c..c62e3249 100644 --- a/src/chunk.h +++ b/src/chunk.h @@ -46,6 +46,12 @@ void sixel_chunk_destroy( sixel_chunk_t * const /* in */ pchunk); + +#if HAVE_TESTS +int +sixel_chunk_tests_main(void); +#endif + #ifdef __cplusplus } #endif diff --git a/src/loader.c b/src/loader.c index 47d552fe..66e64455 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1269,28 +1269,9 @@ test1(void) int nret = EXIT_FAILURE; unsigned char *ptr = malloc(16); -#ifdef HAVE_LIBCURL - sixel_chunk_t chunk = {0, 0, 0}; - int nread; - - nread = memory_write(NULL, 1, 1, NULL); - if (nread != 0) { - goto error; - } - - nread = memory_write(ptr, 1, 1, &chunk); - if (nread != 0) { - goto error; - } - - nread = memory_write(ptr, 0, 1, &chunk); - if (nread != 0) { - goto error; - } -#else nret = EXIT_SUCCESS; goto error; -#endif /* HAVE_LIBCURL */ + nret = EXIT_SUCCESS; error: diff --git a/src/tests.c b/src/tests.c index 4ff05a36..058c8d35 100644 --- a/src/tests.c +++ b/src/tests.c @@ -41,6 +41,7 @@ #include "loader.h" #include "fromgif.h" #include +#include "chunk.h" #if HAVE_TESTS From de1b52b02e9ad71a9ddf00149f9db36a20e0d81e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 20 Jul 2015 02:29:54 +0900 Subject: [PATCH 408/451] Minor fixes --- include/sixel.h.in | 23 +++++++---------------- src/dither.h | 6 +++--- src/fromsixel.c | 2 +- src/output.c | 2 +- src/output.h | 6 ++---- src/tosixel.c | 2 +- 6 files changed, 15 insertions(+), 26 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 825f6352..46f6047c 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -470,25 +470,12 @@ enum methodForResampling { }; #endif -#ifndef LIBSIXEL_DITHER_H - -/* handle type of dither context object */ -typedef struct sixel_dither { int dummy; } sixel_dither_t; - -#endif /* SIXEL_DITHER_H */ - -#ifndef LIBSIXEL_OUTPUT_H +/* output context manipulation API */ +struct sixel_output; +typedef struct sixel_output sixel_output_t; typedef int (* sixel_write_function)(char *data, int size, void *priv); -/* handle type of output context object */ -typedef struct sixel_output { int dummy; } sixel_output_t; - -#endif /* LIBSIXEL_OUTPUT_H */ - - -/* output context manipulation API */ - #ifdef __cplusplus extern "C" { #endif @@ -552,6 +539,10 @@ sixel_output_set_encode_policy( /* color quantization API */ +/* handle type of dither context object */ +struct sixel_dither; +typedef struct sixel_dither sixel_dither_t; + #ifdef __cplusplus extern "C" { #endif diff --git a/src/dither.h b/src/dither.h index 8a23c1a3..13e45b23 100644 --- a/src/dither.h +++ b/src/dither.h @@ -23,7 +23,7 @@ #define LIBSIXEL_DITHER_H /* dither context object */ -typedef struct sixel_dither { +struct sixel_dither { unsigned int ref; /* reference counter */ unsigned char *palette; /* palette definition */ unsigned short *cachetable; /* cache table */ @@ -41,7 +41,7 @@ typedef struct sixel_dither { int quality_mode; /* quality of histogram */ int keycolor; /* background color */ int pixelformat; /* pixelformat for internal processing */ -} sixel_dither_t; +}; #ifdef __cplusplus extern "C" { @@ -49,7 +49,7 @@ extern "C" { /* apply palette */ unsigned char * -sixel_dither_apply_palette(sixel_dither_t *dither, +sixel_dither_apply_palette(struct sixel_dither *dither, unsigned char *pixels, int width, int height); diff --git a/src/fromsixel.c b/src/fromsixel.c index f82ce6c3..5f2010e3 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -56,8 +56,8 @@ # include #endif +#include #include "output.h" -#include "sixel.h" #define RGB(r, g, b) (((r) << 16) + ((g) << 8) + (b)) diff --git a/src/output.c b/src/output.c index 4d037e1f..910adba1 100644 --- a/src/output.c +++ b/src/output.c @@ -22,8 +22,8 @@ #include "config.h" #include #include -#include "output.h" #include +#include "output.h" SIXELAPI sixel_output_t * diff --git a/src/output.h b/src/output.h index d1ab445b..563c66b4 100644 --- a/src/output.h +++ b/src/output.h @@ -30,9 +30,7 @@ typedef struct sixel_node { unsigned char *map; } sixel_node_t; -typedef int (* sixel_write_function)(char *data, int size, void *priv); - -typedef struct sixel_output { +struct sixel_output { int ref; @@ -75,7 +73,7 @@ typedef struct sixel_output { int pos; unsigned char buffer[1]; -} sixel_output_t; +}; #endif /* LIBSIXEL_OUTPUT_H */ diff --git a/src/tosixel.c b/src/tosixel.c index af6c1376..53e56627 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -26,9 +26,9 @@ # include #endif +#include #include "output.h" #include "dither.h" -#include "sixel.h" #define DCS_START_7BIT "\033P" #define DCS_START_7BIT_SIZE (sizeof(DCS_START_7BIT) - 1) From 46f89f3d6a93f421ad7bdc67ddc05459f5e7caee Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 20 Jul 2015 02:35:00 +0900 Subject: [PATCH 409/451] Minor fixes --- include/sixel.h.in | 23 ++++++----------------- src/decoder.c | 2 +- src/decoder.h | 4 ++-- src/encoder.c | 2 +- src/encoder.h | 4 ++-- src/frame.c | 2 +- src/frame.h | 4 ++-- src/tests.c | 2 +- 8 files changed, 16 insertions(+), 27 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 46f6047c..70b03b85 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -756,12 +756,9 @@ enum loopControl { }; #endif -#ifndef LIBSIXEL_FRAME_H - /* handle type of dither context object */ -typedef struct sixel_frame { int dummy; } sixel_frame_t; - -#endif /* LIBSIXEL_FRAME_H */ +struct sixel_frame; +typedef struct sixel_frame sixel_frame_t; #ifdef __cplusplus extern "C" { @@ -890,12 +887,9 @@ sixel_helper_write_image_file( /* easy encoder API */ -#ifndef LIBSIXEL_ENCODER_H - /* handle type of dither context object */ -typedef struct sixel_encoder { int dummy; } sixel_encoder_t; - -#endif /* LIBSIXEL_ENCODER_H */ +struct sixel_encoder; +typedef struct sixel_encoder sixel_encoder_t; #ifdef __cplusplus extern "C" { @@ -934,12 +928,9 @@ sixel_encoder_encode( /* easy encoder API */ -#ifndef LIBSIXEL_DECODER_H - /* handle type of dither context object */ -typedef struct sixel_decoder { int dummy; } sixel_decoder_t; - -#endif /* LIBSIXEL_DECODER_H */ +struct sixel_decoder; +typedef struct sixel_decoder sixel_decoder_t; #ifdef __cplusplus extern "C" { @@ -969,8 +960,6 @@ sixel_decoder_decode( } #endif - - #endif /* LIBSIXEL_SIXEL_H */ /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/decoder.c b/src/decoder.c index 2f454268..5ecdbbe5 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -60,8 +60,8 @@ # include #endif -#include "decoder.h" #include +#include "decoder.h" static char * diff --git a/src/decoder.h b/src/decoder.h index c12037c7..9d3fb87c 100644 --- a/src/decoder.h +++ b/src/decoder.h @@ -23,11 +23,11 @@ #define LIBSIXEL_DECODER_H /* encode settings object */ -typedef struct sixel_decoder { +struct sixel_decoder { unsigned int ref; char *input; char *output; -} sixel_decoder_t; +}; #endif /* LIBSIXEL_DECODER_H */ diff --git a/src/encoder.c b/src/encoder.c index a142f08c..da9b8208 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -63,9 +63,9 @@ # include #endif +#include #include "encoder.h" #include "rgblookup.h" -#include static char * diff --git a/src/encoder.h b/src/encoder.h index e85dba28..977a0cb8 100644 --- a/src/encoder.h +++ b/src/encoder.h @@ -23,7 +23,7 @@ #define LIBSIXEL_ENCODER_H /* encoder object */ -typedef struct sixel_encoder { +struct sixel_encoder { unsigned int ref; /* reference counter */ int reqcolors; char *mapfile; @@ -62,7 +62,7 @@ typedef struct sixel_encoder { int finsecure; int *cancel_flag; void *dither_cache; -} sixel_encoder_t; +}; #if HAVE_TESTS int diff --git a/src/frame.c b/src/frame.c index 274577e2..95a30f63 100644 --- a/src/frame.c +++ b/src/frame.c @@ -34,8 +34,8 @@ # include #endif -#include "frame.h" #include +#include "frame.h" SIXELAPI sixel_frame_t * diff --git a/src/frame.h b/src/frame.h index a2a65bd0..c34dd3e6 100644 --- a/src/frame.h +++ b/src/frame.h @@ -23,7 +23,7 @@ #define LIBSIXEL_FRAME_H /* frame object */ -typedef struct sixel_frame { +struct sixel_frame { unsigned int ref; /* reference counter */ unsigned char *pixels; /* loaded pixel data */ unsigned char *palette; /* loaded palette data */ @@ -36,7 +36,7 @@ typedef struct sixel_frame { int loop_count; /* loop count */ int multiframe; /* whether the image has multiple frames */ int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ -} sixel_frame_t; +}; #ifdef __cplusplus extern "C" { diff --git a/src/tests.c b/src/tests.c index 058c8d35..e55fc4c7 100644 --- a/src/tests.c +++ b/src/tests.c @@ -31,6 +31,7 @@ # include #endif +#include #include "dither.h" #include "quant.h" #include "frame.h" @@ -40,7 +41,6 @@ #include "status.h" #include "loader.h" #include "fromgif.h" -#include #include "chunk.h" #if HAVE_TESTS From f8b0eae09a14c6c1d40e7ab84808a9fe66237cf9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 20 Jul 2015 10:01:53 +0900 Subject: [PATCH 410/451] Enable tests for chunk.c --- src/tests.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tests.c b/src/tests.c index e55fc4c7..cd7b57d5 100644 --- a/src/tests.c +++ b/src/tests.c @@ -115,6 +115,13 @@ main(int argc, char *argv[]) } puts("status ok."); + + nret = sixel_chunk_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("chunk ok."); error: return nret; } From 0bb53a7dd5b60a86185b82938086d118c5c25daa Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 21 Jul 2015 02:44:22 +0900 Subject: [PATCH 411/451] Introduce allocator object --- Makefile.in | 4 +- config.h.in | 3 + configure | 28 +++++ configure.ac | 17 +++ converters/img2sixel.c | 7 ++ include/sixel.h.in | 36 +++++- src/Makefile.am | 2 + src/Makefile.in | 13 +- src/allocator.c | 138 ++++++++++++++++++++++ src/allocator.h | 37 ++++++ src/chunk.c | 30 +++-- src/chunk.h | 12 +- src/encoder.c | 261 ++++++++++++++++++++++++++++------------- src/encoder.h | 3 +- src/loader.c | 5 +- 15 files changed, 490 insertions(+), 106 deletions(-) create mode 100644 src/allocator.c create mode 100644 src/allocator.h diff --git a/Makefile.in b/Makefile.in index d966ad45..40c907f2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -192,8 +192,8 @@ CTAGS = ctags CSCOPE = cscope am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libsixel.pc.in $(srcdir)/package.json.in.in \ - ChangeLog NEWS compile config.guess config.sub install-sh \ - ltmain.sh missing py-compile + ChangeLog NEWS compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/config.h.in b/config.h.in index b49c4587..18883c46 100644 --- a/config.h.in +++ b/config.h.in @@ -72,6 +72,9 @@ don't. */ #undef HAVE_DECL_SIGTERM +/* define 1 if GCC supports -Wdeprecated-declarations */ +#undef HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS + /* define 1 if GCC supports -Wtypedef-redefinition */ #undef HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION diff --git a/configure b/configure index 40abe41e..e3f692d0 100755 --- a/configure +++ b/configure @@ -12244,6 +12244,34 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$CFLAGS_BACKUP +CFLAGS_BACKUP=$CFLAGS +CFLAGS="$CFLAGS -Werror" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #pragma GCC diagnostic push + #pragma GCC diagnostic pop + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + __attribute__((deprecated)) void test(void) {} + +int +main () +{ + + test(); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS=$CFLAGS_BACKUP + # Options # Check whether --enable-img2sixel was given. if test "${enable_img2sixel+set}" = set; then : diff --git a/configure.ac b/configure.ac index 7b10866c..ee5bed8f 100644 --- a/configure.ac +++ b/configure.ac @@ -46,6 +46,23 @@ AC_TRY_COMPILE( [define 1 if GCC supports -Wtypedef-redefinition])]) CFLAGS=$CFLAGS_BACKUP +CFLAGS_BACKUP=$CFLAGS +CFLAGS="$CFLAGS -Werror" +AC_TRY_COMPILE( + [ + #pragma GCC diagnostic push + #pragma GCC diagnostic pop + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + __attribute__((deprecated)) void test(void) {} + ], + [ + test(); + ], + [AC_DEFINE(HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS, + 1, + [define 1 if GCC supports -Wdeprecated-declarations])]) +CFLAGS=$CFLAGS_BACKUP + # Options AC_ARG_ENABLE([img2sixel], [AS_HELP_STRING([--disable-img2sixel], diff --git a/converters/img2sixel.c b/converters/img2sixel.c index 4ea324b5..e7482cc7 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -303,7 +303,14 @@ main(int argc, char *argv[]) sixel_encoder_t *encoder; char const *optstring = "o:78p:m:eb:Id:f:s:c:w:h:r:q:kil:t:ugvSn:PE:B:C:DVH"; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif encoder = sixel_encoder_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif #if HAVE_GETOPT_LONG struct option long_options[] = { diff --git a/include/sixel.h.in b/include/sixel.h.in index 70b03b85..e99729db 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -470,6 +470,31 @@ enum methodForResampling { }; #endif +typedef void *(* sixel_malloc_t)(size_t n); +typedef void *(* sixel_realloc_t)(void *p, size_t n); +typedef void (* sixel_free_t)(void *p); + +struct sixel_allocator; +typedef struct sixel_allocator sixel_allocator_t; + +#ifdef __cplusplus +extern "C" { +#endif + +SIXELSTATUS +sixel_allocator_new( + sixel_allocator_t /* out */ **ppallocator, + sixel_malloc_t /* in */ fn_malloc, + sixel_realloc_t /* in */ fn_realloc, + sixel_free_t /* in */ fn_free); + +void +sixel_allocator_destroy(sixel_allocator_t *allocator); + +#ifdef __cplusplus +} +#endif + /* output context manipulation API */ struct sixel_output; @@ -867,7 +892,8 @@ sixel_helper_load_image_file( sixel_load_image_function /* in */ fn_load, /* callback */ int /* in */ finsecure, /* true if do not verify SSL */ int const /* in */ *cancel_flag, /* cancel flag */ - void /* in/out */ *context); /* private data for callback */ + void /* in/out */ *context, /* private data for callback */ + sixel_allocator_t /* in */ *allocator); /* allocator object */ /* write image to file */ SIXELAPI SIXELSTATUS @@ -896,7 +922,13 @@ extern "C" { #endif /* create encoder object */ -SIXELAPI sixel_encoder_t * +SIXELAPI SIXELSTATUS +sixel_encoder_new( + sixel_encoder_t /* out */ **ppencoder, /* encoder object to be created */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ + +SIXELAPI @attr_func_deprecated@ sixel_encoder_t * sixel_encoder_create(void); SIXELAPI void diff --git a/src/Makefile.am b/src/Makefile.am index 8723f342..c270670f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,6 +39,8 @@ libsixel_la_SOURCES = \ stb_image_write.h \ status.c \ status.h \ + allocator.c \ + allocator.h \ rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ libsixel_la_CFLAGS = $(CFLAGS) $(AM_CFLAGS) $(MAYBE_COVERAGE) \ diff --git a/src/Makefile.in b/src/Makefile.in index 480c305b..247da0e2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -145,7 +145,8 @@ am_libsixel_la_OBJECTS = libsixel_la-output.lo \ libsixel_la-loader.lo libsixel_la-frompnm.lo \ libsixel_la-fromgif.lo libsixel_la-encoder.lo \ libsixel_la-decoder.lo libsixel_la-writer.lo \ - libsixel_la-stb_image_write.lo libsixel_la-status.lo + libsixel_la-stb_image_write.lo libsixel_la-status.lo \ + libsixel_la-allocator.lo libsixel_la_OBJECTS = $(am_libsixel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -411,6 +412,8 @@ libsixel_la_SOURCES = \ stb_image_write.h \ status.c \ status.h \ + allocator.c \ + allocator.h \ rgblookup.h libsixel_la_CPPFLAGS = -I$(top_builddir)/include/ @@ -528,6 +531,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-allocator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-chunk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-decoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsixel_la-dither.Plo@am__quote@ @@ -687,6 +691,13 @@ libsixel_la-status.lo: status.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-status.lo `test -f 'status.c' || echo '$(srcdir)/'`status.c +libsixel_la-allocator.lo: allocator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -MT libsixel_la-allocator.lo -MD -MP -MF $(DEPDIR)/libsixel_la-allocator.Tpo -c -o libsixel_la-allocator.lo `test -f 'allocator.c' || echo '$(srcdir)/'`allocator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsixel_la-allocator.Tpo $(DEPDIR)/libsixel_la-allocator.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='allocator.c' object='libsixel_la-allocator.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsixel_la_CPPFLAGS) $(CPPFLAGS) $(libsixel_la_CFLAGS) $(CFLAGS) -c -o libsixel_la-allocator.lo `test -f 'allocator.c' || echo '$(srcdir)/'`allocator.c + tests-tests.o: tests.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tests_CPPFLAGS) $(CPPFLAGS) $(tests_CFLAGS) $(CFLAGS) -MT tests-tests.o -MD -MP -MF $(DEPDIR)/tests-tests.Tpo -c -o tests-tests.o `test -f 'tests.c' || echo '$(srcdir)/'`tests.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tests-tests.Tpo $(DEPDIR)/tests-tests.Po diff --git a/src/allocator.c b/src/allocator.c new file mode 100644 index 00000000..63895024 --- /dev/null +++ b/src/allocator.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include "config.h" + +#if HAVE_SYS_TYPES_H +# include +#endif /* HAVE_SYS_TYPES_H */ + +#if HAVE_ERRNO_H +# include +#endif /* HAVE_ERRNO_H */ + +#if HAVE_MEMORY_H +# include +#endif /* HAVE_MEMORY_H */ + +#include "allocator.h" + + +SIXELSTATUS +sixel_allocator_new( + sixel_allocator_t /* out */ **ppallocator, + sixel_malloc_t /* in */ fn_malloc, + sixel_realloc_t /* in */ fn_realloc, + sixel_free_t /* in */ fn_free) +{ + SIXELSTATUS status = SIXEL_FALSE; + + if (fn_malloc == NULL) { + sixel_helper_set_additional_message( + "sixel_allocator_new: given argument fn_malloc is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + if (fn_realloc == NULL) { + sixel_helper_set_additional_message( + "sixel_allocator_new: given argument fn_realloc is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + if (fn_free == NULL) { + sixel_helper_set_additional_message( + "sixel_allocator_new: given argument fn_free is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + *ppallocator = fn_malloc(sizeof(sixel_allocator_t)); + if (*ppallocator == NULL) { + sixel_helper_set_additional_message( + "sixel_allocator_new: fn_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + (*ppallocator)->fn_malloc = fn_malloc; + (*ppallocator)->fn_realloc = fn_realloc; + (*ppallocator)->fn_free = fn_free; + +end: + return status; +} + + +void +sixel_allocator_destroy(sixel_allocator_t *allocator) +{ + allocator->fn_free(allocator); +} + + +#if HAVE_TESTS +void * +sixel_bad_malloc(size_t n) +{ + (void) n; + + return NULL; +} + + +void * +sixel_bad_realloc(void *p, size_t n) +{ + (void) p; + (void) n; + + return NULL; +} +#endif /* HAVE_TESTS */ + +#if 0 +int +rpl_posix_memalign(void **memptr, size_t alignment, size_t size) +{ +#if HAVE_POSIX_MEMALIGN + return posix_memalign(memptr, alignment, size); +#elif HAVE_ALIGNED_ALLOC + *memptr = aligned_alloc(alignment, size); + return *memptr ? 0: ENOMEM; +#elif HAVE_MEMALIGN + *memptr = memalign(alignment, size); + return *memptr ? 0: ENOMEM; +#elif HAVE__ALIGNED_MALLOC + return _aligned_malloc(size, alignment); +#else +# error +#endif /* _MSC_VER */ +} +#endif + + + +/* Hello emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/allocator.h b/src/allocator.h new file mode 100644 index 00000000..fd428b28 --- /dev/null +++ b/src/allocator.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014,2015 Hayaki Saito + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBSIXEL_ALLOCATOR_H +#define LIBSIXEL_ALLOCATOR_H + +#include + +struct sixel_allocator { + sixel_malloc_t fn_malloc; + sixel_realloc_t fn_realloc; + sixel_free_t fn_free; +}; + +#endif /* LIBSIXEL_ALLOCATOR_H */ + +/* Hello emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ +/* vim: set expandtab ts=4 : */ +/* EOF */ diff --git a/src/chunk.c b/src/chunk.c index 5699aa21..b473eec5 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -65,8 +65,8 @@ # define O_BINARY _O_BINARY #endif /* !defined(O_BINARY) && !defined(_O_BINARY) */ -#include #include "chunk.h" +#include "allocator.h" static SIXELSTATUS sixel_chunk_init( @@ -77,7 +77,8 @@ sixel_chunk_init( pchunk->max_size = initial_size; pchunk->size = 0; - pchunk->buffer = (unsigned char *)malloc(pchunk->max_size); + pchunk->buffer + = (unsigned char *)pchunk->allocator->fn_malloc(pchunk->max_size); if (pchunk->buffer == NULL) { sixel_helper_set_additional_message( @@ -165,7 +166,9 @@ wait_file(int fd, int usec) static SIXELSTATUS -open_binary_file(FILE **f, char const *filename) +open_binary_file( + FILE /* out */ **f, + char const /* in */ *filename) { SIXELSTATUS status = SIXEL_FALSE; char buffer[1024]; @@ -337,15 +340,15 @@ sixel_chunk_from_url( SIXELSTATUS sixel_chunk_new( - sixel_chunk_t /* out */ **ppchunk, - char const /* in */ *filename, - int /* in */ finsecure, - int const /* in */ *cancel_flag -) + sixel_chunk_t /* out */ **ppchunk, + char const /* in */ *filename, + int /* in */ finsecure, + int const /* in */ *cancel_flag, + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; - *ppchunk = (sixel_chunk_t *)malloc(sizeof(sixel_chunk_t)); + *ppchunk = (sixel_chunk_t *)allocator->fn_malloc(sizeof(sixel_chunk_t)); if (*ppchunk == NULL) { sixel_helper_set_additional_message( "sixel_chunk_new: malloc() failed."); @@ -353,6 +356,9 @@ sixel_chunk_new( goto end; } + /* set allocator to chunk object */ + (*ppchunk)->allocator = allocator; + status = sixel_chunk_init(*ppchunk, 1024 * 32); if (SIXEL_FAILED(status)) { goto end; @@ -379,10 +385,10 @@ sixel_chunk_destroy( sixel_chunk_t * const /* in */ pchunk) { if (pchunk) { - free(pchunk->buffer); + pchunk->allocator->fn_free(pchunk->buffer); pchunk->buffer = NULL; + pchunk->allocator->fn_free(pchunk); } - free(pchunk); } @@ -394,7 +400,7 @@ test1(void) unsigned char *ptr = malloc(16); #ifdef HAVE_LIBCURL - sixel_chunk_t chunk = {0, 0, 0}; + sixel_chunk_t chunk = {0, 0, 0, NULL}; int nread; nread = memory_write(NULL, 1, 1, NULL); diff --git a/src/chunk.h b/src/chunk.h index c62e3249..913d1db0 100644 --- a/src/chunk.h +++ b/src/chunk.h @@ -22,12 +22,15 @@ #ifndef LIBSIXEL_CHUNK_H #define LIBSIXEL_CHUNK_H +#include + /* chunk object */ typedef struct sixel_chunk { unsigned char *buffer; size_t size; size_t max_size; + sixel_allocator_t *allocator; } sixel_chunk_t; #ifdef __cplusplus @@ -36,10 +39,11 @@ extern "C" { SIXELSTATUS sixel_chunk_new( - sixel_chunk_t /* out */ **ppchunk, - char const /* in */ *filename, - int /* in */ finsecure, - int const /* in */ *cancel_flag); + sixel_chunk_t /* out */ **ppchunk, + char const /* in */ *filename, + int /* in */ finsecure, + int const /* in */ *cancel_flag, + sixel_allocator_t /* in */ *allocator); void diff --git a/src/encoder.c b/src/encoder.c index da9b8208..07711abf 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -65,15 +65,19 @@ #include #include "encoder.h" +#include "allocator.h" #include "rgblookup.h" static char * -arg_strdup(char const *s) +arg_strdup( + char const /* in */ *s, /* source buffer */ + sixel_allocator_t /* in */ *allocator) /* allocator object for + destination buffer */ { char *p; - p = (char *)malloc(strlen(s) + 1); + p = (char *)allocator->fn_malloc(strlen(s) + 1); if (p) { strcpy(p, s); } @@ -82,7 +86,11 @@ arg_strdup(char const *s) static SIXELSTATUS -parse_x_colorspec(char const *s, unsigned char **bgcolor) +parse_x_colorspec( + unsigned char /* out */ **bgcolor, /* destination buffer */ + char const /* in */ *s, /* source buffer */ + sixel_allocator_t /* in */ *allocator) /* allocator object for + destination buffer */ { SIXELSTATUS status = SIXEL_FALSE; char *p; @@ -94,8 +102,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) struct color const *pcolor; pcolor = lookup_rgb(s, strlen(s)); if (pcolor) { - *bgcolor = (unsigned char *)malloc(3); + *bgcolor = (unsigned char *)allocator->fn_malloc(3); if (*bgcolor == NULL) { + sixel_helper_set_additional_message( + "parse_x_colorspec: allocator->fn_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -103,8 +113,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[1] = pcolor->g; (*bgcolor)[2] = pcolor->b; } else if (s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == ':') { - p = buf = arg_strdup(s + 4); + p = buf = arg_strdup(s + 4, allocator); if (buf == NULL) { + sixel_helper_set_additional_message( + "parse_x_colorspec: allocator->fn_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -145,8 +157,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) status = SIXEL_BAD_ARGUMENT; goto end; } - *bgcolor = (unsigned char *)malloc(3); + *bgcolor = (unsigned char *)allocator->fn_malloc(3); if (*bgcolor == NULL) { + sixel_helper_set_additional_message( + "parse_x_colorspec: allocator->fn_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -154,8 +168,10 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) (*bgcolor)[1] = components[1]; (*bgcolor)[2] = components[2]; } else if (*s == '#') { - buf = arg_strdup(s + 1); + buf = arg_strdup(s + 1, allocator); if (buf == NULL) { + sixel_helper_set_additional_message( + "parse_x_colorspec: allocator->fn_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -177,7 +193,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) status = SIXEL_BAD_ARGUMENT; goto end; } - *bgcolor = (unsigned char *)malloc(3); + *bgcolor = (unsigned char *)allocator->fn_malloc(3); if (*bgcolor == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -214,7 +230,7 @@ parse_x_colorspec(char const *s, unsigned char **bgcolor) status = SIXEL_OK; end: - free(buf); + allocator->fn_free(buf); return status; } @@ -374,7 +390,8 @@ prepare_specified_palette( int reqcolors, unsigned char *bgcolor, int finsecure, - int const *cancel_flag) + int const *cancel_flag, + sixel_allocator_t *allocator) { SIXELSTATUS status = SIXEL_FALSE; @@ -392,7 +409,8 @@ prepare_specified_palette( load_image_callback_for_palette, finsecure, cancel_flag, - &callback_context); + &callback_context, + allocator); if (status != SIXEL_OK) { return status; } @@ -441,7 +459,8 @@ prepare_palette(sixel_dither_t **dither, encoder->reqcolors, encoder->bgcolor, encoder->finsecure, - encoder->cancel_flag); + encoder->cancel_flag, + encoder->allocator); if (status != SIXEL_OK) { goto end; } @@ -645,15 +664,14 @@ wait_stdin(int usec) static SIXELSTATUS output_sixel_without_macro( - unsigned char *buffer, - int width, - int height, - int pixelformat, - int delay, - sixel_dither_t *dither, - sixel_output_t *context, - sixel_encoder_t *encoder -) + unsigned char /* in */ *buffer, + int /* in */ width, + int /* in */ height, + int /* in */ pixelformat, + int /* in */ delay, + sixel_dither_t /* in */ *dither, + sixel_output_t /* in */ *output, + sixel_encoder_t /* in */ *encoder) { SIXELSTATUS status = SIXEL_OK; int dulation = 0; @@ -667,6 +685,14 @@ output_sixel_without_macro( clock_t start; # endif #endif + + if (encoder == NULL) { + sixel_helper_set_additional_message( + "output_sixel_without_macro: encoder object is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + if (!encoder->mapfile && !encoder->monochrome && !encoder->highcolor && !encoder->builtin_palette) { sixel_dither_set_optimize_palette(dither, 1); @@ -685,8 +711,10 @@ output_sixel_without_macro( goto end; } - p = (unsigned char *)malloc(width * height * depth); + p = (unsigned char *)encoder->allocator->fn_malloc(width * height * depth); if (p == NULL) { + sixel_helper_set_additional_message( + "output_sixel_without_macro: allocator->fn_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -715,13 +743,14 @@ output_sixel_without_macro( goto end; } - status = sixel_encode(p, width, height, depth, dither, context); + status = sixel_encode(p, width, height, depth, dither, output); if (status != 0) { goto end; } end: - free(p); + encoder->allocator->fn_free(p); + return status; } @@ -735,7 +764,7 @@ output_sixel_with_macro( int frame_no, int loop_count, sixel_dither_t *dither, - sixel_output_t *context, + sixel_output_t *output, sixel_encoder_t *encoder ) { @@ -773,7 +802,7 @@ output_sixel_with_macro( goto end; } - status = sixel_encode(frame, sx, sy, /* unused */ 3, dither, context); + status = sixel_encode(frame, sx, sy, /* unused */ 3, dither, output); if (SIXEL_FAILED(status)) { goto end; } @@ -1196,71 +1225,106 @@ load_image_callback(sixel_frame_t *frame, void *data) /* create encoder object */ -SIXELAPI sixel_encoder_t * -sixel_encoder_create(void) +SIXELAPI SIXELSTATUS +sixel_encoder_new( + sixel_encoder_t /* out */ **ppencoder, /* encoder object to be created */ + sixel_allocator_t /* in */ *allocator) /* allocator, null if you use + default allocator */ { - sixel_encoder_t *encoder; + SIXELSTATUS status = SIXEL_FALSE; char const *env_default_bgcolor; char const *env_default_ncolors; int ncolors; - encoder = (sixel_encoder_t *)malloc(sizeof(sixel_encoder_t)); - if (encoder == NULL) { - return NULL; + *ppencoder + = (sixel_encoder_t *)allocator->fn_malloc(sizeof(sixel_encoder_t)); + if (*ppencoder == NULL) { + sixel_helper_set_additional_message( + "sixel_encoder_new: allocator->fn_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; } - encoder->ref = 1; - encoder->reqcolors = (-1); - encoder->mapfile = NULL; - encoder->monochrome = 0; - encoder->highcolor = 0; - encoder->builtin_palette = 0; - encoder->method_for_diffuse = SIXEL_DIFFUSE_AUTO; - encoder->method_for_largest = SIXEL_LARGE_AUTO; - encoder->method_for_rep = SIXEL_REP_AUTO; - encoder->quality_mode = SIXEL_QUALITY_AUTO; - encoder->method_for_resampling = SIXEL_RES_BILINEAR; - encoder->loop_mode = SIXEL_LOOP_AUTO; - encoder->palette_type = SIXEL_PALETTETYPE_AUTO; - encoder->f8bit = 0; - encoder->finvert = 0; - encoder->fuse_macro = 0; - encoder->fignore_delay = 0; - encoder->complexion = 1; - encoder->fstatic = 0; - encoder->pixelwidth = -1; - encoder->pixelheight = -1; - encoder->percentwidth = -1; - encoder->percentheight = -1; - encoder->clipx = 0; - encoder->clipy = 0; - encoder->clipwidth = 0; - encoder->clipheight = 0; - encoder->clipfirst = 0; - encoder->macro_number = -1; - encoder->verbose = 0; - encoder->penetrate_multiplexer = 0; - encoder->encode_policy = SIXEL_ENCODEPOLICY_AUTO; - encoder->pipe_mode = 0; - encoder->bgcolor = NULL; - encoder->outfd = STDOUT_FILENO; - encoder->finsecure = 0; - encoder->cancel_flag = NULL; - encoder->dither_cache = NULL; + (*ppencoder)->ref = 1; + (*ppencoder)->reqcolors = (-1); + (*ppencoder)->mapfile = NULL; + (*ppencoder)->monochrome = 0; + (*ppencoder)->highcolor = 0; + (*ppencoder)->builtin_palette = 0; + (*ppencoder)->method_for_diffuse = SIXEL_DIFFUSE_AUTO; + (*ppencoder)->method_for_largest = SIXEL_LARGE_AUTO; + (*ppencoder)->method_for_rep = SIXEL_REP_AUTO; + (*ppencoder)->quality_mode = SIXEL_QUALITY_AUTO; + (*ppencoder)->method_for_resampling = SIXEL_RES_BILINEAR; + (*ppencoder)->loop_mode = SIXEL_LOOP_AUTO; + (*ppencoder)->palette_type = SIXEL_PALETTETYPE_AUTO; + (*ppencoder)->f8bit = 0; + (*ppencoder)->finvert = 0; + (*ppencoder)->fuse_macro = 0; + (*ppencoder)->fignore_delay = 0; + (*ppencoder)->complexion = 1; + (*ppencoder)->fstatic = 0; + (*ppencoder)->pixelwidth = -1; + (*ppencoder)->pixelheight = -1; + (*ppencoder)->percentwidth = -1; + (*ppencoder)->percentheight = -1; + (*ppencoder)->clipx = 0; + (*ppencoder)->clipy = 0; + (*ppencoder)->clipwidth = 0; + (*ppencoder)->clipheight = 0; + (*ppencoder)->clipfirst = 0; + (*ppencoder)->macro_number = -1; + (*ppencoder)->verbose = 0; + (*ppencoder)->penetrate_multiplexer = 0; + (*ppencoder)->encode_policy = SIXEL_ENCODEPOLICY_AUTO; + (*ppencoder)->pipe_mode = 0; + (*ppencoder)->bgcolor = NULL; + (*ppencoder)->outfd = STDOUT_FILENO; + (*ppencoder)->finsecure = 0; + (*ppencoder)->cancel_flag = NULL; + (*ppencoder)->dither_cache = NULL; env_default_bgcolor = getenv("SIXEL_BGCOLOR"); if (env_default_bgcolor) { - (void) parse_x_colorspec(env_default_bgcolor, &encoder->bgcolor); + status = parse_x_colorspec(&(*ppencoder)->bgcolor, + env_default_bgcolor, + (*ppencoder)->allocator); + if (SIXEL_FAILED(status)) { + goto end; + } } env_default_ncolors = getenv("SIXEL_COLORS"); if (env_default_ncolors) { ncolors = atoi(env_default_ncolors); if (ncolors > 1 && ncolors <= 256) { - encoder->reqcolors = ncolors; + (*ppencoder)->reqcolors = ncolors; } } +end: + return status; +} + + +/* create encoder object */ +SIXELAPI sixel_encoder_t * +sixel_encoder_create(void) +{ + SIXELSTATUS status = SIXEL_FALSE; + sixel_encoder_t *encoder; + sixel_allocator_t *allocator; + + status = sixel_allocator_new(&allocator, malloc, realloc, free); + if (SIXEL_FAILED(status)) { + return NULL; + } + + status = sixel_encoder_new(&encoder, allocator); + if (SIXEL_FAILED(status)) { + return NULL; + } + return encoder; } @@ -1269,15 +1333,15 @@ static void sixel_encoder_destroy(sixel_encoder_t *encoder) { if (encoder) { - free(encoder->mapfile); - free(encoder->bgcolor); + encoder->allocator->fn_free(encoder->mapfile); + encoder->allocator->fn_free(encoder->bgcolor); sixel_dither_unref(encoder->dither_cache); if (encoder->outfd && encoder->outfd != STDOUT_FILENO && encoder->outfd != STDERR_FILENO) { close(encoder->outfd); } - free(encoder); + encoder->allocator->fn_free(encoder); } } @@ -1353,10 +1417,12 @@ sixel_encoder_setopt( break; case SIXEL_OPTFLAG_MAPFILE: /* m */ if (encoder->mapfile) { - free(encoder->mapfile); + encoder->allocator->fn_free(encoder->mapfile); } - encoder->mapfile = arg_strdup(optarg); + encoder->mapfile = arg_strdup(optarg, encoder->allocator); if (encoder->mapfile == NULL) { + sixel_helper_set_additional_message( + "sixel_encoder_setopt: allocator->fn_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -1588,9 +1654,12 @@ sixel_encoder_setopt( case SIXEL_OPTFLAG_BGCOLOR: /* B */ /* parse --bgcolor option */ if (encoder->bgcolor) { - free(encoder->bgcolor); + encoder->allocator->fn_free(encoder->bgcolor); } - if (parse_x_colorspec(optarg, &encoder->bgcolor) != 0) { + status = parse_x_colorspec(&encoder->bgcolor, + optarg, + encoder->allocator); + if (SIXEL_FAILED(status)) { sixel_helper_set_additional_message( "cannot parse bgcolor option."); status = SIXEL_BAD_ARGUMENT; @@ -1755,7 +1824,14 @@ sixel_encoder_encode( int fuse_palette = 1; if (encoder == NULL) { +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif encoder = sixel_encoder_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif } else { sixel_encoder_ref(encoder); } @@ -1796,7 +1872,6 @@ sixel_encoder_encode( } reload: - status = sixel_helper_load_image_file(filename, encoder->fstatic, fuse_palette, @@ -1806,7 +1881,8 @@ sixel_encoder_encode( load_image_callback, encoder->finsecure, encoder->cancel_flag, - (void *)encoder); + (void *)encoder, + encoder->allocator); if (status != SIXEL_OK) { goto end; } @@ -1843,7 +1919,14 @@ test1(void) int nret = EXIT_FAILURE; sixel_encoder_t *encoder = NULL; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif encoder = sixel_encoder_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (encoder == NULL) { goto error; } @@ -1865,7 +1948,14 @@ test2(void) sixel_encoder_t *encoder = NULL; sixel_frame_t *frame = NULL; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif encoder = sixel_encoder_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (encoder == NULL) { goto error; } @@ -1876,7 +1966,7 @@ test2(void) } status = sixel_frame_init(frame, - (unsigned char *)malloc(3), + (unsigned char *)encoder->allocator->fn_malloc(3), 1, 1, SIXEL_PIXELFORMAT_RGB888, @@ -1925,7 +2015,14 @@ test4(void) sixel_encoder_t *encoder = NULL; SIXELSTATUS status; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif encoder = sixel_encoder_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (encoder == NULL) { goto error; } diff --git a/src/encoder.h b/src/encoder.h index 977a0cb8..1b71e4e6 100644 --- a/src/encoder.h +++ b/src/encoder.h @@ -24,7 +24,8 @@ /* encoder object */ struct sixel_encoder { - unsigned int ref; /* reference counter */ + unsigned int ref; /* reference counter */ + sixel_allocator_t *allocator; /* allocator object */ int reqcolors; char *mapfile; int monochrome; diff --git a/src/loader.c b/src/loader.c index 66e64455..45bd80fe 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1193,13 +1193,14 @@ sixel_helper_load_image_file( sixel_load_image_function /* in */ fn_load, /* callback */ int /* in */ finsecure, /* true if do not verify SSL */ int const /* in */ *cancel_flag, /* cancel flag */ - void /* in/out */ *context /* private data */ + void /* in/out */ *context, /* private data */ + sixel_allocator_t /* in */ *allocator /* allocator object */ ) { SIXELSTATUS status = SIXEL_FALSE; sixel_chunk_t *pchunk = NULL; - status = sixel_chunk_new(&pchunk, filename, finsecure, cancel_flag); + status = sixel_chunk_new(&pchunk, filename, finsecure, cancel_flag, allocator); if (status != SIXEL_OK) { goto end; } From 8b7d31b5d406932e9490c90ad5ab9cd4777fd83f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 22 Jul 2015 02:10:48 +0900 Subject: [PATCH 412/451] Introduce reference counter to allocator object --- include/sixel.h.in | 9 +++- src/allocator.c | 100 ++++++++++++++++++++++++++++++++++++++++++--- src/allocator.h | 6 +++ src/encoder.c | 31 ++++++++++---- src/tests.c | 9 ++++ 5 files changed, 139 insertions(+), 16 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index e99729db..3f4013ff 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -488,8 +488,13 @@ sixel_allocator_new( sixel_realloc_t /* in */ fn_realloc, sixel_free_t /* in */ fn_free); -void -sixel_allocator_destroy(sixel_allocator_t *allocator); + +SIXELAPI void +sixel_allocator_ref(sixel_allocator_t *allocator); + + +SIXELAPI void +sixel_allocator_unref(sixel_allocator_t *allocator); #ifdef __cplusplus } diff --git a/src/allocator.c b/src/allocator.c index 63895024..e1ac025c 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -46,6 +46,13 @@ sixel_allocator_new( { SIXELSTATUS status = SIXEL_FALSE; + if (ppallocator == NULL) { + sixel_helper_set_additional_message( + "sixel_allocator_new: given argument ppallocator is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + if (fn_malloc == NULL) { sixel_helper_set_additional_message( "sixel_allocator_new: given argument fn_malloc is null."); @@ -75,22 +82,45 @@ sixel_allocator_new( goto end; } - (*ppallocator)->fn_malloc = fn_malloc; - (*ppallocator)->fn_realloc = fn_realloc; - (*ppallocator)->fn_free = fn_free; + (*ppallocator)->ref = 1; + (*ppallocator)->fn_malloc = fn_malloc; + (*ppallocator)->fn_realloc = fn_realloc; + (*ppallocator)->fn_free = fn_free; + + status = SIXEL_OK; end: return status; } -void -sixel_allocator_destroy(sixel_allocator_t *allocator) +static void +sixel_allocator_destroy( + sixel_allocator_t /* in */ *allocator) /* allocator object to + be destroyed */ { allocator->fn_free(allocator); } +SIXELAPI void +sixel_allocator_ref(sixel_allocator_t *allocator) +{ + /* TODO: be thread safe */ + ++allocator->ref; +} + + +SIXELAPI void +sixel_allocator_unref(sixel_allocator_t *allocator) +{ + /* TODO: be thread safe */ + if (allocator != NULL && --allocator->ref == 0) { + sixel_allocator_destroy(allocator); + } +} + + #if HAVE_TESTS void * sixel_bad_malloc(size_t n) @@ -132,6 +162,66 @@ rpl_posix_memalign(void **memptr, size_t alignment, size_t size) #endif +#if HAVE_TESTS +static int +test1(void) +{ + int nret = EXIT_FAILURE; + SIXELSTATUS status; + sixel_allocator_t *allocator = NULL; + + status = sixel_allocator_new(NULL, malloc, realloc, free); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + status = sixel_allocator_new(&allocator, NULL, realloc, free); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + status = sixel_allocator_new(&allocator, malloc, NULL, free); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + status = sixel_allocator_new(&allocator, malloc, realloc, NULL); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} + + +int +sixel_allocator_tests_main(void) +{ + int nret = EXIT_FAILURE; + size_t i; + typedef int (* testcase)(void); + + static testcase const testcases[] = { + test1, + }; + + for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { + nret = testcases[i](); + if (nret != EXIT_SUCCESS) { + goto error; + } + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} +#endif /* HAVE_TESTS */ + /* Hello emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* vim: set expandtab ts=4 : */ diff --git a/src/allocator.h b/src/allocator.h index fd428b28..4236a11a 100644 --- a/src/allocator.h +++ b/src/allocator.h @@ -25,11 +25,17 @@ #include struct sixel_allocator { + unsigned int ref; /* reference counter */ sixel_malloc_t fn_malloc; sixel_realloc_t fn_realloc; sixel_free_t fn_free; }; +#if HAVE_TESTS +int +sixel_allocator_tests_main(void); +#endif + #endif /* LIBSIXEL_ALLOCATOR_H */ /* Hello emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/encoder.c b/src/encoder.c index 07711abf..ec7ab87e 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1236,6 +1236,15 @@ sixel_encoder_new( char const *env_default_ncolors; int ncolors; + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, malloc, realloc, free); + if (SIXEL_FAILED(status)) { + goto end; + } + } else { + sixel_allocator_ref(allocator); + } + *ppencoder = (sixel_encoder_t *)allocator->fn_malloc(sizeof(sixel_encoder_t)); if (*ppencoder == NULL) { @@ -1283,6 +1292,7 @@ sixel_encoder_new( (*ppencoder)->finsecure = 0; (*ppencoder)->cancel_flag = NULL; (*ppencoder)->dither_cache = NULL; + (*ppencoder)->allocator = allocator; env_default_bgcolor = getenv("SIXEL_BGCOLOR"); if (env_default_bgcolor) { @@ -1302,25 +1312,21 @@ sixel_encoder_new( } } + status = SIXEL_OK; + end: return status; } /* create encoder object */ -SIXELAPI sixel_encoder_t * +SIXELAPI /* deprecated */ sixel_encoder_t * sixel_encoder_create(void) { SIXELSTATUS status = SIXEL_FALSE; - sixel_encoder_t *encoder; - sixel_allocator_t *allocator; - - status = sixel_allocator_new(&allocator, malloc, realloc, free); - if (SIXEL_FAILED(status)) { - return NULL; - } + sixel_encoder_t *encoder = NULL; - status = sixel_encoder_new(&encoder, allocator); + status = sixel_encoder_new(&encoder, NULL); if (SIXEL_FAILED(status)) { return NULL; } @@ -1342,6 +1348,7 @@ sixel_encoder_destroy(sixel_encoder_t *encoder) close(encoder->outfd); } encoder->allocator->fn_free(encoder); + sixel_allocator_unref(encoder->allocator); } } @@ -1832,6 +1839,12 @@ sixel_encoder_encode( #if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS # pragma GCC diagnostic pop #endif + if (encoder == NULL) { + sixel_helper_set_additional_message( + "sixel_encoder_encode: sixel_encoder_create() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } } else { sixel_encoder_ref(encoder); } diff --git a/src/tests.c b/src/tests.c index cd7b57d5..6d4b1d48 100644 --- a/src/tests.c +++ b/src/tests.c @@ -42,6 +42,7 @@ #include "loader.h" #include "fromgif.h" #include "chunk.h" +#include "allocator.h" #if HAVE_TESTS @@ -122,6 +123,14 @@ main(int argc, char *argv[]) } puts("chunk ok."); + + nret = sixel_allocator_tests_main(); + if (nret != EXIT_SUCCESS) { + goto error; + } + + puts("allocator ok."); + error: return nret; } From 4cf2a3f9c4aae77d47ef8dca8925cb5bdf7f26af Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 22 Jul 2015 23:47:45 +0900 Subject: [PATCH 413/451] Add APIs for calling custom allocator functions --- include/sixel.h.in | 46 ++++++++++++++++++++++++++++++--------- src/allocator.c | 54 +++++++++++++++++++++++++++++++++++++++------- src/encoder.c | 50 +++++++++++++++++++++++------------------- 3 files changed, 110 insertions(+), 40 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 3f4013ff..f705481a 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -481,20 +481,42 @@ typedef struct sixel_allocator sixel_allocator_t; extern "C" { #endif +/* create allocator object */ SIXELSTATUS sixel_allocator_new( - sixel_allocator_t /* out */ **ppallocator, - sixel_malloc_t /* in */ fn_malloc, - sixel_realloc_t /* in */ fn_realloc, - sixel_free_t /* in */ fn_free); + sixel_allocator_t /* out */ **ppallocator, /* allocator object to be created */ + sixel_malloc_t /* in */ fn_malloc, /* custom malloc() function */ + sixel_realloc_t /* in */ fn_realloc, /* custom realloc() function */ + sixel_free_t /* in */ fn_free); /* custom free() function */ +/* increase reference count of allocatort object (thread-unsafe) */ +SIXELAPI void +sixel_allocator_ref( + sixel_allocator_t /* in */ *allocator); /* allocator object to be + increment reference counter */ +/* decrease reference count of output context object (thread-unsafe) */ SIXELAPI void -sixel_allocator_ref(sixel_allocator_t *allocator); +sixel_allocator_unref(sixel_allocator_t *allocator); +/* call custom malloc() */ +SIXELAPI void * +sixel_allocator_malloc( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + size_t /* in */ n); /* allocation size */ +/* call custom realloc() */ +SIXELAPI void * +sixel_allocator_realloc( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + void /* in */ *p, /* existing buffer to be re-allocated */ + size_t /* in */ n); /* re-allocation size */ + +/* call custom free() */ SIXELAPI void -sixel_allocator_unref(sixel_allocator_t *allocator); +sixel_allocator_free( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + void /* in */ *p); /* existing buffer to be freed */ #ifdef __cplusplus } @@ -520,30 +542,34 @@ sixel_output_create( SIXELAPI void sixel_output_destroy(sixel_output_t /* in */ *output); /* output context */ -/* increment reference count of output context object (thread-unsafe) */ +/* increase reference count of output context object (thread-unsafe) */ SIXELAPI void sixel_output_ref(sixel_output_t /* in */ *output); /* output context */ -/* decrement reference count of output context object (thread-unsafe) */ +/* decrease reference count of output context object (thread-unsafe) */ SIXELAPI void sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ +/* set 8bit output mode which indicates whether it uses C1 control characters */ SIXELAPI int sixel_output_get_8bit_availability( sixel_output_t /* in */ *output); /* output context */ +/* get 8bit output mode state */ SIXELAPI void sixel_output_set_8bit_availability( sixel_output_t /* in */ *output, /* output context */ int /* in */ availability); /* 0: do not use 8bit characters 1: use 8bit characters */ +/* set GNU Screen penetration feature enable or disable */ SIXELAPI void sixel_output_set_penetrate_multiplexer( sixel_output_t /* in */ *output, /* output context */ int /* in */ penetrate); /* 0: penetrate GNU Screen 1: do not penetrate GNU Screen */ +/* set whether we emit DCS envelope */ SIXELAPI void sixel_output_set_skip_dcs_envelope( sixel_output_t /* in */ *output, /* output context */ @@ -589,11 +615,11 @@ sixel_dither_get(int builtin_dither); /* ID of built-in dither object */ SIXELAPI void sixel_dither_destroy(sixel_dither_t *dither); /* dither context object */ -/* increment reference count of dither context object (thread-unsafe) */ +/* increase reference count of dither context object (thread-unsafe) */ SIXELAPI void sixel_dither_ref(sixel_dither_t *dither); /* dither context object */ -/* decrement reference count of dither context object (thread-unsafe) */ +/* decrease reference count of dither context object (thread-unsafe) */ SIXELAPI void sixel_dither_unref(sixel_dither_t *dither); /* dither context object */ diff --git a/src/allocator.c b/src/allocator.c index e1ac025c..e28c9777 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -37,12 +37,13 @@ #include "allocator.h" +/* create allocator object */ SIXELSTATUS sixel_allocator_new( - sixel_allocator_t /* out */ **ppallocator, - sixel_malloc_t /* in */ fn_malloc, - sixel_realloc_t /* in */ fn_realloc, - sixel_free_t /* in */ fn_free) + sixel_allocator_t /* out */ **ppallocator, /* allocator object to be created */ + sixel_malloc_t /* in */ fn_malloc, /* custom malloc() function */ + sixel_realloc_t /* in */ fn_realloc, /* custom realloc() function */ + sixel_free_t /* in */ fn_free) /* custom free() function */ { SIXELSTATUS status = SIXEL_FALSE; @@ -94,25 +95,31 @@ sixel_allocator_new( } +/* destruct allocator object */ static void sixel_allocator_destroy( - sixel_allocator_t /* in */ *allocator) /* allocator object to - be destroyed */ + sixel_allocator_t /* in */ *allocator) /* allocator object to + be destroyed */ { allocator->fn_free(allocator); } +/* increase reference count of allocatort object (thread-unsafe) */ SIXELAPI void -sixel_allocator_ref(sixel_allocator_t *allocator) +sixel_allocator_ref( + sixel_allocator_t /* in */ *allocator) /* allocator object to be + increment reference counter */ { /* TODO: be thread safe */ ++allocator->ref; } +/* decrease reference count of output context object (thread-unsafe) */ SIXELAPI void -sixel_allocator_unref(sixel_allocator_t *allocator) +sixel_allocator_unref( + sixel_allocator_t /* in */ *allocator) /* allocator object to be unreference */ { /* TODO: be thread safe */ if (allocator != NULL && --allocator->ref == 0) { @@ -121,6 +128,37 @@ sixel_allocator_unref(sixel_allocator_t *allocator) } +/* call custom malloc() */ +SIXELAPI void * +sixel_allocator_malloc( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + size_t /* in */ n) /* allocation size */ +{ + return allocator->fn_malloc(n); +} + + +/* call custom realloc() */ +SIXELAPI void * +sixel_allocator_realloc( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + void /* in */ *p, /* existing buffer to be re-allocated */ + size_t /* in */ n) /* re-allocation size */ +{ + return allocator->fn_realloc(p, n); +} + + +/* call custom free() */ +SIXELAPI void +sixel_allocator_free( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + void /* in */ *p) /* existing buffer to be freed */ +{ + return allocator->fn_free(p); +} + + #if HAVE_TESTS void * sixel_bad_malloc(size_t n) diff --git a/src/encoder.c b/src/encoder.c index ec7ab87e..8a6f3fbe 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -65,7 +65,6 @@ #include #include "encoder.h" -#include "allocator.h" #include "rgblookup.h" @@ -77,7 +76,7 @@ arg_strdup( { char *p; - p = (char *)allocator->fn_malloc(strlen(s) + 1); + p = (char *)sixel_allocator_malloc(allocator, strlen(s) + 1); if (p) { strcpy(p, s); } @@ -102,10 +101,10 @@ parse_x_colorspec( struct color const *pcolor; pcolor = lookup_rgb(s, strlen(s)); if (pcolor) { - *bgcolor = (unsigned char *)allocator->fn_malloc(3); + *bgcolor = (unsigned char *)sixel_allocator_malloc(allocator, 3); if (*bgcolor == NULL) { sixel_helper_set_additional_message( - "parse_x_colorspec: allocator->fn_malloc() failed."); + "parse_x_colorspec: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -116,7 +115,7 @@ parse_x_colorspec( p = buf = arg_strdup(s + 4, allocator); if (buf == NULL) { sixel_helper_set_additional_message( - "parse_x_colorspec: allocator->fn_malloc() failed."); + "parse_x_colorspec: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -157,10 +156,10 @@ parse_x_colorspec( status = SIXEL_BAD_ARGUMENT; goto end; } - *bgcolor = (unsigned char *)allocator->fn_malloc(3); + *bgcolor = (unsigned char *)sixel_allocator_malloc(allocator, 3); if (*bgcolor == NULL) { sixel_helper_set_additional_message( - "parse_x_colorspec: allocator->fn_malloc() failed."); + "parse_x_colorspec: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -171,7 +170,7 @@ parse_x_colorspec( buf = arg_strdup(s + 1, allocator); if (buf == NULL) { sixel_helper_set_additional_message( - "parse_x_colorspec: allocator->fn_malloc() failed."); + "parse_x_colorspec: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -193,8 +192,10 @@ parse_x_colorspec( status = SIXEL_BAD_ARGUMENT; goto end; } - *bgcolor = (unsigned char *)allocator->fn_malloc(3); + *bgcolor = (unsigned char *)sixel_allocator_malloc(allocator, 3); if (*bgcolor == NULL) { + sixel_helper_set_additional_message( + "parse_x_colorspec: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -230,7 +231,7 @@ parse_x_colorspec( status = SIXEL_OK; end: - allocator->fn_free(buf); + sixel_allocator_free(allocator, buf); return status; } @@ -711,10 +712,10 @@ output_sixel_without_macro( goto end; } - p = (unsigned char *)encoder->allocator->fn_malloc(width * height * depth); + p = (unsigned char *)sixel_allocator_malloc(encoder->allocator, width * height * depth); if (p == NULL) { sixel_helper_set_additional_message( - "output_sixel_without_macro: allocator->fn_malloc() failed."); + "output_sixel_without_macro: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -749,7 +750,7 @@ output_sixel_without_macro( } end: - encoder->allocator->fn_free(p); + sixel_allocator_free(encoder->allocator, p); return status; } @@ -1246,10 +1247,10 @@ sixel_encoder_new( } *ppencoder - = (sixel_encoder_t *)allocator->fn_malloc(sizeof(sixel_encoder_t)); + = (sixel_encoder_t *)sixel_allocator_malloc(allocator, sizeof(sixel_encoder_t)); if (*ppencoder == NULL) { sixel_helper_set_additional_message( - "sixel_encoder_new: allocator->fn_malloc() failed."); + "sixel_encoder_new: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -1339,15 +1340,15 @@ static void sixel_encoder_destroy(sixel_encoder_t *encoder) { if (encoder) { - encoder->allocator->fn_free(encoder->mapfile); - encoder->allocator->fn_free(encoder->bgcolor); + sixel_allocator_free(encoder->allocator, encoder->mapfile); + sixel_allocator_free(encoder->allocator, encoder->bgcolor); sixel_dither_unref(encoder->dither_cache); if (encoder->outfd && encoder->outfd != STDOUT_FILENO && encoder->outfd != STDERR_FILENO) { close(encoder->outfd); } - encoder->allocator->fn_free(encoder); + sixel_allocator_free(encoder->allocator, encoder); sixel_allocator_unref(encoder->allocator); } } @@ -1424,12 +1425,12 @@ sixel_encoder_setopt( break; case SIXEL_OPTFLAG_MAPFILE: /* m */ if (encoder->mapfile) { - encoder->allocator->fn_free(encoder->mapfile); + sixel_allocator_free(encoder->allocator, encoder->mapfile); } encoder->mapfile = arg_strdup(optarg, encoder->allocator); if (encoder->mapfile == NULL) { sixel_helper_set_additional_message( - "sixel_encoder_setopt: allocator->fn_malloc() failed."); + "sixel_encoder_setopt: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -1661,7 +1662,7 @@ sixel_encoder_setopt( case SIXEL_OPTFLAG_BGCOLOR: /* B */ /* parse --bgcolor option */ if (encoder->bgcolor) { - encoder->allocator->fn_free(encoder->bgcolor); + sixel_allocator_free(encoder->allocator, encoder->bgcolor); } status = parse_x_colorspec(&encoder->bgcolor, optarg, @@ -1960,6 +1961,7 @@ test2(void) SIXELSTATUS status; sixel_encoder_t *encoder = NULL; sixel_frame_t *frame = NULL; + unsigned char *buffer; #if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS # pragma GCC diagnostic push @@ -1978,8 +1980,12 @@ test2(void) goto error; } + buffer = (unsigned char *)sixel_allocator_malloc(encoder->allocator, 3); + if (buffer == NULL) { + goto error; + } status = sixel_frame_init(frame, - (unsigned char *)encoder->allocator->fn_malloc(3), + buffer, 1, 1, SIXEL_PIXELFORMAT_RGB888, From ba3546e5f6418df459f3fbc396ff8fe2eeb13ef4 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Thu, 23 Jul 2015 11:57:21 +0900 Subject: [PATCH 414/451] Fix memory access violation issue --- include/sixel.h.in | 2 +- src/allocator.c | 4 +++- src/encoder.c | 11 +++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index f705481a..a3dc5f46 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -569,7 +569,7 @@ sixel_output_set_penetrate_multiplexer( int /* in */ penetrate); /* 0: penetrate GNU Screen 1: do not penetrate GNU Screen */ -/* set whether we emit DCS envelope */ +/* set whether we skip DCS envelope */ SIXELAPI void sixel_output_set_skip_dcs_envelope( sixel_output_t /* in */ *output, /* output context */ diff --git a/src/allocator.c b/src/allocator.c index e28c9777..81bba3a4 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -101,7 +101,9 @@ sixel_allocator_destroy( sixel_allocator_t /* in */ *allocator) /* allocator object to be destroyed */ { - allocator->fn_free(allocator); + sixel_free_t fn_free = allocator->fn_free; + + fn_free(allocator); } diff --git a/src/encoder.c b/src/encoder.c index 8a6f3fbe..70dfc2ab 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1339,17 +1339,20 @@ sixel_encoder_create(void) static void sixel_encoder_destroy(sixel_encoder_t *encoder) { + sixel_allocator_t *allocator; + if (encoder) { - sixel_allocator_free(encoder->allocator, encoder->mapfile); - sixel_allocator_free(encoder->allocator, encoder->bgcolor); + allocator = encoder->allocator; + sixel_allocator_free(allocator, encoder->mapfile); + sixel_allocator_free(allocator, encoder->bgcolor); sixel_dither_unref(encoder->dither_cache); if (encoder->outfd && encoder->outfd != STDOUT_FILENO && encoder->outfd != STDERR_FILENO) { close(encoder->outfd); } - sixel_allocator_free(encoder->allocator, encoder); - sixel_allocator_unref(encoder->allocator); + sixel_allocator_free(allocator, encoder); + sixel_allocator_unref(allocator); } } From 261e5f430002a8796c3b99c8f33bb7ed42bfaf1d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Jul 2015 22:48:26 +0900 Subject: [PATCH 415/451] Minor fixes --- src/encoder.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/encoder.c b/src/encoder.c index 70dfc2ab..dbc0abf7 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -237,6 +237,7 @@ parse_x_colorspec( } +/* generic writer function for passing to sixel_output_create() */ static int sixel_write_callback(char *data, int size, void *priv) { @@ -244,8 +245,12 @@ sixel_write_callback(char *data, int size, void *priv) } +/* the writer function with hex-encoding for passing to sixel_output_create() */ static int -sixel_hex_write_callback(char *data, int size, void *priv) +sixel_hex_write_callback( + char /* in */ *data, + int /* in */ size, + void /* in */ *priv) { char hex[SIXEL_OUTPUT_PACKET_SIZE * 2]; int i; @@ -262,8 +267,11 @@ sixel_hex_write_callback(char *data, int size, void *priv) } +/* returns monochrome dithering context object */ static SIXELSTATUS -prepare_monochrome_palette(sixel_dither_t **dither, int finvert) +prepare_monochrome_palette( + sixel_dither_t /* out */ **dither, + int /* in */ finvert) { SIXELSTATUS status = SIXEL_FALSE; @@ -284,6 +292,7 @@ prepare_monochrome_palette(sixel_dither_t **dither, int finvert) } +/* returns dithering context object with specified builtin palette */ static SIXELSTATUS prepare_builtin_palette( sixel_dither_t /* out */ **dither, From 6b2c0954779a129f2290f01f83f9bc309bd04328 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 25 Jul 2015 22:52:24 +0900 Subject: [PATCH 416/451] Additional test for encoder.c --- src/encoder.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/encoder.c b/src/encoder.c index dbc0abf7..8203065b 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -2080,6 +2080,35 @@ test4(void) } +static int +test5(void) +{ + int nret = EXIT_FAILURE; + sixel_encoder_t *encoder = NULL; + sixel_allocator_t *allocator = NULL; + SIXELSTATUS status; + + status = sixel_allocator_new(&allocator, malloc, realloc, free); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_encoder_new(&encoder, allocator); + if (SIXEL_FAILED(status)) { + goto error; + } + + sixel_encoder_ref(encoder); + sixel_encoder_unref(encoder); + nret = EXIT_SUCCESS; + +error: + sixel_encoder_unref(encoder); + return nret; +} + + + int sixel_encoder_tests_main(void) { @@ -2091,7 +2120,8 @@ sixel_encoder_tests_main(void) test1, test2, test3, - test4 + test4, + test5 }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From ae25872a750ea649fa30c624c084164d87f62501 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 28 Jul 2015 00:45:13 +0900 Subject: [PATCH 417/451] Introduce sixel_decoder_new(), the constructor of decoder with custom allocator --- converters/sixel2png.c | 5 ++- include/sixel.h.in | 7 +++- src/decoder.c | 78 +++++++++++++++++++++++++++++++----------- src/decoder.h | 3 ++ 4 files changed, 69 insertions(+), 24 deletions(-) diff --git a/converters/sixel2png.c b/converters/sixel2png.c index 7d7b5561..32e47060 100644 --- a/converters/sixel2png.c +++ b/converters/sixel2png.c @@ -120,9 +120,8 @@ main(int argc, char *argv[]) {0, 0, 0, 0} }; - decoder = sixel_decoder_create(); - if (decoder == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_decoder_new(&decoder, NULL); + if (SIXEL_FAILED(status)) { goto end; } diff --git a/include/sixel.h.in b/include/sixel.h.in index a3dc5f46..287b650f 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -1000,7 +1000,12 @@ extern "C" { #endif /* create decoder object */ -SIXELAPI sixel_decoder_t * +SIXELAPI SIXELSTATUS +sixel_decoder_new( + sixel_decoder_t /* out */ **ppdecoder, /* decoder object to be created */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ +SIXELAPI @attr_func_deprecated@ sixel_decoder_t * sixel_decoder_create(void); SIXELAPI void diff --git a/src/decoder.c b/src/decoder.c index 5ecdbbe5..146f6abe 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -60,16 +60,19 @@ # include #endif -#include #include "decoder.h" +#include "allocator.h" static char * -arg_strdup(char const *s) +strdup_with_allocator( + char const /* in */ *s, /* source buffer */ + sixel_allocator_t /* in */ *allocator) /* allocator object for + destination buffer */ { char *p; - p = malloc(strlen(s) + 1); + p = (char *)sixel_allocator_malloc(allocator, strlen(s) + 1); if (p) { strcpy(p, s); } @@ -78,22 +81,56 @@ arg_strdup(char const *s) /* create decoder object */ -SIXELAPI sixel_decoder_t * -sixel_decoder_create(void) +SIXELAPI SIXELSTATUS +sixel_decoder_new( + sixel_decoder_t /* out */ **ppdecoder, /* decoder object to be created */ + sixel_allocator_t /* in */ *allocator) /* allocator, null if you use + default allocator */ { - sixel_decoder_t *decoder; - - decoder = malloc(sizeof(sixel_decoder_t)); - if (decoder != NULL) { - decoder->ref = 1; - decoder->output = arg_strdup("-"); - decoder->input = arg_strdup("-"); - if (decoder->output == NULL || decoder->input == NULL) { - free(decoder); - return NULL; + SIXELSTATUS status = SIXEL_FALSE; + + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, malloc, realloc, free); + if (SIXEL_FAILED(status)) { + goto end; } } + *ppdecoder = sixel_allocator_malloc(allocator, sizeof(sixel_decoder_t)); + if (*ppdecoder == NULL) { + goto end; + } + + (*ppdecoder)->ref = 1; + (*ppdecoder)->output = strdup_with_allocator("-", allocator); + (*ppdecoder)->input = strdup_with_allocator("-", allocator); + (*ppdecoder)->allocator = allocator; + + if ((*ppdecoder)->output == NULL || (*ppdecoder)->input == NULL) { + sixel_decoder_unref(*ppdecoder); + sixel_helper_set_additional_message( + "sixel_decoder_new: strdup_with_allocator() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + +end: + return status; +} + + +SIXELAPI /* deprecated */ sixel_decoder_t * +sixel_decoder_create(void) +{ + SIXELSTATUS status = SIXEL_FALSE; + sixel_decoder_t *decoder = NULL; + + status = sixel_decoder_new(&decoder, NULL); + if (SIXEL_FAILED(status)) { + goto end; + } + +end: return decoder; } @@ -139,7 +176,7 @@ sixel_decoder_setopt( switch(arg) { case 'i': free(decoder->input); - decoder->input = arg_strdup(optarg); + decoder->input = strdup_with_allocator(optarg, decoder->allocator); if (decoder->input == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -147,7 +184,7 @@ sixel_decoder_setopt( break; case 'o': free(decoder->output); - decoder->output = arg_strdup(optarg); + decoder->output = strdup_with_allocator(optarg, decoder->allocator); if (decoder->input == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -208,7 +245,7 @@ sixel_decoder_decode( raw_len = 0; max = 64 * 1024; - if ((raw_data = (unsigned char *)malloc(max)) == NULL) { + if ((raw_data = (unsigned char *)sixel_allocator_malloc(decoder->allocator, max)) == NULL) { status = SIXEL_BAD_ALLOCATION; if (sprintf(buffer, "malloc(%d) failed.", max) != EOF) { sixel_helper_set_additional_message(buffer); @@ -237,7 +274,8 @@ sixel_decoder_decode( } status = sixel_decode(raw_data, raw_len, &indexed_pixels, - &sx, &sy, &palette, &ncolors, malloc); + &sx, &sy, &palette, &ncolors, + decoder->allocator->fn_malloc); if (SIXEL_FAILED(status)) { goto end; @@ -253,7 +291,7 @@ sixel_decoder_decode( } end: - free(pixels); + sixel_allocator_free(decoder->allocator, pixels); return status; } diff --git a/src/decoder.h b/src/decoder.h index 9d3fb87c..87f227cf 100644 --- a/src/decoder.h +++ b/src/decoder.h @@ -22,11 +22,14 @@ #ifndef LIBSIXEL_DECODER_H #define LIBSIXEL_DECODER_H +#include + /* encode settings object */ struct sixel_decoder { unsigned int ref; char *input; char *output; + sixel_allocator_t *allocator; }; #endif /* LIBSIXEL_DECODER_H */ From 11ed745f658ef370ae3b83f18c13c9fd8b0444b1 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 28 Jul 2015 01:00:36 +0900 Subject: [PATCH 418/451] Use sixel_encoder_new() in img2sixel --- converters/img2sixel.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index e7482cc7..f904a822 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -51,6 +51,7 @@ #include +/* output version info to STDOUT */ static void show_version(void) { @@ -77,6 +78,7 @@ void show_version(void) } +/* output help messages to STDOUT */ static void show_help(void) { @@ -300,18 +302,8 @@ main(int argc, char *argv[]) int long_opt; int option_index; #endif /* HAVE_GETOPT_LONG */ - sixel_encoder_t *encoder; + sixel_encoder_t *encoder = NULL; char const *optstring = "o:78p:m:eb:Id:f:s:c:w:h:r:q:kil:t:ugvSn:PE:B:C:DVH"; - -#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - encoder = sixel_encoder_create(); -#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS -# pragma GCC diagnostic pop -#endif - #if HAVE_GETOPT_LONG struct option long_options[] = { {"outfile", no_argument, &long_opt, 'o'}, @@ -350,6 +342,11 @@ main(int argc, char *argv[]) }; #endif /* HAVE_GETOPT_LONG */ + status = sixel_encoder_new(&encoder, NULL); + if (SIXEL_FAILED(status)) { + goto error; + } + for (;;) { #if HAVE_GETOPT_LONG From e4f9a1669b90fa04f4805799261695a3859dedb5 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 28 Jul 2015 01:20:14 +0900 Subject: [PATCH 419/451] Minor fixes around chunk.c --- src/chunk.c | 81 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/src/chunk.c b/src/chunk.c index b473eec5..440a6232 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -78,7 +78,7 @@ sixel_chunk_init( pchunk->max_size = initial_size; pchunk->size = 0; pchunk->buffer - = (unsigned char *)pchunk->allocator->fn_malloc(pchunk->max_size); + = (unsigned char *)sixel_allocator_malloc(pchunk->allocator, pchunk->max_size); if (pchunk->buffer == NULL) { sixel_helper_set_additional_message( @@ -96,40 +96,45 @@ sixel_chunk_init( # ifdef HAVE_LIBCURL static size_t -memory_write(void *ptr, - size_t size, - size_t len, - void *memory) +memory_write(void /* in */ *ptr, + size_t /* in */ size, + size_t /* in */ len, + void /* in */ *memory) { - size_t nbytes; + size_t nbytes = 0; sixel_chunk_t *chunk; if (ptr == NULL || memory == NULL) { - return 0; - } - nbytes = size * len; - if (nbytes == 0) { - return 0; + goto end; } chunk = (sixel_chunk_t *)memory; if (chunk->buffer == NULL) { - return 0; + goto end; + } + + nbytes = size * len; + if (nbytes == 0) { + goto end; } if (chunk->max_size <= chunk->size + nbytes) { do { chunk->max_size *= 2; } while (chunk->max_size <= chunk->size + nbytes); - chunk->buffer = (unsigned char*)realloc(chunk->buffer, chunk->max_size); + chunk->buffer = (unsigned char*)sixel_allocator_realloc(chunk->allocator, + chunk->buffer, + chunk->max_size); if (chunk->buffer == NULL) { - return 0; + nbytes = 0; + goto end; } } memcpy(chunk->buffer + chunk->size, ptr, nbytes); chunk->size += nbytes; +end: return nbytes; } # endif @@ -243,8 +248,9 @@ sixel_chunk_from_file( for (;;) { if (pchunk->max_size - pchunk->size < 4096) { pchunk->max_size *= 2; - pchunk->buffer = (unsigned char *)realloc(pchunk->buffer, - pchunk->max_size); + pchunk->buffer = (unsigned char *)sixel_allocator_realloc(pchunk->allocator, + pchunk->buffer, + pchunk->max_size); if (pchunk->buffer == NULL) { sixel_helper_set_additional_message( "sixel_chunk_from_file: realloc() failed."); @@ -348,10 +354,24 @@ sixel_chunk_new( { SIXELSTATUS status = SIXEL_FALSE; - *ppchunk = (sixel_chunk_t *)allocator->fn_malloc(sizeof(sixel_chunk_t)); + if (ppchunk == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_new: ppchunk is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + if (allocator == NULL) { + sixel_helper_set_additional_message( + "sixel_chunk_new: allocator is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + *ppchunk = (sixel_chunk_t *)sixel_allocator_malloc(allocator, sizeof(sixel_chunk_t)); if (*ppchunk == NULL) { sixel_helper_set_additional_message( - "sixel_chunk_new: malloc() failed."); + "sixel_chunk_new: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -429,6 +449,30 @@ test1(void) } +static int +test2(void) +{ + int nret = EXIT_FAILURE; + sixel_chunk_t *chunk; + SIXELSTATUS status = SIXEL_FALSE; + + status = sixel_chunk_new(&chunk, NULL, 0, NULL, NULL); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + status = sixel_chunk_new(NULL, NULL, 0, NULL, NULL); + if (status != SIXEL_BAD_ARGUMENT) { + goto error; + } + + nret = EXIT_SUCCESS; + +error: + return nret; +} + + int sixel_chunk_tests_main(void) { @@ -438,6 +482,7 @@ sixel_chunk_tests_main(void) static testcase const testcases[] = { test1, + test2, }; for (i = 0; i < sizeof(testcases) / sizeof(testcase); ++i) { From c4db879e6b087fa6d56bbdeef3364a732c7d0f23 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Jul 2015 00:29:16 +0900 Subject: [PATCH 420/451] Use allocator in loader.c --- src/loader.c | 95 ++++++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/src/loader.c b/src/loader.c index 45bd80fe..70d7402d 100644 --- a/src/loader.c +++ b/src/loader.c @@ -73,6 +73,7 @@ #include "chunk.h" #include "frompnm.h" #include "fromgif.h" +#include "allocator.h" #define STBI_NO_STDIO 1 #define STB_IMAGE_IMPLEMENTATION 1 @@ -87,7 +88,8 @@ load_jpeg(unsigned char **result, int datasize, int *pwidth, int *pheight, - int *ppixelformat) + int *ppixelformat, + sixel_allocator_t *allocator) { SIXELSTATUS status = SIXEL_JPEG_ERROR; int row_stride, size; @@ -118,11 +120,11 @@ load_jpeg(unsigned char **result, *pheight = cinfo.output_height; size = *pwidth * *pheight * cinfo.output_components; - *result = (unsigned char *)malloc(size); + *result = (unsigned char *)sixel_allocator_malloc(allocator, size); if (*result == NULL) { status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( - "load_jpeg: malloc() failed."); + "load_jpeg: sixel_allocator_malloc() failed."); goto end; } row_stride = cinfo.output_width * cinfo.output_components; @@ -199,17 +201,18 @@ read_palette(png_structp png_ptr, static SIXELSTATUS -load_png(unsigned char **result, - unsigned char *buffer, - int size, - int *psx, - int *psy, - unsigned char **ppalette, - int *pncolors, - int reqcolors, - int *pixelformat, - unsigned char *bgcolor, - int *transparent) +load_png(unsigned char /* out */ **result, + unsigned char /* in */ *buffer, + int /* in */ size, + int /* out */ *psx, + int /* out */ *psy, + unsigned char /* out */ **ppalette, + int /* out */ *pncolors, + int /* in */ reqcolors, + int /* out */ *pixelformat, + unsigned char /* out */ *bgcolor, + int /* out */ *transparent, + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; sixel_chunk_t read_chunk; @@ -301,7 +304,7 @@ load_png(unsigned char **result, } else { switch (bitdepth) { case 1: - *ppalette = (unsigned char *)malloc(*pncolors * 3); + *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -311,7 +314,7 @@ load_png(unsigned char **result, *pixelformat = SIXEL_PIXELFORMAT_PAL1; break; case 2: - *ppalette = (unsigned char *)malloc(*pncolors * 3); + *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -321,7 +324,7 @@ load_png(unsigned char **result, *pixelformat = SIXEL_PIXELFORMAT_PAL2; break; case 4: - *ppalette = (unsigned char *)malloc(*pncolors * 3); + *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -331,7 +334,7 @@ load_png(unsigned char **result, *pixelformat = SIXEL_PIXELFORMAT_PAL4; break; case 8: - *ppalette = (unsigned char *)malloc(*pncolors * 3); + *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -460,12 +463,12 @@ load_png(unsigned char **result, goto cleanup; } depth = sixel_helper_compute_depth(*pixelformat); - *result = (unsigned char *)malloc(*psx * *psy * depth); + *result = (unsigned char *)sixel_allocator_malloc(allocator, *psx * *psy * depth); if (*result == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; } - rows = (unsigned char **)malloc(*psy * sizeof(unsigned char *)); + rows = (unsigned char **)sixel_allocator_malloc(allocator, *psy * sizeof(unsigned char *)); if (rows == NULL) { status = SIXEL_BAD_ALLOCATION; goto cleanup; @@ -486,7 +489,7 @@ load_png(unsigned char **result, } #if USE_SETJMP && HAVE_SETJMP if (setjmp(png_jmpbuf(png_ptr))) { - free(*result); + sixel_allocator_free(allocator, *result); *result = NULL; status = SIXEL_PNG_ERROR; goto cleanup; @@ -498,7 +501,7 @@ load_png(unsigned char **result, cleanup: png_destroy_read_struct(&png_ptr, &info_ptr,(png_infopp)0); - free(rows); + sixel_allocator_free(allocator, rows); return status; } @@ -506,15 +509,16 @@ load_png(unsigned char **result, static SIXELSTATUS -load_sixel(unsigned char **result, - unsigned char *buffer, - int size, - int *psx, - int *psy, - unsigned char **ppalette, - int *pncolors, - int reqcolors, - int *ppixelformat) +load_sixel(unsigned char /* out */ **result, + unsigned char /* in */ *buffer, + int /* in */ size, + int /* out */ *psx, + int /* out */ *psy, + unsigned char /* out */ **ppalette, + int /* out */ *pncolors, + int /* in */ reqcolors, + int /* out */ *ppixelformat, + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; unsigned char *p = NULL; @@ -525,13 +529,13 @@ load_sixel(unsigned char **result, /* sixel */ status = sixel_decode(buffer, size, &p, psx, psy, - &palette, &colors, malloc); + &palette, &colors, allocator->fn_malloc); if (SIXEL_FAILED(status)) { goto end; } if (ppalette == NULL || colors > reqcolors) { *ppixelformat = SIXEL_PIXELFORMAT_RGB888; - *result = (unsigned char *)malloc(*psx * *psy * 3); + *result = (unsigned char *)sixel_allocator_malloc(allocator, *psx * *psy * 3); if (*result == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -551,8 +555,8 @@ load_sixel(unsigned char **result, } end: - free(palette); - free(p); + sixel_allocator_free(allocator, palette); + sixel_allocator_free(allocator, p); return status; } @@ -691,7 +695,8 @@ load_with_builtin( fuse_palette ? &frame->palette: NULL, &frame->ncolors, reqcolors, - &frame->pixelformat); + &frame->pixelformat, + pchunk->allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -727,7 +732,8 @@ load_with_builtin( pchunk->size, &frame->width, &frame->height, - &frame->pixelformat); + &frame->pixelformat, + pchunk->allocator); if (SIXEL_FAILED(status)) { goto end; @@ -752,7 +758,8 @@ load_with_builtin( reqcolors, &frame->pixelformat, bgcolor, - &frame->transparent); + &frame->transparent, + pchunk->allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -877,7 +884,7 @@ load_with_gdkpixbuf( frame->width = gdk_pixbuf_get_width(pixbuf); frame->height = gdk_pixbuf_get_height(pixbuf); stride = gdk_pixbuf_get_rowstride(pixbuf); - frame->pixels = malloc(frame->height * stride); + frame->pixels = sixel_allocator_malloc(pchunk->allocator, frame->height * stride); if (frame->pixels == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -922,7 +929,7 @@ load_with_gdkpixbuf( frame->width = gdk_pixbuf_get_width(pixbuf); frame->height = gdk_pixbuf_get_height(pixbuf); stride = gdk_pixbuf_get_rowstride(pixbuf); - frame->pixels = malloc(frame->height * stride); + frame->pixels = sixel_allocator_malloc(pchunk->allocator, frame->height * stride); if (frame->pixels == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -971,9 +978,9 @@ load_with_gdkpixbuf( end: gdk_pixbuf_loader_close(loader, NULL); g_object_unref(loader); - free(frame->pixels); - free(frame->palette); - free(frame); + sixel_allocator_free(pchunk->allocator, frame->pixels); + sixel_allocator_free(pchunk->allocator, frame->palette); + sixel_allocator_free(pchunk->allocator, frame); return status; @@ -1150,7 +1157,7 @@ load_with_gd( frame->width = gdImageSX(im); frame->height = gdImageSY(im); frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; - p = frame->pixels = malloc(frame->width * frame->height * 3); + p = frame->pixels = sixel_allocator_malloc(pchunk->allocator, frame->width * frame->height * 3); if (frame->pixels == NULL) { status = SIXEL_BAD_ALLOCATION; gdImageDestroy(im); From 5d8af834943e5783526b6cebd8012b48e1f44197 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Jul 2015 01:21:19 +0900 Subject: [PATCH 421/451] Use allocator in frame.c --- include/sixel.h.in | 27 ++++--- src/decoder.c | 2 +- src/frame.c | 171 +++++++++++++++++++++++++++++++++------------ src/frame.h | 27 +++---- 4 files changed, 158 insertions(+), 69 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 287b650f..4c129c1d 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -820,28 +820,33 @@ typedef struct sixel_frame sixel_frame_t; extern "C" { #endif -/* create frame object */ +/* constructor of frame object */ +SIXELAPI SIXELSTATUS +sixel_frame_new( + sixel_frame_t /* out */ **ppframe, /* frame object to be created */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ + sixel_frame_t * sixel_frame_create(void); -SIXELAPI unsigned char * -sixel_frame_get_pixels(sixel_frame_t /* in */ *frame); - SIXELAPI void sixel_frame_ref(sixel_frame_t /* in */ *frame); SIXELAPI void sixel_frame_unref(sixel_frame_t /* in */ *frame); +/* initialize frame object with a pixel buffer */ SIXELAPI SIXELSTATUS sixel_frame_init( - sixel_frame_t /* in */ *frame, - unsigned char /* in */ *pixels, - int /* in */ width, - int /* in */ height, - int /* in */ pixelformat, - unsigned char /* in */ *palette, - int /* in */ ncolors); + sixel_frame_t /* in */ *frame, /* frame object to be initialize */ + unsigned char /* in */ *pixels, /* pixel buffer */ + int /* in */ width, /* pixel width of buffer */ + int /* in */ height, /* pixel height of buffer */ + int /* in */ pixelformat, /* pixelformat of buffer */ + unsigned char /* in */ *palette, /* palette for buffer or NULL */ + int /* in */ ncolors /* number of palette colors or (-1) */ +); /* get pixels */ SIXELAPI unsigned char * diff --git a/src/decoder.c b/src/decoder.c index 146f6abe..d9cd7212 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -84,7 +84,7 @@ strdup_with_allocator( SIXELAPI SIXELSTATUS sixel_decoder_new( sixel_decoder_t /* out */ **ppdecoder, /* decoder object to be created */ - sixel_allocator_t /* in */ *allocator) /* allocator, null if you use + sixel_allocator_t /* in */ *allocator) /* allocator, null if you use default allocator */ { SIXELSTATUS status = SIXEL_FALSE; diff --git a/src/frame.c b/src/frame.c index 95a30f63..987ffacb 100644 --- a/src/frame.c +++ b/src/frame.c @@ -34,43 +34,82 @@ # include #endif -#include #include "frame.h" +/* constructor of frame object */ +SIXELAPI SIXELSTATUS +sixel_frame_new( + sixel_frame_t /* out */ **ppframe, /* frame object to be created */ + sixel_allocator_t /* in */ *allocator) /* allocator, null if you use + default allocator */ +{ + SIXELSTATUS status = SIXEL_FALSE; + + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, malloc, realloc, free); + if (SIXEL_FAILED(status)) { + goto end; + } + } + + *ppframe = (sixel_frame_t *)sixel_allocator_malloc(allocator, sizeof(sixel_frame_t)); + if (*ppframe == NULL) { + sixel_helper_set_additional_message( + "sixel_frame_resize: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + (*ppframe)->ref = 1; + (*ppframe)->pixels = NULL; + (*ppframe)->palette = NULL; + (*ppframe)->width = 0; + (*ppframe)->height = 0; + (*ppframe)->ncolors = (-1); + (*ppframe)->pixelformat = SIXEL_PIXELFORMAT_RGB888; + (*ppframe)->delay = 0; + (*ppframe)->frame_no = 0; + (*ppframe)->loop_count = 0; + (*ppframe)->multiframe = 0; + (*ppframe)->transparent = (-1); + (*ppframe)->allocator = allocator; + + sixel_allocator_ref(allocator); + + status = SIXEL_OK; + +end: + return status; +} + SIXELAPI sixel_frame_t * sixel_frame_create(void) { - sixel_frame_t *frame; + SIXELSTATUS status = SIXEL_FALSE; + sixel_frame_t *frame = NULL; - frame = (sixel_frame_t *)malloc(sizeof(sixel_frame_t)); - if (frame == NULL) { - return NULL; - } - frame->ref = 1; - frame->pixels = NULL; - frame->palette = NULL; - frame->width = 0; - frame->height = 0; - frame->ncolors = (-1); - frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; - frame->delay = 0; - frame->frame_no = 0; - frame->loop_count = 0; - frame->multiframe = 0; - frame->transparent = (-1); + status = sixel_frame_new(&frame, NULL); + if (SIXEL_FAILED(status)) { + goto end; + } +end: return frame; } -SIXELAPI void -sixel_frame_destroy(sixel_frame_t *frame) +static void +sixel_frame_destroy(sixel_frame_t /* in */ *frame) { + sixel_allocator_t *allocator = NULL; + if (frame) { - free(frame->pixels); - free(frame->palette); - free(frame); + allocator = frame->allocator; + sixel_allocator_free(allocator, frame->pixels); + sixel_allocator_free(allocator, frame->palette); + sixel_allocator_free(allocator, frame); + sixel_allocator_unref(allocator); } } @@ -93,17 +132,20 @@ sixel_frame_unref(sixel_frame_t *frame) } -SIXELAPI int +/* initialize frame object with a pixel buffer */ +SIXELAPI SIXELSTATUS sixel_frame_init( - sixel_frame_t *frame, - unsigned char *pixels, - int width, - int height, - int pixelformat, - unsigned char *palette, - int ncolors + sixel_frame_t /* in */ *frame, /* frame object to be initialize */ + unsigned char /* in */ *pixels, /* pixel buffer */ + int /* in */ width, /* pixel width of buffer */ + int /* in */ height, /* pixel height of buffer */ + int /* in */ pixelformat, /* pixelformat of buffer */ + unsigned char /* in */ *palette, /* palette for buffer or NULL */ + int /* in */ ncolors /* number of palette colors or (-1) */ ) { + sixel_frame_ref(frame); + frame->pixels = pixels; frame->width = width; frame->height = height; @@ -111,7 +153,9 @@ sixel_frame_init( frame->palette = palette; frame->ncolors = ncolors; - return 0; + sixel_frame_unref(frame); + + return SIXEL_OK; } @@ -216,6 +260,8 @@ sixel_frame_strip_alpha( unsigned char *dst; unsigned char alpha; + sixel_frame_ref(frame); + src = dst = frame->pixels; switch (frame->pixelformat) { @@ -250,6 +296,8 @@ sixel_frame_strip_alpha( status = SIXEL_OK; + sixel_frame_unref(frame); + return status; } @@ -264,12 +312,20 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) unsigned char *src; unsigned char *p; + sixel_frame_ref(frame); + switch (frame->pixelformat) { case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: size = frame->width * frame->height * 4; - normalized_pixels = (unsigned char *)malloc(size); + normalized_pixels = (unsigned char *)sixel_allocator_malloc(frame->allocator, size); + if (normalized_pixels == NULL) { + sixel_helper_set_additional_message( + "sixel_frame_convert_to_rgb888: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } src = normalized_pixels + frame->width * frame->height * 3; dst = normalized_pixels; status = sixel_helper_normalize_pixelformat(src, @@ -279,7 +335,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) frame->width, frame->height); if (SIXEL_FAILED(status)) { - free(normalized_pixels); + sixel_allocator_free(frame->allocator, normalized_pixels); goto end; } for (p = src; dst < src; ++p) { @@ -287,13 +343,19 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) *dst++ = *(frame->palette + *p * 3 + 1); *dst++ = *(frame->palette + *p * 3 + 2); } - free(frame->pixels); + sixel_allocator_free(frame->allocator, frame->pixels); frame->pixels = normalized_pixels; frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; case SIXEL_PIXELFORMAT_PAL8: size = frame->width * frame->height * 3; - normalized_pixels = (unsigned char *)malloc(size); + normalized_pixels = (unsigned char *)sixel_allocator_malloc(frame->allocator, size); + if (normalized_pixels == NULL) { + sixel_helper_set_additional_message( + "sixel_frame_convert_to_rgb888: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } src = frame->pixels; dst = normalized_pixels; for (; dst != normalized_pixels + size; ++src) { @@ -301,7 +363,7 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) *dst++ = frame->palette[*src * 3 + 1]; *dst++ = frame->palette[*src * 3 + 2]; } - free(frame->pixels); + sixel_allocator_free(frame->allocator, frame->pixels); frame->pixels = normalized_pixels; frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; break; @@ -318,7 +380,13 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) case SIXEL_PIXELFORMAT_ARGB8888: /* normalize pixelformat */ size = frame->width * frame->height * 3; - normalized_pixels = (unsigned char *)malloc(size); + normalized_pixels = (unsigned char *)sixel_allocator_malloc(frame->allocator, size); + if (normalized_pixels == NULL) { + sixel_helper_set_additional_message( + "sixel_frame_convert_to_rgb888: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } status = sixel_helper_normalize_pixelformat(normalized_pixels, &frame->pixelformat, frame->pixels, @@ -326,10 +394,10 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) frame->width, frame->height); if (SIXEL_FAILED(status)) { - free(normalized_pixels); + sixel_allocator_free(frame->allocator, normalized_pixels); goto end; } - free(frame->pixels); + sixel_allocator_free(frame->allocator, frame->pixels); frame->pixels = normalized_pixels; break; default: @@ -342,6 +410,8 @@ sixel_frame_convert_to_rgb888(sixel_frame_t /*in */ *frame) status = SIXEL_OK; end: + sixel_frame_unref(frame); + return status; } @@ -358,14 +428,18 @@ sixel_frame_resize( int size; unsigned char *scaled_frame = NULL; + sixel_frame_ref(frame); + status = sixel_frame_convert_to_rgb888(frame); if (SIXEL_FAILED(status)) { goto end; } size = width * height * 3; - scaled_frame = (unsigned char *)malloc(size); + scaled_frame = (unsigned char *)sixel_allocator_malloc(frame->allocator, size); if (scaled_frame == NULL) { + sixel_helper_set_additional_message( + "sixel_frame_resize: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -379,7 +453,7 @@ sixel_frame_resize( if (SIXEL_FAILED(status)) { goto end; } - free(frame->pixels); + sixel_allocator_free(frame->allocator, frame->pixels); frame->pixels = scaled_frame; frame->width = width; frame->height = height; @@ -387,6 +461,8 @@ sixel_frame_resize( status = SIXEL_OK; end: + sixel_frame_unref(frame); + return status; } @@ -470,6 +546,8 @@ sixel_frame_clip( SIXELSTATUS status = SIXEL_FALSE; unsigned char *normalized_pixels; + sixel_frame_ref(frame); + switch (frame->pixelformat) { case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: @@ -477,7 +555,8 @@ sixel_frame_clip( case SIXEL_PIXELFORMAT_G1: case SIXEL_PIXELFORMAT_G2: case SIXEL_PIXELFORMAT_G4: - normalized_pixels = (unsigned char *)malloc(frame->width * frame->height); + normalized_pixels = (unsigned char *)sixel_allocator_malloc(frame->allocator, + frame->width * frame->height); status = sixel_helper_normalize_pixelformat(normalized_pixels, &frame->pixelformat, frame->pixels, @@ -485,10 +564,10 @@ sixel_frame_clip( frame->width, frame->height); if (SIXEL_FAILED(status)) { - free(normalized_pixels); + sixel_allocator_free(frame->allocator, normalized_pixels); goto end; } - free(frame->pixels); + sixel_allocator_free(frame->allocator, frame->pixels); frame->pixels = normalized_pixels; break; default: @@ -512,6 +591,8 @@ sixel_frame_clip( status = SIXEL_OK; end: + sixel_frame_unref(frame); + return status; } diff --git a/src/frame.h b/src/frame.h index c34dd3e6..ad168f1d 100644 --- a/src/frame.h +++ b/src/frame.h @@ -22,20 +22,23 @@ #ifndef LIBSIXEL_FRAME_H #define LIBSIXEL_FRAME_H +#include + /* frame object */ struct sixel_frame { - unsigned int ref; /* reference counter */ - unsigned char *pixels; /* loaded pixel data */ - unsigned char *palette; /* loaded palette data */ - int width; /* frame width */ - int height; /* frame height */ - int ncolors; /* palette colors */ - int pixelformat; /* one of enum pixelFormat */ - int delay; /* delay in msec */ - int frame_no; /* frame number */ - int loop_count; /* loop count */ - int multiframe; /* whether the image has multiple frames */ - int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ + unsigned int ref; /* reference counter */ + unsigned char *pixels; /* loaded pixel data */ + unsigned char *palette; /* loaded palette data */ + int width; /* frame width */ + int height; /* frame height */ + int ncolors; /* palette colors */ + int pixelformat; /* one of enum pixelFormat */ + int delay; /* delay in msec */ + int frame_no; /* frame number */ + int loop_count; /* loop count */ + int multiframe; /* whether the image has multiple frames */ + int transparent; /* -1(no transparent) or >= 0(index of transparent color) */ + sixel_allocator_t *allocator; /* allocator object */ }; #ifdef __cplusplus From ac77392bf28234a30dbb9398f39f31dadb3ee347 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Jul 2015 01:41:03 +0900 Subject: [PATCH 422/451] Fix leaks around chunk object initialization --- src/chunk.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/chunk.c b/src/chunk.c index 440a6232..80ac4d50 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -94,6 +94,22 @@ sixel_chunk_init( } +void +sixel_chunk_destroy( + sixel_chunk_t * const /* in */ pchunk) +{ + sixel_allocator_t *allocator; + + if (pchunk) { + allocator = pchunk->allocator; + allocator->fn_free(pchunk->buffer); + pchunk->buffer = NULL; + allocator->fn_free(pchunk); + sixel_allocator_unref(allocator); + } +} + + # ifdef HAVE_LIBCURL static size_t memory_write(void /* in */ *ptr, @@ -381,15 +397,19 @@ sixel_chunk_new( status = sixel_chunk_init(*ppchunk, 1024 * 32); if (SIXEL_FAILED(status)) { + sixel_allocator_free(allocator, *ppchunk); goto end; } + sixel_allocator_ref(allocator); + if (filename != NULL && strstr(filename, "://")) { status = sixel_chunk_from_url(filename, *ppchunk, finsecure); } else { status = sixel_chunk_from_file(filename, *ppchunk, cancel_flag); } if (SIXEL_FAILED(status)) { + sixel_chunk_destroy(*ppchunk); goto end; } @@ -400,18 +420,6 @@ sixel_chunk_new( } -void -sixel_chunk_destroy( - sixel_chunk_t * const /* in */ pchunk) -{ - if (pchunk) { - pchunk->allocator->fn_free(pchunk->buffer); - pchunk->buffer = NULL; - pchunk->allocator->fn_free(pchunk); - } -} - - #if HAVE_TESTS static int test1(void) From 31c1fb23b16539509721f63e04ca2800ca893b4a Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Jul 2015 02:11:48 +0900 Subject: [PATCH 423/451] Fix leaks and segmentation faults --- src/chunk.c | 7 ++++--- src/decoder.c | 26 ++++++++++++++++++++++---- src/encoder.c | 12 +++++++++++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/chunk.c b/src/chunk.c index 80ac4d50..dadc84d8 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -102,9 +102,8 @@ sixel_chunk_destroy( if (pchunk) { allocator = pchunk->allocator; - allocator->fn_free(pchunk->buffer); - pchunk->buffer = NULL; - allocator->fn_free(pchunk); + sixel_allocator_free(allocator, pchunk->buffer); + sixel_allocator_free(allocator, pchunk); sixel_allocator_unref(allocator); } } @@ -398,6 +397,7 @@ sixel_chunk_new( status = sixel_chunk_init(*ppchunk, 1024 * 32); if (SIXEL_FAILED(status)) { sixel_allocator_free(allocator, *ppchunk); + *ppchunk = NULL; goto end; } @@ -410,6 +410,7 @@ sixel_chunk_new( } if (SIXEL_FAILED(status)) { sixel_chunk_destroy(*ppchunk); + *ppchunk = NULL; goto end; } diff --git a/src/decoder.c b/src/decoder.c index d9cd7212..09b09110 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -94,10 +94,13 @@ sixel_decoder_new( if (SIXEL_FAILED(status)) { goto end; } + } else { + sixel_allocator_ref(allocator); } *ppdecoder = sixel_allocator_malloc(allocator, sizeof(sixel_decoder_t)); if (*ppdecoder == NULL) { + sixel_allocator_unref(allocator); goto end; } @@ -108,9 +111,11 @@ sixel_decoder_new( if ((*ppdecoder)->output == NULL || (*ppdecoder)->input == NULL) { sixel_decoder_unref(*ppdecoder); + *ppdecoder = NULL; sixel_helper_set_additional_message( "sixel_decoder_new: strdup_with_allocator() failed."); status = SIXEL_BAD_ALLOCATION; + sixel_allocator_unref(allocator); goto end; } @@ -138,10 +143,14 @@ sixel_decoder_create(void) SIXELAPI void sixel_decoder_destroy(sixel_decoder_t *decoder) { + sixel_allocator_t *allocator; + if (decoder) { - free(decoder->input); - free(decoder->output); - free(decoder); + allocator = decoder->allocator; + sixel_allocator_free(allocator, decoder->input); + sixel_allocator_free(allocator, decoder->output); + sixel_allocator_free(allocator, decoder); + sixel_allocator_unref(allocator); } } @@ -173,6 +182,8 @@ sixel_decoder_setopt( { SIXELSTATUS status = SIXEL_FALSE; + sixel_decoder_ref(decoder); + switch(arg) { case 'i': free(decoder->input); @@ -199,6 +210,8 @@ sixel_decoder_setopt( status = SIXEL_OK; end: + sixel_decoder_unref(decoder); + return status; } @@ -221,6 +234,8 @@ sixel_decoder_decode( unsigned char *pixels = NULL; char buffer[1024]; + sixel_decoder_ref(decoder); + if (strcmp(decoder->input, "-") == 0) { /* for windows */ #if defined(O_BINARY) @@ -264,8 +279,9 @@ sixel_decoder_decode( goto end; } } - if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) + if ((n = fread(raw_data + raw_len, 1, 4096, input_fp)) <= 0) { break; + } raw_len += n; } @@ -292,6 +308,8 @@ sixel_decoder_decode( end: sixel_allocator_free(decoder->allocator, pixels); + sixel_decoder_ref(decoder); + return status; } diff --git a/src/encoder.c b/src/encoder.c index 8203065b..c204932b 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1261,6 +1261,7 @@ sixel_encoder_new( sixel_helper_set_additional_message( "sixel_encoder_new: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; + sixel_allocator_unref(allocator); goto end; } @@ -1308,8 +1309,11 @@ sixel_encoder_new( if (env_default_bgcolor) { status = parse_x_colorspec(&(*ppencoder)->bgcolor, env_default_bgcolor, - (*ppencoder)->allocator); + allocator); if (SIXEL_FAILED(status)) { + sixel_allocator_free(allocator, *ppencoder); + sixel_allocator_unref(allocator); + *ppencoder = NULL; goto end; } } @@ -1322,6 +1326,8 @@ sixel_encoder_new( } } + sixel_allocator_ref(allocator); + status = SIXEL_OK; end: @@ -1409,6 +1415,8 @@ sixel_encoder_setopt( int parsed; char unit[32]; + sixel_encoder_ref(encoder); + switch(arg) { case SIXEL_OPTFLAG_OUTFILE: /* o */ if (*optarg == '\0') { @@ -1831,6 +1839,8 @@ sixel_encoder_setopt( status = SIXEL_OK; end: + sixel_encoder_unref(encoder); + return status; } From 9fa027598cc3fe3b7c46cd85ad00fb1333a1c63e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Wed, 29 Jul 2015 21:58:07 +0900 Subject: [PATCH 424/451] Add more handlers for libcurl errors --- configure | 1 + configure.ac | 1 + src/chunk.c | 87 ++++++++++++++++++++++++++++++++++++++++------------ src/loader.c | 50 +++++++++++++----------------- 4 files changed, 92 insertions(+), 47 deletions(-) diff --git a/configure b/configure index e3f692d0..3085de85 100755 --- a/configure +++ b/configure @@ -13668,6 +13668,7 @@ for ac_func in memcpy \ setjmp \ strerror \ isatty \ + strncmp \ ldiv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/configure.ac b/configure.ac index ee5bed8f..cb19ed8c 100644 --- a/configure.ac +++ b/configure.ac @@ -254,6 +254,7 @@ AC_CHECK_FUNCS([memcpy \ setjmp \ strerror \ isatty \ + strncmp \ ldiv]) # for HDR diff --git a/src/chunk.c b/src/chunk.c index dadc84d8..8f1c15c9 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -68,6 +68,8 @@ #include "chunk.h" #include "allocator.h" + +/* initialize chunk object with specified size */ static SIXELSTATUS sixel_chunk_init( sixel_chunk_t * const /* in */ pchunk, @@ -243,6 +245,7 @@ open_binary_file( } +/* get chunk date from specified local file path */ static SIXELSTATUS sixel_chunk_from_file( char const /* in */ *filename, @@ -254,6 +257,7 @@ sixel_chunk_from_file( int ret; FILE *f; int n; + int const bucket_size = 4096; status = open_binary_file(&f, filename); if (SIXEL_FAILED(status)) { @@ -261,14 +265,14 @@ sixel_chunk_from_file( } for (;;) { - if (pchunk->max_size - pchunk->size < 4096) { + if (pchunk->max_size - pchunk->size < bucket_size) { pchunk->max_size *= 2; pchunk->buffer = (unsigned char *)sixel_allocator_realloc(pchunk->allocator, pchunk->buffer, pchunk->max_size); if (pchunk->buffer == NULL) { sixel_helper_set_additional_message( - "sixel_chunk_from_file: realloc() failed."); + "sixel_chunk_from_file: sixel_allocator_realloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -282,6 +286,8 @@ sixel_chunk_from_file( } ret = wait_file(fileno(f), 10000); if (ret < 0) { + sixel_helper_set_additional_message( + "sixel_chunk_from_file: wait_file() failed."); status = SIXEL_RUNTIME_ERROR; goto end; } @@ -308,38 +314,76 @@ sixel_chunk_from_file( } +/* get chunk of specified resource over libcurl function */ static SIXELSTATUS sixel_chunk_from_url( - char const *url, - sixel_chunk_t *pchunk, - int finsecure) + char const /* in */ *url, + sixel_chunk_t /* in */ *pchunk, + int /* in */ finsecure) { SIXELSTATUS status = SIXEL_FALSE; - # ifdef HAVE_LIBCURL - CURL *curl; + CURL *curl = NULL; CURLcode code; - char buffer[1024]; curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + if (curl == NULL) { + status = SIXEL_CURL_ERROR & CURLE_FAILED_INIT; + sixel_helper_set_additional_message("curl_easy_init() failed."); + goto end; + } + + code = curl_easy_setopt(curl, CURLOPT_URL, url); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + sixel_helper_set_additional_message("curl_easy_setopt(CURLOPT_FOLLOWLOCATION) failed."); + goto end; + } + + code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + sixel_helper_set_additional_message("curl_easy_setopt(CURLOPT_FOLLOWLOCATION) failed."); + goto end; + } + if (finsecure && strncmp(url, "https://", 8) == 0) { - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + sixel_helper_set_additional_message("curl_easy_setopt(CURLOPT_SSL_VERIFYPEER) failed."); + goto end; + } + + code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + sixel_helper_set_additional_message("curl_easy_setopt(CURLOPT_SSL_VERIFYHOST) failed."); + goto end; + } + + } + + code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memory_write); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + sixel_helper_set_additional_message("curl_easy_setopt(CURLOPT_WRITEFUNCTION) failed."); + goto end; + } + + code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)pchunk); + if (code != CURLE_OK) { + status = SIXEL_CURL_ERROR & (code & 0xff); + sixel_helper_set_additional_message("curl_easy_setopt(CURLOPT_WRITEDATA) failed."); + goto end; } - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memory_write); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)pchunk); + code = curl_easy_perform(curl); if (code != CURLE_OK) { status = SIXEL_CURL_ERROR & (code & 0xff); - if (sprintf(buffer, "curl_easy_perform('%s') failed.", url) != EOF) { - sixel_helper_set_additional_message(buffer); - } - curl_easy_cleanup(curl); + sixel_helper_set_additional_message("curl_easy_perform() failed."); goto end; } - curl_easy_cleanup(curl); status = SIXEL_OK; # else @@ -355,6 +399,11 @@ sixel_chunk_from_url( # endif /* HAVE_LIBCURL */ end: +# ifdef HAVE_LIBCURL + if (curl) { + curl_easy_cleanup(curl); + } +# endif /* HAVE_LIBCURL */ return status; } diff --git a/src/loader.c b/src/loader.c index 70d7402d..8f4fe64b 100644 --- a/src/loader.c +++ b/src/loader.c @@ -680,11 +680,8 @@ load_with_builtin( int nwrite; if (chunk_is_sixel(pchunk)) { - frame = sixel_frame_create(); - if (frame == NULL) { - sixel_helper_set_additional_message( - "malloc() failed in load_with_builtin()."); - status = SIXEL_BAD_ALLOCATION; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { goto end; } status = load_sixel(&frame->pixels, @@ -701,9 +698,8 @@ load_with_builtin( goto end; } } else if (chunk_is_pnm(pchunk)) { - frame = sixel_frame_create(); - if (frame == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { goto end; } /* pnm */ @@ -722,9 +718,8 @@ load_with_builtin( } #if HAVE_JPEG else if (chunk_is_jpeg(pchunk)) { - frame = sixel_frame_create(); - if (frame == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { goto end; } status = load_jpeg(&frame->pixels, @@ -742,12 +737,10 @@ load_with_builtin( #endif /* HAVE_JPEG */ #if HAVE_LIBPNG else if (chunk_is_png(pchunk)) { - frame = sixel_frame_create(); - if (frame == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { goto end; } - status = load_png(&frame->pixels, pchunk->buffer, pchunk->size, @@ -783,9 +776,8 @@ load_with_builtin( stbi__context s; int depth; - frame = sixel_frame_create(); - if (frame == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { goto end; } stbi__start_mem(&s, pchunk->buffer, pchunk->size); @@ -848,12 +840,12 @@ load_with_gdkpixbuf( SIXELSTATUS status = SIXEL_FALSE; GdkPixbuf *pixbuf; GdkPixbufAnimation *animation; - GdkPixbufLoader *loader; + GdkPixbufLoader *loader = NULL; #if 1 GdkPixbufAnimationIter *it; GTimeVal time; #endif - sixel_frame_t *frame; + sixel_frame_t *frame = NULL; int stride; unsigned char *p; int i; @@ -863,9 +855,9 @@ load_with_gdkpixbuf( (void) reqcolors; (void) bgcolor; - frame = sixel_frame_create(); - if (frame == NULL) { - return SIXEL_FALSE; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { + goto end; } #if (!GLIB_CHECK_VERSION(2, 36, 0)) @@ -976,11 +968,13 @@ load_with_gdkpixbuf( status = SIXEL_OK; end: - gdk_pixbuf_loader_close(loader, NULL); - g_object_unref(loader); - sixel_allocator_free(pchunk->allocator, frame->pixels); - sixel_allocator_free(pchunk->allocator, frame->palette); - sixel_allocator_free(pchunk->allocator, frame); + if (frame) { + gdk_pixbuf_loader_close(loader, NULL); + g_object_unref(loader); + sixel_allocator_free(pchunk->allocator, frame->pixels); + sixel_allocator_free(pchunk->allocator, frame->palette); + sixel_allocator_free(pchunk->allocator, frame); + } return status; From f713b4810278e696a249d6f74ca12f6a336be057 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 00:47:39 +0900 Subject: [PATCH 425/451] Add new allocator API: sixel_allocator_calloc() --- include/sixel.h.in | 15 +++- src/allocator.c | 86 ++++++++++++++----- src/allocator.h | 1 + src/chunk.c | 2 +- src/decoder.c | 4 +- src/dither.c | 200 ++++++++++++++++++++++++++++++++------------- src/dither.h | 44 +++++----- src/encoder.c | 4 +- src/frame.c | 2 +- src/status.c | 2 + src/tests.c | 11 +++ 11 files changed, 263 insertions(+), 108 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 4c129c1d..b28502e4 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -470,9 +470,10 @@ enum methodForResampling { }; #endif -typedef void *(* sixel_malloc_t)(size_t n); -typedef void *(* sixel_realloc_t)(void *p, size_t n); -typedef void (* sixel_free_t)(void *p); +typedef void *(* sixel_malloc_t)(size_t); +typedef void *(* sixel_calloc_t)(size_t, size_t); +typedef void *(* sixel_realloc_t)(void *, size_t); +typedef void (* sixel_free_t)(void *); struct sixel_allocator; typedef struct sixel_allocator sixel_allocator_t; @@ -486,6 +487,7 @@ SIXELSTATUS sixel_allocator_new( sixel_allocator_t /* out */ **ppallocator, /* allocator object to be created */ sixel_malloc_t /* in */ fn_malloc, /* custom malloc() function */ + sixel_calloc_t /* in */ fn_calloc, /* custom calloc() function */ sixel_realloc_t /* in */ fn_realloc, /* custom realloc() function */ sixel_free_t /* in */ fn_free); /* custom free() function */ @@ -505,6 +507,13 @@ sixel_allocator_malloc( sixel_allocator_t /* in */ *allocator, /* allocator object */ size_t /* in */ n); /* allocation size */ +/* call custom calloc() */ +SIXELAPI void * +sixel_allocator_calloc( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + size_t /* in */ nelm, /* allocation size */ + size_t /* in */ elsize); /* allocation size */ + /* call custom realloc() */ SIXELAPI void * sixel_allocator_realloc( diff --git a/src/allocator.c b/src/allocator.c index 81bba3a4..626421dd 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -42,6 +42,7 @@ SIXELSTATUS sixel_allocator_new( sixel_allocator_t /* out */ **ppallocator, /* allocator object to be created */ sixel_malloc_t /* in */ fn_malloc, /* custom malloc() function */ + sixel_calloc_t /* in */ fn_calloc, /* custom calloc() function */ sixel_realloc_t /* in */ fn_realloc, /* custom realloc() function */ sixel_free_t /* in */ fn_free) /* custom free() function */ { @@ -55,24 +56,19 @@ sixel_allocator_new( } if (fn_malloc == NULL) { - sixel_helper_set_additional_message( - "sixel_allocator_new: given argument fn_malloc is null."); - status = SIXEL_BAD_ARGUMENT; - goto end; + fn_malloc = malloc; + } + + if (fn_calloc == NULL) { + fn_calloc = calloc; } if (fn_realloc == NULL) { - sixel_helper_set_additional_message( - "sixel_allocator_new: given argument fn_realloc is null."); - status = SIXEL_BAD_ARGUMENT; - goto end; + fn_realloc = realloc; } if (fn_free == NULL) { - sixel_helper_set_additional_message( - "sixel_allocator_new: given argument fn_free is null."); - status = SIXEL_BAD_ARGUMENT; - goto end; + fn_free = free; } *ppallocator = fn_malloc(sizeof(sixel_allocator_t)); @@ -85,6 +81,7 @@ sixel_allocator_new( (*ppallocator)->ref = 1; (*ppallocator)->fn_malloc = fn_malloc; + (*ppallocator)->fn_calloc = fn_calloc; (*ppallocator)->fn_realloc = fn_realloc; (*ppallocator)->fn_free = fn_free; @@ -136,7 +133,39 @@ sixel_allocator_malloc( sixel_allocator_t /* in */ *allocator, /* allocator object */ size_t /* in */ n) /* allocation size */ { - return allocator->fn_malloc(n); + void *p = NULL; + + if (allocator->fn_malloc) { + p = allocator->fn_malloc(n); + } + + return p; +} + + +/* call custom calloc() */ +SIXELAPI void * +sixel_allocator_calloc( + sixel_allocator_t /* in */ *allocator, /* allocator object */ + size_t /* in */ nelm, /* number of elements */ + size_t /* in */ elsize) /* size of element */ +{ + void *p = NULL; + + if (allocator->fn_calloc) { + p = allocator->fn_calloc(nelm, elsize); + if (p) { + goto end; + } + } + + p = allocator->fn_malloc(nelm * elsize); + if (p) { + memset(p, 0x00, nelm * elsize); + } + +end: + return p; } @@ -147,7 +176,13 @@ sixel_allocator_realloc( void /* in */ *p, /* existing buffer to be re-allocated */ size_t /* in */ n) /* re-allocation size */ { - return allocator->fn_realloc(p, n); + void *result = NULL; + + if (allocator->fn_realloc) { + result = allocator->fn_realloc(p, n); + } + + return result; } @@ -157,7 +192,9 @@ sixel_allocator_free( sixel_allocator_t /* in */ *allocator, /* allocator object */ void /* in */ *p) /* existing buffer to be freed */ { - return allocator->fn_free(p); + if (allocator->fn_free) { + allocator->fn_free(p); + } } @@ -210,23 +247,28 @@ test1(void) SIXELSTATUS status; sixel_allocator_t *allocator = NULL; - status = sixel_allocator_new(NULL, malloc, realloc, free); + status = sixel_allocator_new(NULL, malloc, calloc, realloc, free); if (status != SIXEL_BAD_ARGUMENT) { goto error; } - status = sixel_allocator_new(&allocator, NULL, realloc, free); - if (status != SIXEL_BAD_ARGUMENT) { + status = sixel_allocator_new(&allocator, NULL, calloc, realloc, free); + if (SIXEL_FAILED(status)) { goto error; } - status = sixel_allocator_new(&allocator, malloc, NULL, free); - if (status != SIXEL_BAD_ARGUMENT) { + status = sixel_allocator_new(&allocator, malloc, NULL, realloc, free); + if (SIXEL_FAILED(status)) { goto error; } - status = sixel_allocator_new(&allocator, malloc, realloc, NULL); - if (status != SIXEL_BAD_ARGUMENT) { + status = sixel_allocator_new(&allocator, malloc, calloc, NULL, free); + if (SIXEL_FAILED(status)) { + goto error; + } + + status = sixel_allocator_new(&allocator, malloc, calloc, realloc, NULL); + if (SIXEL_FAILED(status)) { goto error; } diff --git a/src/allocator.h b/src/allocator.h index 4236a11a..4baa0396 100644 --- a/src/allocator.h +++ b/src/allocator.h @@ -27,6 +27,7 @@ struct sixel_allocator { unsigned int ref; /* reference counter */ sixel_malloc_t fn_malloc; + sixel_calloc_t fn_calloc; sixel_realloc_t fn_realloc; sixel_free_t fn_free; }; diff --git a/src/chunk.c b/src/chunk.c index 8f1c15c9..b97f9e88 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -84,7 +84,7 @@ sixel_chunk_init( if (pchunk->buffer == NULL) { sixel_helper_set_additional_message( - "sixel_chunk_init: malloc() failed."); + "sixel_chunk_init: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } diff --git a/src/decoder.c b/src/decoder.c index 09b09110..8b8d5722 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -90,7 +90,7 @@ sixel_decoder_new( SIXELSTATUS status = SIXEL_FALSE; if (allocator == NULL) { - status = sixel_allocator_new(&allocator, malloc, realloc, free); + status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); if (SIXEL_FAILED(status)) { goto end; } @@ -262,7 +262,7 @@ sixel_decoder_decode( if ((raw_data = (unsigned char *)sixel_allocator_malloc(decoder->allocator, max)) == NULL) { status = SIXEL_BAD_ALLOCATION; - if (sprintf(buffer, "malloc(%d) failed.", max) != EOF) { + if (sprintf(buffer, "sixel_allocator_malloc(%d) failed.", max) != EOF) { sixel_helper_set_additional_message(buffer); } goto end; diff --git a/src/dither.c b/src/dither.c index 73bf7310..dab9960c 100644 --- a/src/dither.c +++ b/src/dither.c @@ -248,21 +248,41 @@ static const unsigned char pal_vt340_color[] = { }; -SIXELAPI sixel_dither_t * -sixel_dither_create( - int /* in */ ncolors) +/* create dither context object */ +SIXELAPI SIXELSTATUS +sixel_dither_new( + sixel_dither_t /* out */ **ppdither, /* dither object to be created */ + int /* in */ ncolors, /* required colors */ + sixel_allocator_t /* in */ *allocator) /* allocator, null if you use + default allocator */ { - sixel_dither_t *dither; + SIXELSTATUS status = SIXEL_FALSE; int headsize; int datasize; int wholesize; int quality_mode; - if (ncolors == -1) { + if (ppdither == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_new: ppdither is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); + if (SIXEL_FAILED(status)) { + *ppdither = NULL; + goto end; + } + } else { + sixel_allocator_ref(allocator); + } + + if (ncolors == (-1)) { ncolors = 256; quality_mode = SIXEL_QUALITY_HIGHCOLOR; - } - else { + } else { if (ncolors > SIXEL_PALETTE_MAX) { ncolors = 256; } else if (ncolors < 2) { @@ -274,26 +294,54 @@ sixel_dither_create( datasize = ncolors * 3; wholesize = headsize + datasize; - dither = (sixel_dither_t *)malloc(wholesize); - if (dither != NULL) { - dither->ref = 1; - dither->palette = (unsigned char*)(dither + 1); - dither->cachetable = NULL; - dither->reqcolors = ncolors; - dither->ncolors = ncolors; - dither->origcolors = (-1); - dither->keycolor = (-1); - dither->optimized = 0; - dither->optimize_palette = 0; - dither->complexion = 1; - dither->bodyonly = 0; - dither->method_for_largest = SIXEL_LARGE_NORM; - dither->method_for_rep = SIXEL_REP_CENTER_BOX; - dither->method_for_diffuse = SIXEL_DIFFUSE_FS; - dither->quality_mode = quality_mode; - dither->pixelformat = SIXEL_PIXELFORMAT_RGB888; + *ppdither = (sixel_dither_t *)sixel_allocator_malloc(allocator, wholesize); + if (*ppdither == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_new: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + (*ppdither)->ref = 1; + (*ppdither)->palette = (unsigned char*)(*ppdither + 1); + (*ppdither)->cachetable = NULL; + (*ppdither)->reqcolors = ncolors; + (*ppdither)->ncolors = ncolors; + (*ppdither)->origcolors = (-1); + (*ppdither)->keycolor = (-1); + (*ppdither)->optimized = 0; + (*ppdither)->optimize_palette = 0; + (*ppdither)->complexion = 1; + (*ppdither)->bodyonly = 0; + (*ppdither)->method_for_largest = SIXEL_LARGE_NORM; + (*ppdither)->method_for_rep = SIXEL_REP_CENTER_BOX; + (*ppdither)->method_for_diffuse = SIXEL_DIFFUSE_FS; + (*ppdither)->quality_mode = quality_mode; + (*ppdither)->pixelformat = SIXEL_PIXELFORMAT_RGB888; + (*ppdither)->allocator = allocator; + +end: + if (allocator) { + sixel_allocator_unref(allocator); + } + return status; +} + + +/* create dither context object (deprecated) */ +SIXELAPI sixel_dither_t * +sixel_dither_create( + int /* in */ ncolors) +{ + SIXELSTATUS status = SIXEL_FALSE; + sixel_dither_t *dither = NULL; + + status = sixel_dither_new(&dither, ncolors, NULL); + if (SIXEL_FAILED(status)) { + goto end; } +end: return dither; } @@ -302,9 +350,14 @@ SIXELAPI void sixel_dither_destroy( sixel_dither_t /* in */ *dither) { + sixel_allocator_t *allocator; + if (dither) { - free(dither->cachetable); - free(dither); + allocator = dither->allocator; + sixel_allocator_free(allocator, dither->cachetable); + dither->cachetable = NULL; + sixel_allocator_free(allocator, dither); + sixel_allocator_unref(allocator); } } @@ -462,13 +515,26 @@ sixel_dither_initialize( unsigned char *input_pixels; SIXELSTATUS status = SIXEL_FALSE; + if (dither == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_new: dither is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + sixel_dither_ref(dither); + sixel_dither_set_pixelformat(dither, pixelformat); if (pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ - normalized_pixels = (unsigned char *)malloc(width * height * 3); + normalized_pixels + = (unsigned char *)sixel_allocator_malloc(dither->allocator, width * height * 3); if (normalized_pixels == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_initialize: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; goto end; } @@ -515,6 +581,7 @@ sixel_dither_initialize( end: free(normalized_pixels); + sixel_dither_unref(dither); return status; } @@ -633,17 +700,28 @@ sixel_dither_apply_palette( int /* in */ width, int /* in */ height) { - int ret; + SIXELSTATUS status = SIXEL_FALSE; int bufsize; - int cachesize; - unsigned char *dest; + unsigned char *dest = NULL; int ncolors; unsigned char *normalized_pixels = NULL; unsigned char *input_pixels; + if (dither == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_apply_palette: dither is null."); + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + sixel_dither_ref(dither); + bufsize = width * height * sizeof(unsigned char); - dest = (unsigned char *)malloc(bufsize); + dest = (unsigned char *)sixel_allocator_malloc(dither->allocator, bufsize); if (dest == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_new: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; goto end; } @@ -654,27 +732,33 @@ sixel_dither_apply_palette( if (dither->cachetable == NULL && dither->optimized) { if (dither->palette != pal_mono_dark && dither->palette != pal_mono_light) { - cachesize = (1 << 3 * 5) * sizeof(unsigned short); -#if HAVE_CALLOC - dither->cachetable = (unsigned short *)calloc(cachesize, 1); -#else - dither->cachetable = (unsigned short *)malloc(cachesize); - memset(dither->cachetable, 0, cachesize); -#endif + dither->cachetable = (unsigned short *)sixel_allocator_calloc(dither->allocator, + 1 << 3 * 5, + sizeof(unsigned short)); + if (dither->cachetable == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_new: sixel_allocator_calloc() failed."); + status = SIXEL_BAD_ALLOCATION; + goto end; + } } } if (dither->pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelformat */ - normalized_pixels = (unsigned char *)malloc(width * height * 3); + normalized_pixels + = (unsigned char *)sixel_allocator_malloc(dither->allocator, width * height * 3); if (normalized_pixels == NULL) { + sixel_helper_set_additional_message( + "sixel_dither_new: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; goto end; } - ret = sixel_helper_normalize_pixelformat(normalized_pixels, - &dither->pixelformat, - pixels, dither->pixelformat, - width, height); - if (ret != 0) { + status = sixel_helper_normalize_pixelformat(normalized_pixels, + &dither->pixelformat, + pixels, dither->pixelformat, + width, height); + if (SIXEL_FAILED(status)) { goto end; } input_pixels = normalized_pixels; @@ -682,26 +766,28 @@ sixel_dither_apply_palette( input_pixels = pixels; } - ret = sixel_quant_apply_palette(input_pixels, - width, height, 3, - dither->palette, - dither->ncolors, - dither->method_for_diffuse, - dither->optimized, - dither->optimize_palette, - dither->complexion, - dither->cachetable, - &ncolors, - dest); - if (ret != 0) { + status = sixel_quant_apply_palette(input_pixels, + width, height, 3, + dither->palette, + dither->ncolors, + dither->method_for_diffuse, + dither->optimized, + dither->optimize_palette, + dither->complexion, + dither->cachetable, + &ncolors, + dest); + if (SIXEL_FAILED(status)) { free(dest); dest = NULL; + goto end; } dither->ncolors = ncolors; end: free(normalized_pixels); + sixel_dither_unref(dither); return dest; } diff --git a/src/dither.h b/src/dither.h index 13e45b23..60c02ebf 100644 --- a/src/dither.h +++ b/src/dither.h @@ -22,25 +22,28 @@ #ifndef LIBSIXEL_DITHER_H #define LIBSIXEL_DITHER_H +#include + /* dither context object */ struct sixel_dither { - unsigned int ref; /* reference counter */ - unsigned char *palette; /* palette definition */ - unsigned short *cachetable; /* cache table */ - int reqcolors; /* requested colors */ - int ncolors; /* active colors */ - int origcolors; /* original colors */ - int optimized; /* pixel is 15bpp compressable */ - int optimize_palette; /* minimize palette size */ - int complexion; /* for complexion correction */ - int bodyonly; /* do not output palette section if true */ - int method_for_largest; /* method for finding the largest dimention - for splitting */ - int method_for_rep; /* method for choosing a color from the box */ - int method_for_diffuse; /* method for diffusing */ - int quality_mode; /* quality of histogram */ - int keycolor; /* background color */ - int pixelformat; /* pixelformat for internal processing */ + unsigned int ref; /* reference counter */ + unsigned char *palette; /* palette definition */ + unsigned short *cachetable; /* cache table */ + int reqcolors; /* requested colors */ + int ncolors; /* active colors */ + int origcolors; /* original colors */ + int optimized; /* pixel is 15bpp compressable */ + int optimize_palette; /* minimize palette size */ + int complexion; /* for complexion correction */ + int bodyonly; /* do not output palette section if true */ + int method_for_largest; /* method for finding the largest dimention + for splitting */ + int method_for_rep; /* method for choosing a color from the box */ + int method_for_diffuse; /* method for diffusing */ + int quality_mode; /* quality of histogram */ + int keycolor; /* background color */ + int pixelformat; /* pixelformat for internal processing */ + sixel_allocator_t *allocator; /* allocator */ }; #ifdef __cplusplus @@ -49,9 +52,10 @@ extern "C" { /* apply palette */ unsigned char * -sixel_dither_apply_palette(struct sixel_dither *dither, - unsigned char *pixels, - int width, int height); +sixel_dither_apply_palette(struct sixel_dither /* in */ *dither, + unsigned char /* in */ *pixels, + int /* in */ width, + int /* in */ height); #if HAVE_TESTS int diff --git a/src/encoder.c b/src/encoder.c index c204932b..e63a6db5 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -1247,7 +1247,7 @@ sixel_encoder_new( int ncolors; if (allocator == NULL) { - status = sixel_allocator_new(&allocator, malloc, realloc, free); + status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); if (SIXEL_FAILED(status)) { goto end; } @@ -2098,7 +2098,7 @@ test5(void) sixel_allocator_t *allocator = NULL; SIXELSTATUS status; - status = sixel_allocator_new(&allocator, malloc, realloc, free); + status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); if (SIXEL_FAILED(status)) { goto error; } diff --git a/src/frame.c b/src/frame.c index 987ffacb..4a4ee805 100644 --- a/src/frame.c +++ b/src/frame.c @@ -46,7 +46,7 @@ sixel_frame_new( SIXELSTATUS status = SIXEL_FALSE; if (allocator == NULL) { - status = sixel_allocator_new(&allocator, malloc, realloc, free); + status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); if (SIXEL_FAILED(status)) { goto end; } diff --git a/src/status.c b/src/status.c index 7e3cde42..73afb3b7 100644 --- a/src/status.c +++ b/src/status.c @@ -60,6 +60,7 @@ static char g_buffer[1024] = { 0x0 }; +/* set detailed error message (thread-unsafe) */ SIXELAPI void sixel_helper_set_additional_message( const char /* in */ *message /* error message */ @@ -73,6 +74,7 @@ sixel_helper_set_additional_message( } +/* get detailed error message (thread-unsafe) */ SIXELAPI char const * sixel_helper_get_additional_message(void) { diff --git a/src/tests.c b/src/tests.c index 6d4b1d48..b2f2ef72 100644 --- a/src/tests.c +++ b/src/tests.c @@ -60,6 +60,7 @@ main(int argc, char *argv[]) } puts("fromgif ok."); + fflush(stdout); nret = sixel_loader_tests_main(); if (nret != EXIT_SUCCESS) { @@ -67,6 +68,7 @@ main(int argc, char *argv[]) } puts("loader ok."); + fflush(stdout); nret = sixel_dither_tests_main(); if (nret != EXIT_SUCCESS) { @@ -74,6 +76,7 @@ main(int argc, char *argv[]) } puts("dither ok."); + fflush(stdout); nret = sixel_pixelformat_tests_main(); if (nret != EXIT_SUCCESS) { @@ -81,6 +84,7 @@ main(int argc, char *argv[]) } puts("pixelformat ok."); + fflush(stdout); nret = sixel_frame_tests_main(); if (nret != EXIT_SUCCESS) { @@ -88,6 +92,7 @@ main(int argc, char *argv[]) } puts("frame ok."); + fflush(stdout); nret = sixel_writer_tests_main(); if (nret != EXIT_SUCCESS) { @@ -95,6 +100,7 @@ main(int argc, char *argv[]) } puts("writer ok."); + fflush(stdout); nret = sixel_quant_tests_main(); if (nret != EXIT_SUCCESS) { @@ -102,6 +108,7 @@ main(int argc, char *argv[]) } puts("quant ok."); + fflush(stdout); nret = sixel_encoder_tests_main(); if (nret != EXIT_SUCCESS) { @@ -109,6 +116,7 @@ main(int argc, char *argv[]) } puts("encoder ok."); + fflush(stdout); nret = sixel_status_tests_main(); if (nret != EXIT_SUCCESS) { @@ -116,6 +124,7 @@ main(int argc, char *argv[]) } puts("status ok."); + fflush(stdout); nret = sixel_chunk_tests_main(); if (nret != EXIT_SUCCESS) { @@ -123,6 +132,7 @@ main(int argc, char *argv[]) } puts("chunk ok."); + fflush(stdout); nret = sixel_allocator_tests_main(); if (nret != EXIT_SUCCESS) { @@ -130,6 +140,7 @@ main(int argc, char *argv[]) } puts("allocator ok."); + fflush(stdout); error: return nret; From d933718c8034af442ca64e8f3c02ac1eeb582c5d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 01:01:43 +0900 Subject: [PATCH 426/451] Use allocator object in fromgif.c --- src/fromgif.c | 48 +++++++++++++++++++++++++----------------------- src/fromgif.h | 21 ++++++++++++--------- src/loader.c | 3 ++- 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/fromgif.c b/src/fromgif.c index 13aec16a..963f0621 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -31,7 +31,7 @@ #include #include #include "frame.h" -#include +#include "fromgif.h" /* * gif_context_t struct and start_xxx functions @@ -178,10 +178,10 @@ gif_init_frame( frame->delay = pg->delay; ncolors = 2 << (pg->flags & 7); if (frame->palette == NULL) { - frame->palette = (unsigned char *)malloc(ncolors * 3); + frame->palette = (unsigned char *)sixel_allocator_malloc(frame->allocator, ncolors * 3); } else if (frame->ncolors < ncolors) { - free(frame->palette); - frame->palette = (unsigned char *)malloc(ncolors * 3); + sixel_allocator_free(frame->allocator, frame->palette); + frame->palette = (unsigned char *)sixel_allocator_malloc(frame->allocator, ncolors * 3); } if (frame->palette == NULL) { status = SIXEL_BAD_ALLOCATION; @@ -190,11 +190,12 @@ gif_init_frame( frame->ncolors = ncolors; if (frame->ncolors <= reqcolors && fuse_palette) { frame->pixelformat = SIXEL_PIXELFORMAT_PAL8; - free(frame->pixels); - frame->pixels = (unsigned char *)malloc(frame->width * frame->height); + sixel_allocator_free(frame->allocator, frame->pixels); + frame->pixels = (unsigned char *)sixel_allocator_malloc(frame->allocator, + frame->width * frame->height); if (frame->pixels == NULL) { sixel_helper_set_additional_message( - "malloc() failed in gif_init_frame()."); + "sixel_allocator_malloc() failed in gif_init_frame()."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -228,10 +229,11 @@ gif_init_frame( } } else { frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; - frame->pixels = (unsigned char *)malloc(pg->w * pg->h * 3); + frame->pixels = (unsigned char *)sixel_allocator_malloc(frame->allocator, + pg->w * pg->h * 3); if (frame->pixels == NULL) { sixel_helper_set_additional_message( - "malloc() failed in gif_init_frame()."); + "sixel_allocator_malloc() failed in gif_init_frame()."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -535,16 +537,16 @@ gif_load_next( SIXELSTATUS load_gif( - unsigned char /* in */ *buffer, - int /* in */ size, - unsigned char /* in */ *bgcolor, - int /* in */ reqcolors, - int /* in */ fuse_palette, - int /* in */ fstatic, - int /* in */ loop_control, - void /* in */ *fn_load, /* callback */ - void /* in */ *context /* private data for callback */ -) + unsigned char /* in */ *buffer, + int /* in */ size, + unsigned char /* in */ *bgcolor, + int /* in */ reqcolors, + int /* in */ fuse_palette, + int /* in */ fstatic, + int /* in */ loop_control, + void /* in */ *fn_load, /* callback */ + void /* in */ *context, /* private data for callback */ + sixel_allocator_t /* in */ *allocator) /* allocator object */ { gif_context_t s; gif_t g; @@ -553,8 +555,8 @@ load_gif( g.out = NULL; - frame = sixel_frame_create(); - if (frame == NULL) { + status = sixel_frame_new(&frame, allocator); + if (SIXEL_FAILED(status)) { goto end; } s.img_buffer = s.img_buffer_original = (unsigned char *)buffer; @@ -566,7 +568,7 @@ load_gif( } frame->width = g.w, frame->height = g.h, - g.out = (unsigned char *)malloc(g.w * g.h); + g.out = (unsigned char *)sixel_allocator_malloc(allocator, g.w * g.h); if (g.out == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -628,7 +630,7 @@ load_gif( end: sixel_frame_unref(frame); - free(g.out); + sixel_allocator_free(frame->allocator, g.out); return status; } diff --git a/src/fromgif.h b/src/fromgif.h index d121fa1b..f4a39e9d 100644 --- a/src/fromgif.h +++ b/src/fromgif.h @@ -22,6 +22,8 @@ #ifndef LIBSIXEL_FROMGIF_H #define LIBSIXEL_FROMGIF_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -29,15 +31,16 @@ extern "C" { /* load gif */ int load_gif( - unsigned char /* in */ *buffer, - int /* in */ size, - unsigned char /* in */ *bgcolor, - int /* in */ reqcolors, - int /* in */ fuse_palette, - int /* in */ fstatic, - int /* in */ loop_control, - void /* in */ *fn_load, /* callback */ - void /* in */ *context /* private data for callback */ + unsigned char /* in */ *buffer, + int /* in */ size, + unsigned char /* in */ *bgcolor, + int /* in */ reqcolors, + int /* in */ fuse_palette, + int /* in */ fstatic, + int /* in */ loop_control, + void /* in */ *fn_load, /* callback */ + void /* in */ *context, /* private data for callback */ + sixel_allocator_t /* in */ *allocator /* allocator object */ ); #if HAVE_TESTS diff --git a/src/loader.c b/src/loader.c index 8f4fe64b..623ee0f6 100644 --- a/src/loader.c +++ b/src/loader.c @@ -767,7 +767,8 @@ load_with_builtin( fstatic, loop_control, (void *)fn_load, - context); + context, + pchunk->allocator); if (SIXEL_FAILED(status)) { goto end; } From d527b11df952a4fe142d6ec85f555f8562f38a62 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 10:31:46 +0900 Subject: [PATCH 427/451] Amend fix for miss-operation of reference counter --- src/allocator.c | 65 +++++++++++++++++++++++-------------------------- src/dither.c | 4 +-- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/allocator.c b/src/allocator.c index 626421dd..216fa341 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -20,6 +20,7 @@ */ #include +#include #include "config.h" #if HAVE_SYS_TYPES_H @@ -98,9 +99,11 @@ sixel_allocator_destroy( sixel_allocator_t /* in */ *allocator) /* allocator object to be destroyed */ { - sixel_free_t fn_free = allocator->fn_free; + /* precondition */ + assert(allocator); + assert(allocator->fn_free); - fn_free(allocator); + allocator->fn_free(allocator); } @@ -110,6 +113,9 @@ sixel_allocator_ref( sixel_allocator_t /* in */ *allocator) /* allocator object to be increment reference counter */ { + /* precondition */ + assert(allocator); + /* TODO: be thread safe */ ++allocator->ref; } @@ -121,8 +127,12 @@ sixel_allocator_unref( sixel_allocator_t /* in */ *allocator) /* allocator object to be unreference */ { /* TODO: be thread safe */ - if (allocator != NULL && --allocator->ref == 0) { - sixel_allocator_destroy(allocator); + if (allocator) { + assert(allocator->ref > 0); + --allocator->ref; + if (allocator->ref == 0) { + sixel_allocator_destroy(allocator); + } } } @@ -133,13 +143,11 @@ sixel_allocator_malloc( sixel_allocator_t /* in */ *allocator, /* allocator object */ size_t /* in */ n) /* allocation size */ { - void *p = NULL; - - if (allocator->fn_malloc) { - p = allocator->fn_malloc(n); - } + /* precondition */ + assert(allocator); + assert(allocator->fn_malloc); - return p; + return allocator->fn_malloc(n); } @@ -150,22 +158,11 @@ sixel_allocator_calloc( size_t /* in */ nelm, /* number of elements */ size_t /* in */ elsize) /* size of element */ { - void *p = NULL; - - if (allocator->fn_calloc) { - p = allocator->fn_calloc(nelm, elsize); - if (p) { - goto end; - } - } + /* precondition */ + assert(allocator); + assert(allocator->fn_calloc); - p = allocator->fn_malloc(nelm * elsize); - if (p) { - memset(p, 0x00, nelm * elsize); - } - -end: - return p; + return allocator->fn_calloc(nelm, elsize); } @@ -176,13 +173,11 @@ sixel_allocator_realloc( void /* in */ *p, /* existing buffer to be re-allocated */ size_t /* in */ n) /* re-allocation size */ { - void *result = NULL; + /* precondition */ + assert(allocator); + assert(allocator->fn_realloc); - if (allocator->fn_realloc) { - result = allocator->fn_realloc(p, n); - } - - return result; + return allocator->fn_realloc(p, n); } @@ -192,9 +187,11 @@ sixel_allocator_free( sixel_allocator_t /* in */ *allocator, /* allocator object */ void /* in */ *p) /* existing buffer to be freed */ { - if (allocator->fn_free) { - allocator->fn_free(p); - } + /* precondition */ + assert(allocator); + assert(allocator->fn_free); + + allocator->fn_free(p); } diff --git a/src/dither.c b/src/dither.c index dab9960c..20283db6 100644 --- a/src/dither.c +++ b/src/dither.c @@ -296,6 +296,7 @@ sixel_dither_new( *ppdither = (sixel_dither_t *)sixel_allocator_malloc(allocator, wholesize); if (*ppdither == NULL) { + sixel_allocator_unref(allocator); sixel_helper_set_additional_message( "sixel_dither_new: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; @@ -321,9 +322,6 @@ sixel_dither_new( (*ppdither)->allocator = allocator; end: - if (allocator) { - sixel_allocator_unref(allocator); - } return status; } From 3817d0480f1e9e68c934d1d6343ecec3e21233cf Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 16:30:35 +0900 Subject: [PATCH 428/451] Use allocator object in quant.c --- src/dither.c | 29 +++++---- src/quant.c | 175 ++++++++++++++++++++++++++++----------------------- src/quant.h | 56 ++++++++++------- 3 files changed, 148 insertions(+), 112 deletions(-) diff --git a/src/dither.c b/src/dither.c index 20283db6..5e51e7ab 100644 --- a/src/dither.c +++ b/src/dither.c @@ -555,16 +555,18 @@ sixel_dither_initialize( sixel_dither_set_method_for_rep(dither, method_for_rep); sixel_dither_set_quality_mode(dither, quality_mode); - buf = sixel_quant_make_palette(input_pixels, - width * height * 3, - SIXEL_PIXELFORMAT_RGB888, - dither->reqcolors, - &dither->ncolors, - &dither->origcolors, - dither->method_for_largest, - dither->method_for_rep, - dither->quality_mode); - if (buf == NULL) { + status = sixel_quant_make_palette(&buf, + input_pixels, + width * height * 3, + SIXEL_PIXELFORMAT_RGB888, + dither->reqcolors, + &dither->ncolors, + &dither->origcolors, + dither->method_for_largest, + dither->method_for_rep, + dither->quality_mode, + dither->allocator); + if (SIXEL_FAILED(status)) { goto end; } memcpy(dither->palette, buf, dither->ncolors * 3); @@ -574,7 +576,7 @@ sixel_dither_initialize( dither->method_for_diffuse = SIXEL_DIFFUSE_NONE; } - sixel_quant_free_palette(buf); + sixel_quant_free_palette(buf, dither->allocator); status = SIXEL_OK; end: @@ -764,7 +766,8 @@ sixel_dither_apply_palette( input_pixels = pixels; } - status = sixel_quant_apply_palette(input_pixels, + status = sixel_quant_apply_palette(dest, + input_pixels, width, height, 3, dither->palette, dither->ncolors, @@ -774,7 +777,7 @@ sixel_dither_apply_palette( dither->complexion, dither->cachetable, &ncolors, - dest); + dither->allocator); if (SIXEL_FAILED(status)) { free(dest); dest = NULL; diff --git a/src/quant.c b/src/quant.c index 244163e1..1871b564 100644 --- a/src/quant.c +++ b/src/quant.c @@ -60,7 +60,6 @@ #endif #include "quant.h" -#include "sixel.h" #if HAVE_DEBUG #define quant_trace fprintf @@ -132,7 +131,8 @@ static SIXELSTATUS alloctupletable( tupletable /* out */ *result, unsigned int const /* in */ depth, - unsigned int const /* in */ size) + unsigned int const /* in */ size, + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; char message[256]; @@ -176,7 +176,7 @@ alloctupletable( allocSize = mainTableSize + size * tupleIntSize; - pool = malloc(allocSize); + pool = sixel_allocator_malloc(allocator, allocSize); if (pool == NULL) { sprintf(message, "unable to allocate %u bytes for a %u-entry " @@ -208,14 +208,14 @@ alloctupletable( */ static tupletable2 -newColorMap(unsigned int const newcolors, unsigned int const depth) +newColorMap(unsigned int const newcolors, unsigned int const depth, sixel_allocator_t *allocator) { SIXELSTATUS status = SIXEL_FALSE; tupletable2 colormap; unsigned int i; colormap.size = 0; - status = alloctupletable(&colormap.table, depth, newcolors); + status = alloctupletable(&colormap.table, depth, newcolors, allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -234,11 +234,16 @@ newColorMap(unsigned int const newcolors, unsigned int const depth) static boxVector -newBoxVector(int const colors, int const sum, int const newcolors) +newBoxVector( + int const /* in */ colors, + int const /* in */ sum, + int const /* in */ newcolors, + sixel_allocator_t /* in */ *allocator) { boxVector bv; - bv = (boxVector)malloc(sizeof(struct box) * newcolors); + bv = (boxVector)sixel_allocator_malloc(allocator, + sizeof(struct box) * newcolors); if (bv == NULL) { quant_trace(stderr, "out of memory allocating box vector table\n"); return NULL; @@ -436,7 +441,8 @@ colormapFromBv(unsigned int const newcolors, unsigned int const boxes, tupletable2 const colorfreqtable, unsigned int const depth, - int const methodForRep) + int const methodForRep, + sixel_allocator_t *allocator) { /* ** Ok, we've got enough boxes. Now choose a representative color for @@ -449,7 +455,7 @@ colormapFromBv(unsigned int const newcolors, tupletable2 colormap; unsigned int bi; - colormap = newColorMap(newcolors, depth); + colormap = newColorMap(newcolors, depth, allocator); if (!colormap.size) { return colormap; } @@ -587,7 +593,8 @@ mediancut(tupletable2 const colorfreqtable, unsigned int const newcolors, int const methodForLargest, int const methodForRep, - tupletable2 *const colormapP) + tupletable2 *const colormapP, + sixel_allocator_t *allocator) { /*---------------------------------------------------------------------------- Compute a set of only 'newcolors' colors that best represent an @@ -614,7 +621,7 @@ mediancut(tupletable2 const colorfreqtable, /* There is at least one box that contains at least 2 colors; ergo, there is more splitting we can do. */ - bv = newBoxVector(colorfreqtable.size, sum, newcolors); + bv = newBoxVector(colorfreqtable.size, sum, newcolors, allocator); if (bv == NULL) { goto end; } @@ -639,9 +646,9 @@ mediancut(tupletable2 const colorfreqtable, } *colormapP = colormapFromBv(newcolors, bv, boxes, colorfreqtable, depth, - methodForRep); + methodForRep, allocator); - free(bv); + sixel_allocator_free(allocator, bv); status = SIXEL_OK; @@ -669,7 +676,8 @@ computeHistogram(unsigned char const /* in */ *data, unsigned int /* in */ length, unsigned long const /* in */ depth, tupletable2 * const /* out */ colorfreqtableP, - int const /* in */ qualityMode) + int const /* in */ qualityMode, + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; typedef unsigned short unit_t; @@ -708,21 +716,18 @@ computeHistogram(unsigned char const /* in */ *data, quant_trace(stderr, "making histogram...\n"); -#if HAVE_CALLOC - histogram = (unit_t *)calloc(1 << depth * 5, sizeof(unit_t)); -#else - histogram = (unit_t *)malloc((1 << depth * 5) * sizeof(unit_t)); -#endif + histogram = (unit_t *)sixel_allocator_calloc(allocator, + 1 << depth * 5, + sizeof(unit_t)); if (histogram == NULL) { sixel_helper_set_additional_message( "unable to allocate memory for histogram."); status = SIXEL_BAD_ALLOCATION; goto end; } -#if !HAVE_CALLOC - memset(histogram, 0, (1 << depth * 5) * sizeof(unit_t)); -#endif - it = ref = refmap = (unsigned short *)malloc((1 << depth * 5) * sizeof(unit_t)); + it = ref = refmap + = (unsigned short *)sixel_allocator_malloc(allocator, + (1 << depth * 5) * sizeof(unit_t)); if (!it) { sixel_helper_set_additional_message( "unable to allocate memory for lookup table."); @@ -741,7 +746,7 @@ computeHistogram(unsigned char const /* in */ *data, } colorfreqtableP->size = ref - refmap; - status = alloctupletable(&colorfreqtableP->table, depth, ref - refmap); + status = alloctupletable(&colorfreqtableP->table, depth, ref - refmap, allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -761,8 +766,8 @@ computeHistogram(unsigned char const /* in */ *data, status = SIXEL_OK; end: - free(refmap); - free(histogram); + sixel_allocator_free(allocator, refmap); + sixel_allocator_free(allocator, histogram); return status; } @@ -777,7 +782,8 @@ computeColorMapFromInput(unsigned char const *data, int const methodForRep, int const qualityMode, tupletable2 * const colormapP, - int *origcolors) + int *origcolors, + sixel_allocator_t *allocator) { /*---------------------------------------------------------------------------- Produce a colormap containing the best colors to represent the @@ -804,7 +810,7 @@ computeColorMapFromInput(unsigned char const *data, unsigned int n; status = computeHistogram(data, length, depth, - &colorfreqtable, qualityMode); + &colorfreqtable, qualityMode, allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -818,7 +824,7 @@ computeColorMapFromInput(unsigned char const *data, "Keeping same colors.\n", reqColors); /* *colormapP = colorfreqtable; */ colormapP->size = colorfreqtable.size; - status = alloctupletable(&colormapP->table, depth, colorfreqtable.size); + status = alloctupletable(&colormapP->table, depth, colorfreqtable.size, allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -831,7 +837,7 @@ computeColorMapFromInput(unsigned char const *data, } else { quant_trace(stderr, "choosing %d colors...\n", reqColors); status = mediancut(colorfreqtable, depth, reqColors, - methodForLargest, methodForRep, colormapP); + methodForLargest, methodForRep, colormapP, allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -841,7 +847,7 @@ computeColorMapFromInput(unsigned char const *data, status = SIXEL_OK; end: - free(colorfreqtable.table); + sixel_allocator_free(allocator, colorfreqtable.table); return status; } @@ -1154,63 +1160,78 @@ lookup_mono_lightbg(unsigned char const * const pixel, } -SIXELAPI unsigned char * -sixel_quant_make_palette(unsigned char const *data, - int length, - int pixelformat, - int reqcolors, int *ncolors, int *origcolors, - int methodForLargest, - int methodForRep, - int qualityMode) +SIXELSTATUS +sixel_quant_make_palette( + unsigned char /* out */ **result, + unsigned char const /* in */ *data, + int /* in */ length, + int /* in */ pixelformat, + int /* in */ reqcolors, + int /* in */ *ncolors, + int /* in */ *origcolors, + int /* in */ methodForLargest, + int /* in */ methodForRep, + int /* in */ qualityMode, + sixel_allocator_t /* in */ *allocator) { + SIXELSTATUS status = SIXEL_FALSE; int i; int n; int ret; - unsigned char *palette; tupletable2 colormap; - int depth = sixel_helper_compute_depth(pixelformat); + int depth; - if (depth == -1) { - return NULL; + depth = sixel_helper_compute_depth(pixelformat); + if (depth == (-1)) { + *result = NULL; + goto end; } ret = computeColorMapFromInput(data, length, depth, reqcolors, methodForLargest, methodForRep, qualityMode, - &colormap, origcolors); + &colormap, origcolors, allocator); if (ret != 0) { - return NULL; + *result = NULL; + goto end; } *ncolors = colormap.size; quant_trace(stderr, "tupletable size: %d\n", *ncolors); - palette = (unsigned char *)malloc(*ncolors * depth); + *result = (unsigned char *)sixel_allocator_malloc(allocator, *ncolors * depth); for (i = 0; i < *ncolors; i++) { for (n = 0; n < depth; ++n) { - palette[i * depth + n] = colormap.table[i]->tuple[n]; + (*result)[i * depth + n] = colormap.table[i]->tuple[n]; } } - free(colormap.table); - return palette; + sixel_allocator_free(allocator, colormap.table); + + status = SIXEL_OK; + +end: + return status; } -SIXELAPI int -sixel_quant_apply_palette(unsigned char *data, - int width, - int height, - int depth, - unsigned char *palette, - int reqcolor, - int methodForDiffuse, - int foptimize, - int foptimize_palette, - int complexion, - unsigned short *cachetable, - int *ncolors, - unsigned char *result) +SIXELSTATUS +sixel_quant_apply_palette( + unsigned char /* out */ *result, + unsigned char /* in */ *data, + int /* in */ width, + int /* in */ height, + int /* in */ depth, + unsigned char /* in */ *palette, + int /* in */ reqcolor, + int /* in */ methodForDiffuse, + int /* in */ foptimize, + int /* in */ foptimize_palette, + int /* in */ complexion, + unsigned short /* in */ *cachetable, + int /* in */ *ncolors, + sixel_allocator_t /* in */ *allocator) { typedef int component_t; + SIXELSTATUS status = SIXEL_FALSE; int pos, n, x, y, sum1, sum2; component_t offset; int index; @@ -1283,18 +1304,13 @@ sixel_quant_apply_palette(unsigned char *data, indextable = cachetable; if (cachetable == NULL && f_lookup == lookup_fast) { -#if !HAVE_CALLOC - indextable = (unsigned short *)malloc((1 << depth * 5) * sizeof(unsigned short)); -#else - indextable = (unsigned short *)calloc(1 << depth * 5, sizeof(unsigned short)); -#endif + indextable = (unsigned short *)sixel_allocator_calloc(allocator, + 1 << depth * 5, + sizeof(unsigned short)); if (!indextable) { quant_trace(stderr, "Unable to allocate memory for indextable.\n"); - return (-1); + goto end; } -#if !HAVE_CALLOC - memset(indextable, 0x00, (1 << depth * 5) * sizeof(unsigned short)); -#endif } if (foptimize_palette) { @@ -1342,17 +1358,22 @@ sixel_quant_apply_palette(unsigned char *data, } if (cachetable == NULL) { - free(indextable); + sixel_allocator_free(allocator, indextable); } - return 0; + status = SIXEL_OK; + +end: + return status; } -SIXELAPI void -sixel_quant_free_palette(unsigned char * data) +void +sixel_quant_free_palette( + unsigned char /* in */ *data, + sixel_allocator_t /* in */ *allocator) { - free(data); + sixel_allocator_free(allocator, data); } diff --git a/src/quant.h b/src/quant.h index cc0fbc3a..4d6ca85f 100644 --- a/src/quant.h +++ b/src/quant.h @@ -26,33 +26,45 @@ extern "C" { #endif -unsigned char * +#include + +SIXELSTATUS sixel_quant_make_palette( - unsigned const char /* in */ *data, /* data for sampling */ - int /* in */ length, /* data size */ - int /* in */ depth, - int /* in */ reqcolors, - int /* in */ *ncolors, - int /* in */ *origcolors, - int /* in */ methodForLargest, - int /* in */ methodForRep, - int /* in */ qualityMode); + unsigned char /* out */ **result, + unsigned const char /* in */ *data, /* data for sampling */ + int /* in */ length, /* data size */ + int /* in */ depth, + int /* in */ reqcolors, + int /* in */ *ncolors, + int /* in */ *origcolors, + int /* in */ methodForLargest, + int /* in */ methodForRep, + int /* in */ qualityMode, + sixel_allocator_t /* in */ *allocator); -int -sixel_quant_apply_palette(unsigned char *data, - int width, int height, int depth, - unsigned char *palette, int reqcolor, - int const methodForDiffuse, - int foptimize, - int foptimize_palette, - int complexion, - unsigned short *cachetable, - int *ncolor, - unsigned char *result); + +SIXELSTATUS +sixel_quant_apply_palette( + unsigned char /* out */ *result, + unsigned char /* in */ *data, + int /* in */ width, + int /* in */ height, + int /* in */ depth, + unsigned char /* in */ *palette, + int /* in */ reqcolor, + int const /* in */ methodForDiffuse, + int /* in */ foptimize, + int /* in */ foptimize_palette, + int /* in */ complexion, + unsigned short /* in */ *cachetable, + int /* in */ *ncolor, + sixel_allocator_t /* in */ *allocator); void -sixel_quant_free_palette(unsigned char * data); +sixel_quant_free_palette( + unsigned char /* in */ *data, + sixel_allocator_t /* in */ *allocator); #if HAVE_TESTS int From 37a9d7f1f4dd5c53c79e4be9a9cfc4992629904c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 17:43:30 +0900 Subject: [PATCH 429/451] Use allocator object in STBI loader --- src/loader.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/loader.c b/src/loader.c index 623ee0f6..9f6889a8 100644 --- a/src/loader.c +++ b/src/loader.c @@ -41,9 +41,6 @@ # define memmove(d, s, n) (bcopy ((s), (d), (n))) #endif -#define STBI_NO_STDIO 1 -#include "stb_image.h" - #ifdef HAVE_GDK_PIXBUF2 # if HAVE_DIAGNOSTIC_TYPEDEF_REDEFINITION # pragma GCC diagnostic push @@ -75,6 +72,30 @@ #include "fromgif.h" #include "allocator.h" +sixel_allocator_t *stbi_allocator; + +void * +stbi_malloc(size_t n) +{ + return sixel_allocator_malloc(stbi_allocator, n); +} + +void * +stbi_realloc(void *p, size_t n) +{ + return sixel_allocator_realloc(stbi_allocator, p, n); +} + +void +stbi_free(void *p) +{ + return sixel_allocator_free(stbi_allocator, p); +} + +#define STBI_MALLOC stbi_malloc +#define STBI_REALLOC stbi_realloc +#define STBI_FREE stbi_free + #define STBI_NO_STDIO 1 #define STB_IMAGE_IMPLEMENTATION 1 #include "stb_image.h" @@ -781,6 +802,7 @@ load_with_builtin( if (SIXEL_FAILED(status)) { goto end; } + stbi_allocator = pchunk->allocator; stbi__start_mem(&s, pchunk->buffer, pchunk->size); frame->pixels = stbi__load_main(&s, &frame->width, &frame->height, &depth, 3); if (!frame->pixels) { From ac5e3a765c423d9fea44bf959a36aa48e026518f Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 18:02:57 +0900 Subject: [PATCH 430/451] Use allocator object in frompnm.c --- src/frompnm.c | 75 ++++++++++++++++++++++++++++++++++++--------------- src/frompnm.h | 17 ++++++++---- src/loader.c | 22 ++++++++------- 3 files changed, 78 insertions(+), 36 deletions(-) diff --git a/src/frompnm.c b/src/frompnm.c index ba2e0cfd..0d46fb9f 100644 --- a/src/frompnm.c +++ b/src/frompnm.c @@ -51,17 +51,32 @@ pnm_get_line(unsigned char *p, unsigned char *end, unsigned char *line) } -unsigned char * -load_pnm(unsigned char *p, int length, - int *psx, int *psy, - unsigned char **ppalette, int *pncolors, - int *ppixelformat) +SIXELSTATUS +load_pnm(unsigned char /* in */ *p, + int /* in */ length, + sixel_allocator_t /* in */ *allocator, + unsigned char /* out */ **result, + int /* out */ *psx, + int /* out */ *psy, + unsigned char /* out */ **ppalette, + int /* out */ *pncolors, + int /* out */ *ppixelformat) { - int n, i, b, x, y, component[3]; - int ascii, maps; - int width, height, deps; - unsigned char *result; - unsigned char *s, *end, tmp[256]; + SIXELSTATUS status = SIXEL_FALSE; + int n; + int i; + int b; + int x; + int y; + int component[3]; + int ascii; + int maps; + int width; + int height; + int deps; + unsigned char *s; + unsigned char *end; + unsigned char tmp[256]; (void) ppalette; (void) pncolors; @@ -71,9 +86,13 @@ load_pnm(unsigned char *p, int length, end = p + length; p = pnm_get_line(p, end, tmp); + *result = NULL; if (tmp[0] != 'P') { - return NULL; + status = SIXEL_RUNTIME_ERROR; + sixel_helper_set_additional_message( + "load_pnm: first character is not 'P'."); + goto end; } switch(tmp[1]) { @@ -102,7 +121,10 @@ load_pnm(unsigned char *p, int length, maps = 2; break; default: - return NULL; + status = SIXEL_RUNTIME_ERROR; + sixel_helper_set_additional_message( + "load_pnm: unknown ppm format."); + goto end; } p = pnm_get_line(p, end, tmp); @@ -133,15 +155,22 @@ load_pnm(unsigned char *p, int length, } if (width < 1 || height < 1 || deps < 1) { - return NULL; + status = SIXEL_RUNTIME_ERROR; + sixel_helper_set_additional_message( + "load_pnm: invalid data detected."); + goto end; } - result = (unsigned char *)malloc(width * height * 3 + 1); - if (result == NULL) { - return NULL; + *result = (unsigned char *)sixel_allocator_malloc(allocator, + width * height * 3 + 1); + if (*result == NULL) { + status = SIXEL_BAD_ALLOCATION; + sixel_helper_set_additional_message( + "load_pnm: sixel_allocator_malloc() failed."); + goto end; } - memset(result, 0, width * height * 3 + 1); + memset(*result, 0, width * height * 3 + 1); for (y = 0 ; y < height ; y++) { for (x = 0 ; x < width ; x++) { @@ -203,16 +232,20 @@ load_pnm(unsigned char *p, int length, break; } - *(result + (y * width + x) * 3 + 0) = component[0]; - *(result + (y * width + x) * 3 + 1) = component[1]; - *(result + (y * width + x) * 3 + 2) = component[2]; + *(*result + (y * width + x) * 3 + 0) = component[0]; + *(*result + (y * width + x) * 3 + 1) = component[1]; + *(*result + (y * width + x) * 3 + 2) = component[2]; } } *psx = width; *psy = height; *ppixelformat = SIXEL_PIXELFORMAT_RGB888; - return result; + + status = SIXEL_OK; + +end: + return status; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ diff --git a/src/frompnm.h b/src/frompnm.h index 2b1f8b0b..a782b8fc 100644 --- a/src/frompnm.h +++ b/src/frompnm.h @@ -22,16 +22,23 @@ #ifndef LIBSIXEL_FROMPNM_H #define LIBSIXEL_FROMPNM_H +#include + #ifdef __cplusplus extern "C" { #endif /* exported functions */ -unsigned char * -load_pnm(unsigned char *p, int len, - int *psx, int *psy, - unsigned char **ppalette, int *pncolors, - int *ppixelformat); +SIXELSTATUS +load_pnm(unsigned char /* in */ *p, + int /* in */ len, + sixel_allocator_t /* in */ *allocator, + unsigned char /* out */ **result, + int /* out */ *psx, + int /* out */ *psy, + unsigned char /* out */ **ppalette, + int /* out */ *pncolors, + int /* out */ *ppixelformat); #ifdef __cplusplus } diff --git a/src/loader.c b/src/loader.c index 9f6889a8..9630e85b 100644 --- a/src/loader.c +++ b/src/loader.c @@ -724,16 +724,16 @@ load_with_builtin( goto end; } /* pnm */ - frame->pixels = load_pnm(pchunk->buffer, - pchunk->size, - &frame->width, - &frame->height, - fuse_palette ? &frame->palette: NULL, - &frame->ncolors, - &frame->pixelformat); - if (!frame->pixels) { - status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - sixel_helper_set_additional_message("load_pnm() failed."); + status = load_pnm(pchunk->buffer, + pchunk->size, + frame->allocator, + &frame->pixels, + &frame->width, + &frame->height, + fuse_palette ? &frame->palette: NULL, + &frame->ncolors, + &frame->pixelformat); + if (SIXEL_FAILED(status)) { goto end; } } @@ -840,6 +840,8 @@ load_with_builtin( goto end; } + status = SIXEL_OK; + end: sixel_frame_unref(frame); From a2209f8b1b3e5e4777e01a1610ab7adfab0213a9 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 19:30:45 +0900 Subject: [PATCH 431/451] Suppress a sign-compare warnings --- src/chunk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chunk.c b/src/chunk.c index b97f9e88..1c6cc00a 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -257,7 +257,7 @@ sixel_chunk_from_file( int ret; FILE *f; int n; - int const bucket_size = 4096; + size_t const bucket_size = 4096; status = open_binary_file(&f, filename); if (SIXEL_FAILED(status)) { From 1f57dfeb593b35aecbdede5f0cbcff9ee1ab0f09 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 20:05:54 +0900 Subject: [PATCH 432/451] Use allocator object in fromsixel.c --- src/fromsixel.c | 130 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 93 insertions(+), 37 deletions(-) diff --git a/src/fromsixel.c b/src/fromsixel.c index 5f2010e3..f9087b10 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -207,16 +207,18 @@ sixel_getparams(unsigned char *p, int *param, int *len) /* convert sixel data into indexed pixel bytes and palette data */ /* TODO: make "free" function as an argument */ -SIXELAPI int -sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ - int /* in */ len, /* size of sixel bytes */ - unsigned char /* out */ **pixels, /* decoded pixels */ - int /* out */ *pwidth, /* image width */ - int /* out */ *pheight, /* image height */ - unsigned char /* out */ **palette, /* ARGB palette */ - int /* out */ *ncolors, /* palette size (<= 256) */ - sixel_allocator_function /* out */ allocator) /* malloc function */ +SIXELAPI SIXELSTATUS +sixel_decode2( + unsigned char /* in */ *p, /* sixel bytes */ + int /* in */ len, /* size of sixel bytes */ + unsigned char /* out */ **pixels, /* decoded pixels */ + int /* out */ *pwidth, /* image width */ + int /* out */ *pheight, /* image height */ + unsigned char /* out */ **palette, /* ARGB palette */ + int /* out */ *ncolors, /* palette size (<= 256) */ + sixel_allocator_t /* in */ *allocator) /* allocator object */ { + SIXELSTATUS status = SIXEL_FALSE; int n; int i; int r; @@ -248,22 +250,40 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ (void) len; - posision_x = posision_y = 0; - max_x = max_y = 0; + if (pixels == NULL) { + status = SIXEL_BAD_ARGUMENT; + goto end; + } + + posision_x = 0; + posision_y = 0; + max_x = 0; + max_y = 0; attributed_pan = 2; attributed_pad = 1; - attributed_ph = attributed_pv = 0; + attributed_ph = 0; + attributed_pv = 0; repeat_count = 1; color_index = 15; max_color_index = 2; background_color_index = 0; + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, NULL, NULL, NULL, NULL); + if (SIXEL_FAILED(status)) { + goto end; + } + } else { + sixel_allocator_ref(allocator); + } + + *pixels = NULL; imsx = 2048; imsy = 2048; - imbuf = (unsigned char *)malloc(imsx * imsy); - + imbuf = (unsigned char *)sixel_allocator_malloc(allocator, imsx * imsy); if (imbuf == NULL) { - return (-1); + status = SIXEL_BAD_ALLOCATION; + goto end; } for (n = 0; n < 16; n++) { @@ -375,16 +395,17 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ if (imsx < attributed_ph || imsy < attributed_pv) { dmsx = imsx > attributed_ph ? imsx : attributed_ph; dmsy = imsy > attributed_pv ? imsy : attributed_pv; - dmbuf = (unsigned char *)malloc(dmsx * dmsy); + dmbuf = (unsigned char *)sixel_allocator_malloc(allocator, dmsx * dmsy); if (dmbuf == NULL) { - free(imbuf); - return (-1); + sixel_allocator_free(allocator, imbuf); + status = SIXEL_BAD_ALLOCATION; + goto end; } memset(dmbuf, background_color_index, dmsx * dmsy); for (y = 0; y < imsy; ++y) { memcpy(dmbuf + dmsx * y, imbuf + imsx * y, imsx); } - free(imbuf); + sixel_allocator_free(allocator, imbuf); imsx = dmsx; imsy = dmsy; imbuf = dmbuf; @@ -449,16 +470,16 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ dmsx = nx; dmsy = ny; - dmbuf = (unsigned char *)malloc(dmsx * dmsy); + dmbuf = (unsigned char *)sixel_allocator_malloc(allocator, dmsx * dmsy); if (dmbuf == NULL) { - free(imbuf); - return (-1); + sixel_allocator_free(allocator, imbuf); + goto end; } memset(dmbuf, background_color_index, dmsx * dmsy); for (y = 0; y < imsy; ++y) { memcpy(dmbuf + dmsx * y, imbuf + imsx * y, imsx); } - free(imbuf); + sixel_allocator_free(allocator, imbuf); imsx = dmsx; imsy = dmsy; imbuf = dmbuf; @@ -532,9 +553,11 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ if (imsx > max_x || imsy > max_y) { dmsx = max_x; dmsy = max_y; - if ((dmbuf = (unsigned char *)malloc(dmsx * dmsy)) == NULL) { - free(imbuf); - return (-1); + dmbuf = (unsigned char *)sixel_allocator_malloc(allocator, dmsx * dmsy); + if (dmbuf == NULL) { + sixel_allocator_free(allocator, imbuf); + status = SIXEL_BAD_ALLOCATION; + goto end; } for (y = 0; y < dmsy; ++y) { memcpy(dmbuf + dmsx * y, imbuf + imsx * y, dmsx); @@ -545,24 +568,57 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ imbuf = dmbuf; } - *pwidth = imsx; - *pheight = imsy; *ncolors = max_color_index + 1; - if (allocator) { - *pixels = (unsigned char *)allocator(imsx * imsy); - memcpy(*pixels, imbuf, imsx * imsy); - free(imbuf); - *palette = (unsigned char *)allocator(*ncolors * 3); - } else { - *pixels = imbuf; - *palette = (unsigned char *)malloc(*ncolors * 3); + *palette = (unsigned char *)sixel_allocator_malloc(allocator, *ncolors * 3); + if (palette == NULL) { + sixel_allocator_free(allocator, imbuf); + status = SIXEL_BAD_ALLOCATION; + goto end; } for (n = 0; n < *ncolors; ++n) { (*palette)[n * 3 + 0] = sixel_palet[n] >> 16 & 0xff; (*palette)[n * 3 + 1] = sixel_palet[n] >> 8 & 0xff; (*palette)[n * 3 + 2] = sixel_palet[n] & 0xff; } - return 0; + + *pwidth = imsx; + *pheight = imsy; + *pixels = imbuf; + + status = SIXEL_OK; + +end: + sixel_allocator_ref(allocator); + return status; +} + + +SIXELAPI SIXELSTATUS +sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ + int /* in */ len, /* size of sixel bytes */ + unsigned char /* out */ **pixels, /* decoded pixels */ + int /* out */ *pwidth, /* image width */ + int /* out */ *pheight, /* image height */ + unsigned char /* out */ **palette, /* ARGB palette */ + int /* out */ *ncolors, /* palette size (<= 256) */ + sixel_allocator_function /* in */ fn_malloc) /* malloc function */ +{ + SIXELSTATUS status = SIXEL_FALSE; + sixel_allocator_t *allocator = NULL; + + status = sixel_allocator_new(&allocator, fn_malloc, NULL, NULL, NULL); + if (SIXEL_FAILED(status)) { + goto end; + } + + status = sixel_decode2(p, len, pixels, pwidth, pheight, palette, ncolors, allocator); + if (SIXEL_FAILED(status)) { + goto end; + } + +end: + sixel_allocator_unref(allocator); + return status; } /* emacs, -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ From 318b5dce8b2ee89d9c68b4f69b5a2c28b0dcd620 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 21:16:11 +0900 Subject: [PATCH 433/451] Use allocator object in writer.c --- include/sixel.h.in | 28 ++++++++++---- src/decoder.c | 17 +++++--- src/fromsixel.c | 4 +- src/writer.c | 96 +++++++++++++++++++++++++++++----------------- 4 files changed, 93 insertions(+), 52 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index b28502e4..c35d4c72 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -725,6 +725,17 @@ sixel_encode( sixel_output_t /* in */ *context); /* output context */ /* convert sixel data into indexed pixel bytes and palette data */ +SIXELAPI SIXELSTATUS +sixel_decode_raw( + unsigned char /* in */ *p, /* sixel bytes */ + int /* in */ len, /* size of sixel bytes */ + unsigned char /* out */ **pixels, /* decoded pixels */ + int /* out */ *pwidth, /* image width */ + int /* out */ *pheight, /* image height */ + unsigned char /* out */ **palette, /* ARGB palette */ + int /* out */ *ncolors, /* palette size (<= 256) */ + sixel_allocator_t /* in */ *allocator); /* allocator object */ + SIXELAPI SIXELSTATUS sixel_decode( unsigned char /* in */ *sixels, /* sixel bytes */ @@ -734,7 +745,7 @@ sixel_decode( int /* out */ *pheight, /* image height */ unsigned char /* out */ **palette, /* RGBA palette */ int /* out */ *ncolors, /* palette size (<= 256) */ - sixel_allocator_function /* out */ allocator); /* malloc function */ + sixel_allocator_function /* in */ fn_malloc); /* malloc function */ #ifdef __cplusplus } @@ -943,13 +954,14 @@ sixel_helper_load_image_file( /* write image to file */ SIXELAPI SIXELSTATUS sixel_helper_write_image_file( - unsigned char /* in */ *data, /* source pixel data */ - int /* in */ width, /* source data width */ - int /* in */ height, /* source data height */ - unsigned char /* in */ *palette, /* palette of source data */ - int /* in */ pixelformat, /* source pixelFormat */ - char const /* in */ *filename, /* destination filename */ - int /* in */ imageformat); /* one of enum imageformat */ + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename, /* destination filename */ + int /* in */ imageformat, /* one of enum imageformat */ + sixel_allocator_t /* in */ *allocator); /* allocator object */ #ifdef __cplusplus } diff --git a/src/decoder.c b/src/decoder.c index 8b8d5722..9359f1b2 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -61,7 +61,6 @@ #endif #include "decoder.h" -#include "allocator.h" static char * @@ -289,10 +288,15 @@ sixel_decoder_decode( fclose(input_fp); } - status = sixel_decode(raw_data, raw_len, &indexed_pixels, - &sx, &sy, &palette, &ncolors, - decoder->allocator->fn_malloc); - + status = sixel_decode_raw( + raw_data, + raw_len, + &indexed_pixels, + &sx, + &sy, + &palette, + &ncolors, + decoder->allocator); if (SIXEL_FAILED(status)) { goto end; } @@ -300,7 +304,8 @@ sixel_decoder_decode( status = sixel_helper_write_image_file(indexed_pixels, sx, sy, palette, SIXEL_PIXELFORMAT_PAL8, decoder->output, - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + decoder->allocator); if (SIXEL_FAILED(status)) { goto end; diff --git a/src/fromsixel.c b/src/fromsixel.c index f9087b10..3aacde99 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -208,7 +208,7 @@ sixel_getparams(unsigned char *p, int *param, int *len) /* convert sixel data into indexed pixel bytes and palette data */ /* TODO: make "free" function as an argument */ SIXELAPI SIXELSTATUS -sixel_decode2( +sixel_decode_raw( unsigned char /* in */ *p, /* sixel bytes */ int /* in */ len, /* size of sixel bytes */ unsigned char /* out */ **pixels, /* decoded pixels */ @@ -611,7 +611,7 @@ sixel_decode(unsigned char /* in */ *p, /* sixel bytes */ goto end; } - status = sixel_decode2(p, len, pixels, pwidth, pheight, palette, ncolors, allocator); + status = sixel_decode_raw(p, len, pixels, pwidth, pheight, palette, ncolors, allocator); if (SIXEL_FAILED(status)) { goto end; } diff --git a/src/writer.c b/src/writer.c index b1fb966b..8dc42cd0 100644 --- a/src/writer.c +++ b/src/writer.c @@ -62,12 +62,13 @@ stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, static SIXELSTATUS write_png_to_file( - unsigned char /* in */ *data, /* source pixel data */ - int /* in */ width, /* source data width */ - int /* in */ height, /* source data height */ - unsigned char /* in */ *palette, /* palette of source data */ - int /* in */ pixelformat, /* source pixelFormat */ - char const /* in */ *filename) /* destination filename */ + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename, /* destination filename */ + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; FILE *output_fp = NULL; @@ -98,11 +99,11 @@ write_png_to_file( "write_png_to_file: no palette is given"); goto end; } - new_pixels = malloc(width * height * 4); + new_pixels = sixel_allocator_malloc(allocator, width * height * 4); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( - "write_png_to_file: malloc() failed"); + "write_png_to_file: sixel_allocator_malloc() failed"); goto end; } src = new_pixels + width * height * 3; @@ -129,11 +130,11 @@ write_png_to_file( goto end; } src = data; - dst = pixels = new_pixels = malloc(width * height * 3); + dst = pixels = new_pixels = sixel_allocator_malloc(allocator, width * height * 3); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( - "write_png_to_file: malloc() failed"); + "write_png_to_file: sixel_allocator_malloc() failed"); goto end; } for (i = 0; i < width * height; ++i, ++src) { @@ -147,11 +148,12 @@ write_png_to_file( break; case SIXEL_PIXELFORMAT_G8: src = data; - dst = pixels = new_pixels = malloc(width * height * 3); + dst = pixels = new_pixels + = sixel_allocator_malloc(allocator, width * height * 3); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( - "write_png_to_file: malloc() failed"); + "write_png_to_file: sixel_allocator_malloc() failed"); goto end; } if (palette) { @@ -177,11 +179,11 @@ write_png_to_file( case SIXEL_PIXELFORMAT_BGR888: case SIXEL_PIXELFORMAT_RGBA8888: case SIXEL_PIXELFORMAT_ARGB8888: - pixels = new_pixels = malloc(width * height * 3); + pixels = new_pixels = sixel_allocator_malloc(allocator, width * height * 3); if (new_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( - "write_png_to_file: malloc() failed"); + "write_png_to_file: sixel_allocator_malloc() failed"); goto end; } status = sixel_helper_normalize_pixelformat(pixels, @@ -216,11 +218,11 @@ write_png_to_file( } #if HAVE_LIBPNG - rows = malloc(height * sizeof(unsigned char *)); + rows = sixel_allocator_malloc(allocator, height * sizeof(unsigned char *)); if (rows == NULL) { status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( - "write_png_to_file: malloc() failed"); + "write_png_to_file: sixel_allocator_malloc() failed"); goto end; } for (y = 0; y < height; ++y) { @@ -276,14 +278,14 @@ write_png_to_file( fclose(output_fp); } #if HAVE_LIBPNG - free(rows); + sixel_allocator_free(allocator, rows); if (png_ptr) { png_destroy_write_struct(&png_ptr, &info_ptr); } #else - free(png_data); + sixel_allocator_free(allocator, png_data); #endif /* HAVE_LIBPNG */ - free(new_pixels); + sixel_allocator_free(allocator, new_pixels); return status; } @@ -291,20 +293,30 @@ write_png_to_file( SIXELAPI SIXELSTATUS sixel_helper_write_image_file( - unsigned char /* in */ *data, /* source pixel data */ - int /* in */ width, /* source data width */ - int /* in */ height, /* source data height */ - unsigned char /* in */ *palette, /* palette of source data */ - int /* in */ pixelformat, /* source pixelFormat */ - char const /* in */ *filename, /* destination filename */ - int /* in */ imageformat) /* destination imageformat */ + unsigned char /* in */ *data, /* source pixel data */ + int /* in */ width, /* source data width */ + int /* in */ height, /* source data height */ + unsigned char /* in */ *palette, /* palette of source data */ + int /* in */ pixelformat, /* source pixelFormat */ + char const /* in */ *filename, /* destination filename */ + int /* in */ imageformat, /* destination imageformat */ + sixel_allocator_t /* in */ *allocator) /* allocator object */ { SIXELSTATUS status = SIXEL_FALSE; + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, NULL, NULL, NULL, NULL); + if (SIXEL_FAILED(status)) { + goto end; + } + } else { + sixel_allocator_ref(allocator); + } + switch (imageformat) { case SIXEL_FORMAT_PNG: status = write_png_to_file(data, width, height, palette, - pixelformat, filename); + pixelformat, filename, allocator); break; case SIXEL_FORMAT_GIF: case SIXEL_FORMAT_BMP: @@ -319,9 +331,12 @@ sixel_helper_write_image_file( case SIXEL_FORMAT_HDR: default: status = SIXEL_NOT_IMPLEMENTED; + goto end; break; } +end: + sixel_allocator_unref(allocator); return status; } @@ -341,7 +356,8 @@ test1(void) NULL, SIXEL_PIXELFORMAT_RGB888, "output.gif", - SIXEL_FORMAT_GIF); + SIXEL_FORMAT_GIF, + NULL); if (!SIXEL_FAILED(status)) { goto error; @@ -367,7 +383,8 @@ test2(void) NULL, SIXEL_PIXELFORMAT_RGB888, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (SIXEL_FAILED(status)) { goto error; @@ -394,7 +411,8 @@ test3(void) NULL, SIXEL_PIXELFORMAT_G8, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (SIXEL_FAILED(status)) { goto error; @@ -407,7 +425,8 @@ test3(void) sixel_dither_get_palette(dither), SIXEL_PIXELFORMAT_G8, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (SIXEL_FAILED(status)) { goto error; @@ -434,7 +453,8 @@ test4(void) sixel_dither_get_palette(dither), SIXEL_PIXELFORMAT_PAL1, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (SIXEL_FAILED(status)) { goto error; } @@ -446,7 +466,8 @@ test4(void) NULL, SIXEL_PIXELFORMAT_PAL1, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (status != SIXEL_BAD_ARGUMENT) { goto error; } @@ -473,7 +494,8 @@ test5(void) sixel_dither_get_palette(dither), SIXEL_PIXELFORMAT_PAL8, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (SIXEL_FAILED(status)) { goto error; } @@ -485,7 +507,8 @@ test5(void) NULL, SIXEL_PIXELFORMAT_PAL8, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (status != SIXEL_BAD_ARGUMENT) { goto error; } @@ -511,7 +534,8 @@ test6(void) NULL, SIXEL_PIXELFORMAT_BGR888, "test-output.png", - SIXEL_FORMAT_PNG); + SIXEL_FORMAT_PNG, + NULL); if (SIXEL_FAILED(status)) { goto error; From 3dbefa5f413fe56d4b7109b10b80194555261561 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 21:28:28 +0900 Subject: [PATCH 434/451] Use allocator object in tosixel.c --- src/tosixel.c | 157 +++++++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 73 deletions(-) diff --git a/src/tosixel.c b/src/tosixel.c index 53e56627..04b6eea9 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -457,10 +457,17 @@ output_hls_palette_definition( static SIXELSTATUS -sixel_encode_body(unsigned char *pixels, int width, int height, - unsigned char *palette, int ncolors, int keycolor, - int bodyonly, sixel_output_t *context, - unsigned char *palstate) +sixel_encode_body( + unsigned char /* in */ *pixels, + int /* in */ width, + int /* in */ height, + unsigned char /* in */ *palette, + int /* in */ ncolors, + int /* in */ keycolor, + int /* in */ bodyonly, + sixel_output_t /* in */ *output, + unsigned char /* in */ *palstate, + sixel_allocator_t /* in */ *allocator) { SIXELSTATUS status = SIXEL_FALSE; int x; @@ -481,34 +488,27 @@ sixel_encode_body(unsigned char *pixels, int width, int height, goto end; } len = ncolors * width; - context->active_palette = (-1); + output->active_palette = (-1); -#if HAVE_CALLOC - map = (unsigned char *)calloc(len, sizeof(unsigned char)); + map = (unsigned char *)sixel_allocator_calloc(allocator, + len, + sizeof(unsigned char)); if (map == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; } -#else - map = (unsigned char *)malloc(len); - if (map == NULL) { - status = SIXEL_BAD_ALLOCATION; - goto end; - } - memset(map, 0, len); -#endif if (!bodyonly && (ncolors != 2 || keycolor == (-1))) { - if (context->palette_type == SIXEL_PALETTETYPE_HLS) { + if (output->palette_type == SIXEL_PALETTETYPE_HLS) { for (n = 0; n < ncolors; n++) { - status = output_hls_palette_definition(context, palette, n, keycolor); + status = output_hls_palette_definition(output, palette, n, keycolor); if (SIXEL_FAILED(status)) { goto end; } } } else { for (n = 0; n < ncolors; n++) { - status = output_rgb_palette_definition(context, palette, n, keycolor); + status = output_rgb_palette_definition(output, palette, n, keycolor); if (SIXEL_FAILED(status)) { goto end; } @@ -517,7 +517,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, } for (y = i = 0; y < height; y++) { - if (context->encode_policy != SIXEL_ENCODEPOLICY_SIZE) { + if (output->encode_policy != SIXEL_ENCODEPOLICY_SIZE) { fillable = 0; } else if (palstate) { @@ -569,10 +569,11 @@ sixel_encode_body(unsigned char *pixels, int width, int height, mx = mx + n - 1; } - if ((np = context->node_free) != NULL) { - context->node_free = np->next; + if ((np = output->node_free) != NULL) { + output->node_free = np->next; } else { - np = (sixel_node_t *)malloc(sizeof(sixel_node_t)); + np = (sixel_node_t *)sixel_allocator_malloc(allocator, + sizeof(sixel_node_t)); if (np == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -584,7 +585,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, np->mx = mx; np->map = map + c * width; - top.next = context->node_top; + top.next = output->node_top; tp = ⊤ while (tp->next != NULL) { @@ -598,7 +599,7 @@ sixel_encode_body(unsigned char *pixels, int width, int height, np->next = tp->next; tp->next = np; - context->node_top = top.next; + output->node_top = top.next; sx = mx - 1; } @@ -607,28 +608,28 @@ sixel_encode_body(unsigned char *pixels, int width, int height, if (y != 5) { /* DECGNL Graphics Next Line */ - context->buffer[context->pos] = '-'; - sixel_advance(context, 1); + output->buffer[output->pos] = '-'; + sixel_advance(output, 1); } - for (x = 0; (np = context->node_top) != NULL;) { + for (x = 0; (np = output->node_top) != NULL;) { sixel_node_t *next; if (x > np->sx) { /* DECGCR Graphics Carriage Return */ - context->buffer[context->pos] = '$'; - sixel_advance(context, 1); + output->buffer[output->pos] = '$'; + sixel_advance(output, 1); x = 0; } if (fillable) { memset(np->map + np->sx, (1 << i) - 1, np->mx - np->sx); } - status = sixel_put_node(context, &x, np, ncolors, keycolor); + status = sixel_put_node(output, &x, np, ncolors, keycolor); if (SIXEL_FAILED(status)) { goto end; } next = np->next; - sixel_node_del(context, np); + sixel_node_del(output, np); np = next; while (np != NULL) { @@ -640,12 +641,12 @@ sixel_encode_body(unsigned char *pixels, int width, int height, if (fillable) { memset(np->map + np->sx, (1 << i) - 1, np->mx - np->sx); } - status = sixel_put_node(context, &x, np, ncolors, keycolor); + status = sixel_put_node(output, &x, np, ncolors, keycolor); if (SIXEL_FAILED(status)) { goto end; } next = np->next; - sixel_node_del(context, np); + sixel_node_del(output, np); np = next; } @@ -657,57 +658,57 @@ sixel_encode_body(unsigned char *pixels, int width, int height, } if (palstate) { - context->buffer[context->pos] = '$'; - sixel_advance(context, 1); + output->buffer[output->pos] = '$'; + sixel_advance(output, 1); } status = SIXEL_OK; end: /* free nodes */ - while ((np = context->node_free) != NULL) { - context->node_free = np->next; - free(np); + while ((np = output->node_free) != NULL) { + output->node_free = np->next; + sixel_allocator_free(allocator, np); } - context->node_top = NULL; + output->node_top = NULL; - free(map); + sixel_allocator_free(allocator, map); return status; } static SIXELSTATUS -sixel_encode_footer(sixel_output_t *context) +sixel_encode_footer(sixel_output_t *output) { SIXELSTATUS status = SIXEL_FALSE; - if (!context->skip_dcs_envelope && !context->penetrate_multiplexer) { - if (context->has_8bit_control) { - sixel_puts((char *)context->buffer + context->pos, + if (!output->skip_dcs_envelope && !output->penetrate_multiplexer) { + if (output->has_8bit_control) { + sixel_puts((char *)output->buffer + output->pos, DCS_END_8BIT, DCS_END_8BIT_SIZE); - sixel_advance(context, DCS_END_8BIT_SIZE); + sixel_advance(output, DCS_END_8BIT_SIZE); } else { - sixel_puts((char *)context->buffer + context->pos, + sixel_puts((char *)output->buffer + output->pos, DCS_END_7BIT, DCS_END_7BIT_SIZE); - sixel_advance(context, DCS_END_7BIT_SIZE); + sixel_advance(output, DCS_END_7BIT_SIZE); } } /* flush buffer */ - if (context->pos > 0) { - if (context->penetrate_multiplexer) { - penetrate(context, context->pos, + if (output->pos > 0) { + if (output->penetrate_multiplexer) { + penetrate(output, output->pos, DCS_START_7BIT, DCS_END_7BIT, DCS_START_7BIT_SIZE, DCS_END_7BIT_SIZE); - context->fn_write((char *)DCS_7BIT("\033") DCS_7BIT("\\"), + output->fn_write((char *)DCS_7BIT("\033") DCS_7BIT("\\"), (DCS_START_7BIT_SIZE + 1 + DCS_END_7BIT_SIZE) * 2, - context->priv); + output->priv); } else { - context->fn_write((char *)context->buffer, context->pos, context->priv); + output->fn_write((char *)output->buffer, output->pos, output->priv); } } @@ -718,8 +719,12 @@ sixel_encode_footer(sixel_output_t *context) static SIXELSTATUS -sixel_encode_dither(unsigned char *pixels, int width, int height, - sixel_dither_t *dither, sixel_output_t *context) +sixel_encode_dither( + unsigned char /* in */ *pixels, + int /* in */ width, + int /* in */ height, + sixel_dither_t /* in */ *dither, + sixel_output_t /* in */ *output) { SIXELSTATUS status = SIXEL_FALSE; unsigned char *paletted_pixels = NULL; @@ -729,7 +734,8 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, case SIXEL_PIXELFORMAT_PAL1: case SIXEL_PIXELFORMAT_PAL2: case SIXEL_PIXELFORMAT_PAL4: - paletted_pixels = (unsigned char *)malloc(width * height * 3); + paletted_pixels = (unsigned char *)sixel_allocator_malloc(dither->allocator, + width * height * 3); if (paletted_pixels == NULL) { status = SIXEL_BAD_ALLOCATION; goto end; @@ -762,7 +768,7 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, break; } - status = sixel_encode_header(width, height, context); + status = sixel_encode_header(width, height, output); if (SIXEL_FAILED(status)) { goto end; } @@ -774,19 +780,20 @@ sixel_encode_dither(unsigned char *pixels, int width, int height, dither->ncolors, dither->keycolor, dither->bodyonly, - context, - NULL); + output, + NULL, + dither->allocator); if (SIXEL_FAILED(status)) { goto end; } - status = sixel_encode_footer(context); + status = sixel_encode_footer(output); if (SIXEL_FAILED(status)) { goto end; } end: - free(paletted_pixels); + sixel_allocator_free(dither->allocator, paletted_pixels); return status; } @@ -1177,7 +1184,7 @@ sixel_apply_15bpp_dither( static SIXELSTATUS sixel_encode_highcolor(unsigned char *pixels, int width, int height, - sixel_dither_t *dither, sixel_output_t *context) + sixel_dither_t *dither, sixel_output_t *output) { SIXELSTATUS status = SIXEL_FALSE; unsigned char *paletted_pixels = NULL; @@ -1197,7 +1204,8 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, if (dither->pixelformat != SIXEL_PIXELFORMAT_RGB888) { /* normalize pixelfromat */ - normalized_pixels = (unsigned char *)malloc(width * height * 3); + normalized_pixels = (unsigned char *)sixel_allocator_malloc(dither->allocator, + width * height * 3); if (normalized_pixels == NULL) { goto error; } @@ -1211,7 +1219,8 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, } pixels = normalized_pixels; } - paletted_pixels = (unsigned char *)malloc(whole_size); + paletted_pixels = (unsigned char *)sixel_allocator_malloc(dither->allocator, + whole_size); if (paletted_pixels == NULL) { goto error; } @@ -1320,7 +1329,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, orig_height = height; if (output_count++ == 0) { - status = sixel_encode_header(width, height, context); + status = sixel_encode_header(width, height, output); if (SIXEL_FAILED(status)) { goto error; } @@ -1333,8 +1342,9 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, 255, 255, dither->bodyonly, - context, - palstate); + output, + palstate, + dither->allocator); if (SIXEL_FAILED(status)) { goto error; } @@ -1352,7 +1362,7 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, end: if (output_count == 0) { - status = sixel_encode_header(width, height, context); + status = sixel_encode_header(width, height, output); if (SIXEL_FAILED(status)) { goto error; } @@ -1364,20 +1374,21 @@ sixel_encode_highcolor(unsigned char *pixels, int width, int height, 255, 255, dither->bodyonly, - context, - palstate); + output, + palstate, + dither->allocator); if (SIXEL_FAILED(status)) { goto error; } - status = sixel_encode_footer(context); + status = sixel_encode_footer(output); if (SIXEL_FAILED(status)) { goto error; } error: - free(paletted_pixels); - free(normalized_pixels); + sixel_allocator_free(dither->allocator, paletted_pixels); + sixel_allocator_free(dither->allocator, normalized_pixels); return status; } From 4e872f533e39ec00b8ede897973d3c9057fa3bbd Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 21:44:00 +0900 Subject: [PATCH 435/451] Use allocator object in output.c --- include/sixel.h.in | 9 +++++ src/encoder.c | 2 +- src/output.c | 94 ++++++++++++++++++++++++++++++++++------------ src/output.h | 2 +- 4 files changed, 82 insertions(+), 25 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index c35d4c72..369324dd 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -542,6 +542,15 @@ extern "C" { #endif /* create output context object */ +SIXELAPI SIXELSTATUS +sixel_output_new( + sixel_output_t /* out */ **output, /* output object to be created */ + sixel_write_function /* in */ fn_write, /* callback for output sixel */ + void /* in */ *priv, /* private data given as + 3rd argument of fn_write */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ + SIXELAPI sixel_output_t * sixel_output_create( sixel_write_function /* in */ fn_write, /* callback for output sixel */ diff --git a/src/encoder.c b/src/encoder.c index e63a6db5..8367ff4e 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -801,7 +801,7 @@ output_sixel_with_macro( if (nwrite < 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); sixel_helper_set_additional_message( - "load_image_callback: sprintf() failed."); + "output_sixel_with_macro: sprintf() failed."); goto end; } nwrite = sixel_write_callback(buffer, strlen(buffer), &encoder->outfd); diff --git a/src/output.c b/src/output.c index 910adba1..325e2305 100644 --- a/src/output.c +++ b/src/output.c @@ -22,43 +22,87 @@ #include "config.h" #include #include +#include #include #include "output.h" +SIXELAPI SIXELSTATUS +sixel_output_new( + sixel_output_t /* out */ **output, + sixel_write_function /* in */ fn_write, + void /* in */ *priv, + sixel_allocator_t /* in */ *allocator) +{ + SIXELSTATUS status = SIXEL_FALSE; + size_t size; + + if (allocator == NULL) { + status = sixel_allocator_new(&allocator, NULL, NULL, NULL, NULL); + if (SIXEL_FAILED(status)) { + goto end; + } + } else { + sixel_allocator_ref(allocator); + } + size = sizeof(sixel_output_t) + SIXEL_OUTPUT_PACKET_SIZE * 2; + + *output = (sixel_output_t *)sixel_allocator_malloc(allocator, size); + if (*output == NULL) { + status = SIXEL_BAD_ALLOCATION; + goto end; + } + + (*output)->ref = 1; + (*output)->has_8bit_control = 0; + (*output)->has_sdm_glitch = 0; + (*output)->skip_dcs_envelope = 0; + (*output)->palette_type = SIXEL_PALETTETYPE_AUTO; + (*output)->fn_write = fn_write; + (*output)->save_pixel = 0; + (*output)->save_count = 0; + (*output)->active_palette = (-1); + (*output)->node_top = NULL; + (*output)->node_free = NULL; + (*output)->priv = priv; + (*output)->pos = 0; + (*output)->penetrate_multiplexer = 0; + (*output)->encode_policy = SIXEL_ENCODEPOLICY_AUTO; + (*output)->allocator = allocator; + + status = SIXEL_OK; + +end: + return status; +} + + SIXELAPI sixel_output_t * sixel_output_create(sixel_write_function fn_write, void *priv) { - sixel_output_t *output; - size_t size = sizeof(sixel_output_t) + SIXEL_OUTPUT_PACKET_SIZE * 2; + SIXELSTATUS status = SIXEL_FALSE; + sixel_output_t *output = NULL; - output = (sixel_output_t *)malloc(size); - if (output) { - output->ref = 1; - output->has_8bit_control = 0; - output->has_sdm_glitch = 0; - output->skip_dcs_envelope = 0; - output->palette_type = SIXEL_PALETTETYPE_AUTO; - output->fn_write = fn_write; - output->save_pixel = 0; - output->save_count = 0; - output->active_palette = (-1); - output->node_top = NULL; - output->node_free = NULL; - output->priv = priv; - output->pos = 0; - output->penetrate_multiplexer = 0; - output->encode_policy = SIXEL_ENCODEPOLICY_AUTO; + status = sixel_output_new(&output, fn_write, priv, NULL); + if (SIXEL_FAILED(status)) { + goto end; } +end: return output; } - + SIXELAPI void sixel_output_destroy(sixel_output_t *output) { - free(output); + sixel_allocator_t *allocator; + + if (output) { + allocator = output->allocator; + sixel_allocator_free(allocator, output); + sixel_allocator_unref(allocator); + } } @@ -74,8 +118,12 @@ SIXELAPI void sixel_output_unref(sixel_output_t *output) { /* TODO: be thread-safe */ - if (output && --output->ref == 0) { - sixel_output_destroy(output); + if (output) { + assert(output->ref > 0); + output->ref--; + if (output->ref == 0) { + sixel_output_destroy(output); + } } } diff --git a/src/output.h b/src/output.h index 563c66b4..419874b3 100644 --- a/src/output.h +++ b/src/output.h @@ -33,6 +33,7 @@ typedef struct sixel_node { struct sixel_output { int ref; + sixel_allocator_t *allocator; /* compatiblity flags */ @@ -72,7 +73,6 @@ struct sixel_output { void *priv; int pos; unsigned char buffer[1]; - }; #endif /* LIBSIXEL_OUTPUT_H */ From 19622e388801e4650d92973317d0e259fd6fa80d Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 22:28:28 +0900 Subject: [PATCH 436/451] Use allocator object in scale.c --- include/sixel.h.in | 3 ++- src/frame.c | 8 ++++++-- src/scale.c | 7 ++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 369324dd..dd7d492b 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -807,7 +807,8 @@ sixel_helper_scale_image( int /* in */ pixelformat, /* one of enum pixelFormat */ int /* in */ dstw, /* destination image width */ int /* in */ dsth, /* destination image height */ - int /* in */ method_for_resampling /* one of methodForResampling */ + int /* in */ method_for_resampling, /* one of methodForResampling */ + sixel_allocator_t /* in */ *allocator /* allocator object */ ); #ifdef __cplusplus diff --git a/src/frame.c b/src/frame.c index 4a4ee805..942021a9 100644 --- a/src/frame.c +++ b/src/frame.c @@ -446,10 +446,14 @@ sixel_frame_resize( status = sixel_helper_scale_image( scaled_frame, - frame->pixels, frame->width, frame->height, 3, + frame->pixels, + frame->width, + frame->height, + 3, width, height, - method_for_resampling); + method_for_resampling, + frame->allocator); if (SIXEL_FAILED(status)) { goto end; } diff --git a/src/scale.c b/src/scale.c index a836ff9b..cfa85bc4 100644 --- a/src/scale.c +++ b/src/scale.c @@ -312,7 +312,8 @@ sixel_helper_scale_image( int /* in */ pixelformat, /* one of enum pixelFormat */ int /* in */ dstw, /* destination image width */ int /* in */ dsth, /* destination image height */ - int /* in */ method_for_resampling) /* one of methodForResampling */ + int /* in */ method_for_resampling, /* one of methodForResampling */ + sixel_allocator_t /* in */ *allocator) /* allocator object */ { int const depth = sixel_helper_compute_depth(pixelformat); unsigned char *new_src = NULL; @@ -320,7 +321,7 @@ sixel_helper_scale_image( int new_pixelformat; if (depth != 3) { - new_src = (unsigned char *)malloc(srcw * srch * 3); + new_src = (unsigned char *)sixel_allocator_malloc(allocator, srcw * srch * 3); if (new_src == NULL) { return (-1); } @@ -329,7 +330,7 @@ sixel_helper_scale_image( src, pixelformat, srcw, srch); if (nret != 0) { - free(new_src); + sixel_allocator_free(allocator, new_src); return (-1); } From c8e1f303b5aa6bd3bafe0658f61eaaf93e232c43 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 22:35:30 +0900 Subject: [PATCH 437/451] Mark sixel_dither_create() function as deprecated --- include/sixel.h.in | 11 ++++++++++- src/dither.c | 8 ++++---- src/encoder.c | 19 +++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index dd7d492b..16b64bd9 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -551,7 +551,7 @@ sixel_output_new( sixel_allocator_t /* in */ *allocator); /* allocator, null if you use default allocator */ -SIXELAPI sixel_output_t * +SIXELAPI @attr_func_deprecated@ sixel_output_t * sixel_output_create( sixel_write_function /* in */ fn_write, /* callback for output sixel */ void /* in */ *priv); /* private data given as @@ -621,6 +621,14 @@ typedef struct sixel_dither sixel_dither_t; extern "C" { #endif +/* create dither context object */ +SIXELAPI SIXELSTATUS +sixel_dither_new( + sixel_dither_t /* out */ **ppdither, /* dither object to be created */ + int /* in */ ncolors, /* required colors */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ + /* create dither context object */ SIXELAPI sixel_dither_t * sixel_dither_create(int /* in */ ncolors); /* number of colors */ @@ -1041,6 +1049,7 @@ sixel_decoder_new( sixel_decoder_t /* out */ **ppdecoder, /* decoder object to be created */ sixel_allocator_t /* in */ *allocator); /* allocator, null if you use default allocator */ + SIXELAPI @attr_func_deprecated@ sixel_decoder_t * sixel_decoder_create(void); diff --git a/src/dither.c b/src/dither.c index 5e51e7ab..ed72ba8b 100644 --- a/src/dither.c +++ b/src/dither.c @@ -251,10 +251,10 @@ static const unsigned char pal_vt340_color[] = { /* create dither context object */ SIXELAPI SIXELSTATUS sixel_dither_new( - sixel_dither_t /* out */ **ppdither, /* dither object to be created */ - int /* in */ ncolors, /* required colors */ - sixel_allocator_t /* in */ *allocator) /* allocator, null if you use - default allocator */ + sixel_dither_t /* out */ **ppdither, /* dither object to be created */ + int /* in */ ncolors, /* required colors */ + sixel_allocator_t /* in */ *allocator) /* allocator, null if you use + default allocator */ { SIXELSTATUS status = SIXEL_FALSE; int headsize; diff --git a/src/encoder.c b/src/encoder.c index 8367ff4e..92364cac 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -237,7 +237,7 @@ parse_x_colorspec( } -/* generic writer function for passing to sixel_output_create() */ +/* generic writer function for passing to sixel_output_new() */ static int sixel_write_callback(char *data, int size, void *priv) { @@ -245,7 +245,7 @@ sixel_write_callback(char *data, int size, void *priv) } -/* the writer function with hex-encoding for passing to sixel_output_create() */ +/* the writer function with hex-encoding for passing to sixel_output_new() */ static int sixel_hex_write_callback( char /* in */ *data, @@ -1151,11 +1151,18 @@ load_image_callback(sixel_frame_t *frame, void *data) /* create output context */ if (encoder->fuse_macro || encoder->macro_number >= 0) { /* -u or -n option */ - output = sixel_output_create(sixel_hex_write_callback, - &encoder->outfd); + status = sixel_output_new(&output, + sixel_hex_write_callback, + &encoder->outfd, + encoder->allocator); } else { - output = sixel_output_create(sixel_write_callback, - &encoder->outfd); + status = sixel_output_new(&output, + sixel_write_callback, + &encoder->outfd, + encoder->allocator); + } + if (SIXEL_FAILED(status)) { + goto end; } sixel_output_set_8bit_availability(output, encoder->f8bit); sixel_output_set_palette_type(output, encoder->palette_type); From 4492367280ba40df57ab0fc3d04eb5b16f469bc6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 23:01:43 +0900 Subject: [PATCH 438/451] Make sixel_dither_create() as deprecated --- converters/img2sixel.c | 1 + include/sixel.h.in | 2 +- src/dither.c | 34 ++++++++++++++++++++++++++------- src/encoder.c | 43 ++++++++++++++++++++++-------------------- 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/converters/img2sixel.c b/converters/img2sixel.c index f904a822..58a93e2c 100644 --- a/converters/img2sixel.c +++ b/converters/img2sixel.c @@ -431,6 +431,7 @@ main(int argc, char *argv[]) fprintf(stderr, "%s\n%s\n", sixel_helper_format_error(status), sixel_helper_get_additional_message()); + status = (-1); end: sixel_encoder_unref(encoder); return status; diff --git a/include/sixel.h.in b/include/sixel.h.in index 16b64bd9..84819689 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -630,7 +630,7 @@ sixel_dither_new( default allocator */ /* create dither context object */ -SIXELAPI sixel_dither_t * +SIXELAPI @attr_func_deprecated@ sixel_dither_t * sixel_dither_create(int /* in */ ncolors); /* number of colors */ /* get built-in dither context object */ diff --git a/src/dither.c b/src/dither.c index ed72ba8b..560dd3e0 100644 --- a/src/dither.c +++ b/src/dither.c @@ -270,7 +270,7 @@ sixel_dither_new( } if (allocator == NULL) { - status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); + status = sixel_allocator_new(&allocator, NULL, NULL, NULL, NULL); if (SIXEL_FAILED(status)) { *ppdither = NULL; goto end; @@ -321,6 +321,8 @@ sixel_dither_new( (*ppdither)->pixelformat = SIXEL_PIXELFORMAT_RGB888; (*ppdither)->allocator = allocator; + status = SIXEL_OK; + end: return status; } @@ -384,6 +386,7 @@ SIXELAPI sixel_dither_t * sixel_dither_get( int /* in */ builtin_dither) { + SIXELSTATUS status = SIXEL_FALSE; unsigned char *palette; int ncolors; int keycolor; @@ -444,14 +447,17 @@ sixel_dither_get( goto end; } - dither = sixel_dither_create(ncolors); - if (dither) { - dither->palette = palette; - dither->keycolor = keycolor; - dither->optimized = 1; - dither->optimize_palette = 0; + status = sixel_dither_new(&dither, ncolors, NULL); + if (SIXEL_FAILED(status)) { + dither = NULL; + goto end; } + dither->palette = palette; + dither->keycolor = keycolor; + dither->optimized = 1; + dither->optimize_palette = 0; + end: return dither; } @@ -800,7 +806,14 @@ test1(void) sixel_dither_t *dither = NULL; int nret = EXIT_FAILURE; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif dither = sixel_dither_create(0); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (dither == NULL) { goto error; } @@ -820,7 +833,14 @@ test2(void) int colors; int nret = EXIT_FAILURE; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif dither = sixel_dither_create(INT_MAX); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (dither == NULL) { goto error; } diff --git a/src/encoder.c b/src/encoder.c index 92364cac..20402a9a 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -316,6 +316,7 @@ prepare_builtin_palette( typedef struct sixel_callback_context_for_mapfile { int reqcolors; sixel_dither_t *dither; + sixel_allocator_t *allocator; } sixel_callback_context_for_mapfile_t; @@ -336,10 +337,11 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) status = SIXEL_LOGIC_ERROR; goto end; } - callback_context->dither - = sixel_dither_create(sixel_frame_get_ncolors(frame)); - if (callback_context->dither == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_dither_new( + &callback_context->dither, + sixel_frame_get_ncolors(frame), + callback_context->allocator); + if (SIXEL_FAILED(status)) { goto end; } sixel_dither_set_palette(callback_context->dither, @@ -363,10 +365,11 @@ load_image_callback_for_palette(sixel_frame_t *frame, void *data) status = SIXEL_OK; break; default: - callback_context->dither - = sixel_dither_create(callback_context->reqcolors); - if (callback_context->dither == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_dither_new( + &callback_context->dither, + callback_context->reqcolors, + callback_context->allocator); + if (SIXEL_FAILED(status)) { goto end; } @@ -409,6 +412,7 @@ prepare_specified_palette( callback_context.reqcolors = reqcolors; callback_context.dither = NULL; + callback_context.allocator = allocator; status = sixel_helper_load_image_file(mapfile, 1, /* fstatic */ @@ -444,9 +448,8 @@ prepare_palette(sixel_dither_t **dither, if (former_dither) { *dither = former_dither; } else { - *dither = sixel_dither_create(-1); - if (*dither == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_dither_new(dither, (-1), encoder->allocator); + if (SIXEL_FAILED(status)) { goto end; } } @@ -487,9 +490,9 @@ prepare_palette(sixel_dither_t **dither, } } else if (sixel_frame_get_palette(frame) && (sixel_frame_get_pixelformat(frame) & SIXEL_FORMATTYPE_PALETTE)) { - *dither = sixel_dither_create(sixel_frame_get_ncolors(frame)); - if (!*dither) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_dither_new(dither, sixel_frame_get_ncolors(frame), + encoder->allocator); + if (SIXEL_FAILED(status)) { goto end; } sixel_dither_set_palette(*dither, sixel_frame_get_palette(frame)); @@ -520,9 +523,8 @@ prepare_palette(sixel_dither_t **dither, if (former_dither) { sixel_dither_unref(former_dither); } - *dither = sixel_dither_create(encoder->reqcolors); - if (*dither == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_dither_new(dither, encoder->reqcolors, encoder->allocator); + if (SIXEL_FAILED(status)) { goto end; } status = sixel_dither_initialize(*dither, @@ -1254,7 +1256,7 @@ sixel_encoder_new( int ncolors; if (allocator == NULL) { - status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); + status = sixel_allocator_new(&allocator, NULL, NULL, NULL, NULL); if (SIXEL_FAILED(status)) { goto end; } @@ -1263,7 +1265,8 @@ sixel_encoder_new( } *ppencoder - = (sixel_encoder_t *)sixel_allocator_malloc(allocator, sizeof(sixel_encoder_t)); + = (sixel_encoder_t *)sixel_allocator_malloc(allocator, + sizeof(sixel_encoder_t)); if (*ppencoder == NULL) { sixel_helper_set_additional_message( "sixel_encoder_new: sixel_allocator_malloc() failed."); @@ -2105,7 +2108,7 @@ test5(void) sixel_allocator_t *allocator = NULL; SIXELSTATUS status; - status = sixel_allocator_new(&allocator, malloc, calloc, realloc, free); + status = sixel_allocator_new(&allocator, NULL, NULL, NULL, NULL); if (SIXEL_FAILED(status)) { goto error; } From 66557099d477c7847093d12d1d4dd0c1fe6b815c Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 23:12:23 +0900 Subject: [PATCH 439/451] Make sixel_frame_create() as deprecated --- include/sixel.h.in | 3 +-- src/encoder.c | 7 +++++++ src/frame.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/include/sixel.h.in b/include/sixel.h.in index 84819689..67d98df9 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -864,8 +864,7 @@ sixel_frame_new( sixel_frame_t /* out */ **ppframe, /* frame object to be created */ sixel_allocator_t /* in */ *allocator); /* allocator, null if you use default allocator */ - -sixel_frame_t * +SIXELAPI @attr_func_deprecated@ sixel_frame_t * sixel_frame_create(void); SIXELAPI void diff --git a/src/encoder.c b/src/encoder.c index 20402a9a..31ac8c37 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -2007,7 +2007,14 @@ test2(void) goto error; } +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (encoder == NULL) { goto error; } diff --git a/src/frame.c b/src/frame.c index 942021a9..debbcc8c 100644 --- a/src/frame.c +++ b/src/frame.c @@ -83,7 +83,7 @@ sixel_frame_new( } -SIXELAPI sixel_frame_t * +SIXELAPI /* deprecated */ sixel_frame_t * sixel_frame_create(void) { SIXELSTATUS status = SIXEL_FALSE; @@ -608,7 +608,14 @@ test1(void) sixel_frame_t *frame = NULL; int nret = EXIT_FAILURE; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (frame == NULL) { goto error; } @@ -638,7 +645,15 @@ test2(void) memset(bgcolor, 0x10, 3); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif + if (frame == NULL) { goto error; } @@ -696,7 +711,14 @@ test3(void) pixels[2] = 0x97; pixels[3] = 0x32; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (frame == NULL) { goto error; } @@ -754,7 +776,14 @@ test4(void) pixels[2] = 0x97; pixels[3] = 0x32; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (frame == NULL) { goto error; } @@ -814,7 +843,14 @@ test5(void) pixels[0] = 0; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (frame == NULL) { goto error; } @@ -874,7 +910,14 @@ test6(void) pixels[0] = 0; +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif frame = sixel_frame_create(); +#if HAVE_DIAGNOSTIC_DEPRECATED_DECLARATIONS +# pragma GCC diagnostic pop +#endif if (frame == NULL) { goto error; } From a4013d77d27b9025998acfbbf165c9391aa626c6 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 23:32:16 +0900 Subject: [PATCH 440/451] Make sixel_decode() as deprecated --- README.md | 22 ++++++++++------------ include/sixel.h.in | 4 ++-- src/loader.c | 6 +++--- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 9882fac4..c3143efd 100644 --- a/README.md +++ b/README.md @@ -683,19 +683,17 @@ sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ `sixel_decode` function converts SIXEL into indexed bitmap bytes with its palette. ``` -/* malloc(3) compatible function */ -typedef void * (* sixel_allocator_function)(size_t size); - /* convert sixel data into indexed pixel bytes and palette data */ -int -sixel_decode(unsigned char /* in */ *sixels, /* sixel bytes */ - int /* in */ size, /* size of sixel bytes */ - unsigned char /* out */ **pixels, /* decoded pixels */ - int /* out */ *pwidth, /* image width */ - int /* out */ *pheight, /* image height */ - unsigned char /* out */ **palette, /* RGBA palette */ - int /* out */ *ncolors, /* palette size (<= 256) */ - sixel_allocator_function /* out */ allocator); /* malloc function */ +SIXELAPI SIXELSTATUS +sixel_decode_raw( + unsigned char /* in */ *p, /* sixel bytes */ + int /* in */ len, /* size of sixel bytes */ + unsigned char /* out */ **pixels, /* decoded pixels */ + int /* out */ *pwidth, /* image width */ + int /* out */ *pheight, /* image height */ + unsigned char /* out */ **palette, /* ARGB palette */ + int /* out */ *ncolors, /* palette size (<= 256) */ + sixel_allocator_t /* in */ *allocator); /* allocator object */ ``` ## Perl interface diff --git a/include/sixel.h.in b/include/sixel.h.in index 67d98df9..68925e6d 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -751,9 +751,9 @@ sixel_decode_raw( int /* out */ *pheight, /* image height */ unsigned char /* out */ **palette, /* ARGB palette */ int /* out */ *ncolors, /* palette size (<= 256) */ - sixel_allocator_t /* in */ *allocator); /* allocator object */ + sixel_allocator_t /* in */ *allocator); /* allocator object or null */ -SIXELAPI SIXELSTATUS +SIXELAPI @attr_func_deprecated@ SIXELSTATUS sixel_decode( unsigned char /* in */ *sixels, /* sixel bytes */ int /* in */ size, /* size of sixel bytes */ diff --git a/src/loader.c b/src/loader.c index 9630e85b..d2c0c1e9 100644 --- a/src/loader.c +++ b/src/loader.c @@ -548,9 +548,9 @@ load_sixel(unsigned char /* out */ **result, int i; /* sixel */ - status = sixel_decode(buffer, size, - &p, psx, psy, - &palette, &colors, allocator->fn_malloc); + status = sixel_decode_raw(buffer, size, + &p, psx, psy, + &palette, &colors, allocator); if (SIXEL_FAILED(status)) { goto end; } From 36a94c794615ea8b4ca9c9e48015f27fe270de44 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sun, 2 Aug 2015 23:52:17 +0900 Subject: [PATCH 441/451] Update README --- README.md | 194 ++++++++++++++++++++++++++++++++++++--------- include/sixel.h.in | 20 ++++- 2 files changed, 174 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index c3143efd..c21916d2 100644 --- a/README.md +++ b/README.md @@ -537,22 +537,35 @@ The sixel encoder object and related functions provides almost same features as ```C /* create encoder object */ -SIXELAPI sixel_encoder_t * -sixel_encoder_create(void); +SIXELAPI SIXELSTATUS +sixel_encoder_new( + sixel_encoder_t /* out */ **ppencoder, /* encoder object to be created */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ +/* increase reference count of encoder object (thread-unsafe) */ SIXELAPI void -sixel_encoder_ref(sixel_encoder_t *encoder); +sixel_encoder_ref(sixel_encoder_t /* in */ *encoder); +/* decrease reference count of encoder object (thread-unsafe) */ SIXELAPI void -sixel_encoder_unref(sixel_encoder_t *encoder); +sixel_encoder_unref(sixel_encoder_t /* in */ *encoder); -SIXELAPI int +/* set cancel state flag to encoder object */ +SIXELAPI SIXELSTATUS +sixel_encoder_set_cancel_flag( + sixel_encoder_t /* in */ *encoder, + int /* in */ *cancel_flag); + +/* set an option flag to encoder object */ +SIXELAPI SIXELSTATUS sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, char const /* in */ *optarg); -SIXELAPI int +/* load source data from specified file and encode it to SIXEL format */ +SIXELAPI SIXELSTATUS sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, char const /* in */ *filename); @@ -564,22 +577,30 @@ The sixel decoder object and related functions provides almost same features as ```C /* create decoder object */ -SIXELAPI sixel_decoder_t * -sixel_decoder_create(void); +SIXELAPI SIXELSTATUS +sixel_decoder_new( + sixel_decoder_t /* out */ **ppdecoder, /* decoder object to be created */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ +/* increase reference count of decoder object (thread-unsafe) */ SIXELAPI void sixel_decoder_ref(sixel_decoder_t *decoder); +/* decrease reference count of decoder object (thread-unsafe) */ SIXELAPI void sixel_decoder_unref(sixel_decoder_t *decoder); -SIXELAPI int +/* set an option flag to decoder object */ +SIXELAPI SIXELSTATUS sixel_decoder_setopt( - sixel_decoder_t /* in */ *decoder, - int /* in */ arg, - char const /* in */ *optarg); + sixel_decoder_t /* in */ *decoder, /* decoder object */ + int /* in */ arg, /* one of SIXEL_OPTFLAG_*** */ + char const /* in */ *optarg); /* null or an argument of optflag */ -SIXELAPI int +/* load source data from stdin or the file specified with + SIXEL_OPTFLAG_INPUT flag, and decode it */ +SIXELAPI SIXELSTATUS sixel_decoder_decode( sixel_decoder_t /* in */ *decoder); ``` @@ -603,10 +624,8 @@ If you use OSX, a tiny example is available `sixel_encode` function converts bitmap array into SIXEL format. ```C -/* converter API */ - /* convert pixels into sixel format and write it to output context */ -int +SIXELAPI SIXELSTATUS sixel_encode( unsigned char /* in */ *pixels, /* pixel bytes */ int /* in */ width, /* image width */ @@ -626,23 +645,31 @@ Here is a part of APIs for dithering context manipulation. ```C /* create dither context object */ -sixel_dither_t * -sixel_dither_create(int /* in */ ncolors); /* number of colors */ +SIXELAPI SIXELSTATUS +sixel_dither_new( + sixel_dither_t /* out */ **ppdither, /* dither object to be created */ + int /* in */ ncolors, /* required colors */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ /* get built-in dither context object */ -sixel_dither_t * +SIXELAPI sixel_dither_t * sixel_dither_get(int builtin_dither); /* ID of built-in dither object */ -/* increment reference count of dither context object (thread-unsafe) */ -void +/* destroy dither context object */ +SIXELAPI void +sixel_dither_destroy(sixel_dither_t *dither); /* dither context object */ + +/* increase reference count of dither context object (thread-unsafe) */ +SIXELAPI void sixel_dither_ref(sixel_dither_t *dither); /* dither context object */ -/* decrement reference count of dither context object (thread-unsafe) */ -void +/* decrease reference count of dither context object (thread-unsafe) */ +SIXELAPI void sixel_dither_unref(sixel_dither_t *dither); /* dither context object */ /* initialize internal palette from specified pixel buffer */ -int +SIXELAPI SIXELSTATUS sixel_dither_initialize( sixel_dither_t *dither, /* dither context object */ unsigned char /* in */ *data, /* sample image */ @@ -652,6 +679,60 @@ sixel_dither_initialize( int /* in */ method_for_largest, /* method for finding the largest dimension */ int /* in */ method_for_rep, /* method for choosing a color from the box */ int /* in */ quality_mode); /* quality of histogram processing */ + +/* set diffusion type, choose from enum methodForDiffuse */ +SIXELAPI void +sixel_dither_set_diffusion_type( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ method_for_diffuse); /* one of enum methodForDiffuse */ + +/* get number of palette colors */ +SIXELAPI int +sixel_dither_get_num_of_palette_colors( + sixel_dither_t /* in */ *dither); /* dither context object */ + +/* get number of histogram colors */ +SIXELAPI int +sixel_dither_get_num_of_histogram_colors( + sixel_dither_t /* in */ *dither); /* dither context object */ + +/* get palette */ +SIXELAPI unsigned char * +sixel_dither_get_palette( + sixel_dither_t /* in */ *dither); /* dither context object */ + +/* set palette */ +SIXELAPI void +sixel_dither_set_palette( + sixel_dither_t /* in */ *dither, /* dither context object */ + unsigned char /* in */ *palette); + +SIXELAPI void +sixel_dither_set_complexion_score( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ score); /* complexion score (>= 1) */ + +SIXELAPI void +sixel_dither_set_body_only( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ bodyonly); /* 0: output palette section(default) + 1: do not output palette section */ +SIXELAPI void +sixel_dither_set_optimize_palette( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ do_opt); /* 0: optimize palette size + 1: don't optimize palette size */ +/* set pixelformat */ +SIXELAPI void +sixel_dither_set_pixelformat( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ pixelformat); /* one of enum pixelFormat */ + +/* set transparent */ +SIXELAPI void +sixel_dither_set_transparent( + sixel_dither_t /* in */ *dither, /* dither context object */ + int /* in */ transparent); /* transparent color index */ ``` #### Output context @@ -659,23 +740,64 @@ sixel_dither_initialize( Here is a part of APIs for output context manipulation. ```C -typedef int (* sixel_write_function)(char *data, int size, void *priv); - /* create output context object */ -sixel_output_t *const -sixel_output_create( - sixel_write_function /* in */ fn_write, /* callback function for output sixel */ - void /* in */ *priv /* private data given as -); 3rd argument of fn_write */ - -/* increment reference count of output context object (thread-unsafe) */ -void +SIXELAPI SIXELSTATUS +sixel_output_new( + sixel_output_t /* out */ **output, /* output object to be created */ + sixel_write_function /* in */ fn_write, /* callback for output sixel */ + void /* in */ *priv, /* private data given as + 3rd argument of fn_write */ + sixel_allocator_t /* in */ *allocator); /* allocator, null if you use + default allocator */ + +/* destroy output context object */ +SIXELAPI void +sixel_output_destroy(sixel_output_t /* in */ *output); /* output context */ + +/* increase reference count of output context object (thread-unsafe) */ +SIXELAPI void sixel_output_ref(sixel_output_t /* in */ *output); /* output context */ -/* decrement reference count of output context object (thread-unsafe) */ -void +/* decrease reference count of output context object (thread-unsafe) */ +SIXELAPI void sixel_output_unref(sixel_output_t /* in */ *output); /* output context */ +/* set 8bit output mode which indicates whether it uses C1 control characters */ +SIXELAPI int +sixel_output_get_8bit_availability( + sixel_output_t /* in */ *output); /* output context */ + +/* get 8bit output mode state */ +SIXELAPI void +sixel_output_set_8bit_availability( + sixel_output_t /* in */ *output, /* output context */ + int /* in */ availability); /* 0: do not use 8bit characters + 1: use 8bit characters */ + +/* set GNU Screen penetration feature enable or disable */ +SIXELAPI void +sixel_output_set_penetrate_multiplexer( + sixel_output_t /* in */ *output, /* output context */ + int /* in */ penetrate); /* 0: penetrate GNU Screen + 1: do not penetrate GNU Screen */ + +/* set whether we skip DCS envelope */ +SIXELAPI void +sixel_output_set_skip_dcs_envelope( + sixel_output_t /* in */ *output, /* output context */ + int /* in */ skip); /* 0: output DCS envelope + 1: do not output DCS envelope */ + +SIXELAPI void +sixel_output_set_palette_type( + sixel_output_t /* in */ *output, /* output context */ + int /* in */ palettetype); /* PALETTETYPE_RGB: RGB palette + PALETTETYPE_HLS: HLS palette */ + +SIXELAPI void +sixel_output_set_encode_policy( + sixel_output_t /* in */ *output, /* output context */ + int /* in */ encode_policy); ``` ### SIXEL to indexed bitmap diff --git a/include/sixel.h.in b/include/sixel.h.in index 68925e6d..397974f4 100644 --- a/include/sixel.h.in +++ b/include/sixel.h.in @@ -491,7 +491,7 @@ sixel_allocator_new( sixel_realloc_t /* in */ fn_realloc, /* custom realloc() function */ sixel_free_t /* in */ fn_free); /* custom free() function */ -/* increase reference count of allocatort object (thread-unsafe) */ +/* increase reference count of allocator object (thread-unsafe) */ SIXELAPI void sixel_allocator_ref( sixel_allocator_t /* in */ *allocator); /* allocator object to be @@ -1002,26 +1002,32 @@ sixel_encoder_new( sixel_allocator_t /* in */ *allocator); /* allocator, null if you use default allocator */ +/* deprecated version of sixel_decoder_new() */ SIXELAPI @attr_func_deprecated@ sixel_encoder_t * sixel_encoder_create(void); +/* increase reference count of encoder object (thread-unsafe) */ SIXELAPI void sixel_encoder_ref(sixel_encoder_t /* in */ *encoder); +/* decrease reference count of encoder object (thread-unsafe) */ SIXELAPI void sixel_encoder_unref(sixel_encoder_t /* in */ *encoder); +/* set cancel state flag to encoder object */ SIXELAPI SIXELSTATUS sixel_encoder_set_cancel_flag( sixel_encoder_t /* in */ *encoder, int /* in */ *cancel_flag); +/* set an option flag to encoder object */ SIXELAPI SIXELSTATUS sixel_encoder_setopt( sixel_encoder_t /* in */ *encoder, int /* in */ arg, char const /* in */ *optarg); +/* load source data from specified file and encode it to SIXEL format */ SIXELAPI SIXELSTATUS sixel_encoder_encode( sixel_encoder_t /* in */ *encoder, @@ -1049,21 +1055,27 @@ sixel_decoder_new( sixel_allocator_t /* in */ *allocator); /* allocator, null if you use default allocator */ +/* deprecated version of sixel_decoder_new() */ SIXELAPI @attr_func_deprecated@ sixel_decoder_t * sixel_decoder_create(void); +/* increase reference count of decoder object (thread-unsafe) */ SIXELAPI void sixel_decoder_ref(sixel_decoder_t *decoder); +/* decrease reference count of decoder object (thread-unsafe) */ SIXELAPI void sixel_decoder_unref(sixel_decoder_t *decoder); +/* set an option flag to decoder object */ SIXELAPI SIXELSTATUS sixel_decoder_setopt( - sixel_decoder_t /* in */ *decoder, - int /* in */ arg, - char const /* in */ *optarg); + sixel_decoder_t /* in */ *decoder, /* decoder object */ + int /* in */ arg, /* one of SIXEL_OPTFLAG_*** */ + char const /* in */ *optarg); /* null or an argument of optflag */ +/* load source data from stdin or the file specified with + SIXEL_OPTFLAG_INPUT flag, and decode it */ SIXELAPI SIXELSTATUS sixel_decoder_decode( sixel_decoder_t /* in */ *decoder); From ed4631fe8bcd0f777eb012a0c1661da7f31d6a35 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 3 Aug 2015 02:28:26 +0900 Subject: [PATCH 442/451] Add some wrapper functions and constants --- libsixel/__init__.py | 417 ++++++++++++++++++++++++++++++++++++++++++- libsixel/decoder.py | 31 +--- libsixel/encoder.py | 77 +------- 3 files changed, 432 insertions(+), 93 deletions(-) diff --git a/libsixel/__init__.py b/libsixel/__init__.py index bb41d78f..55398a15 100644 --- a/libsixel/__init__.py +++ b/libsixel/__init__.py @@ -20,10 +20,423 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -import ctypes +from ctypes import cdll, c_void_p, c_int, c_char_p, POINTER, byref from ctypes.util import find_library +SIXEL_OK = 0x0000 +SIXEL_FALSE = 0x1000 + +SIXEL_RUNTIME_ERROR = (SIXEL_FALSE | 0x0100) # runtime error +SIXEL_LOGIC_ERROR = (SIXEL_FALSE | 0x0200) # logic error +SIXEL_FEATURE_ERROR = (SIXEL_FALSE | 0x0300) # feature not enabled +SIXEL_LIBC_ERROR = (SIXEL_FALSE | 0x0400) # errors caused by curl +SIXEL_CURL_ERROR = (SIXEL_FALSE | 0x0500) # errors occures in libc functions +SIXEL_JPEG_ERROR = (SIXEL_FALSE | 0x0600) # errors occures in libjpeg functions +SIXEL_PNG_ERROR = (SIXEL_FALSE | 0x0700) # errors occures in libpng functions +SIXEL_GDK_ERROR = (SIXEL_FALSE | 0x0800) # errors occures in gdk functions +SIXEL_GD_ERROR = (SIXEL_FALSE | 0x0900) # errors occures in gd functions +SIXEL_STBI_ERROR = (SIXEL_FALSE | 0x0a00) # errors occures in stb_image functions +SIXEL_STBIW_ERROR = (SIXEL_FALSE | 0x0b00) # errors occures in stb_image_write functions + +SIXEL_INTERRUPTED = (SIXEL_OK | 0x0001) # interrupted by a signal + +SIXEL_BAD_ALLOCATION = (SIXEL_RUNTIME_ERROR | 0x0001) # malloc() failed +SIXEL_BAD_ARGUMENT = (SIXEL_RUNTIME_ERROR | 0x0002) # bad argument detected +SIXEL_BAD_INPUT = (SIXEL_RUNTIME_ERROR | 0x0003) # bad input detected + +SIXEL_NOT_IMPLEMENTED = (SIXEL_FEATURE_ERROR | 0x0001) # feature not implemented + +def SIXEL_SUCCEEDED(status): + return (((status) & 0x1000) == 0) + +def SIXEL_FAILED(status): + return (((status) & 0x1000) != 0) + +# method for finding the largest dimension for splitting, +# and sorting by that component +SIXEL_LARGE_AUTO = 0x0 # choose automatically the method for finding the largest dimension +SIXEL_LARGE_NORM = 0x1 # simply comparing the range in RGB space +SIXEL_LARGE_LUM = 0x2 # transforming into luminosities before the comparison + +# method for choosing a color from the box +SIXEL_REP_AUTO = 0x0 # choose automatically the method for selecting representative color from each box +SIXEL_REP_CENTER_BOX = 0x1 # choose the center of the box +SIXEL_REP_AVERAGE_COLORS = 0x2 # choose the average all the color in the box (specified in Heckbert's paper) +SIXEL_REP_AVERAGE_PIXELS = 0x3 # choose the average all the pixels in the box + +# method for diffusing +SIXEL_DIFFUSE_AUTO = 0x0 # choose diffusion type automatically +SIXEL_DIFFUSE_NONE = 0x1 # don't diffuse +SIXEL_DIFFUSE_ATKINSON = 0x2 # diffuse with Bill Atkinson's method +SIXEL_DIFFUSE_FS = 0x3 # diffuse with Floyd-Steinberg method +SIXEL_DIFFUSE_JAJUNI = 0x4 # diffuse with Jarvis, Judice & Ninke method +SIXEL_DIFFUSE_STUCKI = 0x5 # diffuse with Stucki's method +SIXEL_DIFFUSE_BURKES = 0x6 # diffuse with Burkes' method + +# quality modes +SIXEL_QUALITY_AUTO = 0x0 # choose quality mode automatically +SIXEL_QUALITY_HIGH = 0x1 # high quality palette construction +SIXEL_QUALITY_LOW = 0x2 # low quality palette construction +SIXEL_QUALITY_FULL = 0x3 # full quality palette construction +SIXEL_QUALITY_HIGHCOLOR = 0x4 # high color + +# built-in dither +SIXEL_BUILTIN_MONO_DARK = 0x0 # monochrome terminal with dark background +SIXEL_BUILTIN_MONO_LIGHT = 0x1 # monochrome terminal with dark background +SIXEL_BUILTIN_XTERM16 = 0x2 # xterm 16color +SIXEL_BUILTIN_XTERM256 = 0x3 # xterm 256color +SIXEL_BUILTIN_VT340_MONO = 0x4 # vt340 monochrome +SIXEL_BUILTIN_VT340_COLOR = 0x5 # vt340 color +SIXEL_BUILTIN_G1 = 0x6 # 1bit grayscale +SIXEL_BUILTIN_G2 = 0x7 # 2bit grayscale +SIXEL_BUILTIN_G4 = 0x8 # 4bit grayscale +SIXEL_BUILTIN_G8 = 0x9 # 8bit grayscale + +# offset value of pixelFormat +SIXEL_FORMATTYPE_COLOR = (0) +SIXEL_FORMATTYPE_GRAYSCALE = (1 << 6) +SIXEL_FORMATTYPE_PALETTE = (1 << 7) + +# pixelformat type of input image +# NOTE: for compatibility, the value of PIXELFORAMT_COLOR_RGB888 must be 3 +SIXEL_PIXELFORMAT_RGB555 = (SIXEL_FORMATTYPE_COLOR | 0x01) # 15bpp +SIXEL_PIXELFORMAT_RGB565 = (SIXEL_FORMATTYPE_COLOR | 0x02) # 16bpp +SIXEL_PIXELFORMAT_RGB888 = (SIXEL_FORMATTYPE_COLOR | 0x03) # 24bpp +SIXEL_PIXELFORMAT_BGR555 = (SIXEL_FORMATTYPE_COLOR | 0x04) # 15bpp +SIXEL_PIXELFORMAT_BGR565 = (SIXEL_FORMATTYPE_COLOR | 0x05) # 16bpp +SIXEL_PIXELFORMAT_BGR888 = (SIXEL_FORMATTYPE_COLOR | 0x06) # 24bpp +SIXEL_PIXELFORMAT_ARGB8888 = (SIXEL_FORMATTYPE_COLOR | 0x10) # 32bpp +SIXEL_PIXELFORMAT_RGBA8888 = (SIXEL_FORMATTYPE_COLOR | 0x11) # 32bpp +SIXEL_PIXELFORMAT_G1 = (SIXEL_FORMATTYPE_GRAYSCALE | 0x00) # 1bpp grayscale +SIXEL_PIXELFORMAT_G2 = (SIXEL_FORMATTYPE_GRAYSCALE | 0x01) # 2bpp grayscale +SIXEL_PIXELFORMAT_G4 = (SIXEL_FORMATTYPE_GRAYSCALE | 0x02) # 4bpp grayscale +SIXEL_PIXELFORMAT_G8 = (SIXEL_FORMATTYPE_GRAYSCALE | 0x03) # 8bpp grayscale +SIXEL_PIXELFORMAT_AG88 = (SIXEL_FORMATTYPE_GRAYSCALE | 0x13) # 16bpp gray+alpha +SIXEL_PIXELFORMAT_GA88 = (SIXEL_FORMATTYPE_GRAYSCALE | 0x23) # 16bpp gray+alpha +SIXEL_PIXELFORMAT_PAL1 = (SIXEL_FORMATTYPE_PALETTE | 0x00) # 1bpp palette +SIXEL_PIXELFORMAT_PAL2 = (SIXEL_FORMATTYPE_PALETTE | 0x01) # 2bpp palette +SIXEL_PIXELFORMAT_PAL4 = (SIXEL_FORMATTYPE_PALETTE | 0x02) # 4bpp palette +SIXEL_PIXELFORMAT_PAL8 = (SIXEL_FORMATTYPE_PALETTE | 0x03) # 8bpp palette + +# palette type +SIXEL_PALETTETYPE_AUTO = 0 # choose palette type automatically +SIXEL_PALETTETYPE_HLS = 1 # HLS colorspace +SIXEL_PALETTETYPE_RGB = 2 # RGB colorspace + +# policies of SIXEL encoding +SIXEL_ENCODEPOLICY_AUTO = 0 # choose encoding policy automatically +SIXEL_ENCODEPOLICY_FAST = 1 # encode as fast as possible +SIXEL_ENCODEPOLICY_SIZE = 2 # encode to as small sixel sequence as possible + +# method for re-sampling +SIXEL_RES_NEAREST = 0 # Use nearest neighbor method +SIXEL_RES_GAUSSIAN = 1 # Use guaussian filter +SIXEL_RES_HANNING = 2 # Use hanning filter +SIXEL_RES_HAMMING = 3 # Use hamming filter +SIXEL_RES_BILINEAR = 4 # Use bilinear filter +SIXEL_RES_WELSH = 5 # Use welsh filter +SIXEL_RES_BICUBIC = 6 # Use bicubic filter +SIXEL_RES_LANCZOS2 = 7 # Use lanczos-2 filter +SIXEL_RES_LANCZOS3 = 8 # Use lanczos-3 filter +SIXEL_RES_LANCZOS4 = 9 # Use lanczos-4 filter + +# image format +SIXEL_FORMAT_GIF = 0x0 # read only +SIXEL_FORMAT_PNG = 0x1 # read/write +SIXEL_FORMAT_BMP = 0x2 # read only +SIXEL_FORMAT_JPG = 0x3 # read only +SIXEL_FORMAT_TGA = 0x4 # read only +SIXEL_FORMAT_WBMP = 0x5 # read only with --with-gd configure option +SIXEL_FORMAT_TIFF = 0x6 # read only +SIXEL_FORMAT_SIXEL = 0x7 # read only +SIXEL_FORMAT_PNM = 0x8 # read only +SIXEL_FORMAT_GD2 = 0x9 # read only with --with-gd configure option +SIXEL_FORMAT_PSD = 0xa # read only +SIXEL_FORMAT_HDR = 0xb # read only + +# loop mode +SIXEL_LOOP_AUTO = 0 # honer the setting of GIF header +SIXEL_LOOP_FORCE = 1 # always enable loop +SIXEL_LOOP_DISABLE = 2 # always disable loop + +# setopt flags +SIXEL_OPTFLAG_INPUT = 'i' # -i, --input: specify input file name. +SIXEL_OPTFLAG_OUTPUT = 'o' # -o, --output: specify output file name. +SIXEL_OPTFLAG_OUTFILE = 'o' # -o, --outfile: specify output file name. +SIXEL_OPTFLAG_7BIT_MODE = '7' # -7, --7bit-mode: for 7bit terminals or printers (default) +SIXEL_OPTFLAG_8BIT_MODE = '8' # -8, --8bit-mode: for 8bit terminals or printers +SIXEL_OPTFLAG_COLORS = 'p' # -p COLORS, --colors=COLORS: specify number of colors +SIXEL_OPTFLAG_MAPFILE = 'm' # -m FILE, --mapfile=FILE: specify set of colors +SIXEL_OPTFLAG_MONOCHROME = 'e' # -e, --monochrome: output monochrome sixel image +SIXEL_OPTFLAG_INSECURE = 'k' # -k, --insecure: allow to connect to SSL sites without certs +SIXEL_OPTFLAG_INVERT = 'i' # -i, --invert: assume the terminal background color +SIXEL_OPTFLAG_HIGH_COLOR = 'I' # -I, --high-color: output 15bpp sixel image +SIXEL_OPTFLAG_USE_MACRO = 'u' # -u, --use-macro: use DECDMAC and DEVINVM sequences +SIXEL_OPTFLAG_MACRO_NUMBER = 'n' # -n MACRONO, --macro-number=MACRONO: + # specify macro register number +SIXEL_OPTFLAG_COMPLEXION_SCORE = 'C' # -C COMPLEXIONSCORE, --complexion-score=COMPLEXIONSCORE: + # specify an number argument for the score of + # complexion correction. +SIXEL_OPTFLAG_IGNORE_DELAY = 'g' # -g, --ignore-delay: render GIF animation without delay +SIXEL_OPTFLAG_STATIC = 'S' # -S, --static: render animated GIF as a static image +SIXEL_OPTFLAG_DIFFUSION = 'd' # -d DIFFUSIONTYPE, --diffusion=DIFFUSIONTYPE: + # choose diffusion method which used with -p option. + # DIFFUSIONTYPE is one of them: + # auto -> choose diffusion type + # automatically (default) + # none -> do not diffuse + # fs -> Floyd-Steinberg method + # atkinson -> Bill Atkinson's method + # jajuni -> Jarvis, Judice & Ninke + # stucki -> Stucki's method + # burkes -> Burkes' method + +SIXEL_OPTFLAG_FIND_LARGEST = 'f' # -f FINDTYPE, --find-largest=FINDTYPE: + # choose method for finding the largest + # dimension of median cut boxes for + # splitting, make sense only when -p + # option (color reduction) is + # specified + # FINDTYPE is one of them: + # auto -> choose finding method + # automatically (default) + # norm -> simply comparing the + # range in RGB space + # lum -> transforming into + # luminosities before the + # comparison + +SIXEL_OPTFLAG_SELECT_COLOR = 's' # -s SELECTTYPE, --select-color=SELECTTYPE + # choose the method for selecting + # representative color from each + # median-cut box, make sense only + # when -p option (color reduction) is + # specified + # SELECTTYPE is one of them: + # auto -> choose selecting + # method automatically + # (default) + # center -> choose the center of + # the box + # average -> calculate the color + # average into the box + # histogram -> similar with average + # but considers color + # histogram + +SIXEL_OPTFLAG_CROP = 'c' # -c REGION, --crop=REGION: + # crop source image to fit the + # specified geometry. REGION should + # be formatted as '%dx%d+%d+%d' + +SIXEL_OPTFLAG_WIDTH = 'w' # -w WIDTH, --width=WIDTH: + # resize image to specified width + # WIDTH is represented by the + # following syntax + # auto -> preserving aspect + # ratio (default) + # % -> scale width with + # given percentage + # -> scale width with + # pixel counts + # px -> scale width with + # pixel counts + +SIXEL_OPTFLAG_HEIGHT = 'h' # -h HEIGHT, --height=HEIGHT: + # resize image to specified height + # HEIGHT is represented by the + # following syntax + # auto -> preserving aspect + # ratio (default) + # % -> scale height with + # given percentage + # -> scale height with + # pixel counts + # px -> scale height with + # pixel counts + +SIXEL_OPTFLAG_RESAMPLING = 'r' # -r RESAMPLINGTYPE, --resampling=RESAMPLINGTYPE: + # choose resampling filter used + # with -w or -h option (scaling) + # RESAMPLINGTYPE is one of them: + # nearest -> Nearest-Neighbor + # method + # gaussian -> Gaussian filter + # hanning -> Hanning filter + # hamming -> Hamming filter + # bilinear -> Bilinear filter + # (default) + # welsh -> Welsh filter + # bicubic -> Bicubic filter + # lanczos2 -> Lanczos-2 filter + # lanczos3 -> Lanczos-3 filter + # lanczos4 -> Lanczos-4 filter + +SIXEL_OPTFLAG_QUALITY = 'q' # -q QUALITYMODE, --quality=QUALITYMODE: + # select quality of color + # quanlization. + # auto -> decide quality mode + # automatically (default) + # low -> low quality and high + # speed mode + # high -> high quality and low + # speed mode + # full -> full quality and careful + # speed mode + +SIXEL_OPTFLAG_LOOPMODE = 'l' # -l LOOPMODE, --loop-control=LOOPMODE: + # select loop control mode for GIF + # animation. + # auto -> honor the setting of + # GIF header (default) + # force -> always enable loop + # disable -> always disable loop + +SIXEL_OPTFLAG_PALETTE_TYPE = 't' # -t PALETTETYPE, --palette-type=PALETTETYPE: + # select palette color space type + # auto -> choose palette type + # automatically (default) + # hls -> use HLS color space + # rgb -> use RGB color space + +SIXEL_OPTFLAG_BUILTIN_PALETTE = 'b' # -b BUILTINPALETTE, --builtin-palette=BUILTINPALETTE: + # select built-in palette type + # xterm16 -> X default 16 color map + # xterm256 -> X default 256 color map + # vt340mono -> VT340 monochrome map + # vt340color -> VT340 color map + # gray1 -> 1bit grayscale map + # gray2 -> 2bit grayscale map + # gray4 -> 4bit grayscale map + # gray8 -> 8bit grayscale map + +SIXEL_OPTFLAG_ENCODE_POLICY = 'E' # -E ENCODEPOLICY, --encode-policy=ENCODEPOLICY: + # select encoding policy + # auto -> choose encoding policy + # automatically (default) + # fast -> encode as fast as possible + # size -> encode to as small sixel + # sequence as possible + +SIXEL_OPTFLAG_BGCOLOR = 'B' # -B BGCOLOR, --bgcolor=BGCOLOR: + # specify background color + # BGCOLOR is represented by the + # following syntax + # #rgb + # #rrggbb + # #rrrgggbbb + # #rrrrggggbbbb + # rgb:r/g/b + # rgb:rr/gg/bb + # rgb:rrr/ggg/bbb + # rgb:rrrr/gggg/bbbb + +SIXEL_OPTFLAG_PENETRATE = 'P' # -P, --penetrate: + # penetrate GNU Screen using DCS + # pass-through sequence +SIXEL_OPTFLAG_PIPE_MODE = 'D' # -D, --pipe-mode: + # read source images from stdin continuously +SIXEL_OPTFLAG_VERBOSE = 'v' # -v, --verbose: show debugging info +SIXEL_OPTFLAG_VERSION = 'V' # -V, --version: show version and license info +SIXEL_OPTFLAG_HELP = 'H' # -H, --help: show this help + if not find_library('sixel'): raise ImportError("libsixel not found.") -_sixel = ctypes.cdll.LoadLibrary(find_library('sixel')) +_sixel = cdll.LoadLibrary(find_library('sixel')) + +def sixel_helper_format_error(status): + _sixel.sixel_helper_format_error.restype = c_char_p; + _sixel.sixel_helper_format_error.argtypes = [c_int]; + return _sixel.sixel_helper_format_error(status) + + +def sixel_encoder_new(allocator=c_void_p(None)): + _sixel.sixel_encoder_new.restype = c_int + _sixel.sixel_encoder_new.argtypes = [POINTER(c_void_p), c_void_p] + encoder = c_void_p(None) + status = _sixel.sixel_encoder_new(byref(encoder), allocator) + if SIXEL_FAILED(status): + message = sixel_helper_format_error(status) + raise RuntimeError(message) + return encoder + + +def sixel_encoder_ref(encoder): + _sixel.sixel_encoder_ref.restype = None + _sixel.sixel_encoder_ref.argtypes = [c_void_p] + _sixel.sixel_encoder_ref(encoder) + + +def sixel_encoder_unref(encoder): + _sixel.sixel_encoder_unref.restype = None + _sixel.sixel_encoder_unref.argtypes = [c_void_p] + _sixel.sixel_encoder_unref(encoder) + + +def sixel_encoder_setopt(encoder, flag, arg=None): + _sixel.sixel_encoder_setopt.restype = c_int + _sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + flag = ord(flag) + if arg: + arg = str(arg) + status = _sixel.sixel_encoder_setopt(encoder, flag, arg) + if SIXEL_FAILED(status): + message = sixel_helper_format_error(status) + raise RuntimeError(message) + + +def sixel_encoder_encode(encoder, filename): + _sixel.sixel_encoder_encode.restype = c_int + _sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] + status = _sixel.sixel_encoder_encode(encoder, filename) + if SIXEL_FAILED(status): + message = sixel_helper_format_error(status) + raise RuntimeError(message) + + +def sixel_decoder_new(allocator=c_void_p(None)): + _sixel.sixel_decoder_new.restype = c_int + _sixel.sixel_decoder_new.argtypes = [POINTER(c_void_p), c_void_p] + decoder = c_void_p(None) + status = _sixel.sixel_decoder_new(byref(decoder), c_void_p(None)) + if SIXEL_FAILED(status): + message = sixel_helper_format_error(status) + raise RuntimeError(message) + return decoder + + +def sixel_decoder_ref(decoder): + _sixel.sixel_decoder_ref.restype = None + _sixel.sixel_decoder_ref.argtypes = [c_void_p] + _sixel.sixel_decoder_ref(decoder) + + +def sixel_decoder_unref(decoder): + _sixel.sixel_decoder_unref.restype = None + _sixel.sixel_decoder_unref.argtypes = [c_void_p] + _sixel.sixel_decoder_unref(decoder) + + +def sixel_decoder_setopt(decoder, flag, arg=None): + _sixel.sixel_decoder_setopt.restype = c_int + _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] + flag = ord(flag) + if arg: + arg = str(arg) + status = _sixel.sixel_decoder_setopt(decoder, flag, arg) + if SIXEL_FAILED(status): + message = sixel_helper_format_error(status) + raise RuntimeError(message) + + +def sixel_decoder_decode(decoder, infile=None): + _sixel.sixel_decoder_decode.restype = c_int + _sixel.sixel_decoder_decode.argtypes = [c_void_p] + if infile: + sixel_decoder_setopt(decoder, SIXEL_OPTFLAG_INPUT, infile) + status = _sixel.sixel_decoder_decode(decoder) + if SIXEL_FAILED(status): + message = sixel_helper_format_error(status) + raise RuntimeError(message) + diff --git a/libsixel/decoder.py b/libsixel/decoder.py index b15d4848..65a9d9ea 100644 --- a/libsixel/decoder.py +++ b/libsixel/decoder.py @@ -21,45 +21,30 @@ # from . import _sixel +from . import * +from ctypes import c_void_p, byref class Decoder(object): def __init__(self): - from ctypes import c_void_p, c_int, c_char_p - - _sixel.sixel_decoder_create.restype = c_void_p - _sixel.sixel_decoder_unref.restype = None - _sixel.sixel_decoder_unref.argtypes = [c_void_p] - _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - _sixel.sixel_decoder_decode.argtypes = [c_void_p] - self._decoder = _sixel.sixel_decoder_create() + self._decoder = sixel_decoder_new() def __del__(self): - _sixel.sixel_decoder_unref(self._decoder) + sixel_decoder_unref(self._decoder) def setopt(self, flag, arg=None): - flag = ord(flag) - if arg: - arg = str(arg) - settings = self._decoder - result = _sixel.sixel_decoder_setopt(settings, flag, arg) - if result != 0: - raise RuntimeError("Invalid option was set.") + sixel_decoder_setopt(self._decoder, flag, arg) def decode(self, infile=None): - if infile: - self.setopt("i", infile) - result = _sixel.sixel_decoder_decode(self._decoder) - if result != 0: - raise RuntimeError("Unexpected Error") + sixel_decoder_decode(self._decoder, infile) def test(self, infile=None, outfile=None): import threading if infile: - self.setopt("i", infile) + self.setopt(SIXEL_OPTFLAG_INPUT, infile) if outfile: - self.setopt("o", outfile) + self.setopt(SIXEL_OPTFLAG_OUTPUT, outfile) t = threading.Thread(target=self.decode) t.daemon = True t.start() diff --git a/libsixel/encoder.py b/libsixel/encoder.py index ee7a9ff2..090b2ea0 100755 --- a/libsixel/encoder.py +++ b/libsixel/encoder.py @@ -21,42 +21,29 @@ # from . import _sixel +from . import * +from ctypes import c_void_p, byref class Encoder(object): def __init__(self): - from ctypes import c_void_p, c_int, c_char_p - - _sixel.sixel_encoder_create.restype = c_void_p - _sixel.sixel_encoder_unref.restype = None - _sixel.sixel_encoder_unref.argtypes = [c_void_p] - _sixel.sixel_encoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - _sixel.sixel_encoder_encode.argtypes = [c_void_p, c_char_p] - self._encoder = _sixel.sixel_encoder_create() + self._encoder = sixel_encoder_new() def __del__(self): - _sixel.sixel_encoder_unref(self._encoder) + sixel_encoder_unref(self._encoder) def setopt(self, flag, arg=None): - flag = ord(flag) - if arg: - arg = str(arg) - settings = self._encoder - result = _sixel.sixel_encoder_setopt(settings, flag, arg) - if result != 0: - raise RuntimeError("Invalid option was set.") + sixel_encoder_setopt(self._encoder, flag, arg) def encode(self, filename="-"): - result = _sixel.sixel_encoder_encode(self._encoder, filename) - if result != 0: - raise RuntimeError("Unexpected Error") + sixel_encoder_encode(self._encoder, filename) def test(self, filename): import threading - self.setopt("p", 16) - self.setopt("d", "atkinson") - self.setopt("w", "200") + self.setopt(SIXEL_OPTFALG_COLORS, 16) + self.setopt(SIXEL_OPTFLAG_DIFFUSION, "atkinson") + self.setopt(SIXEL_OPTFLAG_WIDTH, 200) t = threading.Thread(target=self.encode, args=[filename]) t.daemon = True t.start() @@ -67,52 +54,6 @@ def test(self, filename): print "\033\\\033[Jcanceled." -class Decoder(object): - - def __init__(self): - _sixel.sixel_decoder_create.restype = c_void_p - _sixel.sixel_decoder_unref.restype = None - _sixel.sixel_decoder_unref.argtypes = [c_void_p] - _sixel.sixel_decoder_setopt.argtypes = [c_void_p, c_int, c_char_p] - _sixel.sixel_decoder_decode.argtypes = [c_void_p] - self._decoder = _sixel.sixel_decoder_create() - - def __del__(self): - _sixel.sixel_decoder_unref(self._decoder) - - def setopt(self, flag, arg=None): - flag = ord(flag) - if arg: - arg = str(arg) - settings = self._decoder - result = _sixel.sixel_decoder_setopt(settings, flag, arg) - if result != 0: - raise RuntimeError("Invalid option was set.") - - def decode(self, infile=None): - if infile: - self.setopt("i", infile) - result = _sixel.sixel_decoder_decode(self._decoder) - if result != 0: - raise RuntimeError("Unexpected Error") - - def test(self, infile=None, outfile=None): - import threading - - if infile: - self.setopt("i", infile) - if outfile: - self.setopt("o", outfile) - t = threading.Thread(target=self.decode) - t.daemon = True - t.start() - try: - while t.is_alive(): - t.join(1) - except KeyboardInterrupt as e: - print "\033\\\033[Jcanceled." - - if __name__ == '__main__': import sys arg1 = "-" if len(sys.argv) < 2 else sys.argv[1] From 6f9c102f56f8b27eeb0e8729093423a678db1f6e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Mon, 3 Aug 2015 02:41:59 +0900 Subject: [PATCH 443/451] Suppress warning for using deprecated function --- src/loader.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/loader.c b/src/loader.c index d2c0c1e9..4a9aefa2 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1087,7 +1087,7 @@ load_with_gd( gdImagePtr im; int x, y; int c; - sixel_frame_t *frame; + sixel_frame_t *frame = NULL; (void) fstatic; (void) fuse_palette; @@ -1095,9 +1095,8 @@ load_with_gd( (void) bgcolor; (void) loop_control; - frame = sixel_frame_create(); - if (frame == NULL) { - status = SIXEL_BAD_ALLOCATION; + status = sixel_frame_new(&frame, pchunk->allocator); + if (SIXEL_FAILED(status)) { goto end; } From 592a5bceba36fb3f4b97a666fbdc1fc708627c9b Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 4 Aug 2015 14:44:18 +0900 Subject: [PATCH 444/451] Set additional messages when bad allocation error occured --- src/decoder.c | 23 ++++++++++++----------- src/encoder.c | 8 ++++++-- src/fromgif.c | 4 ++++ src/frompnm.c | 2 +- src/fromsixel.c | 8 ++++++++ src/loader.c | 22 +++++++++++++++++++++- src/output.c | 2 ++ src/tosixel.c | 6 ++++++ 8 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/decoder.c b/src/decoder.c index 9359f1b2..f467dabc 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -188,6 +188,8 @@ sixel_decoder_setopt( free(decoder->input); decoder->input = strdup_with_allocator(optarg, decoder->allocator); if (decoder->input == NULL) { + sixel_helper_set_additional_message( + "sixel_decoder_setopt: strdup_with_allocator() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -196,6 +198,8 @@ sixel_decoder_setopt( free(decoder->output); decoder->output = strdup_with_allocator(optarg, decoder->allocator); if (decoder->input == NULL) { + sixel_helper_set_additional_message( + "sixel_decoder_setopt: strdup_with_allocator() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -231,7 +235,6 @@ sixel_decoder_decode( unsigned char *palette; int ncolors; unsigned char *pixels = NULL; - char buffer[1024]; sixel_decoder_ref(decoder); @@ -248,10 +251,9 @@ sixel_decoder_decode( } else { input_fp = fopen(decoder->input, "rb"); if (!input_fp) { + sixel_helper_set_additional_message( + "sixel_decoder_decode: fopen() failed."); status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - if (sprintf(buffer, "fopen('%s') failed.", decoder->input) != EOF) { - sixel_helper_set_additional_message(buffer); - } goto end; } } @@ -260,21 +262,20 @@ sixel_decoder_decode( max = 64 * 1024; if ((raw_data = (unsigned char *)sixel_allocator_malloc(decoder->allocator, max)) == NULL) { + sixel_helper_set_additional_message( + "sixel_decoder_decode: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; - if (sprintf(buffer, "sixel_allocator_malloc(%d) failed.", max) != EOF) { - sixel_helper_set_additional_message(buffer); - } goto end; } for (;;) { if ((max - raw_len) < 4096) { max *= 2; - if ((raw_data = (unsigned char *)realloc(raw_data, max)) == NULL) { + raw_data = (unsigned char *)sixel_allocator_realloc(decoder->allocator, raw_data, max); + if (raw_data == NULL) { + sixel_helper_set_additional_message( + "sixel_decoder_decode: sixel_allocator_realloc() failed."); status = SIXEL_BAD_ALLOCATION; - if (sprintf(buffer, "realloc(raw_data, %d) failed.", max) != EOF) { - sixel_helper_set_additional_message(buffer); - } goto end; } } diff --git a/src/encoder.c b/src/encoder.c index 31ac8c37..538c7a09 100644 --- a/src/encoder.c +++ b/src/encoder.c @@ -281,7 +281,9 @@ prepare_monochrome_palette( *dither = sixel_dither_get(SIXEL_BUILTIN_MONO_DARK); } if (*dither == NULL) { - status = SIXEL_BAD_ALLOCATION; + sixel_helper_set_additional_message( + "prepare_monochrome_palette: sixel_dither_get() failed."); + status = SIXEL_RUNTIME_ERROR; goto end; } @@ -302,7 +304,9 @@ prepare_builtin_palette( *dither = sixel_dither_get(builtin_palette); if (*dither == NULL) { - status = SIXEL_BAD_ALLOCATION; + sixel_helper_set_additional_message( + "prepare_builtin_palette: sixel_dither_get() failed."); + status = SIXEL_RUNTIME_ERROR; goto end; } diff --git a/src/fromgif.c b/src/fromgif.c index 963f0621..c1aeceea 100644 --- a/src/fromgif.c +++ b/src/fromgif.c @@ -184,6 +184,8 @@ gif_init_frame( frame->palette = (unsigned char *)sixel_allocator_malloc(frame->allocator, ncolors * 3); } if (frame->palette == NULL) { + sixel_helper_set_additional_message( + "gif_init_frame: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -570,6 +572,8 @@ load_gif( frame->height = g.h, g.out = (unsigned char *)sixel_allocator_malloc(allocator, g.w * g.h); if (g.out == NULL) { + sixel_helper_set_additional_message( + "load_gif: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } diff --git a/src/frompnm.c b/src/frompnm.c index 0d46fb9f..75add16a 100644 --- a/src/frompnm.c +++ b/src/frompnm.c @@ -164,9 +164,9 @@ load_pnm(unsigned char /* in */ *p, *result = (unsigned char *)sixel_allocator_malloc(allocator, width * height * 3 + 1); if (*result == NULL) { - status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( "load_pnm: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; goto end; } diff --git a/src/fromsixel.c b/src/fromsixel.c index 3aacde99..f8545e91 100644 --- a/src/fromsixel.c +++ b/src/fromsixel.c @@ -282,6 +282,8 @@ sixel_decode_raw( imsy = 2048; imbuf = (unsigned char *)sixel_allocator_malloc(allocator, imsx * imsy); if (imbuf == NULL) { + sixel_helper_set_additional_message( + "sixel_deocde_raw: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -398,6 +400,8 @@ sixel_decode_raw( dmbuf = (unsigned char *)sixel_allocator_malloc(allocator, dmsx * dmsy); if (dmbuf == NULL) { sixel_allocator_free(allocator, imbuf); + sixel_helper_set_additional_message( + "sixel_deocde_raw: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -556,6 +560,8 @@ sixel_decode_raw( dmbuf = (unsigned char *)sixel_allocator_malloc(allocator, dmsx * dmsy); if (dmbuf == NULL) { sixel_allocator_free(allocator, imbuf); + sixel_helper_set_additional_message( + "sixel_deocde_raw: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -572,6 +578,8 @@ sixel_decode_raw( *palette = (unsigned char *)sixel_allocator_malloc(allocator, *ncolors * 3); if (palette == NULL) { sixel_allocator_free(allocator, imbuf); + sixel_helper_set_additional_message( + "sixel_deocde_raw: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } diff --git a/src/loader.c b/src/loader.c index 4a9aefa2..5e0bcf3f 100644 --- a/src/loader.c +++ b/src/loader.c @@ -143,9 +143,9 @@ load_jpeg(unsigned char **result, size = *pwidth * *pheight * cinfo.output_components; *result = (unsigned char *)sixel_allocator_malloc(allocator, size); if (*result == NULL) { - status = SIXEL_BAD_ALLOCATION; sixel_helper_set_additional_message( "load_jpeg: sixel_allocator_malloc() failed."); + status = SIXEL_BAD_ALLOCATION; goto end; } row_stride = cinfo.output_width * cinfo.output_components; @@ -327,6 +327,8 @@ load_png(unsigned char /* out */ **result, case 1: *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { + sixel_helper_set_additional_message( + "load_png: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto cleanup; } @@ -337,6 +339,8 @@ load_png(unsigned char /* out */ **result, case 2: *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { + sixel_helper_set_additional_message( + "load_png: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto cleanup; } @@ -347,6 +351,8 @@ load_png(unsigned char /* out */ **result, case 4: *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { + sixel_helper_set_additional_message( + "load_png: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto cleanup; } @@ -357,6 +363,8 @@ load_png(unsigned char /* out */ **result, case 8: *ppalette = (unsigned char *)sixel_allocator_malloc(allocator, *pncolors * 3); if (*ppalette == NULL) { + sixel_helper_set_additional_message( + "load_png: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto cleanup; } @@ -486,11 +494,15 @@ load_png(unsigned char /* out */ **result, depth = sixel_helper_compute_depth(*pixelformat); *result = (unsigned char *)sixel_allocator_malloc(allocator, *psx * *psy * depth); if (*result == NULL) { + sixel_helper_set_additional_message( + "load_png: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto cleanup; } rows = (unsigned char **)sixel_allocator_malloc(allocator, *psy * sizeof(unsigned char *)); if (rows == NULL) { + sixel_helper_set_additional_message( + "load_png: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto cleanup; } @@ -558,6 +570,8 @@ load_sixel(unsigned char /* out */ **result, *ppixelformat = SIXEL_PIXELFORMAT_RGB888; *result = (unsigned char *)sixel_allocator_malloc(allocator, *psx * *psy * 3); if (*result == NULL) { + sixel_helper_set_additional_message( + "load_sixel: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -903,6 +917,8 @@ load_with_gdkpixbuf( stride = gdk_pixbuf_get_rowstride(pixbuf); frame->pixels = sixel_allocator_malloc(pchunk->allocator, frame->height * stride); if (frame->pixels == NULL) { + sixel_helper_set_additional_message( + "load_with_gdkpixbuf: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -948,6 +964,8 @@ load_with_gdkpixbuf( stride = gdk_pixbuf_get_rowstride(pixbuf); frame->pixels = sixel_allocator_malloc(pchunk->allocator, frame->height * stride); if (frame->pixels == NULL) { + sixel_helper_set_additional_message( + "load_with_gdkpixbuf: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -1177,6 +1195,8 @@ load_with_gd( frame->pixelformat = SIXEL_PIXELFORMAT_RGB888; p = frame->pixels = sixel_allocator_malloc(pchunk->allocator, frame->width * frame->height * 3); if (frame->pixels == NULL) { + sixel_helper_set_additional_message( + "load_with_gd: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; gdImageDestroy(im); goto end; diff --git a/src/output.c b/src/output.c index 325e2305..e8f2b83c 100644 --- a/src/output.c +++ b/src/output.c @@ -49,6 +49,8 @@ sixel_output_new( *output = (sixel_output_t *)sixel_allocator_malloc(allocator, size); if (*output == NULL) { + sixel_helper_set_additional_message( + "sixel_output_new: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } diff --git a/src/tosixel.c b/src/tosixel.c index 04b6eea9..b682981a 100644 --- a/src/tosixel.c +++ b/src/tosixel.c @@ -494,6 +494,8 @@ sixel_encode_body( len, sizeof(unsigned char)); if (map == NULL) { + sixel_helper_set_additional_message( + "sixel_encode_body: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -575,6 +577,8 @@ sixel_encode_body( np = (sixel_node_t *)sixel_allocator_malloc(allocator, sizeof(sixel_node_t)); if (np == NULL) { + sixel_helper_set_additional_message( + "sixel_encode_body: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } @@ -737,6 +741,8 @@ sixel_encode_dither( paletted_pixels = (unsigned char *)sixel_allocator_malloc(dither->allocator, width * height * 3); if (paletted_pixels == NULL) { + sixel_helper_set_additional_message( + "sixel_encode_dither: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; goto end; } From b042982535b30e59c1e8eab7f733d308e5342893 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Tue, 4 Aug 2015 15:32:58 +0900 Subject: [PATCH 445/451] Use fixed error message in some case to prevent buffer overflow --- src/chunk.c | 14 ++++---------- src/decoder.c | 3 ++- src/writer.c | 5 +---- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/chunk.c b/src/chunk.c index 1c6cc00a..0d5a1219 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -193,7 +193,6 @@ open_binary_file( char const /* in */ *filename) { SIXELSTATUS status = SIXEL_FALSE; - char buffer[1024]; #if HAVE_STAT struct stat sb; #endif /* HAVE_STAT */ @@ -216,16 +215,12 @@ open_binary_file( #if HAVE_STAT if (stat(filename, &sb) != 0) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - if (sprintf(buffer, "stat('%s') failed.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } + sixel_helper_set_additional_message("stat() failed."); goto end; } if ((sb.st_mode & S_IFMT) == S_IFDIR) { status = SIXEL_BAD_INPUT; - if (sprintf(buffer, "'%s' is directory.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } + sixel_helper_set_additional_message("specified path is directory."); goto end; } #endif /* HAVE_STAT */ @@ -233,13 +228,12 @@ open_binary_file( *f = fopen(filename, "rb"); if (!*f) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - if (sprintf(buffer, "fopen('%s') failed.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } + sixel_helper_set_additional_message("fopen() failed."); goto end; } status = SIXEL_OK; + end: return status; } diff --git a/src/decoder.c b/src/decoder.c index f467dabc..98b5c30d 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -261,7 +261,8 @@ sixel_decoder_decode( raw_len = 0; max = 64 * 1024; - if ((raw_data = (unsigned char *)sixel_allocator_malloc(decoder->allocator, max)) == NULL) { + raw_data = (unsigned char *)sixel_allocator_malloc(decoder->allocator, max); + if (raw_data == NULL) { sixel_helper_set_additional_message( "sixel_decoder_decode: sixel_allocator_malloc() failed."); status = SIXEL_BAD_ALLOCATION; diff --git a/src/writer.c b/src/writer.c index 8dc42cd0..4c6c25f7 100644 --- a/src/writer.c +++ b/src/writer.c @@ -87,7 +87,6 @@ write_png_to_file( int i; unsigned char *src; unsigned char *dst; - char buffer[1024]; switch (pixelformat) { case SIXEL_PIXELFORMAT_PAL1: @@ -210,9 +209,7 @@ write_png_to_file( output_fp = fopen(filename, "wb"); if (!output_fp) { status = (SIXEL_LIBC_ERROR | (errno & 0xff)); - if (sprintf(buffer, "fopen('%s') failed.", filename) != EOF) { - sixel_helper_set_additional_message(buffer); - } + sixel_helper_set_additional_message("fopen() failed."); goto end; } } From fa5298cc06780c646e104ef7e6d96e86483aca76 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Fri, 7 Aug 2015 00:23:03 +0900 Subject: [PATCH 446/451] Use sixel_encoder_new/sixel_decoder_new --- ext/libsixel/libsixel.c | 20 ++++++++++++++++++-- lib/libsixel/version.rb | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ext/libsixel/libsixel.c b/ext/libsixel/libsixel.c index 546ed142..016c700c 100644 --- a/ext/libsixel/libsixel.c +++ b/ext/libsixel/libsixel.c @@ -42,8 +42,16 @@ static VALUE sixel_ruby_encoder_alloc(VALUE klass) { sixel_encoder_t *encoder; + SIXELSTATUS status; + + status = sixel_encoder_new(&encoder, NULL); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, + "sixel_encoder_new() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); + } - encoder = sixel_encoder_create(); return Data_Wrap_Struct(klass, NULL, sixel_ruby_encoder_free, encoder); } @@ -108,8 +116,16 @@ static VALUE sixel_ruby_decoder_alloc(VALUE klass) { sixel_decoder_t *decoder; + SIXELSTATUS status; + + status = sixel_decoder_new(&decoder, NULL); + if (SIXEL_FAILED(status)) { + rb_raise(rb_eRuntimeError, + "sixel_encoder_encode() failed: %s / %s", + sixel_helper_format_error(status), + sixel_helper_get_additional_message()); + } - decoder = sixel_decoder_create(); return Data_Wrap_Struct(klass, NULL, sixel_ruby_decoder_free, decoder); } diff --git a/lib/libsixel/version.rb b/lib/libsixel/version.rb index 2d45aab6..ededb890 100644 --- a/lib/libsixel/version.rb +++ b/lib/libsixel/version.rb @@ -1,3 +1,3 @@ module Libsixel - VERSION = "0.0.1" + VERSION = "0.0.2" end From 17725237af84a45b0d4f74f374672448af154602 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 8 Aug 2015 21:59:47 +0900 Subject: [PATCH 447/451] Add custom builder --- builder/MyBuilder.pm | 17 +++++++++++++++++ minil.toml | 4 ++++ 2 files changed, 21 insertions(+) create mode 100644 builder/MyBuilder.pm diff --git a/builder/MyBuilder.pm b/builder/MyBuilder.pm new file mode 100644 index 00000000..73d58ccd --- /dev/null +++ b/builder/MyBuilder.pm @@ -0,0 +1,17 @@ +package MyBuilder; + +use strict; +use warnings; +use parent qw(Module::Build); +use File::Copy; + +sub new { + my ($self, %args) = @_; + $self->SUPER::new( + %args, + extra_compiler_flags => [scalar `libsixel-config --cflags`], + extra_linker_flags => [scalar `libsixel-config --libs`], + ); +} + +1; diff --git a/minil.toml b/minil.toml index 565d777b..c64d8d84 100644 --- a/minil.toml +++ b/minil.toml @@ -2,3 +2,7 @@ name = "Image-LibSIXEL" # badges = ["travis"] module_maker="ModuleBuildTiny" +[build] +build_class = "builder::MyBuilder" + + From c6fbd8d2a147cbb172d665aac431d99a0c219f54 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 8 Aug 2015 22:01:04 +0900 Subject: [PATCH 448/451] Use sixel_encoder_new/sixel_decoder_new --- lib/Image/LibSIXEL.xs | 110 ++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/lib/Image/LibSIXEL.xs b/lib/Image/LibSIXEL.xs index bc441630..28cfb12b 100644 --- a/lib/Image/LibSIXEL.xs +++ b/lib/Image/LibSIXEL.xs @@ -10,23 +10,25 @@ MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Encoder PREFIX = encoder_ SV * encoder_new(void) INIT: + SIXELSTATUS status; sixel_encoder_t *encoder; SV *sv; + const char *klass; CODE: - encoder = sixel_encoder_create(); - if (!encoder) { + status = sixel_encoder_new(&encoder, NULL); + if (SIXEL_FAILED(status)) { + croak("libsixel error: %s", sixel_helper_format_error(status)); XSRETURN_UNDEF; - } else { - const char *klass = SvPV_nolen(ST(0)); - sv = newSViv(PTR2IV(encoder)); - if (!sv) { - XSRETURN_UNDEF; - } - sv = newRV_noinc(sv); - sv_bless(sv, gv_stashpv(klass, 1)); - SvREADONLY_on(sv); - RETVAL = sv; } + klass = SvPV_nolen(ST(0)); + sv = newSViv(PTR2IV(encoder)); + if (!sv) { + XSRETURN_UNDEF; + } + sv = newRV_noinc(sv); + sv_bless(sv, gv_stashpv(klass, 1)); + SvREADONLY_on(sv); + RETVAL = sv; OUTPUT: RETVAL @@ -34,11 +36,11 @@ encoder_new(void) void encoder_setopt(...) INIT: - IV iv; + SIXELSTATUS status; + IV iv; sixel_encoder_t *encoder; char const *arg; char const *optarg = NULL; - int retval; PPCODE: if (items != 2 && items != 3) { croak("Bad argument count: %d", items); @@ -46,25 +48,25 @@ encoder_setopt(...) iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); encoder = INT2PTR(sixel_encoder_t *, iv); arg = SvPV_nolen(ST(1)); - if (strlen(arg) != 1) { + if (sv_len(ST(1)) != 1) { croak("Bad argument: %s", arg); } if (items == 3) { optarg = SvPV_nolen(ST(2)); } - retval = sixel_encoder_setopt(encoder, *arg, optarg); - if (retval != 0) { - croak("setopt() failed"); + status = sixel_encoder_setopt(encoder, *arg, optarg); + if (SIXEL_FAILED(status)) { + croak("libsixel error: %s", sixel_helper_format_error(status)); } void encoder_encode(...) INIT: - IV iv; + SIXELSTATUS status; + IV iv; sixel_encoder_t *encoder; char const *infile; - int retval; PPCODE: if (items != 2) { croak("Bad argument count: %d", items); @@ -72,16 +74,16 @@ encoder_encode(...) iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); encoder = INT2PTR(sixel_encoder_t *, iv); infile = SvPV_nolen(ST(1)); - retval = sixel_encoder_encode(encoder, infile); - if (retval != 0) { - croak("encode() failed"); + status = sixel_encoder_encode(encoder, infile); + if (SIXEL_FAILED(status)) { + croak("libsixel error: %s", sixel_helper_format_error(status)); } void encoder_DESTROY(...) INIT: - IV iv; + IV iv; sixel_encoder_t *encoder; PPCODE: iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); @@ -95,23 +97,25 @@ MODULE = Image::LibSIXEL PACKAGE = Image::LibSIXEL::Decoder PREFIX = decoder_ SV * decoder_new(void) INIT: + SIXELSTATUS status; sixel_decoder_t *decoder; SV *sv; + const char *klass; CODE: - decoder = sixel_decoder_create(); - if (!decoder) { + status = sixel_decoder_new(&decoder, NULL); + if (SIXEL_FAILED(status)) { + croak("libsixel error: %s", sixel_helper_format_error(status)); XSRETURN_UNDEF; - } else { - const char *klass = SvPV_nolen(ST(0)); - sv = newSViv(PTR2IV(decoder)); - if (!sv) { - XSRETURN_UNDEF; - } - sv = newRV_noinc(sv); - sv_bless(sv, gv_stashpv(klass, 1)); - SvREADONLY_on(sv); - RETVAL = sv; } + klass = SvPV_nolen(ST(0)); + sv = newSViv(PTR2IV(decoder)); + if (!sv) { + XSRETURN_UNDEF; + } + sv = newRV_noinc(sv); + sv_bless(sv, gv_stashpv(klass, 1)); + SvREADONLY_on(sv); + RETVAL = sv; OUTPUT: RETVAL @@ -119,52 +123,52 @@ decoder_new(void) void decoder_setopt(...) INIT: - IV iv; + SIXELSTATUS status; + IV iv; sixel_decoder_t *decoder; - char const *arg; - char const *optarg = NULL; - int retval; + char const *arg; + char const *optarg = NULL; PPCODE: if (items != 2 && items != 3) { - croak("Bad argument count: %d", items); + croak("Bad argument count: %d", items); } iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); decoder = INT2PTR(sixel_decoder_t *, iv); arg = SvPV_nolen(ST(1)); - if (strlen(arg) != 1) { - croak("Bad argument: %s", arg); + if (sv_len(ST(1)) != 1) { + croak("Bad argument: %s", arg); } if (items == 3) { optarg = SvPV_nolen(ST(2)); } - retval = sixel_decoder_setopt(decoder, *arg, optarg); - if (retval != 0) { - croak("setopt() failed"); + status = sixel_decoder_setopt(decoder, *arg, optarg); + if (SIXEL_FAILED(status)) { + croak("libsixel error: %s", sixel_helper_format_error(status)); } void decoder_decode(...) INIT: - IV iv; + SIXELSTATUS status; + IV iv; sixel_decoder_t *decoder; - int retval; PPCODE: if (items != 1) { - croak("Bad argument count: %d", items); + croak("Bad argument count: %d", items); } iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); decoder = INT2PTR(sixel_decoder_t *, iv); - retval = sixel_decoder_decode(decoder); - if (retval != 0) { - croak("decode() failed"); + status = sixel_decoder_decode(decoder); + if (SIXEL_FAILED(status)) { + croak("libsixel error: %s", sixel_helper_format_error(status)); } void decoder_DESTROY(...) INIT: - IV iv; + IV iv; sixel_decoder_t *decoder; PPCODE: iv = SvROK(ST(0)) ? SvIV(SvRV(ST(0))) : SvIV(ST(0)); From d3a6b82fa48a0ff3a6203fed89e1893ae384aa27 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 8 Aug 2015 22:02:13 +0900 Subject: [PATCH 449/451] Update MANIFEST --- MANIFEST | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST b/MANIFEST index 443804b0..f8fb7145 100644 --- a/MANIFEST +++ b/MANIFEST @@ -4,6 +4,7 @@ lib/Image/LibSIXEL.pm lib/Image/LibSIXEL/Encoder.pm lib/Image/LibSIXEL/Decoder.pm t/libsixel.t +LICENSE Makefile.PL MANIFEST This list of files MANIFEST.SKIP From f6aec561cf5784993f529a997a98eb89cad37b80 Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 22 Aug 2015 01:50:26 +0900 Subject: [PATCH 450/451] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c21916d2..f960d4df 100644 --- a/README.md +++ b/README.md @@ -243,7 +243,7 @@ You can install libsixel via the following package systems. - [Homebrew tap](https://github.com/aki017/homebrew-sixel) - [yacp](https://github.com/fd00/yacp/tree/master/libsixel) - [Debian](https://packages.debian.org/search?searchon=names&keywords=libsixel) -- [AUR](https://aur.archlinux.org/packages/libsixel/) +- [AUR](https://aur.archlinux.org/packages/libsixel-git/) - [Portage](http://packages.gentoo.org/package/media-libs/libsixel) - [Ubuntu](https://launchpad.net/ubuntu/+source/libsixel) From b49f6d1f92d802b3b077d39c583d357d2dee8a6e Mon Sep 17 00:00:00 2001 From: Hayaki Saito Date: Sat, 22 Aug 2015 02:27:20 +0900 Subject: [PATCH 451/451] Update NEWS --- NEWS | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index adb459af..6c0cc08a 100644 --- a/NEWS +++ b/NEWS @@ -46,11 +46,33 @@ sixel_decoder_setopt() sixel_decoder_decode() -* core: Introduce newv APIs for semantic error handling: +* core: Introduce new APIs for semantic error handling: sixel_helper_set_additional_message() sixel_helper_get_additional_message() sixel_helper_format_error() +* core: Introduce custom allocator APIs: + sixel_allocator_new() + sixel_allocator_ref() + sixel_allocator_unref() + sixel_allocator_malloc() + sixel_allocator_calloc() + sixel_allocator_realloc() + sixel_allocator_free() + +* core: Add new constructor methods that returns SIXELSTATUS for semantic error handling: + sixel_output_new() + sixel_dither_new() + sixel_frame_new() + sixel_encoder_new() + sixel_decoder_new() + sixel_allocator_new() + sixel_output_new() + sixel_dither_new() + sixel_frame_new() + sixel_encoder_new() + sixel_decoder_new() + * core: Improve processing quality of loading paletted PNG images. * core: Improve processing quality and performance of loading GIF images. @@ -59,13 +81,13 @@ * core: Update stb_image_write.h to version 0.94 -* Add Perl interface - * Add Python interface -* Add PHP interface +* Add Perl interface (alpha) + +* Add PHP interface (alpha) -* Add Ruby interface +* Add Ruby interface (alpha) * Add new build helper program: libsixel-config